@orion-js/echoes 4.0.0-next.8 → 4.0.0
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.
- package/dist/index.cjs +78 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -18
- package/dist/index.d.ts +35 -18
- package/dist/index.js +76 -58
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.cjs
CHANGED
|
@@ -32,7 +32,9 @@ __export(index_exports, {
|
|
|
32
32
|
EchoEvent: () => EchoEvent,
|
|
33
33
|
EchoRequest: () => EchoRequest,
|
|
34
34
|
Echoes: () => Echoes,
|
|
35
|
-
|
|
35
|
+
createEchoEvent: () => createEchoEvent,
|
|
36
|
+
createEchoRequest: () => createEchoRequest,
|
|
37
|
+
echo: () => echo,
|
|
36
38
|
getServiceEchoes: () => getServiceEchoes,
|
|
37
39
|
publish: () => publish,
|
|
38
40
|
request: () => request,
|
|
@@ -45,19 +47,13 @@ module.exports = __toCommonJS(index_exports);
|
|
|
45
47
|
var config = {};
|
|
46
48
|
var config_default = config;
|
|
47
49
|
|
|
48
|
-
// src/echo/types.ts
|
|
49
|
-
var types_default = {
|
|
50
|
-
event: "event",
|
|
51
|
-
request: "request"
|
|
52
|
-
};
|
|
53
|
-
|
|
54
50
|
// src/requestsHandler/getEcho.ts
|
|
55
51
|
function getEcho_default(method) {
|
|
56
52
|
const echo2 = config_default.echoes[method];
|
|
57
53
|
if (!echo2) {
|
|
58
54
|
throw new Error(`Echo named ${method} not found in this service`);
|
|
59
55
|
}
|
|
60
|
-
if (echo2.type !==
|
|
56
|
+
if (echo2.type !== "request") {
|
|
61
57
|
throw new Error(`Echo named ${method} is not of type request`);
|
|
62
58
|
}
|
|
63
59
|
return echo2;
|
|
@@ -161,9 +157,7 @@ var KafkaManager = class {
|
|
|
161
157
|
this.options = options;
|
|
162
158
|
this.producer = this.kafka.producer(options.producer);
|
|
163
159
|
this.consumer = this.kafka.consumer(options.consumer);
|
|
164
|
-
this.topics = Object.keys(options.echoes).filter(
|
|
165
|
-
(key) => options.echoes[key].type === types_default.event
|
|
166
|
-
);
|
|
160
|
+
this.topics = Object.keys(options.echoes).filter((key) => options.echoes[key].type === "event");
|
|
167
161
|
}
|
|
168
162
|
async checkJoinConsumerGroupConditions() {
|
|
169
163
|
const admin = this.kafka.admin();
|
|
@@ -233,7 +227,7 @@ var KafkaManager = class {
|
|
|
233
227
|
}
|
|
234
228
|
async handleMessage(params) {
|
|
235
229
|
const echo2 = this.options.echoes[params.topic];
|
|
236
|
-
if (!echo2 || echo2.type !==
|
|
230
|
+
if (!echo2 || echo2.type !== "event") {
|
|
237
231
|
console.warn(`Echoes: Received a message for an unknown topic: ${params.topic}, ignoring it`);
|
|
238
232
|
return;
|
|
239
233
|
}
|
|
@@ -337,39 +331,6 @@ async function publish(options) {
|
|
|
337
331
|
});
|
|
338
332
|
}
|
|
339
333
|
|
|
340
|
-
// src/echo/deserialize.ts
|
|
341
|
-
function deserialize_default(serializedJavascript) {
|
|
342
|
-
try {
|
|
343
|
-
return eval("(" + serializedJavascript + ")");
|
|
344
|
-
} catch (error) {
|
|
345
|
-
throw new Error("Error deserializing echo message");
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
// src/echo/index.ts
|
|
350
|
-
var echo = function createNewEcho(options) {
|
|
351
|
-
return {
|
|
352
|
-
...options,
|
|
353
|
-
onMessage: async (messageData) => {
|
|
354
|
-
const { message } = messageData;
|
|
355
|
-
const data = deserialize_default(message.value.toString());
|
|
356
|
-
const context = {
|
|
357
|
-
...messageData,
|
|
358
|
-
data
|
|
359
|
-
};
|
|
360
|
-
await options.resolve(data.params || {}, context);
|
|
361
|
-
},
|
|
362
|
-
onRequest: async (serializedParams) => {
|
|
363
|
-
const context = {};
|
|
364
|
-
const params = deserialize_default(serializedParams);
|
|
365
|
-
const result = await options.resolve(params || {}, context);
|
|
366
|
-
return result;
|
|
367
|
-
}
|
|
368
|
-
};
|
|
369
|
-
};
|
|
370
|
-
echo.types = types_default;
|
|
371
|
-
var echo_default = echo;
|
|
372
|
-
|
|
373
334
|
// src/request/getURL.ts
|
|
374
335
|
function getURL_default(serviceName) {
|
|
375
336
|
var _a, _b;
|
|
@@ -381,6 +342,15 @@ function getURL_default(serviceName) {
|
|
|
381
342
|
return url;
|
|
382
343
|
}
|
|
383
344
|
|
|
345
|
+
// src/echo/deserialize.ts
|
|
346
|
+
function deserialize_default(serializedJavascript) {
|
|
347
|
+
try {
|
|
348
|
+
return eval("(" + serializedJavascript + ")");
|
|
349
|
+
} catch (error) {
|
|
350
|
+
throw new Error("Error deserializing echo message");
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
384
354
|
// src/request/makeRequest.ts
|
|
385
355
|
var import_axios = __toESM(require("axios"), 1);
|
|
386
356
|
var import_helpers2 = require("@orion-js/helpers");
|
|
@@ -452,12 +422,52 @@ async function request(options) {
|
|
|
452
422
|
}
|
|
453
423
|
}
|
|
454
424
|
|
|
425
|
+
// src/echo/index.ts
|
|
426
|
+
var import_schema2 = require("@orion-js/schema");
|
|
427
|
+
var echo = function createNewEcho(options) {
|
|
428
|
+
const resolve = async (params, context) => {
|
|
429
|
+
const cleaned = options.params ? await (0, import_schema2.cleanAndValidate)(options.params, params) : params ?? {};
|
|
430
|
+
const result = await options.resolve(cleaned, context);
|
|
431
|
+
if (options.returns) {
|
|
432
|
+
return await (0, import_schema2.clean)(options.returns, result);
|
|
433
|
+
}
|
|
434
|
+
return result;
|
|
435
|
+
};
|
|
436
|
+
return {
|
|
437
|
+
type: options.type,
|
|
438
|
+
params: options.params,
|
|
439
|
+
returns: options.returns,
|
|
440
|
+
attemptsBeforeDeadLetter: options.type === "event" ? options.attemptsBeforeDeadLetter : void 0,
|
|
441
|
+
resolve,
|
|
442
|
+
onMessage: async (messageData) => {
|
|
443
|
+
const { message } = messageData;
|
|
444
|
+
const data = deserialize_default(message.value.toString());
|
|
445
|
+
const context = {
|
|
446
|
+
...messageData,
|
|
447
|
+
data
|
|
448
|
+
};
|
|
449
|
+
await resolve(data.params, context);
|
|
450
|
+
},
|
|
451
|
+
onRequest: async (serializedParams) => {
|
|
452
|
+
const context = {};
|
|
453
|
+
const params = deserialize_default(serializedParams);
|
|
454
|
+
return await resolve(params, context);
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
};
|
|
458
|
+
function createEchoRequest(options) {
|
|
459
|
+
return echo({ ...options, type: "request" });
|
|
460
|
+
}
|
|
461
|
+
function createEchoEvent(options) {
|
|
462
|
+
return echo({ ...options, type: "event" });
|
|
463
|
+
}
|
|
464
|
+
|
|
455
465
|
// src/service/index.ts
|
|
456
466
|
var import_services = require("@orion-js/services");
|
|
457
467
|
var serviceMetadata = /* @__PURE__ */ new WeakMap();
|
|
458
468
|
var echoesMetadata = /* @__PURE__ */ new WeakMap();
|
|
459
469
|
function Echoes() {
|
|
460
|
-
return
|
|
470
|
+
return (target, context) => {
|
|
461
471
|
(0, import_services.Service)()(target, context);
|
|
462
472
|
context.addInitializer(function() {
|
|
463
473
|
serviceMetadata.set(this, { _serviceType: "echoes" });
|
|
@@ -465,30 +475,38 @@ function Echoes() {
|
|
|
465
475
|
};
|
|
466
476
|
}
|
|
467
477
|
function EchoEvent(options = {}) {
|
|
468
|
-
return
|
|
478
|
+
return (method, context) => {
|
|
469
479
|
const propertyKey = String(context.name);
|
|
470
480
|
context.addInitializer(function() {
|
|
471
481
|
const echoes = echoesMetadata.get(this) || {};
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
482
|
+
if (context.kind === "method") {
|
|
483
|
+
echoes[propertyKey] = createEchoEvent({
|
|
484
|
+
...options,
|
|
485
|
+
resolve: this[propertyKey].bind(this)
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
if (context.kind === "field") {
|
|
489
|
+
echoes[propertyKey] = this[propertyKey];
|
|
490
|
+
}
|
|
477
491
|
echoesMetadata.set(this, echoes);
|
|
478
492
|
});
|
|
479
493
|
return method;
|
|
480
494
|
};
|
|
481
495
|
}
|
|
482
496
|
function EchoRequest(options = {}) {
|
|
483
|
-
return
|
|
497
|
+
return (method, context) => {
|
|
484
498
|
const propertyKey = String(context.name);
|
|
485
499
|
context.addInitializer(function() {
|
|
486
500
|
const echoes = echoesMetadata.get(this) || {};
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
501
|
+
if (context.kind === "method") {
|
|
502
|
+
echoes[propertyKey] = createEchoRequest({
|
|
503
|
+
...options,
|
|
504
|
+
resolve: this[propertyKey].bind(this)
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
if (context.kind === "field") {
|
|
508
|
+
echoes[propertyKey] = this[propertyKey];
|
|
509
|
+
}
|
|
492
510
|
echoesMetadata.set(this, echoes);
|
|
493
511
|
});
|
|
494
512
|
return method;
|
|
@@ -511,6 +529,8 @@ function getServiceEchoes(target) {
|
|
|
511
529
|
EchoEvent,
|
|
512
530
|
EchoRequest,
|
|
513
531
|
Echoes,
|
|
532
|
+
createEchoEvent,
|
|
533
|
+
createEchoRequest,
|
|
514
534
|
echo,
|
|
515
535
|
getServiceEchoes,
|
|
516
536
|
publish,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/echo/types.ts","../src/requestsHandler/getEcho.ts","../src/publish/serialize.ts","../src/request/getSignature.ts","../src/request/getPassword.ts","../src/requestsHandler/checkSignature.ts","../src/requestsHandler/index.ts","../src/startService/KafkaManager.ts","../src/startService/index.ts","../src/publish/index.ts","../src/echo/deserialize.ts","../src/echo/index.ts","../src/request/getURL.ts","../src/request/makeRequest.ts","../src/request/index.ts","../src/service/index.ts"],"sourcesContent":["import startService, {stopService} from './startService'\nimport publish from './publish'\nimport echo from './echo'\nimport request from './request'\n\nexport * from './types'\nexport * from './service'\n\nexport {publish, startService, stopService, echo, request}\n","import {EchoesConfigHandler} from './types'\n\nconst config: EchoesConfigHandler = {}\n\nexport default config\n","export default {\n event: 'event',\n request: 'request',\n}\n","import config from '../config'\nimport types from '../echo/types'\n\nexport default function (method: string) {\n const echo = config.echoes[method]\n\n if (!echo) {\n throw new Error(`Echo named ${method} not found in this service`)\n }\n\n if (echo.type !== types.request) {\n throw new Error(`Echo named ${method} is not of type request`)\n }\n\n return echo\n}\n","import serialize from 'serialize-javascript'\nimport {clone} from '@orion-js/helpers'\n\nexport default function (data: any): string {\n const cloned = clone(data)\n const serialized = serialize(cloned, {ignoreFunction: true})\n return serialized\n}\n","import JSSHA from 'jssha'\nimport {getEchoesPassword} from './getPassword'\n\nexport default function (body: any): string {\n const password = getEchoesPassword()\n const shaObj = new JSSHA('SHA-1', 'TEXT')\n shaObj.setHMACKey(password, 'TEXT')\n shaObj.update(body)\n return shaObj.getHMAC('HEX')\n}\n","import config from '../config'\nimport {internalGetEnv} from '@orion-js/env'\n\nexport function getEchoesPassword() {\n const secret = config?.requests?.key || internalGetEnv('echoes_password', 'ECHOES_PASSWORD')\n if (!secret) {\n console.warn(\n 'Warning: no secret key found for echoes requests. Init echoes or set the env var \"echoes_password\" or process.env.ECHOES_PASSWORD',\n )\n }\n\n return secret\n}\n","import getSignature from '../request/getSignature'\n\nexport default function (body: any, signature: string) {\n const generatedSignature = getSignature(body)\n if (generatedSignature !== signature) {\n throw new Error('Echoes invalid signature')\n }\n}\n","import getEcho from './getEcho'\nimport serialize from '../publish/serialize'\nimport checkSignature from './checkSignature'\nimport {route} from '@orion-js/http'\nimport {EchoesOptions} from '../types'\n\nexport default (options: EchoesOptions) =>\n route({\n method: 'post',\n path: options.requests.handlerPath || '/echoes-services',\n bodyParser: 'json',\n bodyParserOptions: {\n limit: '10mb',\n },\n async resolve(req) {\n try {\n const {body, signature} = req.body\n\n checkSignature(body, signature)\n\n const {method, serializedParams} = body\n\n const echo = getEcho(method)\n const result = await echo.onRequest(serializedParams)\n\n return {\n body: {\n result: serialize(result),\n },\n }\n } catch (error) {\n if (!error.getInfo) {\n console.error('Error at echo requests handler:', error)\n }\n\n return {\n body: {\n error: error.message,\n errorInfo: error.getInfo ? error.getInfo() : null,\n isValidationError: !!error.isValidationError,\n isUserError: !!error.isUserError,\n },\n }\n }\n },\n })\n","import {Kafka, EachMessagePayload, Producer, Consumer} from 'kafkajs'\nimport types from '../echo/types'\nimport {EchoesOptions, EchoType} from '../types'\n\nconst HEARTBEAT_INTERVAL_SECONDS = 5 // This value must be less than the kafkajs session timeout\nconst CHECK_JOIN_CONSUMER_INTERVAL_SECONDS = 30\nconst DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY = 4 // How many partitions to consume concurrently, adjust this with the members to partitions ratio to avoid idle consumers.\nconst DEFAULT_MEMBERS_TO_PARTITIONS_RATIO = 1 // How many members are in comparison to partitions, this is used to determine if the consumer group has room for more members. Numbers over 1 leads to idle consumers. Numbers under 1 needs partitionsConsumedConcurrently to be more than 1.\n\n/**\n * Manages the Kafka connection and the consumers.\n */\nclass KafkaManager {\n kafka: Kafka\n options: EchoesOptions\n producer: Producer\n consumer: Consumer\n topics: string[]\n started: boolean\n interval: NodeJS.Timer\n\n constructor(options: EchoesOptions) {\n this.kafka = new Kafka(options.client)\n this.options = options\n this.producer = this.kafka.producer(options.producer)\n this.consumer = this.kafka.consumer(options.consumer)\n this.topics = Object.keys(options.echoes).filter(\n key => options.echoes[key].type === types.event,\n )\n }\n\n async checkJoinConsumerGroupConditions(): Promise<boolean> {\n const admin = this.kafka.admin()\n try {\n await admin.connect()\n const groupDescriptions = await admin.describeGroups([this.options.consumer.groupId])\n const group = groupDescriptions.groups[0]\n if (group.state === 'Empty') {\n console.info(`Echoes: Consumer group ${this.options.consumer.groupId} is empty, joining`)\n return true\n }\n const topicsMetadata = await admin.fetchTopicMetadata({topics: this.topics})\n const totalPartitions = topicsMetadata.topics.reduce(\n (acc, topic) => acc + topic.partitions.length,\n 0,\n )\n console.info(\n `Echoes: Consumer group ${this.options.consumer.groupId} has ${group.members.length} members and ${totalPartitions} partitions`,\n )\n const partitionsRatio =\n this.options.membersToPartitionsRatio || DEFAULT_MEMBERS_TO_PARTITIONS_RATIO\n const partitionsThreshold = Math.ceil(totalPartitions * partitionsRatio)\n if (partitionsThreshold > group.members.length) {\n console.info(\n `Echoes: Consumer group ${this.options.consumer.groupId} has room for more members ${group.members.length}/${partitionsThreshold}, joining`,\n )\n return true\n }\n } catch (error) {\n console.error(`Echoes: Error checking consumer group conditions, join: ${error.message}`)\n return true\n } finally {\n await admin.disconnect().catch(error => {\n console.error(`Echoes: Error disconnecting admin client: ${error.message}`)\n })\n }\n }\n\n async joinConsumerGroup() {\n await this.consumer.connect()\n await this.consumer.subscribe({topics: this.topics})\n await this.consumer.run({\n partitionsConsumedConcurrently:\n this.options.partitionsConsumedConcurrently || DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY,\n eachMessage: params => this.handleMessage(params),\n })\n }\n\n async conditionalStart(): Promise<boolean> {\n if (await this.checkJoinConsumerGroupConditions()) {\n await this.joinConsumerGroup()\n return true\n }\n }\n\n async start() {\n if (this.started) return\n await this.producer.connect()\n this.started = await this.conditionalStart()\n if (this.started) return\n console.info('Echoes: Delaying consumer group join, waiting for conditions to be met')\n this.interval = setInterval(async () => {\n this.started = await this.conditionalStart()\n if (this.started) clearInterval(this.interval)\n }, CHECK_JOIN_CONSUMER_INTERVAL_SECONDS * 1000)\n }\n\n async stop() {\n console.warn('Echoes: Stopping echoes')\n if (this.interval) clearInterval(this.interval)\n if (this.consumer) await this.consumer.disconnect()\n if (this.producer) await this.producer.disconnect()\n }\n\n async handleMessage(params: EachMessagePayload) {\n const echo = this.options.echoes[params.topic]\n if (!echo || echo.type !== types.event) {\n console.warn(`Echoes: Received a message for an unknown topic: ${params.topic}, ignoring it`)\n return\n }\n\n let intervalsCount = 0\n const heartbeatInterval = setInterval(async () => {\n await params.heartbeat().catch(error => {\n console.warn(`Echoes: Error sending heartbeat: ${error.message}`)\n })\n intervalsCount++\n if ((intervalsCount * HEARTBEAT_INTERVAL_SECONDS) % 30 === 0) {\n console.warn(\n `Echoes: Event is taking too long to process: ${params.topic} ${intervalsCount * HEARTBEAT_INTERVAL_SECONDS}s`,\n )\n }\n }, HEARTBEAT_INTERVAL_SECONDS * 1000)\n\n try {\n await echo.onMessage(params).catch(error => this.handleRetries(echo, params, error))\n } catch (error) {\n console.error(`Echoes: error processing a message: ${params.topic} ${error.message}`)\n throw error\n } finally {\n clearInterval(heartbeatInterval)\n }\n }\n\n async handleRetries(echo: EchoType, params: EachMessagePayload, error: Error) {\n const {message, topic} = params\n const retries = Number.parseInt(message?.headers?.retries?.toString() || '0', 10)\n if (echo.attemptsBeforeDeadLetter === undefined || echo.attemptsBeforeDeadLetter === null) {\n throw error\n }\n const maxRetries = echo.attemptsBeforeDeadLetter || 0\n const exceededMaxRetries = retries >= maxRetries\n const nextTopic = exceededMaxRetries ? `DLQ-${topic}` : topic\n await this.producer.send({\n topic: nextTopic,\n messages: [\n {\n value: message.value.toString(),\n headers: {\n retries: String(retries + 1),\n error: error.message,\n },\n },\n ],\n })\n\n if (exceededMaxRetries) {\n console.error(\n `Echoes: a message has reached the maximum number of retries, sending it to DLQ: ${nextTopic}`,\n )\n } else {\n console.warn(\n `Echoes: a retryable message failed \"${error.message}\", re-sending it to topic: ${nextTopic}`,\n )\n }\n }\n}\n\nexport default KafkaManager\n","import config from '../config'\nimport requestsHandler from '../requestsHandler'\nimport {EchoesOptions} from '../types'\nimport KafkaManager from './KafkaManager'\nimport {registerRoute} from '@orion-js/http'\n\nlet kafkaManager: KafkaManager = null\n\nexport default async function startService(options: EchoesOptions) {\n config.echoes = options.echoes\n\n if (options.requests) {\n config.requests = options.requests\n registerRoute(requestsHandler(options))\n }\n\n if (options.client) {\n kafkaManager = new KafkaManager(options)\n await kafkaManager.start()\n config.producer = kafkaManager.producer\n config.consumer = kafkaManager.consumer\n }\n}\n\nexport async function stopService() {\n if (kafkaManager) {\n console.info('Stoping echoes...')\n await kafkaManager.stop()\n console.info('Echoes stopped')\n }\n}\n","import config from '../config'\nimport {PublishOptions} from '../types'\nimport serialize from './serialize'\n\n/**\n * Publish\n */\nexport default async function publish<TParams = any>(options: PublishOptions<TParams>) {\n if (!config.producer) {\n throw new Error('You must initialize echoes configruation to use publish')\n }\n\n const payload = {\n params: options.params,\n }\n\n return await config.producer.send({\n acks: options.acks,\n timeout: options.timeout,\n topic: options.topic,\n messages: [\n {\n value: serialize(payload),\n },\n ],\n })\n}\n","export default function (serializedJavascript: string): any {\n try {\n return eval('(' + serializedJavascript + ')')\n } catch (error) {\n throw new Error('Error deserializing echo message')\n }\n}\n","import {EachMessagePayload} from 'kafkajs'\nimport {EchoType, EchoConfig} from '../types'\nimport deserialize from './deserialize'\nimport types from './types'\n\nconst echo = function createNewEcho(options: EchoConfig): EchoType {\n return {\n ...options,\n onMessage: async (messageData: EachMessagePayload) => {\n const {message} = messageData\n\n const data = deserialize(message.value.toString())\n\n const context = {\n ...messageData,\n data,\n }\n\n await options.resolve(data.params || {}, context)\n },\n onRequest: async (serializedParams: string) => {\n const context = {}\n const params = deserialize(serializedParams)\n const result = await options.resolve(params || {}, context)\n return result\n },\n }\n}\n\necho.types = types\n\nexport default echo\n","import config from '../config'\n\nexport default function (serviceName: string): string {\n if (serviceName.startsWith('http')) return serviceName\n\n const url = config?.requests?.services[serviceName]\n\n if (!url) {\n throw new Error(`No URL found in echoes config for service ${serviceName}`)\n }\n\n return url\n}\n","import axios from 'axios'\nimport {RequestMaker} from '../types'\nimport {executeWithRetries} from '@orion-js/helpers'\n\nexport const makeRequest: RequestMaker = async options => {\n const result = await executeWithRetries(\n async () => {\n return await axios({\n method: 'post',\n url: options.url,\n timeout: options.timeout,\n headers: {\n 'User-Agent': 'Orionjs-Echoes/1.1',\n },\n data: options.data,\n })\n },\n options.retries,\n 200,\n )\n\n return {\n data: result.data as object,\n statusCode: result.status,\n }\n}\n","import getURL from './getURL'\nimport getSignature from './getSignature'\nimport serialize from '../publish/serialize'\nimport deserialize from '../echo/deserialize'\nimport type {\n MakeRequestParams,\n RequestHandlerResponse,\n RequestMaker,\n RequestOptions,\n} from '../types'\nimport config from '../config'\nimport {makeRequest} from './makeRequest'\nimport {ValidationError} from '@orion-js/schema'\nimport {UserError} from '@orion-js/helpers'\n\nexport default async function request<TData = any, TParams = any>(\n options: RequestOptions<TParams>,\n): Promise<TData> {\n const {method, service, params} = options\n const serializedParams = serialize(params)\n const date = new Date()\n const body = {method, service, serializedParams, date}\n const signature = getSignature(body)\n\n try {\n const requestMaker: RequestMaker = config?.requests?.makeRequest || makeRequest\n const requestOptions: MakeRequestParams = {\n url: getURL(service),\n retries: options.retries,\n timeout: options.timeout,\n data: {\n body,\n signature,\n },\n }\n const result = await requestMaker(requestOptions)\n\n if (result.statusCode !== 200) {\n throw new Error(`Wrong status code ${result.statusCode}`)\n }\n\n const data: RequestHandlerResponse = result.data\n\n if (data.error) {\n const info = data.errorInfo\n if (info) {\n if (data.isValidationError) {\n throw new ValidationError(info.validationErrors)\n }\n if (data.isUserError) {\n throw new UserError(info.error, info.message, info.extra)\n }\n }\n\n throw new Error(`${data.error}`)\n }\n\n const response = deserialize(data.result)\n return response\n } catch (error) {\n if (error.isOrionError) throw error\n\n throw new Error(`Echoes request network error calling ${service}/${method}: ${error.message}`)\n }\n}\n","import echo from '../echo'\nimport {EchoConfig, EchoesMap} from '../types'\nimport {getInstance, Service} from '@orion-js/services'\n\nexport interface EchoesPropertyDescriptor extends Omit<PropertyDecorator, 'value'> {\n value?: EchoConfig['resolve']\n}\n// Define metadata storage using WeakMaps\nconst serviceMetadata = new WeakMap<any, {_serviceType: string}>()\nconst echoesMetadata = new WeakMap<any, Record<string, any>>()\n\nexport function Echoes() {\n return function (target: any, context: ClassDecoratorContext<any>) {\n Service()(target, context)\n\n context.addInitializer(function (this) {\n serviceMetadata.set(this, {_serviceType: 'echoes'})\n })\n }\n}\n\nexport function EchoEvent<\n This,\n TArgs extends Parameters<EchoConfig['resolve']>,\n TReturn extends ReturnType<EchoConfig['resolve']>,\n>(options: Omit<EchoConfig, 'resolve' | 'type'> = {}) {\n return function (\n method: (this: This, ...args: TArgs) => TReturn,\n context: ClassMethodDecoratorContext<This, typeof method>,\n ) {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this: This) {\n const echoes = echoesMetadata.get(this) || {}\n\n echoes[propertyKey] = echo({\n ...options,\n type: 'event',\n resolve: this[propertyKey].bind(this),\n })\n\n echoesMetadata.set(this, echoes)\n })\n\n return method\n }\n}\n\nexport function EchoRequest<\n This,\n TArgs extends Parameters<EchoConfig['resolve']>,\n TReturn extends ReturnType<EchoConfig['resolve']>,\n>(options: Omit<EchoConfig, 'resolve' | 'type'> = {}) {\n return function (\n method: (this: This, ...args: TArgs) => TReturn,\n context: ClassMethodDecoratorContext<This, typeof method>,\n ) {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this: This) {\n const echoes = echoesMetadata.get(this) || {}\n\n echoes[propertyKey] = echo({\n ...options,\n type: 'request',\n resolve: this[propertyKey].bind(this),\n })\n\n echoesMetadata.set(this, echoes)\n })\n\n return method\n }\n}\n\nexport function getServiceEchoes(target: any): EchoesMap {\n const instance = getInstance(target)\n\n if (!serviceMetadata.has(instance.constructor)) {\n throw new Error('You must pass a class decorated with @Echoes to getServiceEchoes')\n }\n\n const instanceMetadata = serviceMetadata.get(instance.constructor)\n if (instanceMetadata._serviceType !== 'echoes') {\n throw new Error('You must pass a class decorated with @Echoes to getServiceEchoes')\n }\n\n const echoesMap = echoesMetadata.get(instance) || {}\n\n return echoesMap\n}\n"],"mappings":"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","names":["echo","serialize","JSSHA","echo","echo","import_http","import_helpers","axios","import_helpers"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/requestsHandler/getEcho.ts","../src/publish/serialize.ts","../src/request/getSignature.ts","../src/request/getPassword.ts","../src/requestsHandler/checkSignature.ts","../src/requestsHandler/index.ts","../src/startService/KafkaManager.ts","../src/startService/index.ts","../src/publish/index.ts","../src/request/getURL.ts","../src/echo/deserialize.ts","../src/request/makeRequest.ts","../src/request/index.ts","../src/echo/index.ts","../src/service/index.ts"],"sourcesContent":["import startService, {stopService} from './startService'\nimport publish from './publish'\nimport request from './request'\n\nexport * from './types'\nexport * from './service'\nexport * from './echo'\n\nexport {publish, startService, stopService, request}\n","import {EchoesConfigHandler} from './types'\n\nconst config: EchoesConfigHandler = {}\n\nexport default config\n","import config from '../config'\n\nexport default function (method: string) {\n const echo = config.echoes[method]\n\n if (!echo) {\n throw new Error(`Echo named ${method} not found in this service`)\n }\n\n if (echo.type !== 'request') {\n throw new Error(`Echo named ${method} is not of type request`)\n }\n\n return echo\n}\n","import serialize from 'serialize-javascript'\nimport {clone} from '@orion-js/helpers'\n\nexport default function (data: any): string {\n const cloned = clone(data)\n const serialized = serialize(cloned, {ignoreFunction: true})\n return serialized\n}\n","import JSSHA from 'jssha'\nimport {getEchoesPassword} from './getPassword'\n\nexport default function (body: any): string {\n const password = getEchoesPassword()\n const shaObj = new JSSHA('SHA-1', 'TEXT')\n shaObj.setHMACKey(password, 'TEXT')\n shaObj.update(body)\n return shaObj.getHMAC('HEX')\n}\n","import config from '../config'\nimport {internalGetEnv} from '@orion-js/env'\n\nexport function getEchoesPassword() {\n const secret = config?.requests?.key || internalGetEnv('echoes_password', 'ECHOES_PASSWORD')\n if (!secret) {\n console.warn(\n 'Warning: no secret key found for echoes requests. Init echoes or set the env var \"echoes_password\" or process.env.ECHOES_PASSWORD',\n )\n }\n\n return secret\n}\n","import getSignature from '../request/getSignature'\n\nexport default function (body: any, signature: string) {\n const generatedSignature = getSignature(body)\n if (generatedSignature !== signature) {\n throw new Error('Echoes invalid signature')\n }\n}\n","import getEcho from './getEcho'\nimport serialize from '../publish/serialize'\nimport checkSignature from './checkSignature'\nimport {route} from '@orion-js/http'\nimport {EchoesOptions} from '../types'\n\nexport default (options: EchoesOptions) =>\n route({\n method: 'post',\n path: options.requests.handlerPath || '/echoes-services',\n bodyParser: 'json',\n bodyParserOptions: {\n limit: '10mb',\n },\n async resolve(req) {\n try {\n const {body, signature} = req.body\n\n checkSignature(body, signature)\n\n const {method, serializedParams} = body\n\n const echo = getEcho(method)\n const result = await echo.onRequest(serializedParams)\n\n return {\n body: {\n result: serialize(result),\n },\n }\n } catch (error) {\n if (!error.getInfo) {\n console.error('Error at echo requests handler:', error)\n }\n\n return {\n body: {\n error: error.message,\n errorInfo: error.getInfo ? error.getInfo() : null,\n isValidationError: !!error.isValidationError,\n isUserError: !!error.isUserError,\n },\n }\n }\n },\n })\n","import {Kafka, EachMessagePayload, Producer, Consumer} from 'kafkajs'\nimport {EchoesOptions, EchoType} from '../types'\n\nconst HEARTBEAT_INTERVAL_SECONDS = 5 // This value must be less than the kafkajs session timeout\nconst CHECK_JOIN_CONSUMER_INTERVAL_SECONDS = 30\nconst DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY = 4 // How many partitions to consume concurrently, adjust this with the members to partitions ratio to avoid idle consumers.\nconst DEFAULT_MEMBERS_TO_PARTITIONS_RATIO = 1 // How many members are in comparison to partitions, this is used to determine if the consumer group has room for more members. Numbers over 1 leads to idle consumers. Numbers under 1 needs partitionsConsumedConcurrently to be more than 1.\n\n/**\n * Manages the Kafka connection and the consumers.\n */\nclass KafkaManager {\n kafka: Kafka\n options: EchoesOptions\n producer: Producer\n consumer: Consumer\n topics: string[]\n started: boolean\n interval: NodeJS.Timeout\n\n constructor(options: EchoesOptions) {\n this.kafka = new Kafka(options.client)\n this.options = options\n this.producer = this.kafka.producer(options.producer)\n this.consumer = this.kafka.consumer(options.consumer)\n this.topics = Object.keys(options.echoes).filter(key => options.echoes[key].type === 'event')\n }\n\n async checkJoinConsumerGroupConditions(): Promise<boolean> {\n const admin = this.kafka.admin()\n try {\n await admin.connect()\n const groupDescriptions = await admin.describeGroups([this.options.consumer.groupId])\n const group = groupDescriptions.groups[0]\n if (group.state === 'Empty') {\n console.info(`Echoes: Consumer group ${this.options.consumer.groupId} is empty, joining`)\n return true\n }\n const topicsMetadata = await admin.fetchTopicMetadata({topics: this.topics})\n const totalPartitions = topicsMetadata.topics.reduce(\n (acc, topic) => acc + topic.partitions.length,\n 0,\n )\n console.info(\n `Echoes: Consumer group ${this.options.consumer.groupId} has ${group.members.length} members and ${totalPartitions} partitions`,\n )\n const partitionsRatio =\n this.options.membersToPartitionsRatio || DEFAULT_MEMBERS_TO_PARTITIONS_RATIO\n const partitionsThreshold = Math.ceil(totalPartitions * partitionsRatio)\n if (partitionsThreshold > group.members.length) {\n console.info(\n `Echoes: Consumer group ${this.options.consumer.groupId} has room for more members ${group.members.length}/${partitionsThreshold}, joining`,\n )\n return true\n }\n } catch (error) {\n console.error(`Echoes: Error checking consumer group conditions, join: ${error.message}`)\n return true\n } finally {\n await admin.disconnect().catch(error => {\n console.error(`Echoes: Error disconnecting admin client: ${error.message}`)\n })\n }\n }\n\n async joinConsumerGroup() {\n await this.consumer.connect()\n await this.consumer.subscribe({topics: this.topics})\n await this.consumer.run({\n partitionsConsumedConcurrently:\n this.options.partitionsConsumedConcurrently || DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY,\n eachMessage: params => this.handleMessage(params),\n })\n }\n\n async conditionalStart(): Promise<boolean> {\n if (await this.checkJoinConsumerGroupConditions()) {\n await this.joinConsumerGroup()\n return true\n }\n }\n\n async start() {\n if (this.started) return\n await this.producer.connect()\n this.started = await this.conditionalStart()\n if (this.started) return\n console.info('Echoes: Delaying consumer group join, waiting for conditions to be met')\n this.interval = setInterval(async () => {\n this.started = await this.conditionalStart()\n if (this.started) clearInterval(this.interval)\n }, CHECK_JOIN_CONSUMER_INTERVAL_SECONDS * 1000)\n }\n\n async stop() {\n console.warn('Echoes: Stopping echoes')\n if (this.interval) clearInterval(this.interval)\n if (this.consumer) await this.consumer.disconnect()\n if (this.producer) await this.producer.disconnect()\n }\n\n async handleMessage(params: EachMessagePayload) {\n const echo = this.options.echoes[params.topic]\n if (!echo || echo.type !== 'event') {\n console.warn(`Echoes: Received a message for an unknown topic: ${params.topic}, ignoring it`)\n return\n }\n\n let intervalsCount = 0\n const heartbeatInterval = setInterval(async () => {\n await params.heartbeat().catch(error => {\n console.warn(`Echoes: Error sending heartbeat: ${error.message}`)\n })\n intervalsCount++\n if ((intervalsCount * HEARTBEAT_INTERVAL_SECONDS) % 30 === 0) {\n console.warn(\n `Echoes: Event is taking too long to process: ${params.topic} ${intervalsCount * HEARTBEAT_INTERVAL_SECONDS}s`,\n )\n }\n }, HEARTBEAT_INTERVAL_SECONDS * 1000)\n\n try {\n await echo.onMessage(params).catch(error => this.handleRetries(echo, params, error))\n } catch (error) {\n console.error(`Echoes: error processing a message: ${params.topic} ${error.message}`)\n throw error\n } finally {\n clearInterval(heartbeatInterval)\n }\n }\n\n async handleRetries(echo: EchoType, params: EachMessagePayload, error: Error) {\n const {message, topic} = params\n const retries = Number.parseInt(message?.headers?.retries?.toString() || '0', 10)\n if (echo.attemptsBeforeDeadLetter === undefined || echo.attemptsBeforeDeadLetter === null) {\n throw error\n }\n const maxRetries = echo.attemptsBeforeDeadLetter || 0\n const exceededMaxRetries = retries >= maxRetries\n const nextTopic = exceededMaxRetries ? `DLQ-${topic}` : topic\n await this.producer.send({\n topic: nextTopic,\n messages: [\n {\n value: message.value.toString(),\n headers: {\n retries: String(retries + 1),\n error: error.message,\n },\n },\n ],\n })\n\n if (exceededMaxRetries) {\n console.error(\n `Echoes: a message has reached the maximum number of retries, sending it to DLQ: ${nextTopic}`,\n )\n } else {\n console.warn(\n `Echoes: a retryable message failed \"${error.message}\", re-sending it to topic: ${nextTopic}`,\n )\n }\n }\n}\n\nexport default KafkaManager\n","import config from '../config'\nimport requestsHandler from '../requestsHandler'\nimport {EchoesOptions} from '../types'\nimport KafkaManager from './KafkaManager'\nimport {registerRoute} from '@orion-js/http'\n\nlet kafkaManager: KafkaManager = null\n\nexport default async function startService(options: EchoesOptions) {\n config.echoes = options.echoes\n\n if (options.requests) {\n config.requests = options.requests\n registerRoute(requestsHandler(options))\n }\n\n if (options.client) {\n kafkaManager = new KafkaManager(options)\n await kafkaManager.start()\n config.producer = kafkaManager.producer\n config.consumer = kafkaManager.consumer\n }\n}\n\nexport async function stopService() {\n if (kafkaManager) {\n console.info('Stoping echoes...')\n await kafkaManager.stop()\n console.info('Echoes stopped')\n }\n}\n","import config from '../config'\nimport {PublishOptions} from '../types'\nimport serialize from './serialize'\n\n/**\n * Publish\n */\nexport default async function publish<TParams = any>(options: PublishOptions<TParams>) {\n if (!config.producer) {\n throw new Error('You must initialize echoes configruation to use publish')\n }\n\n const payload = {\n params: options.params,\n }\n\n return await config.producer.send({\n acks: options.acks,\n timeout: options.timeout,\n topic: options.topic,\n messages: [\n {\n value: serialize(payload),\n },\n ],\n })\n}\n","import config from '../config'\n\nexport default function (serviceName: string): string {\n if (serviceName.startsWith('http')) return serviceName\n\n const url = config?.requests?.services[serviceName]\n\n if (!url) {\n throw new Error(`No URL found in echoes config for service ${serviceName}`)\n }\n\n return url\n}\n","export default function (serializedJavascript: string): any {\n try {\n return eval('(' + serializedJavascript + ')')\n } catch (error) {\n throw new Error('Error deserializing echo message')\n }\n}\n","import axios from 'axios'\nimport {RequestMaker} from '../types'\nimport {executeWithRetries} from '@orion-js/helpers'\n\nexport const makeRequest: RequestMaker = async options => {\n const result = await executeWithRetries(\n async () => {\n return await axios({\n method: 'post',\n url: options.url,\n timeout: options.timeout,\n headers: {\n 'User-Agent': 'Orionjs-Echoes/1.1',\n },\n data: options.data,\n })\n },\n options.retries,\n 200,\n )\n\n return {\n data: result.data as object,\n statusCode: result.status,\n }\n}\n","import getURL from './getURL'\nimport getSignature from './getSignature'\nimport serialize from '../publish/serialize'\nimport deserialize from '../echo/deserialize'\nimport type {\n MakeRequestParams,\n RequestHandlerResponse,\n RequestMaker,\n RequestOptions,\n} from '../types'\nimport config from '../config'\nimport {makeRequest} from './makeRequest'\nimport {ValidationError} from '@orion-js/schema'\nimport {UserError} from '@orion-js/helpers'\n\nexport default async function request<TData = any, TParams = any>(\n options: RequestOptions<TParams>,\n): Promise<TData> {\n const {method, service, params} = options\n const serializedParams = serialize(params)\n const date = new Date()\n const body = {method, service, serializedParams, date}\n const signature = getSignature(body)\n\n try {\n const requestMaker: RequestMaker = config?.requests?.makeRequest || makeRequest\n const requestOptions: MakeRequestParams = {\n url: getURL(service),\n retries: options.retries,\n timeout: options.timeout,\n data: {\n body,\n signature,\n },\n }\n const result = await requestMaker(requestOptions)\n\n if (result.statusCode !== 200) {\n throw new Error(`Wrong status code ${result.statusCode}`)\n }\n\n const data: RequestHandlerResponse = result.data\n\n if (data.error) {\n const info = data.errorInfo\n if (info) {\n if (data.isValidationError) {\n throw new ValidationError(info.validationErrors)\n }\n if (data.isUserError) {\n throw new UserError(info.error, info.message, info.extra)\n }\n }\n\n throw new Error(`${data.error}`)\n }\n\n const response = deserialize(data.result)\n return response\n } catch (error) {\n if (error.isOrionError) throw error\n\n throw new Error(`Echoes request network error calling ${service}/${method}: ${error.message}`)\n }\n}\n","import {EachMessagePayload} from 'kafkajs'\nimport {EchoType, EchoConfig, EchoRequestConfig, EchoEventConfig} from '../types'\nimport deserialize from './deserialize'\nimport {clean, cleanAndValidate, InferSchemaType} from '@orion-js/schema'\nimport {SchemaFieldType} from '@orion-js/schema'\n\n/**\n * @deprecated Use createEchoRequest and createEchoEvent instead\n */\nconst echo = function createNewEcho<\n TParamsSchema extends SchemaFieldType,\n TReturnsSchema extends SchemaFieldType,\n TEchoType extends 'event' | 'request',\n>(\n options: EchoConfig<TParamsSchema, TReturnsSchema, TEchoType>,\n): EchoType<TParamsSchema, TReturnsSchema, TEchoType> {\n const resolve = async (params: InferSchemaType<TParamsSchema>, context: any) => {\n const cleaned = options.params\n ? await cleanAndValidate(options.params, params)\n : (params ?? ({} as InferSchemaType<TParamsSchema>))\n\n const result = await options.resolve(cleaned, context)\n\n if (options.returns) {\n return await clean(options.returns, result)\n }\n\n return result\n }\n\n return {\n type: options.type,\n params: options.params,\n returns: options.returns,\n attemptsBeforeDeadLetter:\n options.type === 'event' ? options.attemptsBeforeDeadLetter : undefined,\n resolve,\n onMessage: async (messageData: EachMessagePayload) => {\n const {message} = messageData\n\n const data = deserialize(message.value.toString())\n\n const context = {\n ...messageData,\n data,\n }\n\n await resolve(data.params, context)\n },\n onRequest: async (serializedParams: string) => {\n const context = {}\n const params = deserialize(serializedParams)\n\n return await resolve(params, context)\n },\n }\n}\n\nexport function createEchoRequest<\n TParamsSchema extends SchemaFieldType,\n TReturnsSchema extends SchemaFieldType,\n>(\n options: EchoRequestConfig<TParamsSchema, TReturnsSchema>,\n): EchoType<TParamsSchema, TReturnsSchema, 'request'> {\n return echo({...options, type: 'request'})\n}\nexport function createEchoEvent<\n TParamsSchema extends SchemaFieldType,\n TReturnsSchema extends SchemaFieldType,\n>(\n options: EchoEventConfig<TParamsSchema, TReturnsSchema>,\n): EchoType<TParamsSchema, TReturnsSchema, 'event'> {\n return echo({...options, type: 'event' as any})\n}\n\nexport {echo}\n","import {createEchoEvent, createEchoRequest} from '../echo'\nimport {EchoConfig, EchoesMap} from '../types'\nimport {getInstance, Service} from '@orion-js/services'\n\nexport interface EchoesPropertyDescriptor extends Omit<PropertyDecorator, 'value'> {\n value?: EchoConfig<any, any>['resolve']\n}\n// Define metadata storage using WeakMaps\nconst serviceMetadata = new WeakMap<any, {_serviceType: string}>()\nconst echoesMetadata = new WeakMap<any, Record<string, any>>()\n\nexport function Echoes() {\n return (target: any, context: ClassDecoratorContext<any>) => {\n Service()(target, context)\n\n context.addInitializer(function (this) {\n serviceMetadata.set(this, {_serviceType: 'echoes'})\n })\n }\n}\n\nexport function EchoEvent(): (\n method: any,\n context: ClassFieldDecoratorContext | ClassMethodDecoratorContext,\n) => any\nexport function EchoEvent(\n options?: Omit<EchoConfig<any, any>, 'resolve' | 'type'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function EchoEvent(options = {}) {\n return (method: any, context: ClassMethodDecoratorContext | ClassFieldDecoratorContext) => {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this) {\n const echoes = echoesMetadata.get(this) || {}\n\n if (context.kind === 'method') {\n echoes[propertyKey] = createEchoEvent({\n ...options,\n resolve: this[propertyKey].bind(this),\n })\n }\n\n if (context.kind === 'field') {\n echoes[propertyKey] = this[propertyKey]\n }\n\n echoesMetadata.set(this, echoes)\n })\n\n return method\n }\n}\n\nexport function EchoRequest(): (\n method: any,\n context: ClassFieldDecoratorContext | ClassMethodDecoratorContext,\n) => any\nexport function EchoRequest(\n options?: Omit<EchoConfig<any, any>, 'resolve' | 'type'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function EchoRequest(options = {}) {\n return (method: any, context: ClassMethodDecoratorContext | ClassFieldDecoratorContext) => {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this) {\n const echoes = echoesMetadata.get(this) || {}\n\n if (context.kind === 'method') {\n echoes[propertyKey] = createEchoRequest({\n ...options,\n resolve: this[propertyKey].bind(this),\n })\n }\n\n if (context.kind === 'field') {\n echoes[propertyKey] = this[propertyKey]\n }\n\n echoesMetadata.set(this, echoes)\n })\n\n return method\n }\n}\n\nexport function getServiceEchoes(target: any): EchoesMap {\n const instance = getInstance(target)\n\n if (!serviceMetadata.has(instance.constructor)) {\n throw new Error('You must pass a class decorated with @Echoes to getServiceEchoes')\n }\n\n const instanceMetadata = serviceMetadata.get(instance.constructor)\n if (instanceMetadata._serviceType !== 'echoes') {\n throw new Error('You must pass a class decorated with @Echoes to getServiceEchoes')\n }\n\n const echoesMap = echoesMetadata.get(instance) || {}\n\n return echoesMap\n}\n"],"mappings":"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","names":["echo","serialize","JSSHA","echo","echo","import_http","import_helpers","axios","import_helpers","import_schema"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,15 +1,31 @@
|
|
|
1
|
+
import { SchemaFieldType, InferSchemaType } from '@orion-js/schema';
|
|
1
2
|
import * as kafkajs from 'kafkajs';
|
|
2
3
|
import { KafkaConfig, ProducerConfig, ConsumerConfig, EachMessagePayload, Producer, Consumer } from 'kafkajs';
|
|
3
4
|
|
|
4
|
-
interface
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
interface EchoRequestConfig<TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType> {
|
|
6
|
+
params?: TParamsSchema;
|
|
7
|
+
returns?: TReturnsSchema;
|
|
8
|
+
resolve(params?: InferSchemaType<TParamsSchema>, context?: any): Promise<InferSchemaType<TReturnsSchema>>;
|
|
7
9
|
attemptsBeforeDeadLetter?: number;
|
|
8
10
|
}
|
|
9
|
-
interface
|
|
11
|
+
interface EchoEventConfig<TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType> {
|
|
12
|
+
params?: TParamsSchema;
|
|
13
|
+
returns?: TReturnsSchema;
|
|
14
|
+
resolve(params?: InferSchemaType<TParamsSchema>, context?: any): Promise<InferSchemaType<TReturnsSchema>>;
|
|
15
|
+
attemptsBeforeDeadLetter?: number;
|
|
16
|
+
}
|
|
17
|
+
type EchoConfig<TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType, TEchoType extends 'event' | 'request' = 'event' | 'request'> = (TEchoType extends 'event' ? EchoEventConfig<TParamsSchema, TReturnsSchema> : EchoRequestConfig<TParamsSchema, TReturnsSchema>) & {
|
|
18
|
+
type: TEchoType;
|
|
19
|
+
};
|
|
20
|
+
type EchoType<TParamsSchema extends SchemaFieldType = any, TReturnsSchema extends SchemaFieldType = any, TEchoType extends 'event' | 'request' = 'event' | 'request'> = {
|
|
21
|
+
params?: TParamsSchema;
|
|
22
|
+
returns?: TReturnsSchema;
|
|
23
|
+
attemptsBeforeDeadLetter?: number;
|
|
24
|
+
type: TEchoType;
|
|
25
|
+
resolve(params?: InferSchemaType<TParamsSchema>, context?: any): Promise<InferSchemaType<TReturnsSchema>>;
|
|
10
26
|
onMessage(messageData: EachMessagePayload): Promise<void>;
|
|
11
27
|
onRequest(serializedParams: string): any;
|
|
12
|
-
}
|
|
28
|
+
};
|
|
13
29
|
interface PublishOptions<TParams = any> {
|
|
14
30
|
topic: string;
|
|
15
31
|
params: TParams;
|
|
@@ -71,7 +87,7 @@ interface RequestsConfig {
|
|
|
71
87
|
makeRequest?: RequestMaker;
|
|
72
88
|
}
|
|
73
89
|
interface EchoesMap {
|
|
74
|
-
[key: string]: EchoType
|
|
90
|
+
[key: string]: EchoType<any, any>;
|
|
75
91
|
}
|
|
76
92
|
interface EchoesOptions {
|
|
77
93
|
client?: KafkaConfig;
|
|
@@ -107,22 +123,23 @@ declare function stopService(): Promise<void>;
|
|
|
107
123
|
*/
|
|
108
124
|
declare function publish<TParams = any>(options: PublishOptions<TParams>): Promise<kafkajs.RecordMetadata[]>;
|
|
109
125
|
|
|
110
|
-
declare const echo: {
|
|
111
|
-
(options: EchoConfig): EchoType;
|
|
112
|
-
types: {
|
|
113
|
-
event: string;
|
|
114
|
-
request: string;
|
|
115
|
-
};
|
|
116
|
-
};
|
|
117
|
-
|
|
118
126
|
declare function request<TData = any, TParams = any>(options: RequestOptions<TParams>): Promise<TData>;
|
|
119
127
|
|
|
120
128
|
interface EchoesPropertyDescriptor extends Omit<PropertyDecorator, 'value'> {
|
|
121
|
-
value?: EchoConfig['resolve'];
|
|
129
|
+
value?: EchoConfig<any, any>['resolve'];
|
|
122
130
|
}
|
|
123
131
|
declare function Echoes(): (target: any, context: ClassDecoratorContext<any>) => void;
|
|
124
|
-
declare function EchoEvent
|
|
125
|
-
declare function
|
|
132
|
+
declare function EchoEvent(): (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => any;
|
|
133
|
+
declare function EchoEvent(options?: Omit<EchoConfig<any, any>, 'resolve' | 'type'>): (method: any, context: ClassMethodDecoratorContext) => any;
|
|
134
|
+
declare function EchoRequest(): (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => any;
|
|
135
|
+
declare function EchoRequest(options?: Omit<EchoConfig<any, any>, 'resolve' | 'type'>): (method: any, context: ClassMethodDecoratorContext) => any;
|
|
126
136
|
declare function getServiceEchoes(target: any): EchoesMap;
|
|
127
137
|
|
|
128
|
-
|
|
138
|
+
/**
|
|
139
|
+
* @deprecated Use createEchoRequest and createEchoEvent instead
|
|
140
|
+
*/
|
|
141
|
+
declare const echo: <TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType, TEchoType extends "event" | "request">(options: EchoConfig<TParamsSchema, TReturnsSchema, TEchoType>) => EchoType<TParamsSchema, TReturnsSchema, TEchoType>;
|
|
142
|
+
declare function createEchoRequest<TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType>(options: EchoRequestConfig<TParamsSchema, TReturnsSchema>): EchoType<TParamsSchema, TReturnsSchema, 'request'>;
|
|
143
|
+
declare function createEchoEvent<TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType>(options: EchoEventConfig<TParamsSchema, TReturnsSchema>): EchoType<TParamsSchema, TReturnsSchema, 'event'>;
|
|
144
|
+
|
|
145
|
+
export { type EchoConfig, EchoEvent, type EchoEventConfig, EchoRequest, type EchoRequestConfig, type EchoType, Echoes, type EchoesConfigHandler, type EchoesMap, type EchoesOptions, type EchoesPropertyDescriptor, type MakeRequestParams, type PublishOptions, type RequestHandlerResponse, type RequestMaker, type RequestMakerResult, type RequestOptions, type RequestsConfig, createEchoEvent, createEchoRequest, echo, getServiceEchoes, publish, request, startService, stopService };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,31 @@
|
|
|
1
|
+
import { SchemaFieldType, InferSchemaType } from '@orion-js/schema';
|
|
1
2
|
import * as kafkajs from 'kafkajs';
|
|
2
3
|
import { KafkaConfig, ProducerConfig, ConsumerConfig, EachMessagePayload, Producer, Consumer } from 'kafkajs';
|
|
3
4
|
|
|
4
|
-
interface
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
interface EchoRequestConfig<TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType> {
|
|
6
|
+
params?: TParamsSchema;
|
|
7
|
+
returns?: TReturnsSchema;
|
|
8
|
+
resolve(params?: InferSchemaType<TParamsSchema>, context?: any): Promise<InferSchemaType<TReturnsSchema>>;
|
|
7
9
|
attemptsBeforeDeadLetter?: number;
|
|
8
10
|
}
|
|
9
|
-
interface
|
|
11
|
+
interface EchoEventConfig<TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType> {
|
|
12
|
+
params?: TParamsSchema;
|
|
13
|
+
returns?: TReturnsSchema;
|
|
14
|
+
resolve(params?: InferSchemaType<TParamsSchema>, context?: any): Promise<InferSchemaType<TReturnsSchema>>;
|
|
15
|
+
attemptsBeforeDeadLetter?: number;
|
|
16
|
+
}
|
|
17
|
+
type EchoConfig<TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType, TEchoType extends 'event' | 'request' = 'event' | 'request'> = (TEchoType extends 'event' ? EchoEventConfig<TParamsSchema, TReturnsSchema> : EchoRequestConfig<TParamsSchema, TReturnsSchema>) & {
|
|
18
|
+
type: TEchoType;
|
|
19
|
+
};
|
|
20
|
+
type EchoType<TParamsSchema extends SchemaFieldType = any, TReturnsSchema extends SchemaFieldType = any, TEchoType extends 'event' | 'request' = 'event' | 'request'> = {
|
|
21
|
+
params?: TParamsSchema;
|
|
22
|
+
returns?: TReturnsSchema;
|
|
23
|
+
attemptsBeforeDeadLetter?: number;
|
|
24
|
+
type: TEchoType;
|
|
25
|
+
resolve(params?: InferSchemaType<TParamsSchema>, context?: any): Promise<InferSchemaType<TReturnsSchema>>;
|
|
10
26
|
onMessage(messageData: EachMessagePayload): Promise<void>;
|
|
11
27
|
onRequest(serializedParams: string): any;
|
|
12
|
-
}
|
|
28
|
+
};
|
|
13
29
|
interface PublishOptions<TParams = any> {
|
|
14
30
|
topic: string;
|
|
15
31
|
params: TParams;
|
|
@@ -71,7 +87,7 @@ interface RequestsConfig {
|
|
|
71
87
|
makeRequest?: RequestMaker;
|
|
72
88
|
}
|
|
73
89
|
interface EchoesMap {
|
|
74
|
-
[key: string]: EchoType
|
|
90
|
+
[key: string]: EchoType<any, any>;
|
|
75
91
|
}
|
|
76
92
|
interface EchoesOptions {
|
|
77
93
|
client?: KafkaConfig;
|
|
@@ -107,22 +123,23 @@ declare function stopService(): Promise<void>;
|
|
|
107
123
|
*/
|
|
108
124
|
declare function publish<TParams = any>(options: PublishOptions<TParams>): Promise<kafkajs.RecordMetadata[]>;
|
|
109
125
|
|
|
110
|
-
declare const echo: {
|
|
111
|
-
(options: EchoConfig): EchoType;
|
|
112
|
-
types: {
|
|
113
|
-
event: string;
|
|
114
|
-
request: string;
|
|
115
|
-
};
|
|
116
|
-
};
|
|
117
|
-
|
|
118
126
|
declare function request<TData = any, TParams = any>(options: RequestOptions<TParams>): Promise<TData>;
|
|
119
127
|
|
|
120
128
|
interface EchoesPropertyDescriptor extends Omit<PropertyDecorator, 'value'> {
|
|
121
|
-
value?: EchoConfig['resolve'];
|
|
129
|
+
value?: EchoConfig<any, any>['resolve'];
|
|
122
130
|
}
|
|
123
131
|
declare function Echoes(): (target: any, context: ClassDecoratorContext<any>) => void;
|
|
124
|
-
declare function EchoEvent
|
|
125
|
-
declare function
|
|
132
|
+
declare function EchoEvent(): (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => any;
|
|
133
|
+
declare function EchoEvent(options?: Omit<EchoConfig<any, any>, 'resolve' | 'type'>): (method: any, context: ClassMethodDecoratorContext) => any;
|
|
134
|
+
declare function EchoRequest(): (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => any;
|
|
135
|
+
declare function EchoRequest(options?: Omit<EchoConfig<any, any>, 'resolve' | 'type'>): (method: any, context: ClassMethodDecoratorContext) => any;
|
|
126
136
|
declare function getServiceEchoes(target: any): EchoesMap;
|
|
127
137
|
|
|
128
|
-
|
|
138
|
+
/**
|
|
139
|
+
* @deprecated Use createEchoRequest and createEchoEvent instead
|
|
140
|
+
*/
|
|
141
|
+
declare const echo: <TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType, TEchoType extends "event" | "request">(options: EchoConfig<TParamsSchema, TReturnsSchema, TEchoType>) => EchoType<TParamsSchema, TReturnsSchema, TEchoType>;
|
|
142
|
+
declare function createEchoRequest<TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType>(options: EchoRequestConfig<TParamsSchema, TReturnsSchema>): EchoType<TParamsSchema, TReturnsSchema, 'request'>;
|
|
143
|
+
declare function createEchoEvent<TParamsSchema extends SchemaFieldType, TReturnsSchema extends SchemaFieldType>(options: EchoEventConfig<TParamsSchema, TReturnsSchema>): EchoType<TParamsSchema, TReturnsSchema, 'event'>;
|
|
144
|
+
|
|
145
|
+
export { type EchoConfig, EchoEvent, type EchoEventConfig, EchoRequest, type EchoRequestConfig, type EchoType, Echoes, type EchoesConfigHandler, type EchoesMap, type EchoesOptions, type EchoesPropertyDescriptor, type MakeRequestParams, type PublishOptions, type RequestHandlerResponse, type RequestMaker, type RequestMakerResult, type RequestOptions, type RequestsConfig, createEchoEvent, createEchoRequest, echo, getServiceEchoes, publish, request, startService, stopService };
|
package/dist/index.js
CHANGED
|
@@ -2,19 +2,13 @@
|
|
|
2
2
|
var config = {};
|
|
3
3
|
var config_default = config;
|
|
4
4
|
|
|
5
|
-
// src/echo/types.ts
|
|
6
|
-
var types_default = {
|
|
7
|
-
event: "event",
|
|
8
|
-
request: "request"
|
|
9
|
-
};
|
|
10
|
-
|
|
11
5
|
// src/requestsHandler/getEcho.ts
|
|
12
6
|
function getEcho_default(method) {
|
|
13
7
|
const echo2 = config_default.echoes[method];
|
|
14
8
|
if (!echo2) {
|
|
15
9
|
throw new Error(`Echo named ${method} not found in this service`);
|
|
16
10
|
}
|
|
17
|
-
if (echo2.type !==
|
|
11
|
+
if (echo2.type !== "request") {
|
|
18
12
|
throw new Error(`Echo named ${method} is not of type request`);
|
|
19
13
|
}
|
|
20
14
|
return echo2;
|
|
@@ -118,9 +112,7 @@ var KafkaManager = class {
|
|
|
118
112
|
this.options = options;
|
|
119
113
|
this.producer = this.kafka.producer(options.producer);
|
|
120
114
|
this.consumer = this.kafka.consumer(options.consumer);
|
|
121
|
-
this.topics = Object.keys(options.echoes).filter(
|
|
122
|
-
(key) => options.echoes[key].type === types_default.event
|
|
123
|
-
);
|
|
115
|
+
this.topics = Object.keys(options.echoes).filter((key) => options.echoes[key].type === "event");
|
|
124
116
|
}
|
|
125
117
|
async checkJoinConsumerGroupConditions() {
|
|
126
118
|
const admin = this.kafka.admin();
|
|
@@ -190,7 +182,7 @@ var KafkaManager = class {
|
|
|
190
182
|
}
|
|
191
183
|
async handleMessage(params) {
|
|
192
184
|
const echo2 = this.options.echoes[params.topic];
|
|
193
|
-
if (!echo2 || echo2.type !==
|
|
185
|
+
if (!echo2 || echo2.type !== "event") {
|
|
194
186
|
console.warn(`Echoes: Received a message for an unknown topic: ${params.topic}, ignoring it`);
|
|
195
187
|
return;
|
|
196
188
|
}
|
|
@@ -294,39 +286,6 @@ async function publish(options) {
|
|
|
294
286
|
});
|
|
295
287
|
}
|
|
296
288
|
|
|
297
|
-
// src/echo/deserialize.ts
|
|
298
|
-
function deserialize_default(serializedJavascript) {
|
|
299
|
-
try {
|
|
300
|
-
return eval("(" + serializedJavascript + ")");
|
|
301
|
-
} catch (error) {
|
|
302
|
-
throw new Error("Error deserializing echo message");
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
// src/echo/index.ts
|
|
307
|
-
var echo = function createNewEcho(options) {
|
|
308
|
-
return {
|
|
309
|
-
...options,
|
|
310
|
-
onMessage: async (messageData) => {
|
|
311
|
-
const { message } = messageData;
|
|
312
|
-
const data = deserialize_default(message.value.toString());
|
|
313
|
-
const context = {
|
|
314
|
-
...messageData,
|
|
315
|
-
data
|
|
316
|
-
};
|
|
317
|
-
await options.resolve(data.params || {}, context);
|
|
318
|
-
},
|
|
319
|
-
onRequest: async (serializedParams) => {
|
|
320
|
-
const context = {};
|
|
321
|
-
const params = deserialize_default(serializedParams);
|
|
322
|
-
const result = await options.resolve(params || {}, context);
|
|
323
|
-
return result;
|
|
324
|
-
}
|
|
325
|
-
};
|
|
326
|
-
};
|
|
327
|
-
echo.types = types_default;
|
|
328
|
-
var echo_default = echo;
|
|
329
|
-
|
|
330
289
|
// src/request/getURL.ts
|
|
331
290
|
function getURL_default(serviceName) {
|
|
332
291
|
var _a, _b;
|
|
@@ -338,6 +297,15 @@ function getURL_default(serviceName) {
|
|
|
338
297
|
return url;
|
|
339
298
|
}
|
|
340
299
|
|
|
300
|
+
// src/echo/deserialize.ts
|
|
301
|
+
function deserialize_default(serializedJavascript) {
|
|
302
|
+
try {
|
|
303
|
+
return eval("(" + serializedJavascript + ")");
|
|
304
|
+
} catch (error) {
|
|
305
|
+
throw new Error("Error deserializing echo message");
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
341
309
|
// src/request/makeRequest.ts
|
|
342
310
|
import axios from "axios";
|
|
343
311
|
import { executeWithRetries } from "@orion-js/helpers";
|
|
@@ -409,12 +377,52 @@ async function request(options) {
|
|
|
409
377
|
}
|
|
410
378
|
}
|
|
411
379
|
|
|
380
|
+
// src/echo/index.ts
|
|
381
|
+
import { clean, cleanAndValidate } from "@orion-js/schema";
|
|
382
|
+
var echo = function createNewEcho(options) {
|
|
383
|
+
const resolve = async (params, context) => {
|
|
384
|
+
const cleaned = options.params ? await cleanAndValidate(options.params, params) : params ?? {};
|
|
385
|
+
const result = await options.resolve(cleaned, context);
|
|
386
|
+
if (options.returns) {
|
|
387
|
+
return await clean(options.returns, result);
|
|
388
|
+
}
|
|
389
|
+
return result;
|
|
390
|
+
};
|
|
391
|
+
return {
|
|
392
|
+
type: options.type,
|
|
393
|
+
params: options.params,
|
|
394
|
+
returns: options.returns,
|
|
395
|
+
attemptsBeforeDeadLetter: options.type === "event" ? options.attemptsBeforeDeadLetter : void 0,
|
|
396
|
+
resolve,
|
|
397
|
+
onMessage: async (messageData) => {
|
|
398
|
+
const { message } = messageData;
|
|
399
|
+
const data = deserialize_default(message.value.toString());
|
|
400
|
+
const context = {
|
|
401
|
+
...messageData,
|
|
402
|
+
data
|
|
403
|
+
};
|
|
404
|
+
await resolve(data.params, context);
|
|
405
|
+
},
|
|
406
|
+
onRequest: async (serializedParams) => {
|
|
407
|
+
const context = {};
|
|
408
|
+
const params = deserialize_default(serializedParams);
|
|
409
|
+
return await resolve(params, context);
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
};
|
|
413
|
+
function createEchoRequest(options) {
|
|
414
|
+
return echo({ ...options, type: "request" });
|
|
415
|
+
}
|
|
416
|
+
function createEchoEvent(options) {
|
|
417
|
+
return echo({ ...options, type: "event" });
|
|
418
|
+
}
|
|
419
|
+
|
|
412
420
|
// src/service/index.ts
|
|
413
421
|
import { getInstance, Service } from "@orion-js/services";
|
|
414
422
|
var serviceMetadata = /* @__PURE__ */ new WeakMap();
|
|
415
423
|
var echoesMetadata = /* @__PURE__ */ new WeakMap();
|
|
416
424
|
function Echoes() {
|
|
417
|
-
return
|
|
425
|
+
return (target, context) => {
|
|
418
426
|
Service()(target, context);
|
|
419
427
|
context.addInitializer(function() {
|
|
420
428
|
serviceMetadata.set(this, { _serviceType: "echoes" });
|
|
@@ -422,30 +430,38 @@ function Echoes() {
|
|
|
422
430
|
};
|
|
423
431
|
}
|
|
424
432
|
function EchoEvent(options = {}) {
|
|
425
|
-
return
|
|
433
|
+
return (method, context) => {
|
|
426
434
|
const propertyKey = String(context.name);
|
|
427
435
|
context.addInitializer(function() {
|
|
428
436
|
const echoes = echoesMetadata.get(this) || {};
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
437
|
+
if (context.kind === "method") {
|
|
438
|
+
echoes[propertyKey] = createEchoEvent({
|
|
439
|
+
...options,
|
|
440
|
+
resolve: this[propertyKey].bind(this)
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
if (context.kind === "field") {
|
|
444
|
+
echoes[propertyKey] = this[propertyKey];
|
|
445
|
+
}
|
|
434
446
|
echoesMetadata.set(this, echoes);
|
|
435
447
|
});
|
|
436
448
|
return method;
|
|
437
449
|
};
|
|
438
450
|
}
|
|
439
451
|
function EchoRequest(options = {}) {
|
|
440
|
-
return
|
|
452
|
+
return (method, context) => {
|
|
441
453
|
const propertyKey = String(context.name);
|
|
442
454
|
context.addInitializer(function() {
|
|
443
455
|
const echoes = echoesMetadata.get(this) || {};
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
456
|
+
if (context.kind === "method") {
|
|
457
|
+
echoes[propertyKey] = createEchoRequest({
|
|
458
|
+
...options,
|
|
459
|
+
resolve: this[propertyKey].bind(this)
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
if (context.kind === "field") {
|
|
463
|
+
echoes[propertyKey] = this[propertyKey];
|
|
464
|
+
}
|
|
449
465
|
echoesMetadata.set(this, echoes);
|
|
450
466
|
});
|
|
451
467
|
return method;
|
|
@@ -467,7 +483,9 @@ export {
|
|
|
467
483
|
EchoEvent,
|
|
468
484
|
EchoRequest,
|
|
469
485
|
Echoes,
|
|
470
|
-
|
|
486
|
+
createEchoEvent,
|
|
487
|
+
createEchoRequest,
|
|
488
|
+
echo,
|
|
471
489
|
getServiceEchoes,
|
|
472
490
|
publish,
|
|
473
491
|
request,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/echo/types.ts","../src/requestsHandler/getEcho.ts","../src/publish/serialize.ts","../src/request/getSignature.ts","../src/request/getPassword.ts","../src/requestsHandler/checkSignature.ts","../src/requestsHandler/index.ts","../src/startService/KafkaManager.ts","../src/startService/index.ts","../src/publish/index.ts","../src/echo/deserialize.ts","../src/echo/index.ts","../src/request/getURL.ts","../src/request/makeRequest.ts","../src/request/index.ts","../src/service/index.ts"],"sourcesContent":["import {EchoesConfigHandler} from './types'\n\nconst config: EchoesConfigHandler = {}\n\nexport default config\n","export default {\n event: 'event',\n request: 'request',\n}\n","import config from '../config'\nimport types from '../echo/types'\n\nexport default function (method: string) {\n const echo = config.echoes[method]\n\n if (!echo) {\n throw new Error(`Echo named ${method} not found in this service`)\n }\n\n if (echo.type !== types.request) {\n throw new Error(`Echo named ${method} is not of type request`)\n }\n\n return echo\n}\n","import serialize from 'serialize-javascript'\nimport {clone} from '@orion-js/helpers'\n\nexport default function (data: any): string {\n const cloned = clone(data)\n const serialized = serialize(cloned, {ignoreFunction: true})\n return serialized\n}\n","import JSSHA from 'jssha'\nimport {getEchoesPassword} from './getPassword'\n\nexport default function (body: any): string {\n const password = getEchoesPassword()\n const shaObj = new JSSHA('SHA-1', 'TEXT')\n shaObj.setHMACKey(password, 'TEXT')\n shaObj.update(body)\n return shaObj.getHMAC('HEX')\n}\n","import config from '../config'\nimport {internalGetEnv} from '@orion-js/env'\n\nexport function getEchoesPassword() {\n const secret = config?.requests?.key || internalGetEnv('echoes_password', 'ECHOES_PASSWORD')\n if (!secret) {\n console.warn(\n 'Warning: no secret key found for echoes requests. Init echoes or set the env var \"echoes_password\" or process.env.ECHOES_PASSWORD',\n )\n }\n\n return secret\n}\n","import getSignature from '../request/getSignature'\n\nexport default function (body: any, signature: string) {\n const generatedSignature = getSignature(body)\n if (generatedSignature !== signature) {\n throw new Error('Echoes invalid signature')\n }\n}\n","import getEcho from './getEcho'\nimport serialize from '../publish/serialize'\nimport checkSignature from './checkSignature'\nimport {route} from '@orion-js/http'\nimport {EchoesOptions} from '../types'\n\nexport default (options: EchoesOptions) =>\n route({\n method: 'post',\n path: options.requests.handlerPath || '/echoes-services',\n bodyParser: 'json',\n bodyParserOptions: {\n limit: '10mb',\n },\n async resolve(req) {\n try {\n const {body, signature} = req.body\n\n checkSignature(body, signature)\n\n const {method, serializedParams} = body\n\n const echo = getEcho(method)\n const result = await echo.onRequest(serializedParams)\n\n return {\n body: {\n result: serialize(result),\n },\n }\n } catch (error) {\n if (!error.getInfo) {\n console.error('Error at echo requests handler:', error)\n }\n\n return {\n body: {\n error: error.message,\n errorInfo: error.getInfo ? error.getInfo() : null,\n isValidationError: !!error.isValidationError,\n isUserError: !!error.isUserError,\n },\n }\n }\n },\n })\n","import {Kafka, EachMessagePayload, Producer, Consumer} from 'kafkajs'\nimport types from '../echo/types'\nimport {EchoesOptions, EchoType} from '../types'\n\nconst HEARTBEAT_INTERVAL_SECONDS = 5 // This value must be less than the kafkajs session timeout\nconst CHECK_JOIN_CONSUMER_INTERVAL_SECONDS = 30\nconst DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY = 4 // How many partitions to consume concurrently, adjust this with the members to partitions ratio to avoid idle consumers.\nconst DEFAULT_MEMBERS_TO_PARTITIONS_RATIO = 1 // How many members are in comparison to partitions, this is used to determine if the consumer group has room for more members. Numbers over 1 leads to idle consumers. Numbers under 1 needs partitionsConsumedConcurrently to be more than 1.\n\n/**\n * Manages the Kafka connection and the consumers.\n */\nclass KafkaManager {\n kafka: Kafka\n options: EchoesOptions\n producer: Producer\n consumer: Consumer\n topics: string[]\n started: boolean\n interval: NodeJS.Timer\n\n constructor(options: EchoesOptions) {\n this.kafka = new Kafka(options.client)\n this.options = options\n this.producer = this.kafka.producer(options.producer)\n this.consumer = this.kafka.consumer(options.consumer)\n this.topics = Object.keys(options.echoes).filter(\n key => options.echoes[key].type === types.event,\n )\n }\n\n async checkJoinConsumerGroupConditions(): Promise<boolean> {\n const admin = this.kafka.admin()\n try {\n await admin.connect()\n const groupDescriptions = await admin.describeGroups([this.options.consumer.groupId])\n const group = groupDescriptions.groups[0]\n if (group.state === 'Empty') {\n console.info(`Echoes: Consumer group ${this.options.consumer.groupId} is empty, joining`)\n return true\n }\n const topicsMetadata = await admin.fetchTopicMetadata({topics: this.topics})\n const totalPartitions = topicsMetadata.topics.reduce(\n (acc, topic) => acc + topic.partitions.length,\n 0,\n )\n console.info(\n `Echoes: Consumer group ${this.options.consumer.groupId} has ${group.members.length} members and ${totalPartitions} partitions`,\n )\n const partitionsRatio =\n this.options.membersToPartitionsRatio || DEFAULT_MEMBERS_TO_PARTITIONS_RATIO\n const partitionsThreshold = Math.ceil(totalPartitions * partitionsRatio)\n if (partitionsThreshold > group.members.length) {\n console.info(\n `Echoes: Consumer group ${this.options.consumer.groupId} has room for more members ${group.members.length}/${partitionsThreshold}, joining`,\n )\n return true\n }\n } catch (error) {\n console.error(`Echoes: Error checking consumer group conditions, join: ${error.message}`)\n return true\n } finally {\n await admin.disconnect().catch(error => {\n console.error(`Echoes: Error disconnecting admin client: ${error.message}`)\n })\n }\n }\n\n async joinConsumerGroup() {\n await this.consumer.connect()\n await this.consumer.subscribe({topics: this.topics})\n await this.consumer.run({\n partitionsConsumedConcurrently:\n this.options.partitionsConsumedConcurrently || DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY,\n eachMessage: params => this.handleMessage(params),\n })\n }\n\n async conditionalStart(): Promise<boolean> {\n if (await this.checkJoinConsumerGroupConditions()) {\n await this.joinConsumerGroup()\n return true\n }\n }\n\n async start() {\n if (this.started) return\n await this.producer.connect()\n this.started = await this.conditionalStart()\n if (this.started) return\n console.info('Echoes: Delaying consumer group join, waiting for conditions to be met')\n this.interval = setInterval(async () => {\n this.started = await this.conditionalStart()\n if (this.started) clearInterval(this.interval)\n }, CHECK_JOIN_CONSUMER_INTERVAL_SECONDS * 1000)\n }\n\n async stop() {\n console.warn('Echoes: Stopping echoes')\n if (this.interval) clearInterval(this.interval)\n if (this.consumer) await this.consumer.disconnect()\n if (this.producer) await this.producer.disconnect()\n }\n\n async handleMessage(params: EachMessagePayload) {\n const echo = this.options.echoes[params.topic]\n if (!echo || echo.type !== types.event) {\n console.warn(`Echoes: Received a message for an unknown topic: ${params.topic}, ignoring it`)\n return\n }\n\n let intervalsCount = 0\n const heartbeatInterval = setInterval(async () => {\n await params.heartbeat().catch(error => {\n console.warn(`Echoes: Error sending heartbeat: ${error.message}`)\n })\n intervalsCount++\n if ((intervalsCount * HEARTBEAT_INTERVAL_SECONDS) % 30 === 0) {\n console.warn(\n `Echoes: Event is taking too long to process: ${params.topic} ${intervalsCount * HEARTBEAT_INTERVAL_SECONDS}s`,\n )\n }\n }, HEARTBEAT_INTERVAL_SECONDS * 1000)\n\n try {\n await echo.onMessage(params).catch(error => this.handleRetries(echo, params, error))\n } catch (error) {\n console.error(`Echoes: error processing a message: ${params.topic} ${error.message}`)\n throw error\n } finally {\n clearInterval(heartbeatInterval)\n }\n }\n\n async handleRetries(echo: EchoType, params: EachMessagePayload, error: Error) {\n const {message, topic} = params\n const retries = Number.parseInt(message?.headers?.retries?.toString() || '0', 10)\n if (echo.attemptsBeforeDeadLetter === undefined || echo.attemptsBeforeDeadLetter === null) {\n throw error\n }\n const maxRetries = echo.attemptsBeforeDeadLetter || 0\n const exceededMaxRetries = retries >= maxRetries\n const nextTopic = exceededMaxRetries ? `DLQ-${topic}` : topic\n await this.producer.send({\n topic: nextTopic,\n messages: [\n {\n value: message.value.toString(),\n headers: {\n retries: String(retries + 1),\n error: error.message,\n },\n },\n ],\n })\n\n if (exceededMaxRetries) {\n console.error(\n `Echoes: a message has reached the maximum number of retries, sending it to DLQ: ${nextTopic}`,\n )\n } else {\n console.warn(\n `Echoes: a retryable message failed \"${error.message}\", re-sending it to topic: ${nextTopic}`,\n )\n }\n }\n}\n\nexport default KafkaManager\n","import config from '../config'\nimport requestsHandler from '../requestsHandler'\nimport {EchoesOptions} from '../types'\nimport KafkaManager from './KafkaManager'\nimport {registerRoute} from '@orion-js/http'\n\nlet kafkaManager: KafkaManager = null\n\nexport default async function startService(options: EchoesOptions) {\n config.echoes = options.echoes\n\n if (options.requests) {\n config.requests = options.requests\n registerRoute(requestsHandler(options))\n }\n\n if (options.client) {\n kafkaManager = new KafkaManager(options)\n await kafkaManager.start()\n config.producer = kafkaManager.producer\n config.consumer = kafkaManager.consumer\n }\n}\n\nexport async function stopService() {\n if (kafkaManager) {\n console.info('Stoping echoes...')\n await kafkaManager.stop()\n console.info('Echoes stopped')\n }\n}\n","import config from '../config'\nimport {PublishOptions} from '../types'\nimport serialize from './serialize'\n\n/**\n * Publish\n */\nexport default async function publish<TParams = any>(options: PublishOptions<TParams>) {\n if (!config.producer) {\n throw new Error('You must initialize echoes configruation to use publish')\n }\n\n const payload = {\n params: options.params,\n }\n\n return await config.producer.send({\n acks: options.acks,\n timeout: options.timeout,\n topic: options.topic,\n messages: [\n {\n value: serialize(payload),\n },\n ],\n })\n}\n","export default function (serializedJavascript: string): any {\n try {\n return eval('(' + serializedJavascript + ')')\n } catch (error) {\n throw new Error('Error deserializing echo message')\n }\n}\n","import {EachMessagePayload} from 'kafkajs'\nimport {EchoType, EchoConfig} from '../types'\nimport deserialize from './deserialize'\nimport types from './types'\n\nconst echo = function createNewEcho(options: EchoConfig): EchoType {\n return {\n ...options,\n onMessage: async (messageData: EachMessagePayload) => {\n const {message} = messageData\n\n const data = deserialize(message.value.toString())\n\n const context = {\n ...messageData,\n data,\n }\n\n await options.resolve(data.params || {}, context)\n },\n onRequest: async (serializedParams: string) => {\n const context = {}\n const params = deserialize(serializedParams)\n const result = await options.resolve(params || {}, context)\n return result\n },\n }\n}\n\necho.types = types\n\nexport default echo\n","import config from '../config'\n\nexport default function (serviceName: string): string {\n if (serviceName.startsWith('http')) return serviceName\n\n const url = config?.requests?.services[serviceName]\n\n if (!url) {\n throw new Error(`No URL found in echoes config for service ${serviceName}`)\n }\n\n return url\n}\n","import axios from 'axios'\nimport {RequestMaker} from '../types'\nimport {executeWithRetries} from '@orion-js/helpers'\n\nexport const makeRequest: RequestMaker = async options => {\n const result = await executeWithRetries(\n async () => {\n return await axios({\n method: 'post',\n url: options.url,\n timeout: options.timeout,\n headers: {\n 'User-Agent': 'Orionjs-Echoes/1.1',\n },\n data: options.data,\n })\n },\n options.retries,\n 200,\n )\n\n return {\n data: result.data as object,\n statusCode: result.status,\n }\n}\n","import getURL from './getURL'\nimport getSignature from './getSignature'\nimport serialize from '../publish/serialize'\nimport deserialize from '../echo/deserialize'\nimport type {\n MakeRequestParams,\n RequestHandlerResponse,\n RequestMaker,\n RequestOptions,\n} from '../types'\nimport config from '../config'\nimport {makeRequest} from './makeRequest'\nimport {ValidationError} from '@orion-js/schema'\nimport {UserError} from '@orion-js/helpers'\n\nexport default async function request<TData = any, TParams = any>(\n options: RequestOptions<TParams>,\n): Promise<TData> {\n const {method, service, params} = options\n const serializedParams = serialize(params)\n const date = new Date()\n const body = {method, service, serializedParams, date}\n const signature = getSignature(body)\n\n try {\n const requestMaker: RequestMaker = config?.requests?.makeRequest || makeRequest\n const requestOptions: MakeRequestParams = {\n url: getURL(service),\n retries: options.retries,\n timeout: options.timeout,\n data: {\n body,\n signature,\n },\n }\n const result = await requestMaker(requestOptions)\n\n if (result.statusCode !== 200) {\n throw new Error(`Wrong status code ${result.statusCode}`)\n }\n\n const data: RequestHandlerResponse = result.data\n\n if (data.error) {\n const info = data.errorInfo\n if (info) {\n if (data.isValidationError) {\n throw new ValidationError(info.validationErrors)\n }\n if (data.isUserError) {\n throw new UserError(info.error, info.message, info.extra)\n }\n }\n\n throw new Error(`${data.error}`)\n }\n\n const response = deserialize(data.result)\n return response\n } catch (error) {\n if (error.isOrionError) throw error\n\n throw new Error(`Echoes request network error calling ${service}/${method}: ${error.message}`)\n }\n}\n","import echo from '../echo'\nimport {EchoConfig, EchoesMap} from '../types'\nimport {getInstance, Service} from '@orion-js/services'\n\nexport interface EchoesPropertyDescriptor extends Omit<PropertyDecorator, 'value'> {\n value?: EchoConfig['resolve']\n}\n// Define metadata storage using WeakMaps\nconst serviceMetadata = new WeakMap<any, {_serviceType: string}>()\nconst echoesMetadata = new WeakMap<any, Record<string, any>>()\n\nexport function Echoes() {\n return function (target: any, context: ClassDecoratorContext<any>) {\n Service()(target, context)\n\n context.addInitializer(function (this) {\n serviceMetadata.set(this, {_serviceType: 'echoes'})\n })\n }\n}\n\nexport function EchoEvent<\n This,\n TArgs extends Parameters<EchoConfig['resolve']>,\n TReturn extends ReturnType<EchoConfig['resolve']>,\n>(options: Omit<EchoConfig, 'resolve' | 'type'> = {}) {\n return function (\n method: (this: This, ...args: TArgs) => TReturn,\n context: ClassMethodDecoratorContext<This, typeof method>,\n ) {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this: This) {\n const echoes = echoesMetadata.get(this) || {}\n\n echoes[propertyKey] = echo({\n ...options,\n type: 'event',\n resolve: this[propertyKey].bind(this),\n })\n\n echoesMetadata.set(this, echoes)\n })\n\n return method\n }\n}\n\nexport function EchoRequest<\n This,\n TArgs extends Parameters<EchoConfig['resolve']>,\n TReturn extends ReturnType<EchoConfig['resolve']>,\n>(options: Omit<EchoConfig, 'resolve' | 'type'> = {}) {\n return function (\n method: (this: This, ...args: TArgs) => TReturn,\n context: ClassMethodDecoratorContext<This, typeof method>,\n ) {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this: This) {\n const echoes = echoesMetadata.get(this) || {}\n\n echoes[propertyKey] = echo({\n ...options,\n type: 'request',\n resolve: this[propertyKey].bind(this),\n })\n\n echoesMetadata.set(this, echoes)\n })\n\n return method\n }\n}\n\nexport function getServiceEchoes(target: any): EchoesMap {\n const instance = getInstance(target)\n\n if (!serviceMetadata.has(instance.constructor)) {\n throw new Error('You must pass a class decorated with @Echoes to getServiceEchoes')\n }\n\n const instanceMetadata = serviceMetadata.get(instance.constructor)\n if (instanceMetadata._serviceType !== 'echoes') {\n throw new Error('You must pass a class decorated with @Echoes to getServiceEchoes')\n }\n\n const echoesMap = echoesMetadata.get(instance) || {}\n\n return echoesMap\n}\n"],"mappings":"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","names":["echo","echo","echo"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/requestsHandler/getEcho.ts","../src/publish/serialize.ts","../src/request/getSignature.ts","../src/request/getPassword.ts","../src/requestsHandler/checkSignature.ts","../src/requestsHandler/index.ts","../src/startService/KafkaManager.ts","../src/startService/index.ts","../src/publish/index.ts","../src/request/getURL.ts","../src/echo/deserialize.ts","../src/request/makeRequest.ts","../src/request/index.ts","../src/echo/index.ts","../src/service/index.ts"],"sourcesContent":["import {EchoesConfigHandler} from './types'\n\nconst config: EchoesConfigHandler = {}\n\nexport default config\n","import config from '../config'\n\nexport default function (method: string) {\n const echo = config.echoes[method]\n\n if (!echo) {\n throw new Error(`Echo named ${method} not found in this service`)\n }\n\n if (echo.type !== 'request') {\n throw new Error(`Echo named ${method} is not of type request`)\n }\n\n return echo\n}\n","import serialize from 'serialize-javascript'\nimport {clone} from '@orion-js/helpers'\n\nexport default function (data: any): string {\n const cloned = clone(data)\n const serialized = serialize(cloned, {ignoreFunction: true})\n return serialized\n}\n","import JSSHA from 'jssha'\nimport {getEchoesPassword} from './getPassword'\n\nexport default function (body: any): string {\n const password = getEchoesPassword()\n const shaObj = new JSSHA('SHA-1', 'TEXT')\n shaObj.setHMACKey(password, 'TEXT')\n shaObj.update(body)\n return shaObj.getHMAC('HEX')\n}\n","import config from '../config'\nimport {internalGetEnv} from '@orion-js/env'\n\nexport function getEchoesPassword() {\n const secret = config?.requests?.key || internalGetEnv('echoes_password', 'ECHOES_PASSWORD')\n if (!secret) {\n console.warn(\n 'Warning: no secret key found for echoes requests. Init echoes or set the env var \"echoes_password\" or process.env.ECHOES_PASSWORD',\n )\n }\n\n return secret\n}\n","import getSignature from '../request/getSignature'\n\nexport default function (body: any, signature: string) {\n const generatedSignature = getSignature(body)\n if (generatedSignature !== signature) {\n throw new Error('Echoes invalid signature')\n }\n}\n","import getEcho from './getEcho'\nimport serialize from '../publish/serialize'\nimport checkSignature from './checkSignature'\nimport {route} from '@orion-js/http'\nimport {EchoesOptions} from '../types'\n\nexport default (options: EchoesOptions) =>\n route({\n method: 'post',\n path: options.requests.handlerPath || '/echoes-services',\n bodyParser: 'json',\n bodyParserOptions: {\n limit: '10mb',\n },\n async resolve(req) {\n try {\n const {body, signature} = req.body\n\n checkSignature(body, signature)\n\n const {method, serializedParams} = body\n\n const echo = getEcho(method)\n const result = await echo.onRequest(serializedParams)\n\n return {\n body: {\n result: serialize(result),\n },\n }\n } catch (error) {\n if (!error.getInfo) {\n console.error('Error at echo requests handler:', error)\n }\n\n return {\n body: {\n error: error.message,\n errorInfo: error.getInfo ? error.getInfo() : null,\n isValidationError: !!error.isValidationError,\n isUserError: !!error.isUserError,\n },\n }\n }\n },\n })\n","import {Kafka, EachMessagePayload, Producer, Consumer} from 'kafkajs'\nimport {EchoesOptions, EchoType} from '../types'\n\nconst HEARTBEAT_INTERVAL_SECONDS = 5 // This value must be less than the kafkajs session timeout\nconst CHECK_JOIN_CONSUMER_INTERVAL_SECONDS = 30\nconst DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY = 4 // How many partitions to consume concurrently, adjust this with the members to partitions ratio to avoid idle consumers.\nconst DEFAULT_MEMBERS_TO_PARTITIONS_RATIO = 1 // How many members are in comparison to partitions, this is used to determine if the consumer group has room for more members. Numbers over 1 leads to idle consumers. Numbers under 1 needs partitionsConsumedConcurrently to be more than 1.\n\n/**\n * Manages the Kafka connection and the consumers.\n */\nclass KafkaManager {\n kafka: Kafka\n options: EchoesOptions\n producer: Producer\n consumer: Consumer\n topics: string[]\n started: boolean\n interval: NodeJS.Timeout\n\n constructor(options: EchoesOptions) {\n this.kafka = new Kafka(options.client)\n this.options = options\n this.producer = this.kafka.producer(options.producer)\n this.consumer = this.kafka.consumer(options.consumer)\n this.topics = Object.keys(options.echoes).filter(key => options.echoes[key].type === 'event')\n }\n\n async checkJoinConsumerGroupConditions(): Promise<boolean> {\n const admin = this.kafka.admin()\n try {\n await admin.connect()\n const groupDescriptions = await admin.describeGroups([this.options.consumer.groupId])\n const group = groupDescriptions.groups[0]\n if (group.state === 'Empty') {\n console.info(`Echoes: Consumer group ${this.options.consumer.groupId} is empty, joining`)\n return true\n }\n const topicsMetadata = await admin.fetchTopicMetadata({topics: this.topics})\n const totalPartitions = topicsMetadata.topics.reduce(\n (acc, topic) => acc + topic.partitions.length,\n 0,\n )\n console.info(\n `Echoes: Consumer group ${this.options.consumer.groupId} has ${group.members.length} members and ${totalPartitions} partitions`,\n )\n const partitionsRatio =\n this.options.membersToPartitionsRatio || DEFAULT_MEMBERS_TO_PARTITIONS_RATIO\n const partitionsThreshold = Math.ceil(totalPartitions * partitionsRatio)\n if (partitionsThreshold > group.members.length) {\n console.info(\n `Echoes: Consumer group ${this.options.consumer.groupId} has room for more members ${group.members.length}/${partitionsThreshold}, joining`,\n )\n return true\n }\n } catch (error) {\n console.error(`Echoes: Error checking consumer group conditions, join: ${error.message}`)\n return true\n } finally {\n await admin.disconnect().catch(error => {\n console.error(`Echoes: Error disconnecting admin client: ${error.message}`)\n })\n }\n }\n\n async joinConsumerGroup() {\n await this.consumer.connect()\n await this.consumer.subscribe({topics: this.topics})\n await this.consumer.run({\n partitionsConsumedConcurrently:\n this.options.partitionsConsumedConcurrently || DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY,\n eachMessage: params => this.handleMessage(params),\n })\n }\n\n async conditionalStart(): Promise<boolean> {\n if (await this.checkJoinConsumerGroupConditions()) {\n await this.joinConsumerGroup()\n return true\n }\n }\n\n async start() {\n if (this.started) return\n await this.producer.connect()\n this.started = await this.conditionalStart()\n if (this.started) return\n console.info('Echoes: Delaying consumer group join, waiting for conditions to be met')\n this.interval = setInterval(async () => {\n this.started = await this.conditionalStart()\n if (this.started) clearInterval(this.interval)\n }, CHECK_JOIN_CONSUMER_INTERVAL_SECONDS * 1000)\n }\n\n async stop() {\n console.warn('Echoes: Stopping echoes')\n if (this.interval) clearInterval(this.interval)\n if (this.consumer) await this.consumer.disconnect()\n if (this.producer) await this.producer.disconnect()\n }\n\n async handleMessage(params: EachMessagePayload) {\n const echo = this.options.echoes[params.topic]\n if (!echo || echo.type !== 'event') {\n console.warn(`Echoes: Received a message for an unknown topic: ${params.topic}, ignoring it`)\n return\n }\n\n let intervalsCount = 0\n const heartbeatInterval = setInterval(async () => {\n await params.heartbeat().catch(error => {\n console.warn(`Echoes: Error sending heartbeat: ${error.message}`)\n })\n intervalsCount++\n if ((intervalsCount * HEARTBEAT_INTERVAL_SECONDS) % 30 === 0) {\n console.warn(\n `Echoes: Event is taking too long to process: ${params.topic} ${intervalsCount * HEARTBEAT_INTERVAL_SECONDS}s`,\n )\n }\n }, HEARTBEAT_INTERVAL_SECONDS * 1000)\n\n try {\n await echo.onMessage(params).catch(error => this.handleRetries(echo, params, error))\n } catch (error) {\n console.error(`Echoes: error processing a message: ${params.topic} ${error.message}`)\n throw error\n } finally {\n clearInterval(heartbeatInterval)\n }\n }\n\n async handleRetries(echo: EchoType, params: EachMessagePayload, error: Error) {\n const {message, topic} = params\n const retries = Number.parseInt(message?.headers?.retries?.toString() || '0', 10)\n if (echo.attemptsBeforeDeadLetter === undefined || echo.attemptsBeforeDeadLetter === null) {\n throw error\n }\n const maxRetries = echo.attemptsBeforeDeadLetter || 0\n const exceededMaxRetries = retries >= maxRetries\n const nextTopic = exceededMaxRetries ? `DLQ-${topic}` : topic\n await this.producer.send({\n topic: nextTopic,\n messages: [\n {\n value: message.value.toString(),\n headers: {\n retries: String(retries + 1),\n error: error.message,\n },\n },\n ],\n })\n\n if (exceededMaxRetries) {\n console.error(\n `Echoes: a message has reached the maximum number of retries, sending it to DLQ: ${nextTopic}`,\n )\n } else {\n console.warn(\n `Echoes: a retryable message failed \"${error.message}\", re-sending it to topic: ${nextTopic}`,\n )\n }\n }\n}\n\nexport default KafkaManager\n","import config from '../config'\nimport requestsHandler from '../requestsHandler'\nimport {EchoesOptions} from '../types'\nimport KafkaManager from './KafkaManager'\nimport {registerRoute} from '@orion-js/http'\n\nlet kafkaManager: KafkaManager = null\n\nexport default async function startService(options: EchoesOptions) {\n config.echoes = options.echoes\n\n if (options.requests) {\n config.requests = options.requests\n registerRoute(requestsHandler(options))\n }\n\n if (options.client) {\n kafkaManager = new KafkaManager(options)\n await kafkaManager.start()\n config.producer = kafkaManager.producer\n config.consumer = kafkaManager.consumer\n }\n}\n\nexport async function stopService() {\n if (kafkaManager) {\n console.info('Stoping echoes...')\n await kafkaManager.stop()\n console.info('Echoes stopped')\n }\n}\n","import config from '../config'\nimport {PublishOptions} from '../types'\nimport serialize from './serialize'\n\n/**\n * Publish\n */\nexport default async function publish<TParams = any>(options: PublishOptions<TParams>) {\n if (!config.producer) {\n throw new Error('You must initialize echoes configruation to use publish')\n }\n\n const payload = {\n params: options.params,\n }\n\n return await config.producer.send({\n acks: options.acks,\n timeout: options.timeout,\n topic: options.topic,\n messages: [\n {\n value: serialize(payload),\n },\n ],\n })\n}\n","import config from '../config'\n\nexport default function (serviceName: string): string {\n if (serviceName.startsWith('http')) return serviceName\n\n const url = config?.requests?.services[serviceName]\n\n if (!url) {\n throw new Error(`No URL found in echoes config for service ${serviceName}`)\n }\n\n return url\n}\n","export default function (serializedJavascript: string): any {\n try {\n return eval('(' + serializedJavascript + ')')\n } catch (error) {\n throw new Error('Error deserializing echo message')\n }\n}\n","import axios from 'axios'\nimport {RequestMaker} from '../types'\nimport {executeWithRetries} from '@orion-js/helpers'\n\nexport const makeRequest: RequestMaker = async options => {\n const result = await executeWithRetries(\n async () => {\n return await axios({\n method: 'post',\n url: options.url,\n timeout: options.timeout,\n headers: {\n 'User-Agent': 'Orionjs-Echoes/1.1',\n },\n data: options.data,\n })\n },\n options.retries,\n 200,\n )\n\n return {\n data: result.data as object,\n statusCode: result.status,\n }\n}\n","import getURL from './getURL'\nimport getSignature from './getSignature'\nimport serialize from '../publish/serialize'\nimport deserialize from '../echo/deserialize'\nimport type {\n MakeRequestParams,\n RequestHandlerResponse,\n RequestMaker,\n RequestOptions,\n} from '../types'\nimport config from '../config'\nimport {makeRequest} from './makeRequest'\nimport {ValidationError} from '@orion-js/schema'\nimport {UserError} from '@orion-js/helpers'\n\nexport default async function request<TData = any, TParams = any>(\n options: RequestOptions<TParams>,\n): Promise<TData> {\n const {method, service, params} = options\n const serializedParams = serialize(params)\n const date = new Date()\n const body = {method, service, serializedParams, date}\n const signature = getSignature(body)\n\n try {\n const requestMaker: RequestMaker = config?.requests?.makeRequest || makeRequest\n const requestOptions: MakeRequestParams = {\n url: getURL(service),\n retries: options.retries,\n timeout: options.timeout,\n data: {\n body,\n signature,\n },\n }\n const result = await requestMaker(requestOptions)\n\n if (result.statusCode !== 200) {\n throw new Error(`Wrong status code ${result.statusCode}`)\n }\n\n const data: RequestHandlerResponse = result.data\n\n if (data.error) {\n const info = data.errorInfo\n if (info) {\n if (data.isValidationError) {\n throw new ValidationError(info.validationErrors)\n }\n if (data.isUserError) {\n throw new UserError(info.error, info.message, info.extra)\n }\n }\n\n throw new Error(`${data.error}`)\n }\n\n const response = deserialize(data.result)\n return response\n } catch (error) {\n if (error.isOrionError) throw error\n\n throw new Error(`Echoes request network error calling ${service}/${method}: ${error.message}`)\n }\n}\n","import {EachMessagePayload} from 'kafkajs'\nimport {EchoType, EchoConfig, EchoRequestConfig, EchoEventConfig} from '../types'\nimport deserialize from './deserialize'\nimport {clean, cleanAndValidate, InferSchemaType} from '@orion-js/schema'\nimport {SchemaFieldType} from '@orion-js/schema'\n\n/**\n * @deprecated Use createEchoRequest and createEchoEvent instead\n */\nconst echo = function createNewEcho<\n TParamsSchema extends SchemaFieldType,\n TReturnsSchema extends SchemaFieldType,\n TEchoType extends 'event' | 'request',\n>(\n options: EchoConfig<TParamsSchema, TReturnsSchema, TEchoType>,\n): EchoType<TParamsSchema, TReturnsSchema, TEchoType> {\n const resolve = async (params: InferSchemaType<TParamsSchema>, context: any) => {\n const cleaned = options.params\n ? await cleanAndValidate(options.params, params)\n : (params ?? ({} as InferSchemaType<TParamsSchema>))\n\n const result = await options.resolve(cleaned, context)\n\n if (options.returns) {\n return await clean(options.returns, result)\n }\n\n return result\n }\n\n return {\n type: options.type,\n params: options.params,\n returns: options.returns,\n attemptsBeforeDeadLetter:\n options.type === 'event' ? options.attemptsBeforeDeadLetter : undefined,\n resolve,\n onMessage: async (messageData: EachMessagePayload) => {\n const {message} = messageData\n\n const data = deserialize(message.value.toString())\n\n const context = {\n ...messageData,\n data,\n }\n\n await resolve(data.params, context)\n },\n onRequest: async (serializedParams: string) => {\n const context = {}\n const params = deserialize(serializedParams)\n\n return await resolve(params, context)\n },\n }\n}\n\nexport function createEchoRequest<\n TParamsSchema extends SchemaFieldType,\n TReturnsSchema extends SchemaFieldType,\n>(\n options: EchoRequestConfig<TParamsSchema, TReturnsSchema>,\n): EchoType<TParamsSchema, TReturnsSchema, 'request'> {\n return echo({...options, type: 'request'})\n}\nexport function createEchoEvent<\n TParamsSchema extends SchemaFieldType,\n TReturnsSchema extends SchemaFieldType,\n>(\n options: EchoEventConfig<TParamsSchema, TReturnsSchema>,\n): EchoType<TParamsSchema, TReturnsSchema, 'event'> {\n return echo({...options, type: 'event' as any})\n}\n\nexport {echo}\n","import {createEchoEvent, createEchoRequest} from '../echo'\nimport {EchoConfig, EchoesMap} from '../types'\nimport {getInstance, Service} from '@orion-js/services'\n\nexport interface EchoesPropertyDescriptor extends Omit<PropertyDecorator, 'value'> {\n value?: EchoConfig<any, any>['resolve']\n}\n// Define metadata storage using WeakMaps\nconst serviceMetadata = new WeakMap<any, {_serviceType: string}>()\nconst echoesMetadata = new WeakMap<any, Record<string, any>>()\n\nexport function Echoes() {\n return (target: any, context: ClassDecoratorContext<any>) => {\n Service()(target, context)\n\n context.addInitializer(function (this) {\n serviceMetadata.set(this, {_serviceType: 'echoes'})\n })\n }\n}\n\nexport function EchoEvent(): (\n method: any,\n context: ClassFieldDecoratorContext | ClassMethodDecoratorContext,\n) => any\nexport function EchoEvent(\n options?: Omit<EchoConfig<any, any>, 'resolve' | 'type'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function EchoEvent(options = {}) {\n return (method: any, context: ClassMethodDecoratorContext | ClassFieldDecoratorContext) => {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this) {\n const echoes = echoesMetadata.get(this) || {}\n\n if (context.kind === 'method') {\n echoes[propertyKey] = createEchoEvent({\n ...options,\n resolve: this[propertyKey].bind(this),\n })\n }\n\n if (context.kind === 'field') {\n echoes[propertyKey] = this[propertyKey]\n }\n\n echoesMetadata.set(this, echoes)\n })\n\n return method\n }\n}\n\nexport function EchoRequest(): (\n method: any,\n context: ClassFieldDecoratorContext | ClassMethodDecoratorContext,\n) => any\nexport function EchoRequest(\n options?: Omit<EchoConfig<any, any>, 'resolve' | 'type'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function EchoRequest(options = {}) {\n return (method: any, context: ClassMethodDecoratorContext | ClassFieldDecoratorContext) => {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this) {\n const echoes = echoesMetadata.get(this) || {}\n\n if (context.kind === 'method') {\n echoes[propertyKey] = createEchoRequest({\n ...options,\n resolve: this[propertyKey].bind(this),\n })\n }\n\n if (context.kind === 'field') {\n echoes[propertyKey] = this[propertyKey]\n }\n\n echoesMetadata.set(this, echoes)\n })\n\n return method\n }\n}\n\nexport function getServiceEchoes(target: any): EchoesMap {\n const instance = getInstance(target)\n\n if (!serviceMetadata.has(instance.constructor)) {\n throw new Error('You must pass a class decorated with @Echoes to getServiceEchoes')\n }\n\n const instanceMetadata = serviceMetadata.get(instance.constructor)\n if (instanceMetadata._serviceType !== 'echoes') {\n throw new Error('You must pass a class decorated with @Echoes to getServiceEchoes')\n }\n\n const echoesMap = echoesMetadata.get(instance) || {}\n\n return echoesMap\n}\n"],"mappings":"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","names":["echo","echo","echo"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orion-js/echoes",
|
|
3
|
-
"version": "4.0.0
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"main": "./dist/index.cjs",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
"jssha": "^3.2.0",
|
|
14
14
|
"kafkajs": "^2.2.4",
|
|
15
15
|
"serialize-javascript": "^6.0.0",
|
|
16
|
-
"@orion-js/env": "4.0.0
|
|
17
|
-
"@orion-js/schema": "4.0.0
|
|
18
|
-
"@orion-js/
|
|
19
|
-
"@orion-js/
|
|
20
|
-
"@orion-js/
|
|
16
|
+
"@orion-js/env": "4.0.0",
|
|
17
|
+
"@orion-js/schema": "4.0.0",
|
|
18
|
+
"@orion-js/services": "4.0.0",
|
|
19
|
+
"@orion-js/http": "4.0.0",
|
|
20
|
+
"@orion-js/helpers": "4.0.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@types/node": "^18.0.0",
|