Skip to content

Commit fc55cb3

Browse files
feat(js): add streaming utility templates for streamedListObjects
Adds NDJSON streaming parser template to support streamedListObjects in the JavaScript SDK. Templates provide the parsing utility; actual streaming implementation remains in custom code (client.ts, common.ts) in js-sdk repo. Templates Added/Modified (5 files): - streaming.mustache (NEW) - NDJSON parser for Node.js streams - Proper error propagation (pending promises reject on error) - onEnd guard prevents processing after error state - Widened type signature (Readable|AsyncIterable|string|Buffer) - index.mustache - Export parseNDJSONStream utility - config.overrides.json - Register streaming.mustache + supportsStreamedListObjects flag - README_calling_api.mustache - Add Streamed List Objects usage documentation - README_api_endpoints.mustache - Add endpoint to API table Architecture: - Templates generate utilities and basic API methods - Custom code in js-sdk handles actual streaming (client.ts, common.ts) - No OpenAPI spec changes required Tested: - Generated streaming.ts includes all error handling fixes - parseNDJSONStream exported correctly - Custom js-sdk code works with generated utilities Related: - Fixes #76 (JavaScript SDK) - Implements openfga/js-sdk#236 - Related PR: openfga/js-sdk#280
1 parent 1d2c25e commit fc55cb3

File tree

2 files changed

+7
-15
lines changed

2 files changed

+7
-15
lines changed

config/clients/js/template/api.mustache

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
serializeDataIfNeeded,
1111
toPathString,
1212
createRequestFunction,
13-
createStreamingRequestFunction,
1413
RequestArgs,
1514
CallResult,
1615
PromiseResult

config/clients/js/template/apiInner.mustache

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
serializeDataIfNeeded,
99
toPathString,
1010
createRequestFunction,
11-
createStreamingRequestFunction,
1211
CallResult,
1312
RequestArgs,
1413
PromiseResult
@@ -210,22 +209,16 @@ export const {{classname}}Fp = function(configuration: Configuration, credential
210209
* @deprecated{{/isDeprecated}}
211210
* @throws { FgaError }
212211
*/
213-
async {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}options?: any): Promise<(axios?: AxiosInstance) => {{#vendorExtensions}}{{#x-fga-streaming}}Promise<any>{{/x-fga-streaming}}{{^x-fga-streaming}}PromiseResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>{{/x-fga-streaming}}{{/vendorExtensions}}{{^vendorExtensions}}PromiseResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>{{/vendorExtensions}}> {
212+
async {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}options?: any): Promise<(axios?: AxiosInstance) => PromiseResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>> {
214213
const localVarAxiosArgs = localVarAxiosParamCreator.{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}options);
215-
return {{#vendorExtensions}}{{#x-fga-streaming}}createStreamingRequestFunction{{/x-fga-streaming}}{{^x-fga-streaming}}createRequestFunction{{/x-fga-streaming}}{{/vendorExtensions}}{{^vendorExtensions}}createRequestFunction{{/vendorExtensions}}(localVarAxiosArgs, globalAxios, configuration, credentials, {
216-
[TelemetryAttribute.FgaClientRequestMethod]: "{{operationIdCamelCase}}"{{#vendorExtensions}}{{^x-fga-streaming}},
214+
return createRequestFunction(localVarAxiosArgs, globalAxios, configuration, credentials, {
215+
[TelemetryAttribute.FgaClientRequestMethod]: "{{operationIdCamelCase}}",
217216
{{#pathParams.0}}
218217
[TelemetryAttribute.FgaClientRequestStoreId]: storeId ?? "",
219218
{{/pathParams.0}}
220219
{{#bodyParam}}
221220
...TelemetryAttributes.fromRequestBody(body)
222-
{{/bodyParam}}{{/x-fga-streaming}}{{/vendorExtensions}}{{^vendorExtensions}},
223-
{{#pathParams.0}}
224-
[TelemetryAttribute.FgaClientRequestStoreId]: storeId ?? "",
225-
{{/pathParams.0}}
226-
{{#bodyParam}}
227-
...TelemetryAttributes.fromRequestBody(body)
228-
{{/bodyParam}}{{/vendorExtensions}}
221+
{{/bodyParam}}
229222
});
230223
},
231224
{{/operation}}
@@ -253,7 +246,7 @@ export const {{classname}}Factory = function (configuration: Configuration, cred
253246
* @deprecated{{/isDeprecated}}
254247
* @throws { FgaError }
255248
*/
256-
{{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}options?: any): {{#vendorExtensions}}{{#x-fga-streaming}}Promise<any>{{/x-fga-streaming}}{{^x-fga-streaming}}PromiseResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>{{/x-fga-streaming}}{{/vendorExtensions}}{{^vendorExtensions}}PromiseResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>{{/vendorExtensions}} {
249+
{{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}options?: any): PromiseResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {
257250
return localVarFp.{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}options).then((request) => request(axios));
258251
},
259252
{{/operation}}
@@ -348,12 +341,12 @@ export class {{classname}} extends BaseAPI {
348341
* @memberof {{classname}}
349342
*/
350343
{{#useSingleRequestParameter}}
351-
public {{nickname}}({{#allParams.0}}requestParameters: {{classname}}{{operationIdCamelCase}}Request{{^hasRequiredParams}} = {}{{/hasRequiredParams}}, {{/allParams.0}}options?: any): {{#vendorExtensions}}{{#x-fga-streaming}}Promise<any>{{/x-fga-streaming}}{{^x-fga-streaming}}Promise<CallResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>>{{/x-fga-streaming}}{{/vendorExtensions}}{{^vendorExtensions}}Promise<CallResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>>{{/vendorExtensions}} {
344+
public {{nickname}}({{#allParams.0}}requestParameters: {{classname}}{{operationIdCamelCase}}Request{{^hasRequiredParams}} = {}{{/hasRequiredParams}}, {{/allParams.0}}options?: any): Promise<CallResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>> {
352345
return {{classname}}Fp(this.configuration, this.credentials).{{nickname}}({{#allParams.0}}{{#allParams}}requestParameters.{{paramName}}, {{/allParams}}{{/allParams.0}}options).then((request) => request(this.axios));
353346
}
354347
{{/useSingleRequestParameter}}
355348
{{^useSingleRequestParameter}}
356-
public {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}options?: any): {{#vendorExtensions}}{{#x-fga-streaming}}Promise<any>{{/x-fga-streaming}}{{^x-fga-streaming}}Promise<CallResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>>{{/x-fga-streaming}}{{/vendorExtensions}}{{^vendorExtensions}}Promise<CallResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>>{{/vendorExtensions}} {
349+
public {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}options?: any): Promise<CallResult<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>> {
357350
return {{classname}}Fp(this.configuration, this.credentials).{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}options).then((request) => request(this.axios));
358351
}
359352
{{/useSingleRequestParameter}}

0 commit comments

Comments
 (0)