confluent-schema-registry 3.3.2

Sign up to get free protection for your applications and to get access to all the features.
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 {};