@lyxa.ai/core 1.0.380 → 1.0.381

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/libraries/event/index.d.ts +1 -1
  2. package/dist/libraries/event/index.js +2 -5
  3. package/dist/libraries/event/index.js.map +1 -1
  4. package/dist/libraries/socket/adapters/index.d.ts +2 -0
  5. package/dist/libraries/socket/adapters/index.js +19 -0
  6. package/dist/libraries/socket/adapters/index.js.map +1 -0
  7. package/dist/libraries/socket/{socket-context.d.ts → adapters/socket-context.d.ts} +1 -1
  8. package/dist/libraries/socket/{socket-context.js → adapters/socket-context.js} +1 -1
  9. package/dist/libraries/socket/adapters/socket-context.js.map +1 -0
  10. package/dist/libraries/socket/adapters/socket-trpc.js.map +1 -0
  11. package/dist/libraries/socket/{BaseSocketEvent.d.ts → core/BaseSocketEvent.d.ts} +1 -1
  12. package/dist/libraries/socket/core/BaseSocketEvent.js.map +1 -0
  13. package/dist/libraries/socket/core/LocalSubscriptionRegistry.js.map +1 -0
  14. package/dist/libraries/socket/core/index.d.ts +5 -0
  15. package/dist/libraries/socket/core/index.js +22 -0
  16. package/dist/libraries/socket/core/index.js.map +1 -0
  17. package/dist/libraries/socket/{socket-event-registry.d.ts → core/socket-event-registry.d.ts} +5 -5
  18. package/dist/libraries/socket/{socket-event-registry.js → core/socket-event-registry.js} +2 -2
  19. package/dist/libraries/socket/core/socket-event-registry.js.map +1 -0
  20. package/dist/libraries/socket/{socket-redis-connections.d.ts → core/socket-redis-connections.d.ts} +1 -0
  21. package/dist/libraries/socket/{socket-redis-connections.js → core/socket-redis-connections.js} +31 -6
  22. package/dist/libraries/socket/core/socket-redis-connections.js.map +1 -0
  23. package/dist/libraries/socket/core/zAsyncIterable.js.map +1 -0
  24. package/dist/libraries/socket/events/chatlist-message-send.socket.event.d.ts +67 -0
  25. package/dist/libraries/socket/events/chatlist-message-send.socket.event.js +30 -0
  26. package/dist/libraries/socket/events/chatlist-message-send.socket.event.js.map +1 -0
  27. package/dist/libraries/socket/events/{chatroom-message-send-socket.event.d.ts → chatroom-message-send.socket.event.d.ts} +7 -7
  28. package/dist/libraries/socket/events/{chatroom-message-send-socket.event.js → chatroom-message-send.socket.event.js} +4 -4
  29. package/dist/libraries/socket/events/chatroom-message-send.socket.event.js.map +1 -0
  30. package/dist/libraries/socket/events/index.d.ts +1 -1
  31. package/dist/libraries/socket/events/index.js +1 -1
  32. package/dist/libraries/socket/events/index.js.map +1 -1
  33. package/dist/libraries/socket/index.d.ts +2 -3
  34. package/dist/libraries/socket/index.js +2 -3
  35. package/dist/libraries/socket/index.js.map +1 -1
  36. package/dist/types/README.md +1 -1
  37. package/dist/types/package.json +1 -1
  38. package/package.json +1 -1
  39. package/dist/libraries/socket/BaseSocketEvent.js.map +0 -1
  40. package/dist/libraries/socket/LocalSubscriptionRegistry.js.map +0 -1
  41. package/dist/libraries/socket/events/chatroom-message-send-socket.event.js.map +0 -1
  42. package/dist/libraries/socket/socket-context.js.map +0 -1
  43. package/dist/libraries/socket/socket-event-registry.js.map +0 -1
  44. package/dist/libraries/socket/socket-redis-connections.js.map +0 -1
  45. package/dist/libraries/socket/socket-trpc.js.map +0 -1
  46. package/dist/libraries/socket/zAsyncIterable.js.map +0 -1
  47. /package/dist/libraries/socket/{socket-trpc.d.ts → adapters/socket-trpc.d.ts} +0 -0
  48. /package/dist/libraries/socket/{socket-trpc.js → adapters/socket-trpc.js} +0 -0
  49. /package/dist/libraries/socket/{BaseSocketEvent.js → core/BaseSocketEvent.js} +0 -0
  50. /package/dist/libraries/socket/{LocalSubscriptionRegistry.d.ts → core/LocalSubscriptionRegistry.d.ts} +0 -0
  51. /package/dist/libraries/socket/{LocalSubscriptionRegistry.js → core/LocalSubscriptionRegistry.js} +0 -0
  52. /package/dist/libraries/socket/{zAsyncIterable.d.ts → core/zAsyncIterable.d.ts} +0 -0
  53. /package/dist/libraries/socket/{zAsyncIterable.js → core/zAsyncIterable.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import amqp from 'amqplib';
2
2
  import { BaseEvent } from './BaseEvent';
3
- import { BaseSocketEvent } from '../socket/BaseSocketEvent';
3
+ import { BaseSocketEvent } from '../socket/core/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>;
@@ -12,8 +12,8 @@ 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");
15
- const LocalSubscriptionRegistry_1 = require("../socket/LocalSubscriptionRegistry");
16
- const socket_redis_connections_1 = require("../socket/socket-redis-connections");
15
+ const LocalSubscriptionRegistry_1 = require("../socket/core/LocalSubscriptionRegistry");
16
+ const socket_redis_connections_1 = require("../socket/core/socket-redis-connections");
17
17
  let connection;
18
18
  let channel;
19
19
  const EXCHANGE_NAME = 'lyxa.events';
@@ -83,17 +83,14 @@ async function publishSocketEvent(event, recipients) {
83
83
  const payload = event.payload();
84
84
  for (const recipient of recipients) {
85
85
  const isSub = await (0, socket_redis_connections_1.isEntitySubscribed)(recipient, localKey);
86
- console.log(isSub);
87
86
  if (isSub) {
88
87
  const instanceNames = await redisService.getSetMembers((0, socket_redis_connections_1.kEntityInstances)(recipient));
89
- console.log(instanceNames);
90
88
  if (!instanceNames.length) {
91
89
  continue;
92
90
  }
93
91
  for (const instanceName of instanceNames) {
94
92
  const routingKey = `${INSTANCE_ROUTE_PREFIX}.${instanceName}`;
95
93
  const messageBuffer = Buffer.from(JSON.stringify({ localKey, payload, recipient }), 'utf8');
96
- console.log("published on routing key", routingKey);
97
94
  channel.publish(EXCHANGE_NAME, routingKey, messageBuffer, {
98
95
  contentType: 'application/json',
99
96
  persistent: true,
@@ -1 +1 @@
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';\nimport { isEntitySubscribed, kEntityEvents, kEntityInstances } from '../socket/socket-redis-connections';\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\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 isEntitySubscribed(recipient, localKey);\n\n\t\tconsole.log(isSub)\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\tconsole.log(instanceNames)\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\tconsole.log(\"published on routing key\", routingKey)\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"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/event/index.ts"],"names":[],"mappings":";;;;;AAaA,oCAKC;AAED,oCASC;AAED,4CA6BC;AAED,wDAkBC;AACD,gDAgCC;AAED,sCAIC;AAvHD,sDAA2B;AAE3B,mEAA+D;AAE/D,uCAA2C;AAC3C,wFAAqE;AACrE,sFAA8G;AAE9G,IAAI,UAA6B,CAAC;AAClC,IAAI,OAAqB,CAAC;AAC1B,MAAM,aAAa,GAAG,aAAa,CAAC;AACpC,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAElC,KAAK,UAAU,YAAY,CAAC,SAAiB;IACnD,UAAU,GAAG,MAAM,iBAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;IAC3C,MAAM,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,0CAA0C,IAAA,8BAAa,GAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAEM,KAAK,UAAU,YAAY,CACjC,KAA0B;IAE1B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACnF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE;QAC5D,WAAW,EAAE,kBAAkB;KAC/B,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,OAAO,gBAAgB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;AAC/E,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACrC,OAAe,EACf,SAA0C;IAE1C,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,GAAG,OAAO,IAAI,IAAA,8BAAa,GAAE,EAAE,CAAC;IAClD,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE;QACpC,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,OAAO,CAAC,OAAO,CACpB,SAAS,EACT,KAAK,EAAC,GAAG,EAAC,EAAE;QACX,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC1C,IAAI,CAAC;gBACJ,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,yBAAyB,OAAO,kBAAkB,IAAA,8BAAa,GAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAC1F,CAAC;QACF,CAAC;IACF,CAAC,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,CAChB,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,eAAe,SAAS,mBAAmB,IAAA,8BAAa,GAAE,GAAG,CAAC,CAAC;AAC3G,CAAC;AAEM,KAAK,UAAU,sBAAsB;IAC3C,MAAM,SAAS,GAAG,iBAAiB,IAAA,8BAAa,GAAE,EAAE,CAAC;IACrD,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,YAAY,IAAA,8BAAa,GAAE,EAAE,CAAC,CAAC;IAEjF,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC;YACJ,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAClF,qCAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AAChB,CAAC;AACM,KAAK,UAAU,kBAAkB,CACvC,KAAgC,EAChC,UAAoB;IAEpB,MAAM,YAAY,GAAG,IAAA,oBAAY,GAAE,CAAC,eAAe,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IAEhC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,IAAA,6CAAkB,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5D,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,IAAA,2CAAgB,EAAC,SAAS,CAAC,CAAC,CAAC;YACpF,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;gBAG3B,SAAS;YACV,CAAC;YAGD,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;gBAC1C,MAAM,UAAU,GAAG,GAAG,qBAAqB,IAAI,YAAY,EAAE,CAAC;gBAC9D,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC5F,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE;oBACzD,WAAW,EAAE,kBAAkB;oBAC/B,UAAU,EAAE,IAAI;iBAChB,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;aAAM,CAAC;QAGR,CAAC;IACF,CAAC;AACF,CAAC;AAEM,KAAK,UAAU,aAAa;IAClC,IAAI,OAAO;QAAE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACnC,IAAI,UAAU;QAAE,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAA,8BAAa,GAAE,GAAG,CAAC,CAAC;AAClE,CAAC","sourcesContent":["import amqp from 'amqplib';\nimport { BaseEvent } from './BaseEvent';\nimport { getInstanceId } from '../../utilities/instance.utils';\nimport { BaseSocketEvent } from '../socket/core/BaseSocketEvent';\nimport { getLibraries } from '../../index';\nimport { LocalSubs } from '../socket/core/LocalSubscriptionRegistry';\nimport { isEntitySubscribed, kEntityEvents, kEntityInstances } from '../socket/core/socket-redis-connections';\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\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\tconst isSub = await isEntitySubscribed(recipient, localKey);\n\t\tif (isSub) {\n\t\t\tconst instanceNames = await redisService.getSetMembers(kEntityInstances(recipient));\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}`;\n\t\t\t\tconst messageBuffer = Buffer.from(JSON.stringify({ localKey, payload, recipient }), 'utf8');\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,2 @@
1
+ export * from './socket-trpc';
2
+ export * from './socket-context';
@@ -0,0 +1,19 @@
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("./socket-trpc"), exports);
18
+ __exportStar(require("./socket-context"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/socket/adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,mDAAiC","sourcesContent":["export * from './socket-trpc';\nexport * from './socket-context';\n"]}
@@ -1,7 +1,7 @@
1
1
  import { CreateWSSContextFnOptions } from '@trpc/server/adapters/ws';
2
2
  import { IncomingMessage } from 'http';
3
3
  import ws from 'ws';
4
- import { LyxaContextParams } from '../trpc/context';
4
+ import { LyxaContextParams } from '../../trpc/context';
5
5
  export interface LyxaWSContext extends LyxaContextParams {
6
6
  req: IncomingMessage;
7
7
  client: ws.WebSocket;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createLyxaWsContext = void 0;
4
4
  const crypto_1 = require("crypto");
5
- const auth_1 = require("../auth");
5
+ const auth_1 = require("../../auth");
6
6
  const createLyxaWsContext = async (opts) => {
7
7
  const { req, res } = opts;
8
8
  const url = new URL(req.url ?? '', 'http://localhost');
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-context.js","sourceRoot":"/","sources":["libraries/socket/adapters/socket-context.ts"],"names":[],"mappings":";;;AACA,mCAAoC;AAIpC,qCAA0E;AAOnE,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-trpc.js","sourceRoot":"/","sources":["libraries/socket/adapters/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"]}
@@ -1,5 +1,5 @@
1
1
  import z, { ZodTypeAny } from 'zod';
2
- import { SocketEventType } from '../../utilities/enum';
2
+ import { SocketEventType } from '../../../utilities/enum';
3
3
  export declare abstract class BaseSocketEvent<SIn extends ZodTypeAny, SOut extends ZodTypeAny> {
4
4
  protected readonly _eventType: SocketEventType;
5
5
  protected readonly inputSchema: SIn;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseSocketEvent.js","sourceRoot":"/","sources":["libraries/socket/core/BaseSocketEvent.ts"],"names":[],"mappings":";;;AAGA,MAAsB,eAAe;IACjB,UAAU,CAAkB;IAC5B,WAAW,CAAM;IACjB,YAAY,CAAO;IAEnB,IAAI,CAAgB;IAIvC,YACC,SAA0B,EAC1B,OAAqC,EACrC,IAAmB;QAEnB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;QAEnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEM,OAAO;QACb,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAEM,SAAS;QACf,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;CACD;AA5BD,0CA4BC","sourcesContent":["import z, { ZodTypeAny } from 'zod';\nimport { SocketEventType } from '../../../utilities/enum';\n\nexport abstract class BaseSocketEvent<SIn extends ZodTypeAny, SOut extends ZodTypeAny> {\n\tprotected readonly _eventType: SocketEventType;\n\tprotected readonly inputSchema: SIn;\n\tprotected readonly outputSchema: SOut;\n\n\tprotected readonly data: z.infer<SOut>;\n\n\tabstract getIdentifier(): string;\n\n\tprotected constructor(\n\t\teventType: SocketEventType,\n\t\tschemas: { input: SIn; output: SOut },\n\t\tdata: z.infer<SOut>\n\t) {\n\t\tthis._eventType = eventType;\n\t\tthis.inputSchema = schemas.input;\n\t\tthis.outputSchema = schemas.output;\n\n\t\tthis.data = this.outputSchema.parse(data);\n\t}\n\n\tpublic payload(): z.infer<SOut> {\n\t\treturn this.data;\n\t}\n\n\tpublic eventType(): SocketEventType {\n\t\treturn this._eventType;\n\t}\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalSubscriptionRegistry.js","sourceRoot":"/","sources":["libraries/socket/core/LocalSubscriptionRegistry.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAkC;AAMlC,MAAa,iBAAiB;IACrB,GAAG,CAAe;IAClB,SAAS,CAAW;IAE5B,YAAY,QAAkB;QAC7B,IAAI,CAAC,GAAG,GAAG,IAAI,gBAAY,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,IAAI,EAAE;QACL,OAAO,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC;CACD;AAhBD,8CAgBC;AAED,MAAM,yBAAyB;IACtB,QAAQ,GAAG,IAAI,GAAG,EAAmD,CAAC;IAE9E,IAAI,CAAC,QAAkB,EAAE,QAAkB,EAAE,EAAqB;QACjE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,EAAE,CAAC;YACR,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,EAAE,CAAC;YACR,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,QAAkB,EAAE,QAAkB,EAAE,EAAqB;QACnE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC;YACP,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;gBAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,QAAkB,EAAE,QAAkB,EAAE,OAAgB;QAC5D,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,EAAE;YAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;CACD;AAEY,QAAA,SAAS,GAAG,IAAI,yBAAyB,EAAE,CAAC","sourcesContent":["import EventEmitter from 'events';\n\ntype EventKey = string; // \"EVENT_TYPE:identifier\"\ntype EntityId = string;\ntype SocketId = string;\n\nexport class LocalEventEmitter {\n\tprivate _ee: EventEmitter;\n\tprivate _socketId: SocketId;\n\n\tconstructor(socketId: SocketId) {\n\t\tthis._ee = new EventEmitter();\n\t\tthis._socketId = socketId;\n\t}\n\n\tget socketId() {\n\t\treturn this._socketId;\n\t}\n\n\tget ee() {\n\t\treturn this._ee;\n\t}\n}\n\nclass LocalSubscriptionRegistry {\n\tprivate byEntity = new Map<EntityId, Map<EventKey, Set<LocalEventEmitter>>>();\n\n\tbind(entityId: EntityId, eventKey: EventKey, ee: LocalEventEmitter) {\n\t\tlet m = this.byEntity.get(entityId);\n\t\tif (!m) {\n\t\t\tm = new Map();\n\t\t\tthis.byEntity.set(entityId, m);\n\t\t}\n\t\tconst s = m.get(eventKey);\n\t\tif (!s) {\n\t\t\tm.set(eventKey, new Set());\n\t\t}\n\t\tm.get(eventKey)?.add(ee);\n\t}\n\n\tunbind(entityId: EntityId, eventKey: EventKey, ee: LocalEventEmitter) {\n\t\tconst m = this.byEntity.get(entityId);\n\t\tif (!m) return;\n\t\tconst s = m.get(eventKey);\n\t\tif (s) {\n\t\t\ts.delete(ee);\n\t\t\tif (s.size === 0) m.delete(eventKey);\n\t\t}\n\t\tif (m.size === 0) this.byEntity.delete(entityId);\n\t}\n\n\temit(entityId: EntityId, eventKey: EventKey, payload: unknown) {\n\t\tconst m = this.byEntity.get(entityId);\n\t\tconst ee = m?.get(eventKey);\n\t\tif (ee) ee.forEach(e => e.ee.emit(eventKey, payload));\n\t}\n}\n\nexport const LocalSubs = new LocalSubscriptionRegistry();\n"]}
@@ -0,0 +1,5 @@
1
+ export * from './BaseSocketEvent';
2
+ export * from './LocalSubscriptionRegistry';
3
+ export * from './socket-event-registry';
4
+ export * from './zAsyncIterable';
5
+ export * from './socket-redis-connections';
@@ -0,0 +1,22 @@
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("./LocalSubscriptionRegistry"), exports);
19
+ __exportStar(require("./socket-event-registry"), exports);
20
+ __exportStar(require("./zAsyncIterable"), exports);
21
+ __exportStar(require("./socket-redis-connections"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/socket/core/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,8DAA4C;AAC5C,0DAAwC;AACxC,mDAAiC;AACjC,6DAA2C","sourcesContent":["export * from './BaseSocketEvent';\nexport * from './LocalSubscriptionRegistry';\nexport * from './socket-event-registry';\nexport * from './zAsyncIterable';\nexport * from './socket-redis-connections';\n"]}
@@ -1,6 +1,6 @@
1
1
  import z, { ZodTypeAny } from 'zod';
2
- import { ChatroomMessageSendEvent, ChatroomMessageSendInput, ChatroomMessageSendOutput } from './events/chatroom-message-send-socket.event';
3
- import { SocketEventType } from '../../utilities/enum';
2
+ import { ChatroomMessageSendEvent, ChatroomMessageSendInput, ChatroomMessageSendOutput } from '../events/chatroom-message-send.socket.event';
3
+ import { SocketEventType } from '../../../utilities/enum';
4
4
  import { BaseSocketEvent } from './BaseSocketEvent';
5
5
  type EventCtor<SIn extends ZodTypeAny, SOut extends ZodTypeAny, C extends BaseSocketEvent<SIn, SOut>> = new (data: z.input<SOut>) => C;
6
6
  declare const REGISTRY: {
@@ -16,16 +16,16 @@ declare const REGISTRY: {
16
16
  readonly output: z.ZodObject<{
17
17
  chatId: z.ZodString;
18
18
  messageId: z.ZodString;
19
- contents: z.ZodString;
19
+ content: z.ZodString;
20
20
  createdAt: z.ZodDate;
21
21
  }, "strip", z.ZodTypeAny, {
22
+ content: string;
22
23
  createdAt: Date;
23
- contents: string;
24
24
  chatId: string;
25
25
  messageId: string;
26
26
  }, {
27
+ content: string;
27
28
  createdAt: Date;
28
- contents: string;
29
29
  chatId: string;
30
30
  messageId: string;
31
31
  }>;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EventFactory = void 0;
4
- const chatroom_message_send_socket_event_1 = require("./events/chatroom-message-send-socket.event");
5
- const enum_1 = require("../../utilities/enum");
4
+ const chatroom_message_send_socket_event_1 = require("../events/chatroom-message-send.socket.event");
5
+ const enum_1 = require("../../../utilities/enum");
6
6
  const REGISTRY = {
7
7
  [enum_1.SocketEventType.CHATROOM_MESSAGE_SEND]: {
8
8
  ctor: chatroom_message_send_socket_event_1.ChatroomMessageSendEvent,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-event-registry.js","sourceRoot":"/","sources":["libraries/socket/core/socket-event-registry.ts"],"names":[],"mappings":";;;AACA,qGAIsD;AACtD,kDAA0D;AAO1D,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"]}
@@ -9,3 +9,4 @@ export interface SocketRedisEventInformation {
9
9
  export declare function connectEntityToSocketEvent(entityId: string, socketRedisEventInformation: SocketRedisEventInformation): Promise<void>;
10
10
  export declare function disconnectEntityFromSocketEvent(entityId: string, socketRedisEventInformation: SocketRedisEventInformation): Promise<void>;
11
11
  export declare function isEntitySubscribed(entityId: string, eventKey: string): Promise<boolean>;
12
+ export declare function disconnectAllEntitiesFromInstance(instanceId: string): Promise<void>;
@@ -4,7 +4,8 @@ exports.kEntityConnection = exports.kEntityInstances = exports.kEntityEvents = v
4
4
  exports.connectEntityToSocketEvent = connectEntityToSocketEvent;
5
5
  exports.disconnectEntityFromSocketEvent = disconnectEntityFromSocketEvent;
6
6
  exports.isEntitySubscribed = isEntitySubscribed;
7
- const __1 = require("../..");
7
+ exports.disconnectAllEntitiesFromInstance = disconnectAllEntitiesFromInstance;
8
+ const __1 = require("../../..");
8
9
  const kEntityEvents = (entityId) => `socket:events:entity:${entityId}`;
9
10
  exports.kEntityEvents = kEntityEvents;
10
11
  const kEntityInstances = (entityId) => `socket:instances:entity:${entityId}`;
@@ -31,10 +32,34 @@ async function disconnectEntityFromSocketEvent(entityId, socketRedisEventInforma
31
32
  async function isEntitySubscribed(entityId, eventKey) {
32
33
  const redis = (0, __1.getLibraries)().getRedisService();
33
34
  const events = await redis.getSetMembers((0, exports.kEntityEvents)(entityId));
34
- console.log(events);
35
- console.log(entityId, eventKey);
36
- return events
37
- .map(e => JSON.parse(e))
38
- .some(e => e.eventKey === eventKey);
35
+ return events.map(e => JSON.parse(e)).some(e => e.eventKey === eventKey);
36
+ }
37
+ async function disconnectAllEntitiesFromInstance(instanceId) {
38
+ const redis = (0, __1.getLibraries)().getRedisService();
39
+ const connectedEntities = await redis.getSetMembers((0, exports.kEntityConnection)());
40
+ if (connectedEntities.length === 0)
41
+ return;
42
+ for (const entityId of connectedEntities) {
43
+ const allEvents = await redis.getSetMembers((0, exports.kEntityEvents)(entityId));
44
+ if (allEvents.length === 0)
45
+ continue;
46
+ const eventsToKeep = [];
47
+ for (const e of allEvents) {
48
+ const parsed = JSON.parse(e);
49
+ if (parsed.instanceId === instanceId) {
50
+ await redis.removeFromSet((0, exports.kEntityEvents)(entityId), e);
51
+ }
52
+ else {
53
+ eventsToKeep.push(e);
54
+ }
55
+ }
56
+ const stillOnInstance = eventsToKeep.some(e => JSON.parse(e).instanceId === instanceId);
57
+ if (!stillOnInstance) {
58
+ await redis.removeFromSet((0, exports.kEntityInstances)(entityId), instanceId);
59
+ }
60
+ if (eventsToKeep.length === 0) {
61
+ await redis.removeFromSet((0, exports.kEntityConnection)(), entityId);
62
+ }
63
+ }
39
64
  }
40
65
  //# sourceMappingURL=socket-redis-connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-redis-connections.js","sourceRoot":"/","sources":["libraries/socket/core/socket-redis-connections.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLibraries } from '../../..';\n\nexport const kEntityEvents = (entityId: string) => `socket:events:entity:${entityId}`;\nexport const kEntityInstances = (entityId: string) => `socket:instances:entity:${entityId}`;\nexport const kEntityConnection = () => `socket:connections`;\n\nexport interface SocketRedisEventInformation {\n\teventKey: string;\n\tinstanceId: string;\n\tsocketId: string;\n}\n\nexport async function connectEntityToSocketEvent(\n\tentityId: string,\n\tsocketRedisEventInformation: SocketRedisEventInformation\n) {\n\tconst redis = getLibraries().getRedisService();\n\n\tawait redis.addToSet(kEntityEvents(entityId), JSON.stringify(socketRedisEventInformation));\n\tawait redis.addToSet(kEntityInstances(entityId), socketRedisEventInformation.instanceId);\n\tawait redis.addToSet(kEntityConnection(), entityId);\n}\n\nexport async function disconnectEntityFromSocketEvent(\n\tentityId: string,\n\tsocketRedisEventInformation: SocketRedisEventInformation\n) {\n\tconst redis = getLibraries().getRedisService();\n\n\tawait redis.removeFromSet(kEntityEvents(entityId), JSON.stringify(socketRedisEventInformation));\n\n\tconst remainingEvents = (await redis.getSetMembers(kEntityEvents(entityId))).map(\n\t\tr => JSON.parse(r) as SocketRedisEventInformation\n\t);\n\n\tif (remainingEvents.filter(e => e.instanceId === socketRedisEventInformation.instanceId).length === 0) {\n\t\tawait redis.removeFromSet(kEntityInstances(entityId), socketRedisEventInformation.instanceId);\n\t}\n\n\tif (remainingEvents.length === 0) {\n\t\tawait redis.removeFromSet(kEntityConnection(), entityId);\n\t}\n}\n\nexport async function isEntitySubscribed(entityId: string, eventKey: string): Promise<boolean> {\n\tconst redis = getLibraries().getRedisService();\n\tconst events = await redis.getSetMembers(kEntityEvents(entityId));\n\treturn events.map(e => JSON.parse(e) as SocketRedisEventInformation).some(e => e.eventKey === eventKey);\n}\n\nexport async function disconnectAllEntitiesFromInstance(instanceId: string) {\n\tconst redis = getLibraries().getRedisService();\n\n\tconst connectedEntities = await redis.getSetMembers(kEntityConnection());\n\tif (connectedEntities.length === 0) return;\n\n\tfor (const entityId of connectedEntities) {\n\t\tconst allEvents = await redis.getSetMembers(kEntityEvents(entityId));\n\t\tif (allEvents.length === 0) continue;\n\n\t\tconst eventsToKeep: string[] = [];\n\n\t\tfor (const e of allEvents) {\n\t\t\tconst parsed = JSON.parse(e) as SocketRedisEventInformation;\n\t\t\tif (parsed.instanceId === instanceId) {\n\t\t\t\tawait redis.removeFromSet(kEntityEvents(entityId), e);\n\t\t\t} else {\n\t\t\t\teventsToKeep.push(e);\n\t\t\t}\n\t\t}\n\n\t\tconst stillOnInstance = eventsToKeep.some(\n\t\t\te => (JSON.parse(e) as SocketRedisEventInformation).instanceId === instanceId\n\t\t);\n\t\tif (!stillOnInstance) {\n\t\t\tawait redis.removeFromSet(kEntityInstances(entityId), instanceId);\n\t\t}\n\t\tif (eventsToKeep.length === 0) {\n\t\t\tawait redis.removeFromSet(kEntityConnection(), entityId);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zAsyncIterable.js","sourceRoot":"/","sources":["libraries/socket/core/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"]}
@@ -0,0 +1,67 @@
1
+ import z from 'zod';
2
+ import { BaseSocketEvent } from '../core/BaseSocketEvent';
3
+ import { DTO } from '../../../utilities/validation';
4
+ export declare const ChatroomMessageSendInput: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
5
+ export declare const ChatroomMessageSendOutput: z.ZodObject<{
6
+ chatroomId: z.ZodUnion<[z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("mongoose").Types.ObjectId, string>, z.ZodType<import("mongoose").Types.ObjectId, z.ZodTypeDef, import("mongoose").Types.ObjectId>]>;
7
+ lastMessage: z.ZodObject<{
8
+ content: z.ZodString | z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
9
+ createdAt: z.ZodEffects<z.ZodEffects<z.ZodUnion<[z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, Date, string>, z.ZodDate]>, Date, string | Date>, Date, string | Date>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ content: string;
12
+ createdAt: Date;
13
+ }, {
14
+ content: string;
15
+ createdAt: string | Date;
16
+ }>;
17
+ unreadCount: z.ZodNumber;
18
+ }, "strip", z.ZodTypeAny, {
19
+ lastMessage: {
20
+ content: string;
21
+ createdAt: Date;
22
+ };
23
+ unreadCount: number;
24
+ chatroomId: import("mongoose").Types.ObjectId;
25
+ }, {
26
+ lastMessage: {
27
+ content: string;
28
+ createdAt: string | Date;
29
+ };
30
+ unreadCount: number;
31
+ chatroomId: string | import("mongoose").Types.ObjectId;
32
+ }>;
33
+ export declare class ChatroomMessageSendEvent extends BaseSocketEvent<typeof ChatroomMessageSendInput, typeof ChatroomMessageSendOutput> {
34
+ static readonly schemas: {
35
+ input: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
36
+ output: z.ZodObject<{
37
+ chatroomId: z.ZodUnion<[z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("mongoose").Types.ObjectId, string>, z.ZodType<import("mongoose").Types.ObjectId, z.ZodTypeDef, import("mongoose").Types.ObjectId>]>;
38
+ lastMessage: z.ZodObject<{
39
+ content: z.ZodString | z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
40
+ createdAt: z.ZodEffects<z.ZodEffects<z.ZodUnion<[z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, Date, string>, z.ZodDate]>, Date, string | Date>, Date, string | Date>;
41
+ }, "strip", z.ZodTypeAny, {
42
+ content: string;
43
+ createdAt: Date;
44
+ }, {
45
+ content: string;
46
+ createdAt: string | Date;
47
+ }>;
48
+ unreadCount: z.ZodNumber;
49
+ }, "strip", z.ZodTypeAny, {
50
+ lastMessage: {
51
+ content: string;
52
+ createdAt: Date;
53
+ };
54
+ unreadCount: number;
55
+ chatroomId: import("mongoose").Types.ObjectId;
56
+ }, {
57
+ lastMessage: {
58
+ content: string;
59
+ createdAt: string | Date;
60
+ };
61
+ unreadCount: number;
62
+ chatroomId: string | import("mongoose").Types.ObjectId;
63
+ }>;
64
+ };
65
+ constructor(payload: DTO<typeof ChatroomMessageSendOutput>);
66
+ getIdentifier(): string;
67
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ChatroomMessageSendEvent = exports.ChatroomMessageSendOutput = exports.ChatroomMessageSendInput = void 0;
7
+ const zod_1 = __importDefault(require("zod"));
8
+ const BaseSocketEvent_1 = require("../core/BaseSocketEvent");
9
+ const enum_1 = require("../../../utilities/enum");
10
+ const validation_1 = require("../../../utilities/validation");
11
+ exports.ChatroomMessageSendInput = zod_1.default.object({});
12
+ exports.ChatroomMessageSendOutput = zod_1.default.object({
13
+ chatroomId: validation_1.ZodValidation.objectId('chatroomId'),
14
+ lastMessage: zod_1.default.object({
15
+ content: validation_1.ZodValidation.string('content'),
16
+ createdAt: validation_1.ZodValidation.date('createdAt'),
17
+ }),
18
+ unreadCount: validation_1.ZodValidation.number('unreadCount').min(0),
19
+ });
20
+ class ChatroomMessageSendEvent extends BaseSocketEvent_1.BaseSocketEvent {
21
+ static schemas = { input: exports.ChatroomMessageSendInput, output: exports.ChatroomMessageSendOutput };
22
+ constructor(payload) {
23
+ super(enum_1.SocketEventType.CHATROOM_MESSAGE_SEND, ChatroomMessageSendEvent.schemas, payload);
24
+ }
25
+ getIdentifier() {
26
+ return enum_1.SocketEventType.CHATROOM_MESSAGE_SEND;
27
+ }
28
+ }
29
+ exports.ChatroomMessageSendEvent = ChatroomMessageSendEvent;
30
+ //# sourceMappingURL=chatlist-message-send.socket.event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatlist-message-send.socket.event.js","sourceRoot":"/","sources":["libraries/socket/events/chatlist-message-send.socket.event.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AACpB,6DAA0D;AAC1D,kDAA0D;AAC1D,8DAAmE;AAEtD,QAAA,wBAAwB,GAAG,aAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAExC,QAAA,yBAAyB,GAAG,aAAC,CAAC,MAAM,CAAC;IACjD,UAAU,EAAE,0BAAa,CAAC,QAAQ,CAAC,YAAY,CAAC;IAChD,WAAW,EAAE,aAAC,CAAC,MAAM,CAAC;QACrB,OAAO,EAAE,0BAAa,CAAC,MAAM,CAAC,SAAS,CAAC;QACxC,SAAS,EAAE,0BAAa,CAAC,IAAI,CAAC,WAAW,CAAC;KAC1C,CAAC;IACF,WAAW,EAAE,0BAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACvD,CAAC,CAAC;AAEH,MAAa,wBAAyB,SAAQ,iCAG7C;IACA,MAAM,CAAU,OAAO,GAAG,EAAE,KAAK,EAAE,gCAAwB,EAAE,MAAM,EAAE,iCAAyB,EAAE,CAAC;IAEjG,YAAY,OAA8C;QACzD,KAAK,CAAC,sBAAe,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzF,CAAC;IAEM,aAAa;QACnB,OAAO,sBAAe,CAAC,qBAAqB,CAAC;IAC9C,CAAC;;AAZF,4DAaC","sourcesContent":["import z from 'zod';\nimport { BaseSocketEvent } from '../core/BaseSocketEvent';\nimport { SocketEventType } from '../../../utilities/enum';\nimport { DTO, ZodValidation } from '../../../utilities/validation';\n\nexport const ChatroomMessageSendInput = z.object({});\n\nexport const ChatroomMessageSendOutput = z.object({\n\tchatroomId: ZodValidation.objectId('chatroomId'),\n\tlastMessage: z.object({\n\t\tcontent: ZodValidation.string('content'),\n\t\tcreatedAt: ZodValidation.date('createdAt'),\n\t}),\n\tunreadCount: ZodValidation.number('unreadCount').min(0),\n});\n\nexport class ChatroomMessageSendEvent extends BaseSocketEvent<\n\ttypeof ChatroomMessageSendInput,\n\ttypeof ChatroomMessageSendOutput\n> {\n\tstatic readonly schemas = { input: ChatroomMessageSendInput, output: ChatroomMessageSendOutput };\n\n\tconstructor(payload: DTO<typeof ChatroomMessageSendOutput>) {\n\t\tsuper(SocketEventType.CHATROOM_MESSAGE_SEND, ChatroomMessageSendEvent.schemas, payload);\n\t}\n\n\tpublic getIdentifier(): string {\n\t\treturn SocketEventType.CHATROOM_MESSAGE_SEND;\n\t}\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import z from 'zod';
2
- import { BaseSocketEvent } from '../BaseSocketEvent';
2
+ import { BaseSocketEvent } from '../core/BaseSocketEvent';
3
3
  import { DTO } from '../../../utilities/validation';
4
4
  export declare const ChatroomMessageSendInput: z.ZodObject<{
5
5
  chatId: z.ZodString;
@@ -11,16 +11,16 @@ export declare const ChatroomMessageSendInput: z.ZodObject<{
11
11
  export declare const ChatroomMessageSendOutput: z.ZodObject<{
12
12
  chatId: z.ZodString;
13
13
  messageId: z.ZodString;
14
- contents: z.ZodString;
14
+ content: z.ZodString;
15
15
  createdAt: z.ZodDate;
16
16
  }, "strip", z.ZodTypeAny, {
17
+ content: string;
17
18
  createdAt: Date;
18
- contents: string;
19
19
  chatId: string;
20
20
  messageId: string;
21
21
  }, {
22
+ content: string;
22
23
  createdAt: Date;
23
- contents: string;
24
24
  chatId: string;
25
25
  messageId: string;
26
26
  }>;
@@ -36,16 +36,16 @@ export declare class ChatroomMessageSendEvent extends BaseSocketEvent<typeof Cha
36
36
  output: z.ZodObject<{
37
37
  chatId: z.ZodString;
38
38
  messageId: z.ZodString;
39
- contents: z.ZodString;
39
+ content: z.ZodString;
40
40
  createdAt: z.ZodDate;
41
41
  }, "strip", z.ZodTypeAny, {
42
+ content: string;
42
43
  createdAt: Date;
43
- contents: string;
44
44
  chatId: string;
45
45
  messageId: string;
46
46
  }, {
47
+ content: string;
47
48
  createdAt: Date;
48
- contents: string;
49
49
  chatId: string;
50
50
  messageId: string;
51
51
  }>;
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ChatroomMessageSendEvent = exports.ChatroomMessageSendOutput = exports.ChatroomMessageSendInput = void 0;
7
7
  const zod_1 = __importDefault(require("zod"));
8
- const BaseSocketEvent_1 = require("../BaseSocketEvent");
8
+ const BaseSocketEvent_1 = require("../core/BaseSocketEvent");
9
9
  const enum_1 = require("../../../utilities/enum");
10
10
  exports.ChatroomMessageSendInput = zod_1.default.object({
11
11
  chatId: zod_1.default.string(),
@@ -13,7 +13,7 @@ exports.ChatroomMessageSendInput = zod_1.default.object({
13
13
  exports.ChatroomMessageSendOutput = zod_1.default.object({
14
14
  chatId: zod_1.default.string(),
15
15
  messageId: zod_1.default.string(),
16
- contents: zod_1.default.string(),
16
+ content: zod_1.default.string(),
17
17
  createdAt: zod_1.default.coerce.date(),
18
18
  });
19
19
  class ChatroomMessageSendEvent extends BaseSocketEvent_1.BaseSocketEvent {
@@ -22,11 +22,11 @@ class ChatroomMessageSendEvent extends BaseSocketEvent_1.BaseSocketEvent {
22
22
  super(enum_1.SocketEventType.CHATROOM_MESSAGE_SEND, ChatroomMessageSendEvent.schemas, payload);
23
23
  }
24
24
  getIdentifier() {
25
- return enum_1.SocketEventType.CHATROOM_MESSAGE_SEND + ":" + ChatroomMessageSendEvent.identifier(this.data);
25
+ return enum_1.SocketEventType.CHATROOM_MESSAGE_SEND + ':' + ChatroomMessageSendEvent.identifier(this.data);
26
26
  }
27
27
  static identifier(input) {
28
28
  return input.chatId;
29
29
  }
30
30
  }
31
31
  exports.ChatroomMessageSendEvent = ChatroomMessageSendEvent;
32
- //# sourceMappingURL=chatroom-message-send-socket.event.js.map
32
+ //# sourceMappingURL=chatroom-message-send.socket.event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatroom-message-send.socket.event.js","sourceRoot":"/","sources":["libraries/socket/events/chatroom-message-send.socket.event.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AACpB,6DAA0D;AAC1D,kDAA0D;AAG7C,QAAA,wBAAwB,GAAG,aAAC,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,aAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAEU,QAAA,yBAAyB,GAAG,aAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,aAAC,CAAC,MAAM,EAAE;IAClB,SAAS,EAAE,aAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,aAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,aAAC,CAAC,MAAM,CAAC,IAAI,EAAE;CAC1B,CAAC,CAAC;AAEH,MAAa,wBAAyB,SAAQ,iCAG7C;IACA,MAAM,CAAU,OAAO,GAAG,EAAE,KAAK,EAAE,gCAAwB,EAAE,MAAM,EAAE,iCAAyB,EAAE,CAAC;IAEjG,YAAY,OAA8C;QACzD,KAAK,CAAC,sBAAe,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzF,CAAC;IAEM,aAAa;QACnB,OAAO,sBAAe,CAAC,qBAAqB,GAAG,GAAG,GAAG,wBAAwB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrG,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,KAA+C;QAChE,OAAO,KAAK,CAAC,MAAM,CAAC;IACrB,CAAC;;AAhBF,4DAiBC","sourcesContent":["import z from 'zod';\nimport { BaseSocketEvent } from '../core/BaseSocketEvent';\nimport { SocketEventType } from '../../../utilities/enum';\nimport { DTO } from '../../../utilities/validation';\n\nexport const ChatroomMessageSendInput = z.object({\n\tchatId: z.string(),\n});\n\nexport const ChatroomMessageSendOutput = z.object({\n\tchatId: z.string(),\n\tmessageId: z.string(),\n\tcontent: z.string(),\n\tcreatedAt: z.coerce.date(),\n});\n\nexport class ChatroomMessageSendEvent extends BaseSocketEvent<\n\ttypeof ChatroomMessageSendInput,\n\ttypeof ChatroomMessageSendOutput\n> {\n\tstatic readonly schemas = { input: ChatroomMessageSendInput, output: ChatroomMessageSendOutput };\n\n\tconstructor(payload: DTO<typeof ChatroomMessageSendOutput>) {\n\t\tsuper(SocketEventType.CHATROOM_MESSAGE_SEND, ChatroomMessageSendEvent.schemas, payload);\n\t}\n\n\tpublic getIdentifier(): string {\n\t\treturn SocketEventType.CHATROOM_MESSAGE_SEND + ':' + ChatroomMessageSendEvent.identifier(this.data);\n\t}\n\n\tstatic identifier(input: z.infer<typeof ChatroomMessageSendInput>): string {\n\t\treturn input.chatId;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- export * from './chatroom-message-send-socket.event';
1
+ export * from './chatroom-message-send.socket.event';
@@ -14,5 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./chatroom-message-send-socket.event"), exports);
17
+ __exportStar(require("./chatroom-message-send.socket.event"), exports);
18
18
  //# sourceMappingURL=index.js.map
@@ -1 +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';"]}
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"]}
@@ -1,4 +1,3 @@
1
- export * from './BaseSocketEvent';
2
1
  export * from './events';
3
- export * from './LocalSubscriptionRegistry';
4
- export * from './socket-event-registry';
2
+ export * from './adapters';
3
+ export * from './core';
@@ -14,8 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./BaseSocketEvent"), exports);
18
17
  __exportStar(require("./events"), exports);
19
- __exportStar(require("./LocalSubscriptionRegistry"), exports);
20
- __exportStar(require("./socket-event-registry"), exports);
18
+ __exportStar(require("./adapters"), exports);
19
+ __exportStar(require("./core"), exports);
21
20
  //# sourceMappingURL=index.js.map
@@ -1 +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"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/socket/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,6CAA2B;AAC3B,yCAAuB","sourcesContent":["export * from './events';\nexport * from './adapters';\nexport * from './core';\n"]}
@@ -22,7 +22,7 @@ Perfect for sharing types between frontend and backend applications.
22
22
 
23
23
  ## Version
24
24
 
25
- Version: 1.0.379
25
+ Version: 1.0.381
26
26
 
27
27
  ## Dependencies
28
28
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lyxa.ai/types",
3
- "version": "1.0.379",
3
+ "version": "1.0.381",
4
4
  "description": "Lyxa type definitions and validation schemas for both frontend and backend",
5
5
  "author": "elie <42282499+Internalizable@users.noreply.github.com>",
6
6
  "license": "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lyxa.ai/core",
3
- "version": "1.0.380",
3
+ "version": "1.0.381",
4
4
  "description": "The Core system of the Lyxa services.",
5
5
  "author": "elie <42282499+Internalizable@users.noreply.github.com>",
6
6
  "license": "MIT",
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseSocketEvent.js","sourceRoot":"/","sources":["libraries/socket/BaseSocketEvent.ts"],"names":[],"mappings":";;;AAGA,MAAsB,eAAe;IACjB,UAAU,CAAkB;IAC5B,WAAW,CAAM;IACjB,YAAY,CAAO;IAEnB,IAAI,CAAgB;IAIvC,YACC,SAA0B,EAC1B,OAAqC,EACrC,IAAmB;QAEnB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;QAEnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEM,OAAO;QACb,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAEM,SAAS;QACf,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;CACD;AA5BD,0CA4BC","sourcesContent":["import z, { ZodTypeAny } from 'zod';\nimport { SocketEventType } from '../../utilities/enum';\n\nexport abstract class BaseSocketEvent<SIn extends ZodTypeAny, SOut extends ZodTypeAny> {\n\tprotected readonly _eventType: SocketEventType;\n\tprotected readonly inputSchema: SIn;\n\tprotected readonly outputSchema: SOut;\n\n\tprotected readonly data: z.infer<SOut>;\n\n\tabstract getIdentifier(): string;\n\n\tprotected constructor(\n\t\teventType: SocketEventType,\n\t\tschemas: { input: SIn; output: SOut },\n\t\tdata: z.infer<SOut>\n\t) {\n\t\tthis._eventType = eventType;\n\t\tthis.inputSchema = schemas.input;\n\t\tthis.outputSchema = schemas.output;\n\n\t\tthis.data = this.outputSchema.parse(data);\n\t}\n\n\tpublic payload(): z.infer<SOut> {\n\t\treturn this.data;\n\t}\n\n\tpublic eventType(): SocketEventType {\n\t\treturn this._eventType;\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LocalSubscriptionRegistry.js","sourceRoot":"/","sources":["libraries/socket/LocalSubscriptionRegistry.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAkC;AAMlC,MAAa,iBAAiB;IACrB,GAAG,CAAe;IAClB,SAAS,CAAW;IAE5B,YAAY,QAAkB;QAC7B,IAAI,CAAC,GAAG,GAAG,IAAI,gBAAY,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,IAAI,EAAE;QACL,OAAO,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC;CACD;AAhBD,8CAgBC;AAED,MAAM,yBAAyB;IACtB,QAAQ,GAAG,IAAI,GAAG,EAAmD,CAAC;IAE9E,IAAI,CAAC,QAAkB,EAAE,QAAkB,EAAE,EAAqB;QACjE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,EAAE,CAAC;YACR,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,EAAE,CAAC;YACR,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,QAAkB,EAAE,QAAkB,EAAE,EAAqB;QACnE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC;YACP,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;gBAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,QAAkB,EAAE,QAAkB,EAAE,OAAgB;QAC5D,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,EAAE;YAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;CACD;AAEY,QAAA,SAAS,GAAG,IAAI,yBAAyB,EAAE,CAAC","sourcesContent":["import EventEmitter from 'events';\n\ntype EventKey = string; // \"EVENT_TYPE:identifier\"\ntype EntityId = string;\ntype SocketId = string;\n\nexport class LocalEventEmitter {\n\tprivate _ee: EventEmitter;\n\tprivate _socketId: SocketId;\n\n\tconstructor(socketId: SocketId) {\n\t\tthis._ee = new EventEmitter();\n\t\tthis._socketId = socketId;\n\t}\n\n\tget socketId() {\n\t\treturn this._socketId;\n\t}\n\n\tget ee() {\n\t\treturn this._ee;\n\t}\n}\n\nclass LocalSubscriptionRegistry {\n\tprivate byEntity = new Map<EntityId, Map<EventKey, Set<LocalEventEmitter>>>();\n\n\tbind(entityId: EntityId, eventKey: EventKey, ee: LocalEventEmitter) {\n\t\tlet m = this.byEntity.get(entityId);\n\t\tif (!m) {\n\t\t\tm = new Map();\n\t\t\tthis.byEntity.set(entityId, m);\n\t\t}\n\t\tconst s = m.get(eventKey);\n\t\tif (!s) {\n\t\t\tm.set(eventKey, new Set());\n\t\t}\n\t\tm.get(eventKey)?.add(ee);\n\t}\n\n\tunbind(entityId: EntityId, eventKey: EventKey, ee: LocalEventEmitter) {\n\t\tconst m = this.byEntity.get(entityId);\n\t\tif (!m) return;\n\t\tconst s = m.get(eventKey);\n\t\tif (s) {\n\t\t\ts.delete(ee);\n\t\t\tif (s.size === 0) m.delete(eventKey);\n\t\t}\n\t\tif (m.size === 0) this.byEntity.delete(entityId);\n\t}\n\n\temit(entityId: EntityId, eventKey: EventKey, payload: unknown) {\n\t\tconst m = this.byEntity.get(entityId);\n\t\tconst ee = m?.get(eventKey);\n\t\tif (ee) ee.forEach(e => e.ee.emit(eventKey, payload));\n\t}\n}\n\nexport const LocalSubs = new LocalSubscriptionRegistry();\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"chatroom-message-send-socket.event.js","sourceRoot":"/","sources":["libraries/socket/events/chatroom-message-send-socket.event.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AACpB,wDAAqD;AACrD,kDAA0D;AAG7C,QAAA,wBAAwB,GAAG,aAAC,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,aAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAEU,QAAA,yBAAyB,GAAG,aAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,aAAC,CAAC,MAAM,EAAE;IAClB,SAAS,EAAE,aAAC,CAAC,MAAM,EAAE;IACrB,QAAQ,EAAE,aAAC,CAAC,MAAM,EAAE;IACpB,SAAS,EAAE,aAAC,CAAC,MAAM,CAAC,IAAI,EAAE;CAC1B,CAAC,CAAC;AAEH,MAAa,wBAAyB,SAAQ,iCAG7C;IACA,MAAM,CAAU,OAAO,GAAG,EAAE,KAAK,EAAE,gCAAwB,EAAE,MAAM,EAAE,iCAAyB,EAAE,CAAC;IAEjG,YAAY,OAA8C;QACzD,KAAK,CAAC,sBAAe,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzF,CAAC;IAEM,aAAa;QACnB,OAAO,sBAAe,CAAC,qBAAqB,GAAG,GAAG,GAAG,wBAAwB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrG,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,KAA+C;QAChE,OAAO,KAAK,CAAC,MAAM,CAAC;IACrB,CAAC;;AAhBF,4DAiBC","sourcesContent":["import z from 'zod';\nimport { BaseSocketEvent } from '../BaseSocketEvent';\nimport { SocketEventType } from '../../../utilities/enum';\nimport { DTO } from '../../../utilities/validation';\n\nexport const ChatroomMessageSendInput = z.object({\n\tchatId: z.string(),\n});\n\nexport const ChatroomMessageSendOutput = z.object({\n\tchatId: z.string(),\n\tmessageId: z.string(),\n\tcontents: z.string(),\n\tcreatedAt: z.coerce.date(),\n});\n\nexport class ChatroomMessageSendEvent extends BaseSocketEvent<\n\ttypeof ChatroomMessageSendInput,\n\ttypeof ChatroomMessageSendOutput\n> {\n\tstatic readonly schemas = { input: ChatroomMessageSendInput, output: ChatroomMessageSendOutput };\n\n\tconstructor(payload: DTO<typeof ChatroomMessageSendOutput>) {\n\t\tsuper(SocketEventType.CHATROOM_MESSAGE_SEND, ChatroomMessageSendEvent.schemas, payload);\n\t}\n\n\tpublic getIdentifier(): string {\n\t\treturn SocketEventType.CHATROOM_MESSAGE_SEND + \":\" + ChatroomMessageSendEvent.identifier(this.data);\n\t}\n\n\tstatic identifier(input: z.infer<typeof ChatroomMessageSendInput>): string {\n\t\treturn input.chatId;\n\t}\n}\n"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"socket-redis-connections.js","sourceRoot":"/","sources":["libraries/socket/socket-redis-connections.ts"],"names":[],"mappings":";;;AAYA,gEASC;AAED,0EAmBC;AAED,gDAQC;AApDD,6BAAqC;AAE9B,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,wBAAwB,QAAQ,EAAE,CAAC;AAAzE,QAAA,aAAa,iBAA4D;AAC/E,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,2BAA2B,QAAQ,EAAE,CAAC;AAA/E,QAAA,gBAAgB,oBAA+D;AACrF,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAAC,oBAAoB,CAAC;AAA/C,QAAA,iBAAiB,qBAA8B;AAQrD,KAAK,UAAU,0BAA0B,CAC/C,QAAgB,EAChB,2BAAwD;IAExD,MAAM,KAAK,GAAG,IAAA,gBAAY,GAAE,CAAC,eAAe,EAAE,CAAC;IAE/C,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAA,qBAAa,EAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAC3F,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAA,wBAAgB,EAAC,QAAQ,CAAC,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAC;IACzF,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAA,yBAAiB,GAAE,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAEM,KAAK,UAAU,+BAA+B,CACpD,QAAgB,EAChB,2BAAwD;IAExD,MAAM,KAAK,GAAG,IAAA,gBAAY,GAAE,CAAC,eAAe,EAAE,CAAC;IAE/C,MAAM,KAAK,CAAC,aAAa,CAAC,IAAA,qBAAa,EAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAEhG,MAAM,eAAe,GAAG,CAAC,MAAM,KAAK,CAAC,aAAa,CAAC,IAAA,qBAAa,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAC/E,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAgC,CACjD,CAAC;IAEF,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,2BAA2B,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvG,MAAM,KAAK,CAAC,aAAa,CAAC,IAAA,wBAAgB,EAAC,QAAQ,CAAC,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAC;IAC/F,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,KAAK,CAAC,aAAa,CAAC,IAAA,yBAAiB,GAAE,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,QAAgB,EAAE,QAAgB;IAC1E,MAAM,KAAK,GAAG,IAAA,gBAAY,GAAE,CAAC,eAAe,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,IAAA,qBAAa,EAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,MAAM;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAgC,CAAC;SACtD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACtC,CAAC","sourcesContent":["import { getLibraries } from '../..';\n\nexport const kEntityEvents = (entityId: string) => `socket:events:entity:${entityId}`;\nexport const kEntityInstances = (entityId: string) => `socket:instances:entity:${entityId}`;\nexport const kEntityConnection = () => `socket:connections`;\n\nexport interface SocketRedisEventInformation {\n\teventKey: string;\n\tinstanceId: string;\n\tsocketId: string;\n}\n\nexport async function connectEntityToSocketEvent(\n\tentityId: string,\n\tsocketRedisEventInformation: SocketRedisEventInformation\n) {\n\tconst redis = getLibraries().getRedisService();\n\n\tawait redis.addToSet(kEntityEvents(entityId), JSON.stringify(socketRedisEventInformation));\n\tawait redis.addToSet(kEntityInstances(entityId), socketRedisEventInformation.instanceId);\n\tawait redis.addToSet(kEntityConnection(), entityId);\n}\n\nexport async function disconnectEntityFromSocketEvent(\n\tentityId: string,\n\tsocketRedisEventInformation: SocketRedisEventInformation\n) {\n\tconst redis = getLibraries().getRedisService();\n\n\tawait redis.removeFromSet(kEntityEvents(entityId), JSON.stringify(socketRedisEventInformation));\n\n\tconst remainingEvents = (await redis.getSetMembers(kEntityEvents(entityId))).map(\n\t\tr => JSON.parse(r) as SocketRedisEventInformation\n\t);\n\n\tif (remainingEvents.filter(e => e.instanceId === socketRedisEventInformation.instanceId).length === 0) {\n\t\tawait redis.removeFromSet(kEntityInstances(entityId), socketRedisEventInformation.instanceId);\n\t}\n\n\tif (remainingEvents.length === 0) {\n\t\tawait redis.removeFromSet(kEntityConnection(), entityId);\n\t}\n}\n\nexport async function isEntitySubscribed(entityId: string, eventKey: string): Promise<boolean> {\n\tconst redis = getLibraries().getRedisService();\n\tconst events = await redis.getSetMembers(kEntityEvents(entityId));\n\tconsole.log(events);\n\tconsole.log(entityId, eventKey);\n\treturn events\n\t\t.map(e => JSON.parse(e) as SocketRedisEventInformation)\n\t\t.some(e => e.eventKey === eventKey);\n}"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}