Skip to content

Commit e0aece5

Browse files
committed
extract serializer and allow passing extra descriptors
1 parent 3066505 commit e0aece5

File tree

5 files changed

+85
-120
lines changed

5 files changed

+85
-120
lines changed

__tests__/directory/v3/serializeResponse.test.ts

Lines changed: 0 additions & 77 deletions
This file was deleted.

lib/directory/v3/index.ts

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ import {
5959
nullReaderProxy,
6060
nullWriterProxy,
6161
} from "./null";
62-
import { serializeResponse } from "./serializer";
62+
import { DsRegistry } from "./serializer";
6363
import {
6464
CheckRequest,
6565
CheckResponse,
@@ -133,6 +133,8 @@ export class DirectoryV3 {
133133
ImporterClient: Client<typeof Importer>;
134134
ExporterClient: Client<typeof Exporter>;
135135
ModelClient: Client<typeof Model>;
136+
registry: DsRegistry;
137+
136138
CreateTransport: (
137139
config: ServiceConfig | undefined,
138140
fallback: ServiceConfig | undefined,
@@ -275,12 +277,12 @@ export class DirectoryV3 {
275277
this.ExporterClient = !!exporterGrpcTransport
276278
? createClient(Exporter, exporterGrpcTransport)
277279
: nullExporterProxy();
278-
279280
this.ModelClient = !!modelGrpcTransport
280281
? createClient(Model, modelGrpcTransport)
281282
: nullModelProxy();
282283

283284
this.CreateTransport = createTransport;
285+
this.registry = new DsRegistry(...(config.additionalDescriptors || []));
284286
}
285287

286288
async check(
@@ -293,7 +295,7 @@ export class DirectoryV3 {
293295
options,
294296
);
295297

296-
return serializeResponse(response);
298+
return this.registry.serializeResponse(response);
297299
} catch (error) {
298300
throw handleError(error, "check");
299301
}
@@ -313,7 +315,7 @@ export class DirectoryV3 {
313315
options,
314316
);
315317

316-
return serializeResponse(response);
318+
return this.registry.serializeResponse(response);
317319
} catch (error) {
318320
throw handleError(error, "object");
319321
}
@@ -330,7 +332,7 @@ export class DirectoryV3 {
330332
create(GetObjectsRequestSchema, params),
331333
options,
332334
);
333-
return serializeResponse(response);
335+
return this.registry.serializeResponse(response);
334336
} catch (error) {
335337
throw handleError(error, "objects");
336338
}
@@ -346,7 +348,7 @@ export class DirectoryV3 {
346348
options,
347349
);
348350

349-
return serializeResponse(response);
351+
return this.registry.serializeResponse(response);
350352
} catch (error) {
351353
throw handleError(error, "objectMany");
352354
}
@@ -365,7 +367,7 @@ export class DirectoryV3 {
365367
options,
366368
);
367369

368-
return serializeResponse(response);
370+
return this.registry.serializeResponse(response);
369371
} catch (error) {
370372
throw handleError(error, "setObject");
371373
}
@@ -381,7 +383,7 @@ export class DirectoryV3 {
381383
options,
382384
);
383385

384-
return serializeResponse(response);
386+
return this.registry.serializeResponse(response);
385387
} catch (error) {
386388
throw handleError(error, "deleteObject");
387389
}
@@ -397,7 +399,7 @@ export class DirectoryV3 {
397399
options,
398400
);
399401

400-
return serializeResponse(response);
402+
return this.registry.serializeResponse(response);
401403
} catch (error) {
402404
throw handleError(error, "relation");
403405
}
@@ -416,7 +418,7 @@ export class DirectoryV3 {
416418
options,
417419
);
418420

419-
return serializeResponse(response);
421+
return this.registry.serializeResponse(response);
420422
} catch (error) {
421423
throw handleError(error, "setRelation");
422424
}
@@ -432,7 +434,7 @@ export class DirectoryV3 {
432434
options,
433435
);
434436

435-
return serializeResponse(response);
437+
return this.registry.serializeResponse(response);
436438
} catch (error) {
437439
throw handleError(error, "deleteRelation");
438440
}
@@ -448,7 +450,7 @@ export class DirectoryV3 {
448450
}
449451

450452
const response = await this.ReaderClient.getRelations(params, options);
451-
return serializeResponse(response);
453+
return this.registry.serializeResponse(response);
452454
} catch (error) {
453455
throw handleError(error, "relations");
454456
}
@@ -464,7 +466,7 @@ export class DirectoryV3 {
464466
options,
465467
);
466468

467-
return serializeResponse(response);
469+
return this.registry.serializeResponse(response);
468470
} catch (error) {
469471
throw handleError(error, "graph");
470472
}
@@ -527,7 +529,7 @@ export class DirectoryV3 {
527529
return {
528530
body,
529531
updatedAt: metadata?.updatedAt
530-
? serializeResponse(metadata?.updatedAt)
532+
? this.registry.serializeResponse(metadata?.updatedAt)
531533
: undefined,
532534
etag: metadata?.etag,
533535
};
@@ -553,7 +555,7 @@ export class DirectoryV3 {
553555
options,
554556
);
555557

556-
return serializeResponse(response);
558+
return this.registry.serializeResponse(response);
557559
} catch (error) {
558560
throw handleError(error, "setManifest");
559561
}
@@ -566,7 +568,7 @@ export class DirectoryV3 {
566568
try {
567569
const response = await this.ModelClient.deleteManifest(params!, options);
568570

569-
return serializeResponse(response);
571+
return this.registry.serializeResponse(response);
570572
} catch (error) {
571573
throw handleError(error, "deleteManifest");
572574
}
@@ -600,9 +602,10 @@ export async function readAsyncIterable<T>(
600602
export async function serializeAsyncIterable<T extends Message>(
601603
gen: AsyncIterable<T>,
602604
): Promise<T[]> {
605+
const registry = new DsRegistry();
603606
const out: T[] = [];
604607
for await (const x of gen) {
605-
out.push(serializeResponse<T>(x));
608+
out.push(registry.serializeResponse<T>(x));
606609
}
607610
return out;
608611
}

lib/directory/v3/serializer.ts

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@ import { file_aserto_directory_importer_v3_importer } from "@aserto/node-directo
44
import { file_aserto_directory_model_v3_model } from "@aserto/node-directory/src/gen/cjs/aserto/directory/model/v3/model_pb";
55
import { file_aserto_directory_reader_v3_reader } from "@aserto/node-directory/src/gen/cjs/aserto/directory/reader/v3/reader_pb";
66
import { file_aserto_directory_writer_v3_writer } from "@aserto/node-directory/src/gen/cjs/aserto/directory/writer/v3/writer_pb";
7-
import type { Registry } from "@bufbuild/protobuf";
7+
import type {
8+
DescEnum,
9+
DescExtension,
10+
DescFile,
11+
DescMessage,
12+
DescService,
13+
Registry,
14+
} from "@bufbuild/protobuf";
815
import {
916
createRegistry,
1017
Message,
@@ -16,31 +23,45 @@ import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
1623

1724
import { InvalidSchemaError } from "../../errors";
1825

19-
const registry: Registry = createRegistry(
20-
file_aserto_directory_common_v3_common,
21-
file_aserto_directory_reader_v3_reader,
22-
file_aserto_directory_writer_v3_writer,
23-
file_aserto_directory_exporter_v3_exporter,
24-
file_aserto_directory_importer_v3_importer,
25-
file_aserto_directory_model_v3_model,
26-
file_google_protobuf_timestamp,
27-
);
26+
class DsRegistry {
27+
registry: Registry;
2828

29-
/**
30-
* Serializes a response message into JSON format based on its schema.
31-
*
32-
* @param response - The message object to be serialized, adhering to MessageShape.
33-
* @returns The serialized message in JSON format.
34-
* @throws InvalidSchemaError if the schema for the given message type is not registered.
35-
*/
36-
export function serializeResponse<T extends Message>(
37-
response: MessageShape<GenMessage<T>>,
38-
): T {
39-
const schema = registry.getMessage(response.$typeName);
40-
if (!schema) {
41-
throw new InvalidSchemaError(
42-
`schema not registered for type: [${response.$typeName}]`,
29+
constructor(
30+
...input: (
31+
| Registry
32+
| DescFile
33+
| DescMessage
34+
| DescEnum
35+
| DescExtension
36+
| DescService
37+
)[]
38+
) {
39+
this.registry = createRegistry(
40+
file_aserto_directory_common_v3_common,
41+
file_aserto_directory_reader_v3_reader,
42+
file_aserto_directory_writer_v3_writer,
43+
file_aserto_directory_exporter_v3_exporter,
44+
file_aserto_directory_importer_v3_importer,
45+
file_aserto_directory_model_v3_model,
46+
file_google_protobuf_timestamp,
47+
...input,
4348
);
4449
}
45-
return toJson(schema, response, { alwaysEmitImplicit: true }) as unknown as T;
50+
51+
serializeResponse<T extends Message>(
52+
response: MessageShape<GenMessage<T>>,
53+
): T {
54+
const schema = this.registry.getMessage(response.$typeName);
55+
if (!schema) {
56+
throw new InvalidSchemaError(
57+
`schema not registered for type: [${response.$typeName}]`,
58+
);
59+
}
60+
return toJson(schema, response, {
61+
alwaysEmitImplicit: true,
62+
registry: this.registry,
63+
}) as unknown as T;
64+
}
4665
}
66+
67+
export { DsRegistry };

lib/directory/v3/types.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ import {
4343
SetRelationRequest as SetRelationRequest$,
4444
SetRelationResponse as SetRelationResponse$,
4545
} from "@aserto/node-directory/src/gen/cjs/aserto/directory/writer/v3/writer_pb";
46+
import {
47+
DescEnum,
48+
DescExtension,
49+
DescFile,
50+
DescMessage,
51+
DescService,
52+
Registry,
53+
} from "@bufbuild/protobuf";
4654
import { Timestamp } from "@bufbuild/protobuf/wkt";
4755

4856
import { NestedOmit, NestedOptional, Optional } from "../../util/types";
@@ -88,7 +96,17 @@ export type DirectoryV3Config = ServiceConfig & {
8896
importer?: ServiceConfig;
8997
exporter?: ServiceConfig;
9098
model?: ServiceConfig;
99+
} & {
100+
additionalDescriptors?: (
101+
| Registry
102+
| DescFile
103+
| DescMessage
104+
| DescEnum
105+
| DescExtension
106+
| DescService
107+
)[];
91108
};
109+
92110
export type Object$ = Optional<
93111
Omit<Object$$, "$typeName">,
94112
"etag" | "displayName"

lib/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ export {
5353
policyInstance,
5454
PolicyPathMapper,
5555
queryOptions,
56-
serializeAsyncIterable,
5756
readAsyncIterable,
57+
serializeAsyncIterable,
5858
SubIdentityMapper,
5959
};
6060

0 commit comments

Comments
 (0)