@lyxa.ai/core 1.1.103 → 1.1.104

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.
@@ -12,5 +12,5 @@ interface _SubscriptionOpts<TEventType extends SocketEventType, TInput> {
12
12
  ctx: _SubscriptionContext;
13
13
  input: TInput;
14
14
  }
15
- export declare function createSocketSubscriptionAdapter<TEventType extends SocketEventType, TInput>(eventType: TEventType, getTrackingId?: (payload: OutputFor<TEventType>) => string): (opts: _SubscriptionOpts<TEventType, TInput>) => AsyncGenerator<import("@trpc/server").TrackedEnvelope<OutputFor<TEventType>>, void, unknown>;
15
+ export declare function createSocketSubscriptionAdapter<TEventType extends SocketEventType, TInput>(eventType: TEventType): (opts: _SubscriptionOpts<TEventType, TInput>) => AsyncGenerator<Awaited<OutputFor<TEventType>>, void, unknown>;
16
16
  export {};
@@ -5,35 +5,33 @@ const index_1 = require("../index");
5
5
  const crypto_1 = require("crypto");
6
6
  const instance_utils_1 = require("../../../utilities/instance.utils");
7
7
  const ws_1 = require("ws");
8
- const server_1 = require("@trpc/server");
9
8
  async function* _createSocketSubscription(options) {
10
- const { eventType, ctx, input, getTrackingId } = options;
9
+ const { eventType, ctx, input } = options;
11
10
  const registration = index_1.EventFactory.getRegistration(eventType);
12
11
  const socketId = (0, crypto_1.randomUUID)();
13
12
  const localEE = new index_1.LocalEventEmitter(socketId);
14
13
  const entityId = ctx.entity.id;
15
14
  const entityType = ctx.entity.type;
15
+ const entity = { id: entityId, type: entityType };
16
16
  const eventKey = index_1.EventFactory.getSubscriptionKey(eventType, input);
17
17
  const instanceId = (0, instance_utils_1.getInstanceId)();
18
18
  const socketInfo = { socketId, eventKey, instanceId };
19
19
  await (0, index_1.connectEntityToSocketEvent)(ctx.entity, socketInfo);
20
- index_1.LocalSubs.bind(entityId, eventKey, localEE);
20
+ index_1.LocalSubs.bind(entity, eventKey, localEE);
21
21
  ctx.signal?.addEventListener('abort', () => {
22
- index_1.LocalSubs.unbind(entityId, eventKey, localEE);
22
+ index_1.LocalSubs.unbind(entity, eventKey, localEE);
23
23
  (0, index_1.disconnectEntityFromSocketEvent)(ctx.entity, socketInfo).catch(console.error);
24
24
  });
25
25
  for await (const [data] of (0, ws_1.on)(localEE.ee, eventKey, { signal: ctx.signal })) {
26
26
  const payload = data;
27
- const id = getTrackingId ? getTrackingId(payload) : (payload._id?.toString() ?? (0, crypto_1.randomUUID)());
28
- yield (0, server_1.tracked)(id, payload);
27
+ yield payload;
29
28
  }
30
29
  }
31
- function createSocketSubscriptionAdapter(eventType, getTrackingId) {
30
+ function createSocketSubscriptionAdapter(eventType) {
32
31
  return (opts) => _createSocketSubscription({
33
32
  eventType,
34
33
  ctx: opts.ctx,
35
34
  input: opts.input,
36
- getTrackingId,
37
35
  });
38
36
  }
39
37
  //# sourceMappingURL=socket-subscription.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"socket-subscription.js","sourceRoot":"/","sources":["libraries/socket/adapters/socket-subscription.ts"],"names":[],"mappings":";;AAiEA,0EAWC;AA3ED,oCAOkB;AAClB,mCAAoC;AACpC,sEAAkE;AAClE,2BAAwB;AACxB,yCAAuC;AAoBvC,KAAK,SAAS,CAAC,CAAC,yBAAyB,CACxC,OAAuD;IAEvD,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAEzD,MAAM,YAAY,GAAG,oBAAY,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,yBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEhD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAO,CAAC,EAAE,CAAC;IAChC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAO,CAAC,IAAI,CAAC;IACpC,MAAM,QAAQ,GAAG,oBAAY,CAAC,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAEnE,MAAM,UAAU,GAAG,IAAA,8BAAa,GAAE,CAAC;IACnC,MAAM,UAAU,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEtD,MAAM,IAAA,kCAA0B,EAAC,GAAG,CAAC,MAAO,EAAE,UAAU,CAAC,CAAC;IAC1D,iBAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE5C,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QAC1C,iBAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAA,uCAA+B,EAAC,GAAG,CAAC,MAAO,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAGH,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAA,OAAE,EAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC7E,MAAM,OAAO,GAAG,IAAW,CAAC;QAC5B,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,OAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,IAAA,mBAAU,GAAE,CAAC,CAAC;QAEvG,MAAM,IAAA,gBAAO,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;AACF,CAAC;AAED,SAAgB,+BAA+B,CAC9C,SAAqB,EACrB,aAA0D;IAE1D,OAAO,CAAC,IAA2C,EAAE,EAAE,CACtD,yBAAyB,CAAC;QACzB,SAAS;QACT,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,aAAa;KACb,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { SocketEventType } from '../../../utilities/enum';\nimport {\n\tconnectEntityToSocketEvent,\n\tdisconnectEntityFromSocketEvent,\n\tEventFactory,\n\tLocalEventEmitter,\n\tLocalSubs,\n\tOutputFor,\n} from '../index';\nimport { randomUUID } from 'crypto';\nimport { getInstanceId } from '../../../utilities/instance.utils';\nimport { on } from 'ws';\nimport { tracked } from '@trpc/server';\nimport { AuthEntityType } from '../../auth';\n\ninterface _SubscriptionContext {\n\tentity?: { id: string; type: AuthEntityType };\n\tsignal?: AbortSignal;\n}\n\ninterface _SubscriptionOpts<TEventType extends SocketEventType, TInput> {\n\tctx: _SubscriptionContext;\n\tinput: TInput;\n}\n\ninterface _CreateSubscriptionOptions<TEventType extends SocketEventType, TInput> {\n\teventType: TEventType;\n\tctx: _SubscriptionContext;\n\tinput: TInput;\n\tgetTrackingId?: (payload: OutputFor<TEventType>) => string;\n}\n\nasync function* _createSocketSubscription<TEventType extends SocketEventType, TInput>(\n\toptions: _CreateSubscriptionOptions<TEventType, TInput>\n) {\n\tconst { eventType, ctx, input, getTrackingId } = options;\n\n\tconst registration = EventFactory.getRegistration(eventType);\n\tconst socketId = randomUUID();\n\tconst localEE = new LocalEventEmitter(socketId);\n\n\tconst entityId = ctx.entity!.id;\n\tconst entityType = ctx.entity!.type;\n\tconst eventKey = EventFactory.getSubscriptionKey(eventType, input);\n\n\tconst instanceId = getInstanceId();\n\tconst socketInfo = { socketId, eventKey, instanceId };\n\n\tawait connectEntityToSocketEvent(ctx.entity!, socketInfo);\n\tLocalSubs.bind(entityId, eventKey, localEE);\n\n\tctx.signal?.addEventListener('abort', () => {\n\t\tLocalSubs.unbind(entityId, eventKey, localEE);\n\t\tdisconnectEntityFromSocketEvent(ctx.entity!, socketInfo).catch(console.error);\n\t});\n\n\ttype Out = OutputFor<TEventType>;\n\tfor await (const [data] of on(localEE.ee, eventKey, { signal: ctx.signal })) {\n\t\tconst payload = data as Out;\n\t\tconst id = getTrackingId ? getTrackingId(payload) : ((payload as any)._id?.toString() ?? randomUUID());\n\n\t\tyield tracked(id, payload);\n\t}\n}\n\nexport function createSocketSubscriptionAdapter<TEventType extends SocketEventType, TInput>(\n\teventType: TEventType,\n\tgetTrackingId?: (payload: OutputFor<TEventType>) => string\n) {\n\treturn (opts: _SubscriptionOpts<TEventType, TInput>) =>\n\t\t_createSocketSubscription({\n\t\t\teventType,\n\t\t\tctx: opts.ctx,\n\t\t\tinput: opts.input,\n\t\t\tgetTrackingId,\n\t\t});\n}\n\n/**\n * @Example\n * const socketRouterTwo = createTRPCRouter({\n * \tonMessage: createAuthenticatedProcedure({ entityTypes: [AuthEntityType.CRM] })\n * \t\t.input(ChatroomMessageSendSocketInputSchema)\n * \t\t.output(\n * \t\t\tzAsyncIterable({\n * \t\t\t\tyield: ChatroomMessageSendOutputSchema,\n * \t\t\t\ttracked: true,\n * \t\t\t})\n * \t\t)\n * \t\t.subscription(createSocketSubscriptionAdapter(SocketEventType.CHATROOM_MESSAGE_SEND)),\n * });\n */\n"]}
1
+ {"version":3,"file":"socket-subscription.js","sourceRoot":"/","sources":["libraries/socket/adapters/socket-subscription.ts"],"names":[],"mappings":";;AAiEA,0EAOC;AAvED,oCAQkB;AAClB,mCAAoC;AACpC,sEAAkE;AAClE,2BAAwB;AAmBxB,KAAK,SAAS,CAAC,CAAC,yBAAyB,CACxC,OAAuD;IAEvD,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1C,MAAM,YAAY,GAAG,oBAAY,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,yBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEhD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAO,CAAC,EAAE,CAAC;IAChC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAO,CAAC,IAAI,CAAC;IAEpC,MAAM,MAAM,GAAuB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAEtE,MAAM,QAAQ,GAAG,oBAAY,CAAC,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAEnE,MAAM,UAAU,GAAG,IAAA,8BAAa,GAAE,CAAC;IACnC,MAAM,UAAU,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEtD,MAAM,IAAA,kCAA0B,EAAC,GAAG,CAAC,MAAO,EAAE,UAAU,CAAC,CAAC;IAC1D,iBAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE1C,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QAC1C,iBAAS,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAA,uCAA+B,EAAC,GAAG,CAAC,MAAO,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAGH,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAA,OAAE,EAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC7E,MAAM,OAAO,GAAG,IAAW,CAAC;QAC5B,MAAM,OAAO,CAAC;IACf,CAAC;AACF,CAAC;AAED,SAAgB,+BAA+B,CAA6C,SAAqB;IAChH,OAAO,CAAC,IAA2C,EAAE,EAAE,CACtD,yBAAyB,CAAC;QACzB,SAAS;QACT,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;KACjB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { SocketEventType } from '../../../utilities/enum';\nimport {\n\tconnectEntityToSocketEvent,\n\tdisconnectEntityFromSocketEvent,\n\tEntitySubscription,\n\tEventFactory,\n\tLocalEventEmitter,\n\tLocalSubs,\n\tOutputFor,\n} from '../index';\nimport { randomUUID } from 'crypto';\nimport { getInstanceId } from '../../../utilities/instance.utils';\nimport { on } from 'ws';\nimport { AuthEntityType } from '../../auth';\n\ninterface _SubscriptionContext {\n\tentity?: { id: string; type: AuthEntityType };\n\tsignal?: AbortSignal;\n}\n\ninterface _SubscriptionOpts<TEventType extends SocketEventType, TInput> {\n\tctx: _SubscriptionContext;\n\tinput: TInput;\n}\n\ninterface _CreateSubscriptionOptions<TEventType extends SocketEventType, TInput> {\n\teventType: TEventType;\n\tctx: _SubscriptionContext;\n\tinput: TInput;\n}\n\nasync function* _createSocketSubscription<TEventType extends SocketEventType, TInput>(\n\toptions: _CreateSubscriptionOptions<TEventType, TInput>\n) {\n\tconst { eventType, ctx, input } = options;\n\n\tconst registration = EventFactory.getRegistration(eventType);\n\tconst socketId = randomUUID();\n\tconst localEE = new LocalEventEmitter(socketId);\n\n\tconst entityId = ctx.entity!.id;\n\tconst entityType = ctx.entity!.type;\n\n\tconst entity: EntitySubscription = { id: entityId, type: entityType };\n\n\tconst eventKey = EventFactory.getSubscriptionKey(eventType, input);\n\n\tconst instanceId = getInstanceId();\n\tconst socketInfo = { socketId, eventKey, instanceId };\n\n\tawait connectEntityToSocketEvent(ctx.entity!, socketInfo);\n\tLocalSubs.bind(entity, eventKey, localEE);\n\n\tctx.signal?.addEventListener('abort', () => {\n\t\tLocalSubs.unbind(entity, eventKey, localEE);\n\t\tdisconnectEntityFromSocketEvent(ctx.entity!, socketInfo).catch(console.error);\n\t});\n\n\ttype Out = OutputFor<TEventType>;\n\tfor await (const [data] of on(localEE.ee, eventKey, { signal: ctx.signal })) {\n\t\tconst payload = data as Out;\n\t\tyield payload;\n\t}\n}\n\nexport function createSocketSubscriptionAdapter<TEventType extends SocketEventType, TInput>(eventType: TEventType) {\n\treturn (opts: _SubscriptionOpts<TEventType, TInput>) =>\n\t\t_createSocketSubscription({\n\t\t\teventType,\n\t\t\tctx: opts.ctx,\n\t\t\tinput: opts.input,\n\t\t});\n}\n\n/**\n * @Example\n * const socketRouterTwo = createTRPCRouter({\n * \tonMessage: createAuthenticatedProcedure({ entityTypes: [AuthEntityType.CRM] })\n * \t\t.input(ChatroomMessageSendSocketInputSchema)\n * \t\t.output(\n * \t\t\tzAsyncIterable({\n * \t\t\t\tyield: ChatroomMessageSendOutputSchema,\n * \t\t\t})\n * \t\t)\n * \t\t.subscription(createSocketSubscriptionAdapter(SocketEventType.CHATROOM_MESSAGE_SEND)),\n * });\n */\n"]}
@@ -1,6 +1,6 @@
1
1
  import EventEmitter from 'events';
2
+ import { EntitySubscription } from './socket-redis-connections';
2
3
  type EventKey = string;
3
- type EntityId = string;
4
4
  type SocketId = string;
5
5
  export declare class LocalEventEmitter {
6
6
  private _ee;
@@ -11,9 +11,9 @@ export declare class LocalEventEmitter {
11
11
  }
12
12
  declare class LocalSubscriptionRegistry {
13
13
  private byEntity;
14
- bind(entityId: EntityId, eventKey: EventKey, ee: LocalEventEmitter): void;
15
- unbind(entityId: EntityId, eventKey: EventKey, ee: LocalEventEmitter): void;
16
- emit(entityId: EntityId, eventKey: EventKey, payload: unknown): void;
14
+ bind(entity: EntitySubscription, eventKey: EventKey, ee: LocalEventEmitter): void;
15
+ unbind(entity: EntitySubscription, eventKey: EventKey, ee: LocalEventEmitter): void;
16
+ emit(entity: EntitySubscription, eventKey: EventKey, payload: unknown): void;
17
17
  }
18
18
  export declare const LocalSubs: LocalSubscriptionRegistry;
19
19
  export {};
@@ -5,6 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.LocalSubs = exports.LocalEventEmitter = void 0;
7
7
  const events_1 = __importDefault(require("events"));
8
+ function entityKey(entity) {
9
+ return entity.type ? `${entity.type}:${entity.id}` : entity.id;
10
+ }
8
11
  class LocalEventEmitter {
9
12
  _ee;
10
13
  _socketId;
@@ -22,36 +25,48 @@ class LocalEventEmitter {
22
25
  exports.LocalEventEmitter = LocalEventEmitter;
23
26
  class LocalSubscriptionRegistry {
24
27
  byEntity = new Map();
25
- bind(entityId, eventKey, ee) {
26
- let m = this.byEntity.get(entityId);
27
- if (!m) {
28
- m = new Map();
29
- this.byEntity.set(entityId, m);
28
+ bind(entity, eventKey, ee) {
29
+ const key = entityKey(entity);
30
+ let eventMap = this.byEntity.get(key);
31
+ if (!eventMap) {
32
+ eventMap = new Map();
33
+ this.byEntity.set(key, eventMap);
30
34
  }
31
- const s = m.get(eventKey);
32
- if (!s) {
33
- m.set(eventKey, new Set());
35
+ let listenerSet = eventMap.get(eventKey);
36
+ if (!listenerSet) {
37
+ listenerSet = new Set();
38
+ eventMap.set(eventKey, listenerSet);
34
39
  }
35
- m.get(eventKey)?.add(ee);
40
+ listenerSet.add(ee);
41
+ console.log(`[LocalSubs] Bound ${key} -> ${eventKey}, socket=${ee.socketId}`);
36
42
  }
37
- unbind(entityId, eventKey, ee) {
38
- const m = this.byEntity.get(entityId);
39
- if (!m)
43
+ unbind(entity, eventKey, ee) {
44
+ const key = entityKey(entity);
45
+ const eventMap = this.byEntity.get(key);
46
+ if (!eventMap)
40
47
  return;
41
- const s = m.get(eventKey);
42
- if (s) {
43
- s.delete(ee);
44
- if (s.size === 0)
45
- m.delete(eventKey);
48
+ const listenerSet = eventMap.get(eventKey);
49
+ if (listenerSet) {
50
+ listenerSet.delete(ee);
51
+ if (listenerSet.size === 0)
52
+ eventMap.delete(eventKey);
46
53
  }
47
- if (m.size === 0)
48
- this.byEntity.delete(entityId);
54
+ if (eventMap.size === 0)
55
+ this.byEntity.delete(key);
56
+ console.log(`[LocalSubs] Unbound ${key} -> ${eventKey}, socket=${ee.socketId}`);
49
57
  }
50
- emit(entityId, eventKey, payload) {
51
- const m = this.byEntity.get(entityId);
52
- const ee = m?.get(eventKey);
53
- if (ee)
54
- ee.forEach(e => e.ee.emit(eventKey, payload));
58
+ emit(entity, eventKey, payload) {
59
+ const key = entityKey(entity);
60
+ const eventMap = this.byEntity.get(key);
61
+ const listeners = eventMap?.get(eventKey);
62
+ console.log('LocalSubs emit called', {
63
+ payload,
64
+ });
65
+ if (!listeners)
66
+ return;
67
+ for (const listener of listeners) {
68
+ listener.ee.emit(eventKey, payload);
69
+ }
55
70
  }
56
71
  }
57
72
  exports.LocalSubs = new LocalSubscriptionRegistry();
@@ -1 +1 @@
1
- {"version":3,"file":"local-subscription-registry.js","sourceRoot":"/","sources":["libraries/socket/core/local-subscription-registry.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
+ {"version":3,"file":"local-subscription-registry.js","sourceRoot":"/","sources":["libraries/socket/core/local-subscription-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events';\nimport { EntitySubscription } from './socket-redis-connections';\n\ntype EventKey = string;\ntype SocketId = string;\n\n// Utility: create a unique key for each EntitySubscription\nfunction entityKey(entity: EntitySubscription): string {\n\treturn entity.type ? `${entity.type}:${entity.id}` : entity.id;\n}\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<string, Map<EventKey, Set<LocalEventEmitter>>>();\n\n\tbind(entity: EntitySubscription, eventKey: EventKey, ee: LocalEventEmitter) {\n\t\tconst key = entityKey(entity);\n\t\tlet eventMap = this.byEntity.get(key);\n\t\tif (!eventMap) {\n\t\t\teventMap = new Map();\n\t\t\tthis.byEntity.set(key, eventMap);\n\t\t}\n\n\t\tlet listenerSet = eventMap.get(eventKey);\n\t\tif (!listenerSet) {\n\t\t\tlistenerSet = new Set();\n\t\t\teventMap.set(eventKey, listenerSet);\n\t\t}\n\n\t\tlistenerSet.add(ee);\n\n\t\tconsole.log(`[LocalSubs] Bound ${key} -> ${eventKey}, socket=${ee.socketId}`);\n\t}\n\n\tunbind(entity: EntitySubscription, eventKey: EventKey, ee: LocalEventEmitter) {\n\t\tconst key = entityKey(entity);\n\t\tconst eventMap = this.byEntity.get(key);\n\t\tif (!eventMap) return;\n\n\t\tconst listenerSet = eventMap.get(eventKey);\n\t\tif (listenerSet) {\n\t\t\tlistenerSet.delete(ee);\n\t\t\tif (listenerSet.size === 0) eventMap.delete(eventKey);\n\t\t}\n\t\tif (eventMap.size === 0) this.byEntity.delete(key);\n\n\t\tconsole.log(`[LocalSubs] Unbound ${key} -> ${eventKey}, socket=${ee.socketId}`);\n\t}\n\n\temit(entity: EntitySubscription, eventKey: EventKey, payload: unknown) {\n\t\tconst key = entityKey(entity);\n\t\tconst eventMap = this.byEntity.get(key);\n\t\tconst listeners = eventMap?.get(eventKey);\n\n\t\tconsole.log('LocalSubs emit called', {\n\t\t\tpayload,\n\t\t});\n\n\t\tif (!listeners) return;\n\n\t\tfor (const listener of listeners) {\n\t\t\tlistener.ee.emit(eventKey, payload);\n\t\t}\n\t}\n}\n\nexport const LocalSubs = new LocalSubscriptionRegistry();\n"]}
@@ -22,7 +22,7 @@ Perfect for sharing types between frontend and backend applications.
22
22
 
23
23
  ## Version
24
24
 
25
- Version: 1.1.103
25
+ Version: 1.1.104
26
26
 
27
27
  ## Dependencies
28
28
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lyxa.ai/types",
3
- "version": "1.1.103",
3
+ "version": "1.1.104",
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.1.103",
3
+ "version": "1.1.104",
4
4
  "description": "The Core system of the Lyxa services.",
5
5
  "author": "elie <42282499+Internalizable@users.noreply.github.com>",
6
6
  "license": "MIT",