confluent-schema-registry 3.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/.dockerignore +2 -0
  2. package/.prettierrc.js +8 -0
  3. package/CHANGELOG.md +166 -0
  4. package/Dockerfile +10 -0
  5. package/LICENSE +21 -0
  6. package/README.md +44 -0
  7. package/bin/avdlToAVSC.sh +9 -0
  8. package/dist/@types.d.ts +93 -0
  9. package/dist/@types.js +10 -0
  10. package/dist/@types.js.map +1 -0
  11. package/dist/AvroHelper.d.ts +12 -0
  12. package/dist/AvroHelper.js +67 -0
  13. package/dist/AvroHelper.js.map +1 -0
  14. package/dist/JsonHelper.d.ts +7 -0
  15. package/dist/JsonHelper.js +20 -0
  16. package/dist/JsonHelper.js.map +1 -0
  17. package/dist/JsonSchema.d.ts +31 -0
  18. package/dist/JsonSchema.js +58 -0
  19. package/dist/JsonSchema.js.map +1 -0
  20. package/dist/ProtoHelper.d.ts +7 -0
  21. package/dist/ProtoHelper.js +23 -0
  22. package/dist/ProtoHelper.js.map +1 -0
  23. package/dist/ProtoSchema.d.ts +14 -0
  24. package/dist/ProtoSchema.js +66 -0
  25. package/dist/ProtoSchema.js.map +1 -0
  26. package/dist/SchemaRegistry.d.ts +48 -0
  27. package/dist/SchemaRegistry.js +250 -0
  28. package/dist/SchemaRegistry.js.map +1 -0
  29. package/dist/api/index.d.ts +43 -0
  30. package/dist/api/index.js +90 -0
  31. package/dist/api/index.js.map +1 -0
  32. package/dist/api/middleware/confluentEncoderMiddleware.d.ts +3 -0
  33. package/dist/api/middleware/confluentEncoderMiddleware.js +31 -0
  34. package/dist/api/middleware/confluentEncoderMiddleware.js.map +1 -0
  35. package/dist/api/middleware/errorMiddleware.d.ts +3 -0
  36. package/dist/api/middleware/errorMiddleware.js +20 -0
  37. package/dist/api/middleware/errorMiddleware.js.map +1 -0
  38. package/dist/api/middleware/userAgent.d.ts +3 -0
  39. package/dist/api/middleware/userAgent.js +18 -0
  40. package/dist/api/middleware/userAgent.js.map +1 -0
  41. package/dist/cache.d.ts +20 -0
  42. package/dist/cache.js +24 -0
  43. package/dist/cache.js.map +1 -0
  44. package/dist/constants.d.ts +11 -0
  45. package/dist/constants.js +15 -0
  46. package/dist/constants.js.map +1 -0
  47. package/dist/errors.d.ts +14 -0
  48. package/dist/errors.js +26 -0
  49. package/dist/errors.js.map +1 -0
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.js +13 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/schemaTypeResolver.d.ts +4 -0
  54. package/dist/schemaTypeResolver.js +80 -0
  55. package/dist/schemaTypeResolver.js.map +1 -0
  56. package/dist/utils/avdlToAVSC.d.ts +2 -0
  57. package/dist/utils/avdlToAVSC.js +85 -0
  58. package/dist/utils/avdlToAVSC.js.map +1 -0
  59. package/dist/utils/index.d.ts +2 -0
  60. package/dist/utils/index.js +9 -0
  61. package/dist/utils/index.js.map +1 -0
  62. package/dist/utils/readAVSC.d.ts +3 -0
  63. package/dist/utils/readAVSC.js +33 -0
  64. package/dist/utils/readAVSC.js.map +1 -0
  65. package/dist/wireDecoder.d.ts +7 -0
  66. package/dist/wireDecoder.js +8 -0
  67. package/dist/wireDecoder.js.map +1 -0
  68. package/dist/wireEncoder.d.ts +3 -0
  69. package/dist/wireEncoder.js +10 -0
  70. package/dist/wireEncoder.js.map +1 -0
  71. package/dockest-error.json +11 -0
  72. package/dockest.ts +30 -0
  73. package/jest.setup.ts +60 -0
  74. package/package.json +56 -0
  75. package/release/CHANGELOG.md +166 -0
  76. package/release/LICENSE +21 -0
  77. package/release/README.md +44 -0
  78. package/release/dist/@types.d.ts +93 -0
  79. package/release/dist/@types.js +10 -0
  80. package/release/dist/@types.js.map +1 -0
  81. package/release/dist/AvroHelper.d.ts +12 -0
  82. package/release/dist/AvroHelper.js +67 -0
  83. package/release/dist/AvroHelper.js.map +1 -0
  84. package/release/dist/JsonHelper.d.ts +7 -0
  85. package/release/dist/JsonHelper.js +20 -0
  86. package/release/dist/JsonHelper.js.map +1 -0
  87. package/release/dist/JsonSchema.d.ts +31 -0
  88. package/release/dist/JsonSchema.js +58 -0
  89. package/release/dist/JsonSchema.js.map +1 -0
  90. package/release/dist/ProtoHelper.d.ts +7 -0
  91. package/release/dist/ProtoHelper.js +23 -0
  92. package/release/dist/ProtoHelper.js.map +1 -0
  93. package/release/dist/ProtoSchema.d.ts +14 -0
  94. package/release/dist/ProtoSchema.js +66 -0
  95. package/release/dist/ProtoSchema.js.map +1 -0
  96. package/release/dist/SchemaRegistry.d.ts +48 -0
  97. package/release/dist/SchemaRegistry.js +250 -0
  98. package/release/dist/SchemaRegistry.js.map +1 -0
  99. package/release/dist/api/index.d.ts +43 -0
  100. package/release/dist/api/index.js +90 -0
  101. package/release/dist/api/index.js.map +1 -0
  102. package/release/dist/api/middleware/confluentEncoderMiddleware.d.ts +3 -0
  103. package/release/dist/api/middleware/confluentEncoderMiddleware.js +31 -0
  104. package/release/dist/api/middleware/confluentEncoderMiddleware.js.map +1 -0
  105. package/release/dist/api/middleware/errorMiddleware.d.ts +3 -0
  106. package/release/dist/api/middleware/errorMiddleware.js +20 -0
  107. package/release/dist/api/middleware/errorMiddleware.js.map +1 -0
  108. package/release/dist/api/middleware/userAgent.d.ts +3 -0
  109. package/release/dist/api/middleware/userAgent.js +18 -0
  110. package/release/dist/api/middleware/userAgent.js.map +1 -0
  111. package/release/dist/cache.d.ts +20 -0
  112. package/release/dist/cache.js +24 -0
  113. package/release/dist/cache.js.map +1 -0
  114. package/release/dist/constants.d.ts +11 -0
  115. package/release/dist/constants.js +15 -0
  116. package/release/dist/constants.js.map +1 -0
  117. package/release/dist/errors.d.ts +14 -0
  118. package/release/dist/errors.js +26 -0
  119. package/release/dist/errors.js.map +1 -0
  120. package/release/dist/index.d.ts +4 -0
  121. package/release/dist/index.js +13 -0
  122. package/release/dist/index.js.map +1 -0
  123. package/release/dist/schemaTypeResolver.d.ts +4 -0
  124. package/release/dist/schemaTypeResolver.js +80 -0
  125. package/release/dist/schemaTypeResolver.js.map +1 -0
  126. package/release/dist/utils/avdlToAVSC.d.ts +2 -0
  127. package/release/dist/utils/avdlToAVSC.js +85 -0
  128. package/release/dist/utils/avdlToAVSC.js.map +1 -0
  129. package/release/dist/utils/index.d.ts +2 -0
  130. package/release/dist/utils/index.js +9 -0
  131. package/release/dist/utils/index.js.map +1 -0
  132. package/release/dist/utils/readAVSC.d.ts +3 -0
  133. package/release/dist/utils/readAVSC.js +33 -0
  134. package/release/dist/utils/readAVSC.js.map +1 -0
  135. package/release/dist/wireDecoder.d.ts +7 -0
  136. package/release/dist/wireDecoder.js +8 -0
  137. package/release/dist/wireDecoder.js.map +1 -0
  138. package/release/dist/wireEncoder.d.ts +3 -0
  139. package/release/dist/wireEncoder.js +10 -0
  140. package/release/dist/wireEncoder.js.map +1 -0
  141. package/release/package.json +56 -0
  142. package/src/@types.ts +105 -0
  143. package/src/AvroHelper.ts +91 -0
  144. package/src/JsonHelper.ts +35 -0
  145. package/src/JsonSchema.ts +80 -0
  146. package/src/ProtoHelper.ts +38 -0
  147. package/src/ProtoSchema.ts +80 -0
  148. package/src/SchemaRegistry.avro.spec.ts +558 -0
  149. package/src/SchemaRegistry.json.spec.ts +364 -0
  150. package/src/SchemaRegistry.newApi.spec.ts +622 -0
  151. package/src/SchemaRegistry.protobuf.spec.ts +372 -0
  152. package/src/SchemaRegistry.spec.ts +252 -0
  153. package/src/SchemaRegistry.ts +387 -0
  154. package/src/api/index.spec.ts +23 -0
  155. package/src/api/index.ts +121 -0
  156. package/src/api/middleware/confluentEncoderMiddleware.ts +36 -0
  157. package/src/api/middleware/errorMiddleware.spec.ts +67 -0
  158. package/src/api/middleware/errorMiddleware.ts +37 -0
  159. package/src/api/middleware/userAgent.spec.ts +53 -0
  160. package/src/api/middleware/userAgent.ts +19 -0
  161. package/src/cache.ts +34 -0
  162. package/src/constants.ts +13 -0
  163. package/src/errors.ts +26 -0
  164. package/src/index.ts +4 -0
  165. package/src/schemaTypeResolver.ts +101 -0
  166. package/src/utils/avdlToAVSC.spec.ts +79 -0
  167. package/src/utils/avdlToAVSC.ts +106 -0
  168. package/src/utils/index.ts +2 -0
  169. package/src/utils/readAVSC.spec.ts +23 -0
  170. package/src/utils/readAVSC.ts +36 -0
  171. package/src/wireDecoder.ts +5 -0
  172. package/src/wireEncoder.ts +10 -0
  173. package/tsconfig.json +22 -0
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const protobufjs_1 = __importDefault(require("protobufjs"));
7
+ const light_1 = require("protobufjs/light");
8
+ const errors_1 = require("./errors");
9
+ class ProtoSchema {
10
+ constructor(schema, opts) {
11
+ const parsedMessage = protobufjs_1.default.parse(schema.schema);
12
+ const root = parsedMessage.root;
13
+ const referencedSchemas = opts === null || opts === void 0 ? void 0 : opts.referencedSchemas;
14
+ // handle all schema references independent on nested references
15
+ if (referencedSchemas) {
16
+ referencedSchemas.forEach(rawSchema => protobufjs_1.default.parse(rawSchema.schema, root));
17
+ }
18
+ this.message = root.lookupType(this.getTypeName(parsedMessage, opts));
19
+ }
20
+ getNestedTypeName(parent) {
21
+ if (!parent)
22
+ throw new errors_1.ConfluentSchemaRegistryArgumentError('no nested fields');
23
+ const keys = Object.keys(parent);
24
+ const reflection = parent[keys[0]];
25
+ // Traverse down the nested Namespaces until we find a message Type instance (which extends Namespace)
26
+ if (reflection instanceof light_1.Namespace && !(reflection instanceof light_1.Type) && reflection.nested)
27
+ return this.getNestedTypeName(reflection.nested);
28
+ return keys[0];
29
+ }
30
+ getTypeName(parsedMessage, opts) {
31
+ const root = parsedMessage.root;
32
+ const pkg = parsedMessage.package;
33
+ const name = opts && opts.messageName ? opts.messageName : this.getNestedTypeName(root.nested);
34
+ return `${pkg ? pkg + '.' : ''}.${name}`;
35
+ }
36
+ trimStart(buffer) {
37
+ const index = buffer.findIndex((value) => value != 0);
38
+ return buffer.slice(index);
39
+ }
40
+ toBuffer(payload) {
41
+ const paths = [];
42
+ if (!this.isValid(payload, {
43
+ errorHook: (path) => paths.push(path),
44
+ })) {
45
+ throw new errors_1.ConfluentSchemaRegistryValidationError('invalid payload', paths);
46
+ }
47
+ const protoPayload = this.message.create(payload);
48
+ return Buffer.from(this.message.encode(protoPayload).finish());
49
+ }
50
+ fromBuffer(buffer) {
51
+ const newBuffer = this.trimStart(buffer);
52
+ return this.message.decode(newBuffer);
53
+ }
54
+ isValid(payload, opts) {
55
+ const errMsg = this.message.verify(payload);
56
+ if (errMsg) {
57
+ if (opts === null || opts === void 0 ? void 0 : opts.errorHook) {
58
+ opts.errorHook([errMsg], payload);
59
+ }
60
+ return false;
61
+ }
62
+ return true;
63
+ }
64
+ }
65
+ exports.default = ProtoSchema;
66
+ //# sourceMappingURL=ProtoSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtoSchema.js","sourceRoot":"","sources":["../src/ProtoSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /// <reference types="node" />
2
+ import { COMPATIBILITY } from './constants';
3
+ import { SchemaRegistryAPIClientArgs } from './api';
4
+ import Cache from './cache';
5
+ import { Schema, RawAvroSchema, AvroSchema, SchemaType, ConfluentSchema, SchemaRegistryAPIClientOptions, AvroConfluentSchema, SchemaHelper, SchemaReference } from './@types';
6
+ export interface RegisteredSchema {
7
+ id: number;
8
+ }
9
+ interface Opts {
10
+ compatibility?: COMPATIBILITY;
11
+ separator?: string;
12
+ subject: string;
13
+ }
14
+ interface AvroDecodeOptions {
15
+ readerSchema?: RawAvroSchema | AvroSchema | Schema;
16
+ }
17
+ interface DecodeOptions {
18
+ [SchemaType.AVRO]?: AvroDecodeOptions;
19
+ }
20
+ export default class SchemaRegistry {
21
+ private api;
22
+ private cacheMissRequests;
23
+ private options;
24
+ cache: Cache;
25
+ constructor({ auth, clientId, host, retry, agent }: SchemaRegistryAPIClientArgs, options?: SchemaRegistryAPIClientOptions);
26
+ private isConfluentSchema;
27
+ private getConfluentSchema;
28
+ register(schema: Exclude<ConfluentSchema, AvroConfluentSchema>, userOpts: Opts): Promise<RegisteredSchema>;
29
+ register(schema: RawAvroSchema | AvroConfluentSchema, userOpts?: Omit<Opts, 'subject'> & {
30
+ subject?: string;
31
+ }): Promise<RegisteredSchema>;
32
+ register(schema: RawAvroSchema | ConfluentSchema, userOpts: Opts): Promise<RegisteredSchema>;
33
+ private updateOptionsWithSchemaReferences;
34
+ private asProtocolOptions;
35
+ private getreferencedSchemas;
36
+ private getreferencedSchemasRecursive;
37
+ getreferencedSchemasFromReference(reference: SchemaReference, helper: SchemaHelper, referencesSet: Set<string>): Promise<ConfluentSchema[]>;
38
+ private _getSchema;
39
+ getSchema(registryId: number): Promise<Schema | AvroSchema>;
40
+ encode(registryId: number, payload: any): Promise<Buffer>;
41
+ private collectInvalidPaths;
42
+ decode(buffer: Buffer, options?: DecodeOptions): Promise<any>;
43
+ getRegistryId(subject: string, version: number | string): Promise<number>;
44
+ getRegistryIdBySchema(subject: string, schema: AvroSchema | RawAvroSchema | ConfluentSchema): Promise<number>;
45
+ getLatestSchemaId(subject: string): Promise<number>;
46
+ private getSchemaOriginRequest;
47
+ }
48
+ export {};
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const wireEncoder_1 = require("./wireEncoder");
7
+ const wireDecoder_1 = __importDefault(require("./wireDecoder"));
8
+ const constants_1 = require("./constants");
9
+ const api_1 = __importDefault(require("./api"));
10
+ const cache_1 = __importDefault(require("./cache"));
11
+ const errors_1 = require("./errors");
12
+ const _types_1 = require("./@types");
13
+ const schemaTypeResolver_1 = require("./schemaTypeResolver");
14
+ const DEFAULT_OPTS = {
15
+ compatibility: constants_1.COMPATIBILITY.BACKWARD,
16
+ separator: constants_1.DEFAULT_SEPERATOR,
17
+ };
18
+ class SchemaRegistry {
19
+ constructor({ auth, clientId, host, retry, agent }, options) {
20
+ this.cacheMissRequests = {};
21
+ this.api = api_1.default({ auth, clientId, host, retry, agent });
22
+ this.cache = new cache_1.default();
23
+ this.options = options;
24
+ }
25
+ isConfluentSchema(schema) {
26
+ return schema.schema != null;
27
+ }
28
+ getConfluentSchema(schema) {
29
+ let confluentSchema;
30
+ // convert data from old api (for backwards compatibility)
31
+ if (!this.isConfluentSchema(schema)) {
32
+ // schema is instanceof RawAvroSchema or AvroSchema
33
+ confluentSchema = {
34
+ type: _types_1.SchemaType.AVRO,
35
+ schema: JSON.stringify(schema),
36
+ };
37
+ }
38
+ else {
39
+ confluentSchema = schema;
40
+ }
41
+ return confluentSchema;
42
+ }
43
+ async register(schema, userOpts) {
44
+ const { compatibility, separator } = { ...DEFAULT_OPTS, ...userOpts };
45
+ const confluentSchema = this.getConfluentSchema(schema);
46
+ const helper = schemaTypeResolver_1.helperTypeFromSchemaType(confluentSchema.type);
47
+ const options = await this.updateOptionsWithSchemaReferences(confluentSchema, this.options);
48
+ const schemaInstance = schemaTypeResolver_1.schemaFromConfluentSchema(confluentSchema, options);
49
+ helper.validate(schemaInstance);
50
+ let isFirstTimeRegistration = false;
51
+ let subject;
52
+ if (userOpts === null || userOpts === void 0 ? void 0 : userOpts.subject) {
53
+ subject = {
54
+ name: userOpts.subject,
55
+ };
56
+ }
57
+ else {
58
+ subject = helper.getSubject(confluentSchema, schemaInstance, separator);
59
+ }
60
+ try {
61
+ const response = await this.api.Subject.config({ subject: subject.name });
62
+ const { compatibilityLevel } = response.data();
63
+ if (compatibilityLevel.toUpperCase() !== compatibility) {
64
+ throw new errors_1.ConfluentSchemaRegistryCompatibilityError(`Compatibility does not match the configuration (${compatibility} != ${compatibilityLevel.toUpperCase()})`);
65
+ }
66
+ }
67
+ catch (error) {
68
+ if (error.status !== 404) {
69
+ throw error;
70
+ }
71
+ else {
72
+ isFirstTimeRegistration = true;
73
+ }
74
+ }
75
+ const response = await this.api.Subject.register({
76
+ subject: subject.name,
77
+ body: {
78
+ schemaType: confluentSchema.type === _types_1.SchemaType.AVRO ? undefined : confluentSchema.type,
79
+ schema: confluentSchema.schema,
80
+ references: confluentSchema.references,
81
+ },
82
+ });
83
+ if (compatibility && isFirstTimeRegistration) {
84
+ await this.api.Subject.updateConfig({ subject: subject.name, body: { compatibility } });
85
+ }
86
+ const registeredSchema = response.data();
87
+ this.cache.setLatestRegistryId(subject.name, registeredSchema.id);
88
+ this.cache.setSchema(registeredSchema.id, confluentSchema.type, schemaInstance);
89
+ return registeredSchema;
90
+ }
91
+ async updateOptionsWithSchemaReferences(schema, options) {
92
+ const helper = schemaTypeResolver_1.helperTypeFromSchemaType(schema.type);
93
+ const referencedSchemas = await this.getreferencedSchemas(schema, helper);
94
+ const protocolOptions = this.asProtocolOptions(options);
95
+ return helper.updateOptionsFromSchemaReferences(referencedSchemas, protocolOptions);
96
+ }
97
+ asProtocolOptions(options) {
98
+ var _a, _b;
99
+ if (!((_a = options) === null || _a === void 0 ? void 0 : _a.forSchemaOptions)) {
100
+ return options;
101
+ }
102
+ return {
103
+ [_types_1.SchemaType.AVRO]: (_b = options) === null || _b === void 0 ? void 0 : _b.forSchemaOptions,
104
+ };
105
+ }
106
+ async getreferencedSchemas(schema, helper) {
107
+ const referencesSet = new Set();
108
+ return this.getreferencedSchemasRecursive(schema, helper, referencesSet);
109
+ }
110
+ async getreferencedSchemasRecursive(schema, helper, referencesSet) {
111
+ const references = schema.references || [];
112
+ let referencedSchemas = [];
113
+ for (const reference of references) {
114
+ const schemas = await this.getreferencedSchemasFromReference(reference, helper, referencesSet);
115
+ referencedSchemas = referencedSchemas.concat(schemas);
116
+ }
117
+ return referencedSchemas;
118
+ }
119
+ async getreferencedSchemasFromReference(reference, helper, referencesSet) {
120
+ const { name, subject, version } = reference;
121
+ const key = `${name}-${subject}-${version}`;
122
+ // avoid duplicates
123
+ if (referencesSet.has(key)) {
124
+ return [];
125
+ }
126
+ referencesSet.add(key);
127
+ const versionResponse = await this.api.Subject.version(reference);
128
+ const foundSchema = versionResponse.data();
129
+ const schema = helper.toConfluentSchema(foundSchema);
130
+ const referencedSchemas = await this.getreferencedSchemasRecursive(schema, helper, referencesSet);
131
+ referencedSchemas.push(schema);
132
+ return referencedSchemas;
133
+ }
134
+ async _getSchema(registryId) {
135
+ const cacheEntry = this.cache.getSchema(registryId);
136
+ if (cacheEntry) {
137
+ return cacheEntry;
138
+ }
139
+ const response = await this.getSchemaOriginRequest(registryId);
140
+ const foundSchema = response.data();
141
+ const schemaType = schemaTypeResolver_1.schemaTypeFromString(foundSchema.schemaType);
142
+ const helper = schemaTypeResolver_1.helperTypeFromSchemaType(schemaType);
143
+ const confluentSchema = helper.toConfluentSchema(foundSchema);
144
+ const options = await this.updateOptionsWithSchemaReferences(confluentSchema, this.options);
145
+ const schemaInstance = schemaTypeResolver_1.schemaFromConfluentSchema(confluentSchema, options);
146
+ return this.cache.setSchema(registryId, schemaType, schemaInstance);
147
+ }
148
+ async getSchema(registryId) {
149
+ return await (await this._getSchema(registryId)).schema;
150
+ }
151
+ async encode(registryId, payload) {
152
+ if (!registryId) {
153
+ throw new errors_1.ConfluentSchemaRegistryArgumentError(`Invalid registryId: ${JSON.stringify(registryId)}`);
154
+ }
155
+ const { schema } = await this._getSchema(registryId);
156
+ try {
157
+ const serializedPayload = schema.toBuffer(payload);
158
+ return wireEncoder_1.encode(registryId, serializedPayload);
159
+ }
160
+ catch (error) {
161
+ if (error instanceof errors_1.ConfluentSchemaRegistryValidationError)
162
+ throw error;
163
+ const paths = this.collectInvalidPaths(schema, payload);
164
+ throw new errors_1.ConfluentSchemaRegistryValidationError(error, paths);
165
+ }
166
+ }
167
+ collectInvalidPaths(schema, jsonPayload) {
168
+ const paths = [];
169
+ schema.isValid(jsonPayload, {
170
+ errorHook: path => paths.push(path),
171
+ });
172
+ return paths;
173
+ }
174
+ async decode(buffer, options) {
175
+ var _a;
176
+ if (!Buffer.isBuffer(buffer)) {
177
+ throw new errors_1.ConfluentSchemaRegistryArgumentError('Invalid buffer');
178
+ }
179
+ const { magicByte, registryId, payload } = wireDecoder_1.default(buffer);
180
+ if (Buffer.compare(wireEncoder_1.MAGIC_BYTE, magicByte) !== 0) {
181
+ throw new errors_1.ConfluentSchemaRegistryArgumentError(`Message encoded with magic byte ${JSON.stringify(magicByte)}, expected ${JSON.stringify(wireEncoder_1.MAGIC_BYTE)}`);
182
+ }
183
+ const { type, schema: writerSchema } = await this._getSchema(registryId);
184
+ let rawReaderSchema;
185
+ switch (type) {
186
+ case _types_1.SchemaType.AVRO:
187
+ rawReaderSchema = (_a = options === null || options === void 0 ? void 0 : options[_types_1.SchemaType.AVRO]) === null || _a === void 0 ? void 0 : _a.readerSchema;
188
+ }
189
+ if (rawReaderSchema) {
190
+ const readerSchema = schemaTypeResolver_1.schemaFromConfluentSchema({ type: _types_1.SchemaType.AVRO, schema: rawReaderSchema }, this.options);
191
+ if (readerSchema.equals(writerSchema)) {
192
+ /* Even when schemas are considered equal by `avsc`,
193
+ * they still aren't interchangeable:
194
+ * provided `readerSchema` may have different `opts` (e.g. logicalTypes / unionWrap flags)
195
+ * see https://github.com/mtth/avsc/issues/362 */
196
+ return readerSchema.fromBuffer(payload);
197
+ }
198
+ else {
199
+ // decode using a resolver from writer type into reader type
200
+ return readerSchema.fromBuffer(payload, readerSchema.createResolver(writerSchema));
201
+ }
202
+ }
203
+ return writerSchema.fromBuffer(payload);
204
+ }
205
+ async getRegistryId(subject, version) {
206
+ const response = await this.api.Subject.version({ subject, version });
207
+ const { id } = response.data();
208
+ return id;
209
+ }
210
+ async getRegistryIdBySchema(subject, schema) {
211
+ try {
212
+ const confluentSchema = this.getConfluentSchema(schema);
213
+ const response = await this.api.Subject.registered({
214
+ subject,
215
+ body: {
216
+ schemaType: confluentSchema.type === _types_1.SchemaType.AVRO ? undefined : confluentSchema.type,
217
+ schema: confluentSchema.schema,
218
+ },
219
+ });
220
+ const { id } = response.data();
221
+ return id;
222
+ }
223
+ catch (error) {
224
+ if (error.status && error.status === 404) {
225
+ throw new errors_1.ConfluentSchemaRegistryError(error);
226
+ }
227
+ throw error;
228
+ }
229
+ }
230
+ async getLatestSchemaId(subject) {
231
+ const response = await this.api.Subject.latestVersion({ subject });
232
+ const { id } = response.data();
233
+ return id;
234
+ }
235
+ getSchemaOriginRequest(registryId) {
236
+ // ensure that cache-misses result in a single origin request
237
+ if (this.cacheMissRequests[registryId]) {
238
+ return this.cacheMissRequests[registryId];
239
+ }
240
+ else {
241
+ const request = this.api.Schema.find({ id: registryId }).finally(() => {
242
+ delete this.cacheMissRequests[registryId];
243
+ });
244
+ this.cacheMissRequests[registryId] = request;
245
+ return request;
246
+ }
247
+ }
248
+ }
249
+ exports.default = SchemaRegistry;
250
+ //# sourceMappingURL=SchemaRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaRegistry.js","sourceRoot":"","sources":["../src/SchemaRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /// <reference types="node" />
2
+ import { Agent } from 'http';
3
+ import { Authorization, Client } from 'mappersmith';
4
+ import { RetryMiddlewareOptions } from 'mappersmith/middleware/retry/v2';
5
+ export interface SchemaRegistryAPIClientArgs {
6
+ host: string;
7
+ auth?: Authorization;
8
+ clientId?: string;
9
+ retry?: Partial<RetryMiddlewareOptions>;
10
+ /** HTTP Agent that will be passed to underlying API calls */
11
+ agent?: Agent;
12
+ }
13
+ export declare type SchemaRegistryAPIClient = Client<{
14
+ Schema: {
15
+ find: (_: any) => any;
16
+ };
17
+ Subject: {
18
+ all: (_: any) => any;
19
+ latestVersion: (_: any) => any;
20
+ version: (_: any) => any;
21
+ config: (_: any) => any;
22
+ updateConfig: (_: any) => any;
23
+ register: (_: any) => any;
24
+ registered: (_: any) => any;
25
+ compatible: (_: any) => any;
26
+ };
27
+ }>;
28
+ declare const _default: ({ auth, clientId: userClientId, host, retry, agent, }: SchemaRegistryAPIClientArgs) => Client<{
29
+ Schema: {
30
+ find: (_: any) => any;
31
+ };
32
+ Subject: {
33
+ all: (_: any) => any;
34
+ latestVersion: (_: any) => any;
35
+ version: (_: any) => any;
36
+ config: (_: any) => any;
37
+ updateConfig: (_: any) => any;
38
+ register: (_: any) => any;
39
+ registered: (_: any) => any;
40
+ compatible: (_: any) => any;
41
+ };
42
+ }>;
43
+ export default _default;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const mappersmith_1 = __importDefault(require("mappersmith"));
7
+ const v2_1 = __importDefault(require("mappersmith/middleware/retry/v2"));
8
+ const basic_auth_1 = __importDefault(require("mappersmith/middleware/basic-auth"));
9
+ const constants_1 = require("../constants");
10
+ const errorMiddleware_1 = __importDefault(require("./middleware/errorMiddleware"));
11
+ const confluentEncoderMiddleware_1 = __importDefault(require("./middleware/confluentEncoderMiddleware"));
12
+ const userAgent_1 = __importDefault(require("./middleware/userAgent"));
13
+ const DEFAULT_RETRY = {
14
+ maxRetryTimeInSecs: 5,
15
+ initialRetryTimeInSecs: 0.1,
16
+ factor: 0.2,
17
+ multiplier: 2,
18
+ retries: 3,
19
+ };
20
+ exports.default = ({ auth, clientId: userClientId, host, retry = {}, agent, }) => {
21
+ const clientId = userClientId || constants_1.DEFAULT_API_CLIENT_ID;
22
+ // FIXME: ResourcesType typings is not exposed by mappersmith
23
+ const manifest = {
24
+ clientId,
25
+ ignoreGlobalMiddleware: true,
26
+ host,
27
+ middleware: [
28
+ userAgent_1.default,
29
+ confluentEncoderMiddleware_1.default,
30
+ v2_1.default(Object.assign(DEFAULT_RETRY, retry)),
31
+ errorMiddleware_1.default,
32
+ ...(auth ? [basic_auth_1.default(auth)] : []),
33
+ ],
34
+ resources: {
35
+ Schema: {
36
+ find: {
37
+ method: 'get',
38
+ path: '/schemas/ids/{id}',
39
+ },
40
+ },
41
+ Subject: {
42
+ all: {
43
+ method: 'get',
44
+ path: '/subjects',
45
+ },
46
+ latestVersion: {
47
+ method: 'get',
48
+ path: '/subjects/{subject}/versions/latest',
49
+ },
50
+ version: {
51
+ method: 'get',
52
+ path: '/subjects/{subject}/versions/{version}',
53
+ },
54
+ registered: {
55
+ method: 'post',
56
+ path: '/subjects/{subject}',
57
+ },
58
+ config: {
59
+ method: 'get',
60
+ path: '/config/{subject}',
61
+ },
62
+ updateConfig: {
63
+ method: 'put',
64
+ path: '/config/{subject}',
65
+ },
66
+ register: {
67
+ method: 'post',
68
+ path: '/subjects/{subject}/versions',
69
+ },
70
+ compatible: {
71
+ method: 'post',
72
+ path: '/compatibility/subjects/{subject}/versions/{version}',
73
+ params: { version: 'latest' },
74
+ },
75
+ },
76
+ },
77
+ };
78
+ // if an agent was provided, bind the agent to the mappersmith configs
79
+ if (agent) {
80
+ // gatewayConfigs is not listed as a type on manifest object in mappersmith
81
+ ;
82
+ manifest.gatewayConfigs = {
83
+ HTTP: {
84
+ configure: () => ({ agent }),
85
+ },
86
+ };
87
+ }
88
+ return mappersmith_1.default(manifest);
89
+ };
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";;;;;AACA,8DAAyF;AACzF,yEAAyF;AACzF,mFAAmE;AAEnE,4CAAoD;AACpD,mFAA0D;AAC1D,yGAAsE;AACtE,uEAAwD;AAExD,MAAM,aAAa,GAAG;IACpB,kBAAkB,EAAE,CAAC;IACrB,sBAAsB,EAAE,GAAG;IAC3B,MAAM,EAAE,GAAG;IACX,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,CAAC;CACX,CAAA;AA4BD,kBAAe,CAAC,EACd,IAAI,EACJ,QAAQ,EAAE,YAAY,EACtB,IAAI,EACJ,KAAK,GAAG,EAAE,EACV,KAAK,GACuB,EAA2B,EAAE;IACzD,MAAM,QAAQ,GAAG,YAAY,IAAI,iCAAqB,CAAA;IACtD,6DAA6D;IAC7D,MAAM,QAAQ,GAAiB;QAC7B,QAAQ;QACR,sBAAsB,EAAE,IAAI;QAC5B,IAAI;QACJ,UAAU,EAAE;YACV,mBAAmB;YACnB,oCAAgB;YAChB,YAAe,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACpD,yBAAe;YACf,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7C;QACD,SAAS,EAAE;YACT,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,mBAAmB;iBAC1B;aACF;YACD,OAAO,EAAE;gBACP,GAAG,EAAE;oBACH,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,WAAW;iBAClB;gBACD,aAAa,EAAE;oBACb,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,qCAAqC;iBAC5C;gBACD,OAAO,EAAE;oBACP,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,wCAAwC;iBAC/C;gBACD,UAAU,EAAE;oBACV,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,qBAAqB;iBAC5B;gBAED,MAAM,EAAE;oBACN,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,mBAAmB;iBAC1B;gBACD,YAAY,EAAE;oBACZ,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,mBAAmB;iBAC1B;gBAED,QAAQ,EAAE;oBACR,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,8BAA8B;iBACrC;gBACD,UAAU,EAAE;oBACV,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,sDAAsD;oBAC5D,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;iBAC9B;aACF;SACF;KACF,CAAA;IACD,sEAAsE;IACtE,IAAI,KAAK,EAAE;QACT,2EAA2E;QAC3E,CAAC;QAAE,QAA0E,CAAC,cAAc,GAAG;YAC7F,IAAI,EAAE;gBACJ,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;aAC7B;SACF,CAAA;KACF;IACD,OAAO,qBAAK,CAAC,QAAQ,CAAC,CAAA;AACxB,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Middleware } from 'mappersmith';
2
+ declare const confluentEncoderMiddleware: Middleware;
3
+ export default confluentEncoderMiddleware;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const REQUEST_HEADERS = {
4
+ 'Content-Type': 'application/vnd.schemaregistry.v1+json',
5
+ };
6
+ const updateContentType = (response) => response.enhance({
7
+ headers: {
8
+ 'content-type': 'application/json',
9
+ },
10
+ });
11
+ const confluentEncoderMiddleware = () => ({
12
+ request: req => {
13
+ try {
14
+ if (req.body()) {
15
+ return req.enhance({
16
+ headers: REQUEST_HEADERS,
17
+ body: JSON.stringify(req.body()),
18
+ });
19
+ }
20
+ }
21
+ catch (_) { }
22
+ return req.enhance({ headers: REQUEST_HEADERS });
23
+ },
24
+ response: next => next()
25
+ .then(updateContentType)
26
+ .catch((response) => {
27
+ throw updateContentType(response);
28
+ }),
29
+ });
30
+ exports.default = confluentEncoderMiddleware;
31
+ //# sourceMappingURL=confluentEncoderMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluentEncoderMiddleware.js","sourceRoot":"","sources":["../../../src/api/middleware/confluentEncoderMiddleware.ts"],"names":[],"mappings":";;AAEA,MAAM,eAAe,GAAG;IACtB,cAAc,EAAE,wCAAwC;CACzD,CAAA;AAED,MAAM,iBAAiB,GAAG,CAAC,QAAkB,EAAE,EAAE,CAC/C,QAAQ,CAAC,OAAO,CAAC;IACf,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAA;AAEJ,MAAM,0BAA0B,GAAe,GAAG,EAAE,CAAC,CAAC;IACpD,OAAO,EAAE,GAAG,CAAC,EAAE;QACb,IAAI;YACF,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE;gBACd,OAAO,GAAG,CAAC,OAAO,CAAC;oBACjB,OAAO,EAAE,eAAe;oBACxB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;iBACjC,CAAC,CAAA;aACH;SACF;QAAC,OAAO,CAAC,EAAE,GAAE;QAEd,OAAO,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,QAAQ,EAAE,IAAI,CAAC,EAAE,CACf,IAAI,EAAE;SACH,IAAI,CAAC,iBAAiB,CAAC;SACvB,KAAK,CAAC,CAAC,QAAkB,EAAE,EAAE;QAC5B,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC,CAAC;CACP,CAAC,CAAA;AAEF,kBAAe,0BAA0B,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Middleware } from 'mappersmith';
2
+ declare const errorMiddleware: Middleware;
3
+ export default errorMiddleware;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class ResponseError extends Error {
4
+ constructor(clientName, response) {
5
+ super(`${clientName} - ${response.data().message ||
6
+ `Error, status ${response.status()}${response.data() ? `: ${response.data()}` : ''}`}`);
7
+ const request = response.request();
8
+ this.name = this.constructor.name;
9
+ this.status = response.status();
10
+ this.unauthorized = this.status === 401;
11
+ this.url = `${request.method()} ${request.url()}`;
12
+ }
13
+ }
14
+ const errorMiddleware = ({ clientId }) => ({
15
+ response: next => new Promise((resolve, reject) => next()
16
+ .then(resolve)
17
+ .catch((response) => reject(new ResponseError(clientId, response)))),
18
+ });
19
+ exports.default = errorMiddleware;
20
+ //# sourceMappingURL=errorMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorMiddleware.js","sourceRoot":"","sources":["../../../src/api/middleware/errorMiddleware.ts"],"names":[],"mappings":";;AAQA,MAAM,aAAc,SAAQ,KAAK;IAK/B,YAAY,UAAkB,EAAE,QAA4B;QAC1D,KAAK,CACH,GAAG,UAAU,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO;YACxC,iBAAiB,QAAQ,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CACzF,CAAA;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAA;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;QACjC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAA;QAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG,CAAA;QACvC,IAAI,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CAAA;IACnD,CAAC;CACF;AAED,MAAM,eAAe,GAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,QAAQ,EAAE,IAAI,CAAC,EAAE,CACf,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAC9B,IAAI,EAAE;SACH,IAAI,CAAC,OAAO,CAAC;SACb,KAAK,CAAC,CAAC,QAAkB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAChF;CACJ,CAAC,CAAA;AAEF,kBAAe,eAAe,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Middleware } from 'mappersmith';
2
+ declare const userAgentMiddleware: Middleware;
3
+ export default userAgentMiddleware;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants_1 = require("../../constants");
4
+ const product = '@kafkajs/confluent-schema-registry';
5
+ const userAgentMiddleware = ({ clientId }) => {
6
+ const comment = clientId !== constants_1.DEFAULT_API_CLIENT_ID ? clientId : undefined;
7
+ const userAgent = comment ? `${product} (${comment})` : product;
8
+ const headers = {
9
+ 'User-Agent': userAgent,
10
+ };
11
+ return {
12
+ prepareRequest: next => {
13
+ return next().then(req => req.enhance({ headers }));
14
+ },
15
+ };
16
+ };
17
+ exports.default = userAgentMiddleware;
18
+ //# sourceMappingURL=userAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userAgent.js","sourceRoot":"","sources":["../../../src/api/middleware/userAgent.ts"],"names":[],"mappings":";;AACA,+CAAuD;AAEvD,MAAM,OAAO,GAAG,oCAAoC,CAAA;AAEpD,MAAM,mBAAmB,GAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IACvD,MAAM,OAAO,GAAG,QAAQ,KAAK,iCAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;IACzE,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAA;IAC/D,MAAM,OAAO,GAAG;QACd,YAAY,EAAE,SAAS;KACxB,CAAA;IACD,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,EAAE;YACrB,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QACrD,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AAED,kBAAe,mBAAmB,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { AvroSchema, Schema, SchemaType } from './@types';
2
+ declare type CacheEntry = {
3
+ type: SchemaType;
4
+ schema: Schema | AvroSchema;
5
+ };
6
+ export default class Cache {
7
+ registryIdBySubject: {
8
+ [key: string]: number;
9
+ };
10
+ schemasByRegistryId: {
11
+ [key: string]: CacheEntry;
12
+ };
13
+ constructor();
14
+ getLatestRegistryId: (subject: string) => number | undefined;
15
+ setLatestRegistryId: (subject: string, id: number) => number;
16
+ getSchema: (registryId: number) => CacheEntry | undefined;
17
+ setSchema: (registryId: number, type: SchemaType, schema: Schema) => CacheEntry;
18
+ clear: () => void;
19
+ }
20
+ export {};