@betterinternship/core 2.5.5 → 2.5.7
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/lib/broker/base.task.d.ts +12 -12
- package/dist/lib/broker/base.task.js +1 -1
- package/dist/lib/broker/base.task.js.map +1 -1
- package/dist/lib/broker/broker.d.ts +19 -19
- package/dist/lib/broker/broker.js +91 -88
- package/dist/lib/broker/broker.js.map +1 -1
- package/dist/lib/chat/chat.js +183 -183
- package/dist/lib/chat/index.js +2 -2
- package/dist/lib/email/email.js +94 -94
- package/dist/lib/env.js +3 -3
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/dist/lib/broker/tasks/base.task.d.ts +0 -22
- package/dist/lib/broker/tasks/base.task.js +0 -34
- package/dist/lib/broker/tasks/base.task.js.map +0 -1
- package/dist/lib/broker/tasks/email..task.d.ts +0 -15
- package/dist/lib/broker/tasks/email..task.js +0 -4
- package/dist/lib/broker/tasks/email..task.js.map +0 -1
- package/dist/lib/broker/tasks/index.d.ts +0 -1
- package/dist/lib/broker/tasks/index.js +0 -2
- package/dist/lib/broker/tasks/index.js.map +0 -1
- package/dist/lib/broker/tasks/sign.task.d.ts +0 -35
- package/dist/lib/broker/tasks/sign.task.js +0 -4
- package/dist/lib/broker/tasks/sign.task.js.map +0 -1
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
import { Task } from '@betterinternship/db';
|
|
2
2
|
import { JsonValue } from '@prisma/client/runtime/client';
|
|
3
|
-
export declare class TaskRequest implements Pick<Task, 'inputs' | 'internal_id' | 'handler_id' | 'parent_id' | 'process_id' | 'timestamp'> {
|
|
4
|
-
inputs:
|
|
3
|
+
export declare class TaskRequest<TaskInputs extends JsonValue> implements Pick<Task, 'inputs' | 'internal_id' | 'handler_id' | 'parent_id' | 'process_id' | 'timestamp'> {
|
|
4
|
+
inputs: TaskInputs;
|
|
5
5
|
internal_id: string;
|
|
6
6
|
handler_id: string;
|
|
7
7
|
parent_id: string | null;
|
|
8
8
|
process_id: string;
|
|
9
9
|
timestamp: Date;
|
|
10
10
|
}
|
|
11
|
-
export declare class TaskResponse implements Pick<Task, 'result' | 'status' | 'error'> {
|
|
12
|
-
result:
|
|
13
|
-
error:
|
|
11
|
+
export declare class TaskResponse<TaskResult extends JsonValue> implements Pick<Task, 'result' | 'status' | 'error'> {
|
|
12
|
+
result: TaskResult;
|
|
13
|
+
error: string;
|
|
14
14
|
status: string;
|
|
15
15
|
}
|
|
16
|
-
type TaskResponseHandler = (response: TaskResponse) => Promise<void>;
|
|
17
|
-
export declare class BaseTaskInitiator<TaskInputs> {
|
|
16
|
+
type TaskResponseHandler<TaskResult extends JsonValue> = (response: TaskResponse<TaskResult>) => Promise<void>;
|
|
17
|
+
export declare class BaseTaskInitiator<TaskInputs extends JsonValue, TaskResult extends JsonValue> {
|
|
18
18
|
private handlerId;
|
|
19
19
|
private requestQueueId;
|
|
20
20
|
private responseQueueId;
|
|
21
|
-
constructor(queueId: string, handler: TaskResponseHandler);
|
|
22
|
-
init(handler: TaskResponseHandler): Promise<void>;
|
|
21
|
+
constructor(queueId: string, handler: TaskResponseHandler<TaskResult>);
|
|
22
|
+
init(handler: TaskResponseHandler<TaskResult>): Promise<void>;
|
|
23
23
|
sendTaskRequest(processId: string, inputs: TaskInputs, options: {
|
|
24
24
|
internalId?: string;
|
|
25
25
|
parentId?: string;
|
|
26
26
|
maxRetries?: number;
|
|
27
27
|
}): Promise<boolean>;
|
|
28
28
|
}
|
|
29
|
-
type TaskRequestHandler = (task: TaskRequest) => Promise<TaskResponse
|
|
30
|
-
export declare class BaseTaskRunner {
|
|
29
|
+
type TaskRequestHandler<TaskInputs extends JsonValue, TaskResult extends JsonValue> = (task: TaskRequest<TaskInputs>) => Promise<TaskResponse<TaskResult>>;
|
|
30
|
+
export declare class BaseTaskRunner<TaskInputs extends JsonValue, TaskResult extends JsonValue> {
|
|
31
31
|
private requestQueueId;
|
|
32
32
|
private responseQueueId;
|
|
33
|
-
constructor(queueId: string, handler: TaskRequestHandler);
|
|
33
|
+
constructor(queueId: string, handler: TaskRequestHandler<TaskInputs, TaskResult>);
|
|
34
34
|
private init;
|
|
35
35
|
}
|
|
36
36
|
export {};
|
|
@@ -29,7 +29,7 @@ export class BaseTaskInitiator {
|
|
|
29
29
|
return await brokerAPI.addQueueHandler(this.responseQueueId, async (taskId) => {
|
|
30
30
|
const task = await tasks.findFirst({ where: { id: taskId } });
|
|
31
31
|
await handler({
|
|
32
|
-
result: task?.result
|
|
32
|
+
result: task?.result,
|
|
33
33
|
error: task?.error ?? '',
|
|
34
34
|
status: task?.status ?? 'failed',
|
|
35
35
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.task.js","sourceRoot":"","sources":["../../../lib/broker/base.task.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,KAAK,EAAQ,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAG1B,MAAM,OAAO,WAAW;IAYtB,MAAM,
|
|
1
|
+
{"version":3,"file":"base.task.js","sourceRoot":"","sources":["../../../lib/broker/base.task.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import * as amqp from 'amqplib';
|
|
2
|
-
export declare const Q: (...args: string[]) => string;
|
|
3
|
-
export interface RequestBody {
|
|
4
|
-
taskId: string;
|
|
5
|
-
}
|
|
6
|
-
export declare class BrokerAPI {
|
|
7
|
-
connection: amqp.ChannelModel;
|
|
8
|
-
channels: Record<string, amqp.Channel>;
|
|
9
|
-
private static __instance;
|
|
10
|
-
private constructor();
|
|
11
|
-
static instance(): Promise<BrokerAPI>;
|
|
12
|
-
assertQueue(queueId: string, options?: amqp.Options.AssertQueue): Promise<amqp.Replies.AssertQueue>;
|
|
13
|
-
private addToQueueWithHeaders;
|
|
14
|
-
addToQueue(queueId: string, taskId: string, options?: {
|
|
15
|
-
retries?: number;
|
|
16
|
-
maxRetries?: number;
|
|
17
|
-
}): Promise<boolean>;
|
|
18
|
-
addQueueHandler<T>(queueId: string, handler: (taskId: string, resolve: () => void, reject: () => void) => Promise<T>): Promise<void>;
|
|
19
|
-
}
|
|
1
|
+
import * as amqp from 'amqplib';
|
|
2
|
+
export declare const Q: (...args: string[]) => string;
|
|
3
|
+
export interface RequestBody {
|
|
4
|
+
taskId: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class BrokerAPI {
|
|
7
|
+
connection: amqp.ChannelModel;
|
|
8
|
+
channels: Record<string, amqp.Channel>;
|
|
9
|
+
private static __instance;
|
|
10
|
+
private constructor();
|
|
11
|
+
static instance(): Promise<BrokerAPI>;
|
|
12
|
+
assertQueue(queueId: string, options?: amqp.Options.AssertQueue): Promise<amqp.Replies.AssertQueue>;
|
|
13
|
+
private addToQueueWithHeaders;
|
|
14
|
+
addToQueue(queueId: string, taskId: string, options?: {
|
|
15
|
+
retries?: number;
|
|
16
|
+
maxRetries?: number;
|
|
17
|
+
}): Promise<boolean>;
|
|
18
|
+
addQueueHandler<T>(queueId: string, handler: (taskId: string, resolve: () => void, reject: () => void) => Promise<T>): Promise<void>;
|
|
19
|
+
}
|
|
@@ -1,89 +1,92 @@
|
|
|
1
|
-
import * as amqp from 'amqplib';
|
|
2
|
-
import { ENV } from '../env.js';
|
|
3
|
-
const RABBITMQ_ENABLED = ENV.RABBITMQ_ENABLED;
|
|
4
|
-
const RABBITMQ_URL = ENV.RABBITMQ_URL;
|
|
5
|
-
if (!RABBITMQ_URL && RABBITMQ_ENABLED)
|
|
6
|
-
throw new Error('[ERROR:ENV] Missing RabbitMQ configuration.');
|
|
7
|
-
export const Q = (...args) => {
|
|
8
|
-
if (ENV.ENVIRONMENT === 'production')
|
|
9
|
-
return args.join('.');
|
|
10
|
-
else
|
|
11
|
-
return ['dev', ...args].join('.');
|
|
12
|
-
};
|
|
13
|
-
export class BrokerAPI {
|
|
14
|
-
connection;
|
|
15
|
-
channels;
|
|
16
|
-
static __instance;
|
|
17
|
-
constructor() { }
|
|
18
|
-
static async instance() {
|
|
19
|
-
if (
|
|
20
|
-
|
|
21
|
-
BrokerAPI.__instance
|
|
22
|
-
|
|
23
|
-
BrokerAPI.__instance
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
console.log(`[BROKER] Message
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return
|
|
61
|
-
}
|
|
62
|
-
async
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
1
|
+
import * as amqp from 'amqplib';
|
|
2
|
+
import { ENV } from '../env.js';
|
|
3
|
+
const RABBITMQ_ENABLED = ENV.RABBITMQ_ENABLED;
|
|
4
|
+
const RABBITMQ_URL = ENV.RABBITMQ_URL;
|
|
5
|
+
if (!RABBITMQ_URL && RABBITMQ_ENABLED)
|
|
6
|
+
throw new Error('[ERROR:ENV] Missing RabbitMQ configuration.');
|
|
7
|
+
export const Q = (...args) => {
|
|
8
|
+
if (ENV.ENVIRONMENT === 'production')
|
|
9
|
+
return args.join('.');
|
|
10
|
+
else
|
|
11
|
+
return ['dev', ...args].join('.');
|
|
12
|
+
};
|
|
13
|
+
export class BrokerAPI {
|
|
14
|
+
connection;
|
|
15
|
+
channels;
|
|
16
|
+
static __instance = null;
|
|
17
|
+
constructor() { }
|
|
18
|
+
static async instance() {
|
|
19
|
+
if (RABBITMQ_ENABLED)
|
|
20
|
+
throw new Error('[BROKER] Rabbit MQ not enabled.');
|
|
21
|
+
if (BrokerAPI.__instance)
|
|
22
|
+
return BrokerAPI.__instance;
|
|
23
|
+
BrokerAPI.__instance = new BrokerAPI();
|
|
24
|
+
BrokerAPI.__instance.connection = await amqp.connect(RABBITMQ_URL);
|
|
25
|
+
BrokerAPI.__instance.channels = {
|
|
26
|
+
asserter: await BrokerAPI.__instance.connection.createChannel(),
|
|
27
|
+
reader: await BrokerAPI.__instance.connection.createChannel(),
|
|
28
|
+
writer: await BrokerAPI.__instance.connection.createChannel(),
|
|
29
|
+
};
|
|
30
|
+
console.log('[BROKER] Channels: ', BrokerAPI.__instance.channels);
|
|
31
|
+
return BrokerAPI.__instance;
|
|
32
|
+
}
|
|
33
|
+
async assertQueue(queueId, options) {
|
|
34
|
+
const result = await this.channels.asserter.assertQueue(queueId, {
|
|
35
|
+
durable: true,
|
|
36
|
+
...options,
|
|
37
|
+
});
|
|
38
|
+
console.log(`[BROKER] Queue "${queueId}" has been asserted.`);
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
async addToQueueWithHeaders(queueId, taskId, headers, options) {
|
|
42
|
+
const bodyStr = JSON.stringify({ taskId });
|
|
43
|
+
const result = this.channels.writer.sendToQueue(queueId, Buffer.from(bodyStr), {
|
|
44
|
+
persistent: true,
|
|
45
|
+
contentType: 'application/json',
|
|
46
|
+
headers: {
|
|
47
|
+
...headers,
|
|
48
|
+
'x-retries': options?.retries ?? 0,
|
|
49
|
+
'x-max-retries': options?.maxRetries ?? 3,
|
|
50
|
+
'x-first-published': Date.now(),
|
|
51
|
+
},
|
|
52
|
+
messageId: taskId,
|
|
53
|
+
});
|
|
54
|
+
if (result) {
|
|
55
|
+
console.log(`[BROKER] Message sent to queue "${queueId}": ${bodyStr}.`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.log(`[BROKER] Message could not sent to queue "${queueId}": ${bodyStr}.`);
|
|
59
|
+
}
|
|
60
|
+
return Promise.resolve(result);
|
|
61
|
+
}
|
|
62
|
+
async addToQueue(queueId, taskId, options) {
|
|
63
|
+
return this.addToQueueWithHeaders(queueId, taskId, {}, options);
|
|
64
|
+
}
|
|
65
|
+
async addQueueHandler(queueId, handler) {
|
|
66
|
+
const resolve = (message) => () => {
|
|
67
|
+
this.channels.writer.ack(message);
|
|
68
|
+
};
|
|
69
|
+
const reject = (message) => () => {
|
|
70
|
+
const content = message?.content?.toString?.();
|
|
71
|
+
const request = JSON.parse(content);
|
|
72
|
+
const headers = message.properties.headers ?? {};
|
|
73
|
+
const retries = headers['x-retries'] ?? 0;
|
|
74
|
+
const maxRetries = headers['x-max-retries'] ?? 3;
|
|
75
|
+
if (retries >= maxRetries) {
|
|
76
|
+
this.channels.writer.ack(message);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
void this.addToQueueWithHeaders(queueId, request.taskId, headers, {
|
|
80
|
+
retries,
|
|
81
|
+
maxRetries,
|
|
82
|
+
}).then(() => this.channels.writer.ack(message));
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
await this.channels.reader.consume(queueId, (message) => {
|
|
86
|
+
const content = message?.content?.toString?.();
|
|
87
|
+
const request = JSON.parse(content);
|
|
88
|
+
void handler(request.taskId, resolve(message), reject(message));
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
89
92
|
//# sourceMappingURL=broker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../lib/broker/broker.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,CAAC;AAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;AACtC,IAAI,CAAC,YAAY,IAAI,gBAAgB;IACnC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;AAMjE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAc,EAAU,EAAE;IAC7C,IAAI,GAAG,CAAC,WAAW,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;QACvD,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC,CAAC;AAaF,MAAM,OAAO,SAAS;IAEpB,UAAU,CAAoB;IAC9B,QAAQ,CAA+B;IAG/B,MAAM,CAAC,UAAU,
|
|
1
|
+
{"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../lib/broker/broker.ts"],"names":[],"mappings":"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"}
|