@lyxa.ai/core 1.0.372 → 1.0.374
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/libraries/event/index.d.ts +2 -2
- package/dist/libraries/event/index.js +14 -15
- package/dist/libraries/event/index.js.map +1 -1
- package/dist/libraries/socket/events/index.d.ts +1 -0
- package/dist/libraries/socket/events/index.js +18 -0
- package/dist/libraries/socket/events/index.js.map +1 -0
- package/dist/libraries/socket/index.d.ts +4 -0
- package/dist/libraries/socket/index.js +21 -0
- package/dist/libraries/socket/index.js.map +1 -0
- package/dist/libraries/socket/socket-context.d.ts +9 -0
- package/dist/libraries/socket/socket-context.js +29 -0
- package/dist/libraries/socket/socket-context.js.map +1 -0
- package/dist/libraries/socket/{socket-event-registery.js → socket-event-registry.js} +1 -1
- package/dist/libraries/socket/socket-event-registry.js.map +1 -0
- package/dist/libraries/socket/socket-trpc.d.ts +71 -0
- package/dist/libraries/socket/socket-trpc.js +22 -0
- package/dist/libraries/socket/socket-trpc.js.map +1 -0
- package/dist/libraries/socket/zAsyncIterable.d.ts +7 -0
- package/dist/libraries/socket/zAsyncIterable.js +35 -0
- package/dist/libraries/socket/zAsyncIterable.js.map +1 -0
- package/dist/types/README.md +1 -1
- package/dist/types/package.json +1 -1
- package/package.json +1 -1
- package/dist/libraries/socket/socket-event-registery.js.map +0 -1
- /package/dist/libraries/socket/{socket-event-registery.d.ts → socket-event-registry.d.ts} +0 -0
|
@@ -4,6 +4,6 @@ import { BaseSocketEvent } from '../socket/BaseSocketEvent';
|
|
|
4
4
|
export declare function initEventBus(rabbitUrl: string): Promise<void>;
|
|
5
5
|
export declare function publishEvent<TPayload extends Record<string, unknown>>(event: BaseEvent<TPayload>): Promise<void>;
|
|
6
6
|
export declare function subscribeToEvent(eventId: string, onMessage: (payload: any) => Promise<void>): Promise<void>;
|
|
7
|
-
export declare function subscribeToSocketEvent(
|
|
8
|
-
export declare function closeEventBus(): Promise<void>;
|
|
7
|
+
export declare function subscribeToSocketEvent(): Promise<amqp.Channel>;
|
|
9
8
|
export declare function publishSocketEvent(event: BaseSocketEvent<any, any>, recipients: string[]): Promise<void>;
|
|
9
|
+
export declare function closeEventBus(): Promise<void>;
|
|
@@ -7,8 +7,8 @@ exports.initEventBus = initEventBus;
|
|
|
7
7
|
exports.publishEvent = publishEvent;
|
|
8
8
|
exports.subscribeToEvent = subscribeToEvent;
|
|
9
9
|
exports.subscribeToSocketEvent = subscribeToSocketEvent;
|
|
10
|
-
exports.closeEventBus = closeEventBus;
|
|
11
10
|
exports.publishSocketEvent = publishSocketEvent;
|
|
11
|
+
exports.closeEventBus = closeEventBus;
|
|
12
12
|
const amqplib_1 = __importDefault(require("amqplib"));
|
|
13
13
|
const instance_utils_1 = require("../../utilities/instance.utils");
|
|
14
14
|
const index_1 = require("../../index");
|
|
@@ -57,10 +57,12 @@ async function subscribeToEvent(eventId, onMessage) {
|
|
|
57
57
|
}, { noAck: false });
|
|
58
58
|
console.log(`Subscribed to event [${eventId}] on queue [${queueName}] for instance [${(0, instance_utils_1.getInstanceId)()}]`);
|
|
59
59
|
}
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
const kEntityEvents = (entityId) => `socket:events:entity:${entityId}`;
|
|
61
|
+
const kEntityInstances = (entityId) => `socket:instances:entity:${entityId}`;
|
|
62
|
+
async function subscribeToSocketEvent() {
|
|
63
|
+
const queueName = `socket-events-${(0, instance_utils_1.getInstanceId)()}`;
|
|
62
64
|
await channel.assertQueue(queueName, { durable: true });
|
|
63
|
-
await channel.bindQueue(queueName, EXCHANGE_NAME,
|
|
65
|
+
await channel.bindQueue(queueName, EXCHANGE_NAME, `instance.${(0, instance_utils_1.getInstanceId)()}.*`);
|
|
64
66
|
await channel.consume(queueName, msg => {
|
|
65
67
|
if (!msg)
|
|
66
68
|
return;
|
|
@@ -76,18 +78,10 @@ async function subscribeToSocketEvent(eventId) {
|
|
|
76
78
|
});
|
|
77
79
|
return channel;
|
|
78
80
|
}
|
|
79
|
-
async function closeEventBus() {
|
|
80
|
-
if (channel)
|
|
81
|
-
await channel.close();
|
|
82
|
-
if (connection)
|
|
83
|
-
await connection.close();
|
|
84
|
-
console.log(`EventBus closed for instance [${(0, instance_utils_1.getInstanceId)()}]`);
|
|
85
|
-
}
|
|
86
81
|
async function publishSocketEvent(event, recipients) {
|
|
87
82
|
const redisService = (0, index_1.getLibraries)().getRedisService();
|
|
88
83
|
const localKey = event.getIdentifier();
|
|
89
84
|
const payload = event.payload();
|
|
90
|
-
const eventType = event.eventType();
|
|
91
85
|
for (const recipient of recipients) {
|
|
92
86
|
const isSub = await redisService.isMemberOfSet(kEntityEvents(recipient), localKey);
|
|
93
87
|
if (isSub) {
|
|
@@ -96,7 +90,7 @@ async function publishSocketEvent(event, recipients) {
|
|
|
96
90
|
continue;
|
|
97
91
|
}
|
|
98
92
|
for (const instanceName of instanceNames) {
|
|
99
|
-
const routingKey = `${INSTANCE_ROUTE_PREFIX}.${instanceName}
|
|
93
|
+
const routingKey = `${INSTANCE_ROUTE_PREFIX}.${instanceName}`;
|
|
100
94
|
const messageBuffer = Buffer.from(JSON.stringify({ localKey, payload, recipient }), 'utf8');
|
|
101
95
|
channel.publish(EXCHANGE_NAME, routingKey, messageBuffer, {
|
|
102
96
|
contentType: 'application/json',
|
|
@@ -108,6 +102,11 @@ async function publishSocketEvent(event, recipients) {
|
|
|
108
102
|
}
|
|
109
103
|
}
|
|
110
104
|
}
|
|
111
|
-
|
|
112
|
-
|
|
105
|
+
async function closeEventBus() {
|
|
106
|
+
if (channel)
|
|
107
|
+
await channel.close();
|
|
108
|
+
if (connection)
|
|
109
|
+
await connection.close();
|
|
110
|
+
console.log(`EventBus closed for instance [${(0, instance_utils_1.getInstanceId)()}]`);
|
|
111
|
+
}
|
|
113
112
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/event/index.ts"],"names":[],"mappings":";;;;;AAYA,oCAKC;AAED,oCASC;AAED,4CA6BC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/event/index.ts"],"names":[],"mappings":"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","sourcesContent":["import amqp from 'amqplib';\nimport { BaseEvent } from './BaseEvent';\nimport { getInstanceId } from '../../utilities/instance.utils';\nimport { BaseSocketEvent } from '../socket/BaseSocketEvent';\nimport { getLibraries } from '../../index';\nimport { LocalSubs } from '../socket/LocalSubscriptionRegistry';\n\nlet connection: amqp.ChannelModel;\nlet channel: amqp.Channel;\nconst EXCHANGE_NAME = 'lyxa.events';\nconst INSTANCE_ROUTE_PREFIX = 'instance'; // routing key: instance.{instanceName}.{eventType}\n\nexport async function initEventBus(rabbitUrl: string) {\n\tconnection = await amqp.connect(rabbitUrl);\n\tchannel = await connection.createChannel();\n\tawait channel.assertExchange(EXCHANGE_NAME, 'topic', { durable: true });\n\tconsole.log(`EventBus initialized with instance ID: ${getInstanceId()}`);\n}\n\nexport async function publishEvent<TPayload extends Record<string, unknown>>(\n\tevent: BaseEvent<TPayload>\n): Promise<void> {\n\tif (!channel) throw new Error('Channel not initialized. Call initEventBus first.');\n\tconst messageBuffer = Buffer.from(JSON.stringify(event.payload));\n\tchannel.publish(EXCHANGE_NAME, event.eventId, messageBuffer, {\n\t\tcontentType: 'application/json',\n\t});\n\tconsole.log(`Published event [${event.eventId}] with payload`, event.payload);\n}\n\nexport async function subscribeToEvent(\n\teventId: string,\n\tonMessage: (payload: any) => Promise<void>\n): Promise<void> {\n\tif (!channel) throw new Error('Channel not initialized. Call initEventBus first.');\n\tconst queueName = `${eventId}-${getInstanceId()}`;\n\tawait channel.assertQueue(queueName, {\n\t\tdurable: false,\n\t\texclusive: true,\n\t\tautoDelete: true,\n\t});\n\tawait channel.bindQueue(queueName, EXCHANGE_NAME, eventId);\n\tawait channel.consume(\n\t\tqueueName,\n\t\tasync msg => {\n\t\t\tif (msg !== null) {\n\t\t\t\tconst payloadString = msg.content.toString();\n\t\t\t\tconst payload = JSON.parse(payloadString);\n\t\t\t\ttry {\n\t\t\t\t\tawait onMessage(payload);\n\t\t\t\t\tchannel.ack(msg);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`Error handling event [${eventId}] on instance [${getInstanceId()}]`, err);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{ noAck: false }\n\t);\n\tconsole.log(`Subscribed to event [${eventId}] on queue [${queueName}] for instance [${getInstanceId()}]`);\n}\n\nconst kEntityEvents = (entityId: string) => `socket:events:entity:${entityId}`;\nconst kEntityInstances = (entityId: string) => `socket:instances:entity:${entityId}`;\n\nexport async function subscribeToSocketEvent() {\n\tconst queueName = `socket-events-${getInstanceId()}`;\n\tawait channel.assertQueue(queueName, { durable: true });\n\tawait channel.bindQueue(queueName, EXCHANGE_NAME, `instance.${getInstanceId()}.*`);\n\n\tawait channel.consume(queueName, msg => {\n\t\tif (!msg) return;\n\t\ttry {\n\t\t\tconst { localKey, payload, recipient } = JSON.parse(msg.content.toString('utf8'));\n\t\t\tLocalSubs.emit(recipient, localKey, payload);\n\t\t\tchannel.ack(msg);\n\t\t} catch (e) {\n\t\t\tconsole.error('Failed to handle instance event', e);\n\t\t\tchannel.nack(msg, false, false);\n\t\t}\n\t});\n\n\treturn channel;\n}\nexport async function publishSocketEvent(\n\tevent: BaseSocketEvent<any, any>,\n\trecipients: string[]\n): Promise<void> {\n\tconst redisService = getLibraries().getRedisService();\n\tconst localKey = event.getIdentifier(); // e.g. \"CHAT_UPSERT_MESSAGE:123123\"\n\tconst payload = event.payload();\n\n\tfor (const recipient of recipients) {\n\t\t// 1) Is this user subscribed to *this* event key?\n\t\tconst isSub = await redisService.isMemberOfSet(kEntityEvents(recipient), localKey);\n\n\t\tif (isSub) {\n\t\t\t// 2) Get all instances where this user is connected\n\t\t\tconst instanceNames = await redisService.getSetMembers(kEntityInstances(recipient));\n\n\t\t\tif (!instanceNames.length) {\n\t\t\t\t// No active instances → push notification fallback\n\t\t\t\t// TODO: queue push notification for { recipient, eventType, payload }\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// 3) Publish to every instance with routing\n\t\t\tfor (const instanceName of instanceNames) {\n\t\t\t\tconst routingKey = `${INSTANCE_ROUTE_PREFIX}.${instanceName}`; // remove event type\n\t\t\t\tconst messageBuffer = Buffer.from(JSON.stringify({ localKey, payload, recipient }), 'utf8');\n\n\t\t\t\tchannel.publish(EXCHANGE_NAME, routingKey, messageBuffer, {\n\t\t\t\t\tcontentType: 'application/json',\n\t\t\t\t\tpersistent: true,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// Not subscribed → push notification fallback\n\t\t\t// TODO: queue push notification for { recipient, eventType, payload }\n\t\t}\n\t}\n}\n\nexport async function closeEventBus(): Promise<void> {\n\tif (channel) await channel.close();\n\tif (connection) await connection.close();\n\tconsole.log(`EventBus closed for instance [${getInstanceId()}]`);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './chatroom-message-send-socket.event';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./chatroom-message-send-socket.event"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/socket/events/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uEAAqD","sourcesContent":["export * from './chatroom-message-send-socket.event';\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./BaseSocketEvent"), exports);
|
|
18
|
+
__exportStar(require("./events"), exports);
|
|
19
|
+
__exportStar(require("./LocalSubscriptionRegistry"), exports);
|
|
20
|
+
__exportStar(require("./socket-event-registry"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/socket/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,2CAAyB;AACzB,8DAA4C;AAC5C,0DAAwC","sourcesContent":["export * from './BaseSocketEvent';\nexport * from './events';\nexport * from './LocalSubscriptionRegistry';\nexport * from './socket-event-registry';\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CreateWSSContextFnOptions } from '@trpc/server/adapters/ws';
|
|
2
|
+
import { IncomingMessage } from 'http';
|
|
3
|
+
import ws from 'ws';
|
|
4
|
+
import { LyxaContextParams } from '../trpc/context';
|
|
5
|
+
export interface LyxaWSContext extends LyxaContextParams {
|
|
6
|
+
req: IncomingMessage;
|
|
7
|
+
client: ws.WebSocket;
|
|
8
|
+
}
|
|
9
|
+
export declare const createLyxaWsContext: (opts: CreateWSSContextFnOptions) => Promise<LyxaWSContext>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLyxaWsContext = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const auth_1 = require("../auth");
|
|
6
|
+
const createLyxaWsContext = async (opts) => {
|
|
7
|
+
const { req, res } = opts;
|
|
8
|
+
const url = new URL(req.url ?? '', 'http://localhost');
|
|
9
|
+
const token = url.searchParams.get('token');
|
|
10
|
+
req.headers = {
|
|
11
|
+
...req.headers,
|
|
12
|
+
authorization: token ? `Bearer ${token}` : undefined,
|
|
13
|
+
};
|
|
14
|
+
let entity;
|
|
15
|
+
if (token) {
|
|
16
|
+
entity = await (0, auth_1.verifyAccessToken)([auth_1.AuthEntityType.USER, auth_1.AuthEntityType.DELIVERY_BOY, auth_1.AuthEntityType.CRM, auth_1.AuthEntityType.SELLER], token);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
client: res,
|
|
20
|
+
req,
|
|
21
|
+
entity,
|
|
22
|
+
requestId: (0, crypto_1.randomUUID)(),
|
|
23
|
+
tokenType: entity ? auth_1.TokenType.ACCESS : undefined,
|
|
24
|
+
usedRefreshToken: false,
|
|
25
|
+
tokenRenewed: false,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
exports.createLyxaWsContext = createLyxaWsContext;
|
|
29
|
+
//# sourceMappingURL=socket-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-context.js","sourceRoot":"/","sources":["libraries/socket/socket-context.ts"],"names":[],"mappings":";;;AACA,mCAAoC;AAIpC,kCAAuE;AAOhE,MAAM,mBAAmB,GAAG,KAAK,EAAE,IAA+B,EAA0B,EAAE;IACpG,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAE1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE5C,GAAG,CAAC,OAAO,GAAG;QACb,GAAG,GAAG,CAAC,OAAO;QACd,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;KACpD,CAAC;IAEF,IAAI,MAAM,CAAC;IACX,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,MAAM,IAAA,wBAAiB,EAC/B,CAAC,qBAAc,CAAC,IAAI,EAAE,qBAAc,CAAC,YAAY,EAAE,qBAAc,CAAC,GAAG,EAAE,qBAAc,CAAC,MAAM,CAAC,EAC7F,KAAK,CACL,CAAC;IACH,CAAC;IAED,OAAO;QACN,MAAM,EAAE,GAAG;QACX,GAAG;QACH,MAAM;QACN,SAAS,EAAE,IAAA,mBAAU,GAAE;QACvB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAChD,gBAAgB,EAAE,KAAK;QACvB,YAAY,EAAE,KAAK;KACnB,CAAC;AACH,CAAC,CAAC;AA5BW,QAAA,mBAAmB,uBA4B9B","sourcesContent":["import { CreateWSSContextFnOptions } from '@trpc/server/adapters/ws';\nimport { randomUUID } from 'crypto';\nimport { IncomingMessage } from 'http';\nimport ws from 'ws';\nimport { LyxaContextParams } from '../trpc/context';\nimport { AuthEntityType, TokenType, verifyAccessToken } from '../auth';\n\nexport interface LyxaWSContext extends LyxaContextParams {\n\treq: IncomingMessage;\n\tclient: ws.WebSocket;\n}\n\nexport const createLyxaWsContext = async (opts: CreateWSSContextFnOptions): Promise<LyxaWSContext> => {\n\tconst { req, res } = opts;\n\n\tconst url = new URL(req.url ?? '', 'http://localhost');\n\tconst token = url.searchParams.get('token');\n\n\treq.headers = {\n\t\t...req.headers,\n\t\tauthorization: token ? `Bearer ${token}` : undefined,\n\t};\n\n\tlet entity;\n\tif (token) {\n\t\tentity = await verifyAccessToken(\n\t\t\t[AuthEntityType.USER, AuthEntityType.DELIVERY_BOY, AuthEntityType.CRM, AuthEntityType.SELLER],\n\t\t\ttoken\n\t\t);\n\t}\n\n\treturn {\n\t\tclient: res,\n\t\treq,\n\t\tentity,\n\t\trequestId: randomUUID(),\n\t\ttokenType: entity ? TokenType.ACCESS : undefined,\n\t\tusedRefreshToken: false,\n\t\ttokenRenewed: false,\n\t};\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-event-registry.js","sourceRoot":"/","sources":["libraries/socket/socket-event-registry.ts"],"names":[],"mappings":";;;AACA,oGAIqD;AACrD,+CAAuD;AAOvD,MAAM,QAAQ,GAAG;IAChB,CAAC,sBAAe,CAAC,qBAAqB,CAAC,EAAE;QACxC,IAAI,EAAE,6DAIL;QACD,KAAK,EAAE,6DAAwB,CAAC,OAAO,CAAC,KAAK;QAC7C,MAAM,EAAE,6DAAwB,CAAC,OAAO,CAAC,MAAM;QAC/C,UAAU,EAAE,6DAAwB,CAAC,UAAU;KAC/C;CACQ,CAAC;AAOX,MAAa,YAAY;IACjB,MAAM,CAAC,WAAW,CAA4B,eAAkB,EAAE,IAAmB;QAC3F,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC3C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAgB,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,kBAAkB,CAC/B,eAAkB,EAClB,KAA6C;QAE7C,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;QACjD,OAAO,GAAG,eAAe,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAClD,CAAC;CACD;AAbD,oCAaC","sourcesContent":["import z, { ZodTypeAny } from 'zod';\nimport {\n\tChatroomMessageSendEvent,\n\tChatroomMessageSendInput,\n\tChatroomMessageSendOutput,\n} from './events/chatroom-message-send-socket.event';\nimport { SocketEventType } from '../../utilities/enum';\nimport { BaseSocketEvent } from './BaseSocketEvent';\n\ntype EventCtor<SIn extends ZodTypeAny, SOut extends ZodTypeAny, C extends BaseSocketEvent<SIn, SOut>> = new (\n\tdata: z.input<SOut>\n) => C;\n\nconst REGISTRY = {\n\t[SocketEventType.CHATROOM_MESSAGE_SEND]: {\n\t\tctor: ChatroomMessageSendEvent as EventCtor<\n\t\t\ttypeof ChatroomMessageSendInput,\n\t\t\ttypeof ChatroomMessageSendOutput,\n\t\t\tChatroomMessageSendEvent\n\t\t>,\n\t\tinput: ChatroomMessageSendEvent.schemas.input,\n\t\toutput: ChatroomMessageSendEvent.schemas.output,\n\t\tidentifier: ChatroomMessageSendEvent.identifier,\n\t},\n} as const;\n\ntype Registry = typeof REGISTRY;\n\ntype PayloadFor<T extends SocketEventType> = z.input<Registry[T]['output']>;\ntype EventFor<T extends SocketEventType> = InstanceType<Registry[T]['ctor']>;\n\nexport class EventFactory {\n\tpublic static createEvent<T extends SocketEventType>(SocketEventType: T, data: PayloadFor<T>): EventFor<T> {\n\t\tconst { ctor } = REGISTRY[SocketEventType];\n\t\treturn new ctor(data) as EventFor<T>;\n\t}\n\n\tpublic static getSubscriptionKey<T extends SocketEventType>(\n\t\tSocketEventType: T,\n\t\tinput: z.infer<(typeof REGISTRY)[T]['input']>\n\t): string {\n\t\tconst { identifier } = REGISTRY[SocketEventType];\n\t\treturn `${SocketEventType}:${identifier(input)}`;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { TRPCError } from '@trpc/server';
|
|
2
|
+
import { LyxaWSContext } from './socket-context';
|
|
3
|
+
export declare const tWS: import("@trpc/server").TRPCRootObject<LyxaWSContext, object, {
|
|
4
|
+
errorFormatter({ shape, error }: {
|
|
5
|
+
error: TRPCError;
|
|
6
|
+
type: import("@trpc/server").ProcedureType | "unknown";
|
|
7
|
+
path: string | undefined;
|
|
8
|
+
input: unknown;
|
|
9
|
+
ctx: LyxaWSContext | undefined;
|
|
10
|
+
shape: import("@trpc/server").TRPCDefaultErrorShape;
|
|
11
|
+
}): {
|
|
12
|
+
data: {
|
|
13
|
+
stack: undefined;
|
|
14
|
+
path: undefined;
|
|
15
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
16
|
+
httpStatus: number;
|
|
17
|
+
};
|
|
18
|
+
stack: undefined;
|
|
19
|
+
message: string;
|
|
20
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
|
|
21
|
+
};
|
|
22
|
+
}, {
|
|
23
|
+
ctx: LyxaWSContext;
|
|
24
|
+
meta: object;
|
|
25
|
+
errorShape: {
|
|
26
|
+
data: {
|
|
27
|
+
stack: undefined;
|
|
28
|
+
path: undefined;
|
|
29
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
30
|
+
httpStatus: number;
|
|
31
|
+
};
|
|
32
|
+
stack: undefined;
|
|
33
|
+
message: string;
|
|
34
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
|
|
35
|
+
};
|
|
36
|
+
transformer: false;
|
|
37
|
+
}>;
|
|
38
|
+
export declare const publicWSProcedure: import("@trpc/server").TRPCProcedureBuilder<LyxaWSContext, object, object, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, false>;
|
|
39
|
+
export declare const createWSRouter: import("@trpc/server").TRPCRouterBuilder<{
|
|
40
|
+
ctx: LyxaWSContext;
|
|
41
|
+
meta: object;
|
|
42
|
+
errorShape: {
|
|
43
|
+
data: {
|
|
44
|
+
stack: undefined;
|
|
45
|
+
path: undefined;
|
|
46
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
47
|
+
httpStatus: number;
|
|
48
|
+
};
|
|
49
|
+
stack: undefined;
|
|
50
|
+
message: string;
|
|
51
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
|
|
52
|
+
};
|
|
53
|
+
transformer: false;
|
|
54
|
+
}>;
|
|
55
|
+
export declare const createWSCallerFactory: import("@trpc/server").TRPCRouterCallerFactory<{
|
|
56
|
+
ctx: LyxaWSContext;
|
|
57
|
+
meta: object;
|
|
58
|
+
errorShape: {
|
|
59
|
+
data: {
|
|
60
|
+
stack: undefined;
|
|
61
|
+
path: undefined;
|
|
62
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
63
|
+
httpStatus: number;
|
|
64
|
+
};
|
|
65
|
+
stack: undefined;
|
|
66
|
+
message: string;
|
|
67
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
|
|
68
|
+
};
|
|
69
|
+
transformer: false;
|
|
70
|
+
}>;
|
|
71
|
+
export type LyxaWSRouter = ReturnType<typeof createWSRouter>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createWSCallerFactory = exports.createWSRouter = exports.publicWSProcedure = exports.tWS = void 0;
|
|
4
|
+
const server_1 = require("@trpc/server");
|
|
5
|
+
exports.tWS = server_1.initTRPC.context().create({
|
|
6
|
+
errorFormatter({ shape, error }) {
|
|
7
|
+
console.log('WS Error:', error, shape);
|
|
8
|
+
return {
|
|
9
|
+
...shape,
|
|
10
|
+
data: {
|
|
11
|
+
...shape.data,
|
|
12
|
+
stack: undefined,
|
|
13
|
+
path: undefined,
|
|
14
|
+
},
|
|
15
|
+
stack: undefined,
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
exports.publicWSProcedure = exports.tWS.procedure;
|
|
20
|
+
exports.createWSRouter = exports.tWS.router;
|
|
21
|
+
exports.createWSCallerFactory = exports.tWS.createCallerFactory;
|
|
22
|
+
//# sourceMappingURL=socket-trpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-trpc.js","sourceRoot":"/","sources":["libraries/socket/socket-trpc.ts"],"names":[],"mappings":";;;AAAA,yCAAmD;AAGtC,QAAA,GAAG,GAAG,iBAAQ,CAAC,OAAO,EAAiB,CAAC,MAAM,CAAC;IAC3D,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEvC,OAAO;YACN,GAAG,KAAK;YACR,IAAI,EAAE;gBACL,GAAG,KAAK,CAAC,IAAI;gBACb,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,SAAS;aACf;YACD,KAAK,EAAE,SAAS;SAChB,CAAC;IACH,CAAC;CACD,CAAC,CAAC;AAEU,QAAA,iBAAiB,GAAG,WAAG,CAAC,SAAS,CAAC;AAClC,QAAA,cAAc,GAAG,WAAG,CAAC,MAAM,CAAC;AAC5B,QAAA,qBAAqB,GAAG,WAAG,CAAC,mBAAmB,CAAC","sourcesContent":["import { initTRPC, TRPCError } from '@trpc/server';\nimport { LyxaWSContext } from './socket-context';\n\nexport const tWS = initTRPC.context<LyxaWSContext>().create({\n\terrorFormatter({ shape, error }) {\n\t\tconsole.log('WS Error:', error, shape);\n\n\t\treturn {\n\t\t\t...shape,\n\t\t\tdata: {\n\t\t\t\t...shape.data,\n\t\t\t\tstack: undefined,\n\t\t\t\tpath: undefined,\n\t\t\t},\n\t\t\tstack: undefined,\n\t\t};\n\t},\n});\n\nexport const publicWSProcedure = tWS.procedure;\nexport const createWSRouter = tWS.router;\nexport const createWSCallerFactory = tWS.createCallerFactory;\n\nexport type LyxaWSRouter = ReturnType<typeof createWSRouter>;\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TrackedEnvelope } from '@trpc/server';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export declare function zAsyncIterable<TYieldIn, TYieldOut, TReturnIn = void, TReturnOut = void, Tracked extends boolean = false>(opts: {
|
|
4
|
+
yield: z.ZodType<TYieldIn, any, TYieldOut>;
|
|
5
|
+
return?: z.ZodType<TReturnIn, any, TReturnOut>;
|
|
6
|
+
tracked?: Tracked;
|
|
7
|
+
}): z.ZodType<AsyncIterable<Tracked extends true ? TrackedEnvelope<TYieldIn> : TYieldIn, TReturnIn, unknown>, any, AsyncIterable<Tracked extends true ? TrackedEnvelope<TYieldOut> : TYieldOut, TReturnOut, unknown>>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.zAsyncIterable = zAsyncIterable;
|
|
4
|
+
const server_1 = require("@trpc/server");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
function isAsyncIterable(value) {
|
|
7
|
+
return !!value && typeof value === 'object' && Symbol.asyncIterator in value;
|
|
8
|
+
}
|
|
9
|
+
const trackedEnvelopeSchema = zod_1.z.custom(server_1.isTrackedEnvelope);
|
|
10
|
+
function zAsyncIterable(opts) {
|
|
11
|
+
return zod_1.z
|
|
12
|
+
.custom(val => isAsyncIterable(val))
|
|
13
|
+
.transform(async function* (iter) {
|
|
14
|
+
const iterator = iter[Symbol.asyncIterator]();
|
|
15
|
+
try {
|
|
16
|
+
let next;
|
|
17
|
+
while ((next = await iterator.next()) && !next.done) {
|
|
18
|
+
if (opts.tracked) {
|
|
19
|
+
const [id, data] = trackedEnvelopeSchema.parse(next.value);
|
|
20
|
+
yield (0, server_1.tracked)(id, await opts.yield.parseAsync(data));
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
yield opts.yield.parseAsync(next.value);
|
|
24
|
+
}
|
|
25
|
+
if (opts.return) {
|
|
26
|
+
return await opts.return.parseAsync(next.value);
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await iterator.return?.();
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=zAsyncIterable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zAsyncIterable.js","sourceRoot":"/","sources":["libraries/socket/zAsyncIterable.ts"],"names":[],"mappings":";;AAgBA,wCAkDC;AAjED,yCAA0D;AAC1D,6BAAwB;AAExB,SAAS,eAAe,CAA4B,KAAc;IACjE,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC;AAC9E,CAAC;AAED,MAAM,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAA2B,0BAAiB,CAAC,CAAC;AAQpF,SAAgB,cAAc,CAM5B,IAeD;IACA,OAAO,OAAC;SACN,MAAM,CAAwF,GAAG,CAAC,EAAE,CACpG,eAAe,CAAC,GAAG,CAAC,CACpB;SACA,SAAS,CAAC,KAAK,SAAS,CAAC,EAAE,IAAI;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC;YACJ,IAAI,IAAI,CAAC;YACT,OAAO,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC3D,MAAM,IAAA,gBAAO,EAAC,EAAE,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;oBACrD,SAAS;gBACV,CAAC;gBACD,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;YACD,OAAO;QACR,CAAC;gBAAS,CAAC;YACV,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3B,CAAC;IACF,CAAC,CAID,CAAC;AACH,CAAC","sourcesContent":["import type { TrackedEnvelope } from '@trpc/server';\nimport { isTrackedEnvelope, tracked } from '@trpc/server';\nimport { z } from 'zod';\n\nfunction isAsyncIterable<TValue, TReturn = unknown>(value: unknown): value is AsyncIterable<TValue, TReturn> {\n\treturn !!value && typeof value === 'object' && Symbol.asyncIterator in value;\n}\n\nconst trackedEnvelopeSchema = z.custom<TrackedEnvelope<unknown>>(isTrackedEnvelope);\n\n/**\n * A Zod schema helper designed specifically for validating async iterables. This schema ensures that:\n * 1. The value being validated is an async iterable.\n * 2. Each item yielded by the async iterable conforms to a specified type.\n * 3. The return value of the async iterable, if any, also conforms to a specified type.\n */\nexport function zAsyncIterable<\n\tTYieldIn,\n\tTYieldOut,\n\tTReturnIn = void,\n\tTReturnOut = void,\n\tTracked extends boolean = false,\n>(opts: {\n\t/**\n\t * Validate the value yielded by the async generator\n\t */\n\tyield: z.ZodType<TYieldIn, any, TYieldOut>;\n\t/**\n\t * Validate the return value of the async generator\n\t * @remark not applicable for subscriptions\n\t */\n\treturn?: z.ZodType<TReturnIn, any, TReturnOut>;\n\t/**\n\t * Whether if the yielded values are tracked\n\t * @remark only applicable for subscriptions\n\t */\n\ttracked?: Tracked;\n}) {\n\treturn z\n\t\t.custom<AsyncIterable<Tracked extends true ? TrackedEnvelope<TYieldIn> : TYieldIn, TReturnIn>>(val =>\n\t\t\tisAsyncIterable(val)\n\t\t)\n\t\t.transform(async function* (iter) {\n\t\t\tconst iterator = iter[Symbol.asyncIterator]();\n\t\t\ttry {\n\t\t\t\tlet next;\n\t\t\t\twhile ((next = await iterator.next()) && !next.done) {\n\t\t\t\t\tif (opts.tracked) {\n\t\t\t\t\t\tconst [id, data] = trackedEnvelopeSchema.parse(next.value);\n\t\t\t\t\t\tyield tracked(id, await opts.yield.parseAsync(data));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tyield opts.yield.parseAsync(next.value);\n\t\t\t\t}\n\t\t\t\tif (opts.return) {\n\t\t\t\t\treturn await opts.return.parseAsync(next.value);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t} finally {\n\t\t\t\tawait iterator.return?.();\n\t\t\t}\n\t\t}) as z.ZodType<\n\t\tAsyncIterable<Tracked extends true ? TrackedEnvelope<TYieldIn> : TYieldIn, TReturnIn, unknown>,\n\t\tany,\n\t\tAsyncIterable<Tracked extends true ? TrackedEnvelope<TYieldOut> : TYieldOut, TReturnOut, unknown>\n\t>;\n}\n"]}
|
package/dist/types/README.md
CHANGED
package/dist/types/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"socket-event-registery.js","sourceRoot":"/","sources":["libraries/socket/socket-event-registery.ts"],"names":[],"mappings":";;;AACA,oGAIqD;AACrD,+CAAuD;AAOvD,MAAM,QAAQ,GAAG;IAChB,CAAC,sBAAe,CAAC,qBAAqB,CAAC,EAAE;QACxC,IAAI,EAAE,6DAIL;QACD,KAAK,EAAE,6DAAwB,CAAC,OAAO,CAAC,KAAK;QAC7C,MAAM,EAAE,6DAAwB,CAAC,OAAO,CAAC,MAAM;QAC/C,UAAU,EAAE,6DAAwB,CAAC,UAAU;KAC/C;CACQ,CAAC;AAOX,MAAa,YAAY;IACjB,MAAM,CAAC,WAAW,CAA4B,eAAkB,EAAE,IAAmB;QAC3F,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC3C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAgB,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,kBAAkB,CAC/B,eAAkB,EAClB,KAA6C;QAE7C,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;QACjD,OAAO,GAAG,eAAe,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAClD,CAAC;CACD;AAbD,oCAaC","sourcesContent":["import z, { ZodTypeAny } from 'zod';\nimport {\n\tChatroomMessageSendEvent,\n\tChatroomMessageSendInput,\n\tChatroomMessageSendOutput,\n} from './events/chatroom-message-send-socket.event';\nimport { SocketEventType } from '../../utilities/enum';\nimport { BaseSocketEvent } from './BaseSocketEvent';\n\ntype EventCtor<SIn extends ZodTypeAny, SOut extends ZodTypeAny, C extends BaseSocketEvent<SIn, SOut>> = new (\n\tdata: z.input<SOut>\n) => C;\n\nconst REGISTRY = {\n\t[SocketEventType.CHATROOM_MESSAGE_SEND]: {\n\t\tctor: ChatroomMessageSendEvent as EventCtor<\n\t\t\ttypeof ChatroomMessageSendInput,\n\t\t\ttypeof ChatroomMessageSendOutput,\n\t\t\tChatroomMessageSendEvent\n\t\t>,\n\t\tinput: ChatroomMessageSendEvent.schemas.input,\n\t\toutput: ChatroomMessageSendEvent.schemas.output,\n\t\tidentifier: ChatroomMessageSendEvent.identifier,\n\t},\n} as const;\n\ntype Registry = typeof REGISTRY;\n\ntype PayloadFor<T extends SocketEventType> = z.input<Registry[T]['output']>;\ntype EventFor<T extends SocketEventType> = InstanceType<Registry[T]['ctor']>;\n\nexport class EventFactory {\n\tpublic static createEvent<T extends SocketEventType>(SocketEventType: T, data: PayloadFor<T>): EventFor<T> {\n\t\tconst { ctor } = REGISTRY[SocketEventType];\n\t\treturn new ctor(data) as EventFor<T>;\n\t}\n\n\tpublic static getSubscriptionKey<T extends SocketEventType>(\n\t\tSocketEventType: T,\n\t\tinput: z.infer<(typeof REGISTRY)[T]['input']>\n\t): string {\n\t\tconst { identifier } = REGISTRY[SocketEventType];\n\t\treturn `${SocketEventType}:${identifier(input)}`;\n\t}\n}\n"]}
|
|
File without changes
|