@rlanz/socket 0.0.1-0 → 0.0.1-10

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 (67) hide show
  1. package/README.md +594 -90
  2. package/build/base_channel-DKmR3Z0l.d.ts +476 -0
  3. package/build/chunk-55EIQ2VV.js +152 -0
  4. package/build/chunk-55EIQ2VV.js.map +1 -0
  5. package/build/chunk-6PJ4ALJD.js +115 -0
  6. package/build/chunk-6PJ4ALJD.js.map +1 -0
  7. package/build/chunk-BLRAKPXW.js +7 -0
  8. package/build/chunk-BLRAKPXW.js.map +1 -0
  9. package/build/chunk-E6ILCRL3.js +182 -0
  10. package/build/chunk-E6ILCRL3.js.map +1 -0
  11. package/build/{chunk-XUDFDJME.js → chunk-G75J233Z.js} +12 -9
  12. package/build/chunk-G75J233Z.js.map +1 -0
  13. package/build/chunk-IUQ3GYZZ.js +140 -0
  14. package/build/chunk-IUQ3GYZZ.js.map +1 -0
  15. package/build/chunk-K243S3QP.js +131 -0
  16. package/build/chunk-K243S3QP.js.map +1 -0
  17. package/build/chunk-NUPBNOP3.js +61 -0
  18. package/build/chunk-NUPBNOP3.js.map +1 -0
  19. package/build/chunk-O6UYCGTV.js +914 -0
  20. package/build/chunk-O6UYCGTV.js.map +1 -0
  21. package/build/framework-16ypv4Ss.d.ts +13 -0
  22. package/build/index-8jB5RG6v.d.ts +150 -0
  23. package/build/index.d.ts +29 -8
  24. package/build/index.js +39 -15
  25. package/build/index.js.map +1 -1
  26. package/build/providers/socket_provider.d.ts +6 -3
  27. package/build/providers/socket_provider.js +2156 -45
  28. package/build/providers/socket_provider.js.map +1 -1
  29. package/build/services/socket.d.ts +6 -3
  30. package/build/{shared_types-Dw9AphfO.d.ts → shared_types-DE86M136.d.ts} +5 -4
  31. package/build/socket_service-C1JM64_9.d.ts +106 -0
  32. package/build/src/assembler_hook.d.ts +15 -0
  33. package/build/src/assembler_hook.js +238 -0
  34. package/build/src/assembler_hook.js.map +1 -0
  35. package/build/src/client/index.d.ts +3 -106
  36. package/build/src/client/index.js +6 -667
  37. package/build/src/client/index.js.map +1 -1
  38. package/build/src/client/react.d.ts +30 -0
  39. package/build/src/client/react.js +86 -0
  40. package/build/src/client/react.js.map +1 -0
  41. package/build/src/client/types.d.ts +62 -9
  42. package/build/src/client/vue.d.ts +32 -0
  43. package/build/src/client/vue.js +100 -0
  44. package/build/src/client/vue.js.map +1 -0
  45. package/build/src/decorators.d.ts +7 -4
  46. package/build/src/decorators.js +1 -1
  47. package/build/src/health_check.d.ts +6 -3
  48. package/build/src/health_check.js +14 -3
  49. package/build/src/health_check.js.map +1 -1
  50. package/build/src/otel.d.ts +1 -0
  51. package/build/src/otel.js +187 -32
  52. package/build/src/otel.js.map +1 -1
  53. package/build/src/testing.d.ts +45 -0
  54. package/build/src/testing.js +7 -0
  55. package/build/src/testing.js.map +1 -0
  56. package/build/src/types/tracing_channels.d.ts +1 -2
  57. package/build/src/types.d.ts +4 -2
  58. package/package.json +36 -11
  59. package/build/chunk-4UPUCRVG.js +0 -1772
  60. package/build/chunk-4UPUCRVG.js.map +0 -1
  61. package/build/chunk-GKAD2UOA.js +0 -18
  62. package/build/chunk-GKAD2UOA.js.map +0 -1
  63. package/build/chunk-HK7Z65DA.js +0 -19
  64. package/build/chunk-HK7Z65DA.js.map +0 -1
  65. package/build/chunk-XUDFDJME.js.map +0 -1
  66. package/build/socket_service-jxIaH5Rs.d.ts +0 -144
  67. package/build/types-C0rDwbry.d.ts +0 -393
@@ -0,0 +1,131 @@
1
+ import {
2
+ getDecoratedChannelHandlers
3
+ } from "./chunk-G75J233Z.js";
4
+
5
+ // src/base_channel.ts
6
+ var runMiddlewareWithoutContainer = async (Middleware, ctx, next) => {
7
+ await new Middleware().handle(ctx, next);
8
+ };
9
+ var SocketResponseError = class extends Error {
10
+ };
11
+ var MissingPresenceInfoError = class extends SocketResponseError {
12
+ constructor() {
13
+ super("Presence channels must implement getPresenceInfo(socket)");
14
+ }
15
+ };
16
+ var BaseChannel = class {
17
+ /**
18
+ * URL-like channel pattern, for example: 'chat/:roomId'.
19
+ */
20
+ static pattern;
21
+ /**
22
+ * Channel options.
23
+ */
24
+ static options;
25
+ /**
26
+ * Middlewares to run before subscription.
27
+ */
28
+ static middlewares;
29
+ /**
30
+ * Injected socket service.
31
+ */
32
+ socket;
33
+ /**
34
+ * Full channel name, for example: 'chat/general'.
35
+ */
36
+ channelName;
37
+ /**
38
+ * Parameters extracted from the pattern, for example: { roomId: 'general' }.
39
+ */
40
+ params;
41
+ /**
42
+ * Injected presence manager when presence is enabled.
43
+ */
44
+ presence;
45
+ /**
46
+ * Injects dependencies.
47
+ */
48
+ $setContext(socket, channelName, params, presence) {
49
+ this.socket = socket;
50
+ this.channelName = channelName;
51
+ this.params = params;
52
+ if (presence) {
53
+ this.presence = presence;
54
+ }
55
+ }
56
+ /**
57
+ * Emits to every channel member.
58
+ */
59
+ broadcast(event, data) {
60
+ this.socket.to(this.channelName).emit(event, data);
61
+ }
62
+ /**
63
+ * Emits to every channel member except one socket.
64
+ */
65
+ broadcastExcept(socketId, event, data) {
66
+ this.socket.to(this.channelName).except(socketId).emit(event, data);
67
+ }
68
+ /**
69
+ * Runs the middleware chain.
70
+ *
71
+ * middleware[0] -> middleware[1] -> ... -> subscribe
72
+ */
73
+ async $runMiddlewares(ctx, runClassMiddleware = runMiddlewareWithoutContainer) {
74
+ const middlewares = this.constructor.middlewares || [];
75
+ let index = 0;
76
+ const dispatch = async () => {
77
+ if (index >= middlewares.length) return;
78
+ const middleware = middlewares[index++];
79
+ let nextCalled = false;
80
+ const next = async () => {
81
+ if (nextCalled) return;
82
+ nextCalled = true;
83
+ await dispatch();
84
+ };
85
+ if (typeof middleware === "function" && middleware.prototype?.handle) {
86
+ await runClassMiddleware(middleware, ctx, next);
87
+ } else if (typeof middleware === "function") {
88
+ await middleware(ctx, next);
89
+ } else {
90
+ await middleware.handle(ctx, next);
91
+ }
92
+ };
93
+ await dispatch();
94
+ }
95
+ /**
96
+ * Dispatches a message to the matching handler.
97
+ * Called by SocketService. Do not override.
98
+ */
99
+ async $handleMessage(socket, event, data) {
100
+ const handlers = getDecoratedChannelHandlers(this);
101
+ const handler = handlers[event];
102
+ if (typeof handler === "function") {
103
+ return Reflect.apply(handler, this, [socket, data]);
104
+ }
105
+ throw new SocketResponseError(`Unknown channel event: ${event}`);
106
+ }
107
+ /**
108
+ * Runs the generic join hook. ChannelSubscriptions owns subscription lifecycle.
109
+ */
110
+ async $handleJoin(socket, ...params) {
111
+ await this.onJoin?.(socket, ...params);
112
+ }
113
+ /**
114
+ * Runs the generic leave hook. ChannelSubscriptions owns subscription lifecycle.
115
+ */
116
+ async $handleLeave(socket, ...params) {
117
+ await this.onLeave?.(socket, ...params);
118
+ }
119
+ $getPresenceInfo(socket) {
120
+ if (!this.getPresenceInfo) {
121
+ throw new MissingPresenceInfoError();
122
+ }
123
+ return this.getPresenceInfo(socket);
124
+ }
125
+ };
126
+
127
+ export {
128
+ SocketResponseError,
129
+ BaseChannel
130
+ };
131
+ //# sourceMappingURL=chunk-K243S3QP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/base_channel.ts"],"sourcesContent":["import type {\n AuthenticatedSocket,\n ChannelOptions,\n PresenceInfo,\n PresenceMember,\n Middleware,\n MiddlewareConstructor,\n MiddlewareContext,\n MiddlewareFn,\n} from './types.js'\nimport type { PresenceManager } from './presence_manager.js'\nimport { getDecoratedChannelHandlers } from './decorators.js'\n\ninterface ChannelBroadcaster {\n to(channel: string): {\n emit(event: string, data: unknown): void\n except(socketId: string): {\n emit(event: string, data: unknown): void\n }\n }\n}\n\nexport type ChannelMiddlewareRunner = <User>(\n middleware: MiddlewareConstructor<User>,\n ctx: MiddlewareContext<User>,\n next: () => Promise<void>\n) => Promise<void>\n\nexport type ChannelMiddlewareRunnerFactory = () => ChannelMiddlewareRunner\n\nconst runMiddlewareWithoutContainer: ChannelMiddlewareRunner = async (Middleware, ctx, next) => {\n await new Middleware().handle(ctx, next)\n}\n\n/**\n * Error whose message may intentionally be returned to a socket client.\n */\nexport class SocketResponseError extends Error {}\n\nexport class MissingPresenceInfoError extends SocketResponseError {\n constructor() {\n super('Presence channels must implement getPresenceInfo(socket)')\n }\n}\n\n/**\n * Abstract class used to define a channel.\n *\n * @example\n * ```ts\n * export default class ChatChannel extends BaseChannel {\n * static pattern = 'chat/:roomId'\n * static middlewares = [\n * async (ctx, next) => {\n * // Authorize access to the channel through middleware.\n * // if (!Room.isMember(ctx.params.roomId, ctx.socket.user.id)) throw new Error('Forbidden')\n * await next()\n * },\n * ]\n * }\n * ```\n *\n * @example With presence and decorated handlers\n * ```ts\n * import { onMessage } from '@rlanz/socket/decorators'\n *\n * export default class ChatChannel extends BaseChannel {\n * static pattern = 'chat/:roomId'\n * static options = { presence: true }\n *\n * static middlewares = [\n * async (ctx, next) => {\n * if (!ctx.socket.user.isVerified) throw new Error('Not verified')\n * await next()\n * }\n * ]\n *\n * @onMessage('chat:send')\n * async handleSend(socket: AuthenticatedSocket<User>, data: unknown) {\n * // Handle chat:send event\n * }\n *\n * @onMessage('chat:typing')\n * async handleTyping(socket: AuthenticatedSocket<User>, data: unknown) {\n * // Handle chat:typing event\n * }\n * }\n * ```\n */\nexport class BaseChannel<User = unknown, ServerEvents = Record<never, never>> {\n /** Type-only server event declarations consumed by generated browser client types. */\n declare readonly $serverEvents: ServerEvents\n /**\n * URL-like channel pattern, for example: 'chat/:roomId'.\n */\n static pattern: string\n\n /**\n * Channel options.\n */\n static options?: ChannelOptions\n\n /**\n * Middlewares to run before subscription.\n */\n static middlewares?: Middleware<any>[]\n\n /**\n * Injected socket service.\n */\n protected socket!: ChannelBroadcaster\n\n /**\n * Full channel name, for example: 'chat/general'.\n */\n protected channelName!: string\n\n /**\n * Parameters extracted from the pattern, for example: { roomId: 'general' }.\n */\n protected params!: Record<string, string>\n\n /**\n * Injected presence manager when presence is enabled.\n */\n protected presence!: PresenceManager\n\n /**\n * Injects dependencies.\n */\n $setContext(\n socket: ChannelBroadcaster,\n channelName: string,\n params: Record<string, string>,\n presence?: PresenceManager\n ): void {\n this.socket = socket\n this.channelName = channelName\n this.params = params\n if (presence) {\n this.presence = presence\n }\n }\n\n /**\n * Emits to every channel member.\n */\n protected broadcast<K extends keyof ServerEvents & string>(\n event: K,\n data: ServerEvents[K]\n ): void {\n this.socket.to(this.channelName).emit(event, data)\n }\n\n /**\n * Emits to every channel member except one socket.\n */\n protected broadcastExcept<K extends keyof ServerEvents & string>(\n socketId: string,\n event: K,\n data: ServerEvents[K]\n ): void {\n this.socket.to(this.channelName).except(socketId).emit(event, data)\n }\n\n /**\n * Runs the middleware chain.\n *\n * middleware[0] -> middleware[1] -> ... -> subscribe\n */\n async $runMiddlewares(\n ctx: MiddlewareContext<User>,\n runClassMiddleware: ChannelMiddlewareRunner = runMiddlewareWithoutContainer\n ): Promise<void> {\n const middlewares = (this.constructor as typeof BaseChannel).middlewares || []\n\n let index = 0\n\n const dispatch = async (): Promise<void> => {\n if (index >= middlewares.length) return\n\n const middleware = middlewares[index++]\n let nextCalled = false\n const next = async (): Promise<void> => {\n if (nextCalled) return\n nextCalled = true\n await dispatch()\n }\n\n if (typeof middleware === 'function' && middleware.prototype?.handle) {\n await runClassMiddleware(middleware as MiddlewareConstructor<User>, ctx, next)\n } else if (typeof middleware === 'function') {\n await (middleware as MiddlewareFn<User>)(ctx, next)\n } else {\n await middleware.handle(ctx, next)\n }\n }\n\n await dispatch()\n }\n\n /**\n * Returns member information for presence.\n * Implement when options.presence = true.\n */\n getPresenceInfo?(socket: AuthenticatedSocket<User>): PresenceInfo\n\n /**\n * Hook called when a socket joins the channel.\n */\n onJoin?(socket: AuthenticatedSocket<User>, ...params: string[]): Promise<void>\n\n /**\n * Hook called when a socket leaves the channel.\n */\n onLeave?(socket: AuthenticatedSocket<User>, ...params: string[]): Promise<void>\n\n /**\n * Hook called when a member joins a presence channel.\n */\n onMemberJoin?(\n socket: AuthenticatedSocket<User>,\n member: PresenceMember,\n ...params: string[]\n ): Promise<void>\n\n /**\n * Hook called when a member leaves a presence channel.\n */\n onMemberLeave?(\n socket: AuthenticatedSocket<User>,\n member: PresenceMember,\n ...params: string[]\n ): Promise<void>\n\n /**\n * Dispatches a message to the matching handler.\n * Called by SocketService. Do not override.\n */\n async $handleMessage(\n socket: AuthenticatedSocket<User>,\n event: string,\n data: unknown\n ): Promise<unknown> {\n const handlers = getDecoratedChannelHandlers<User>(this)\n const handler = handlers[event]\n\n if (typeof handler === 'function') {\n return Reflect.apply(handler, this, [socket, data])\n }\n\n throw new SocketResponseError(`Unknown channel event: ${event}`)\n }\n\n /**\n * Runs the generic join hook. ChannelSubscriptions owns subscription lifecycle.\n */\n async $handleJoin(socket: AuthenticatedSocket<User>, ...params: string[]): Promise<void> {\n await this.onJoin?.(socket, ...params)\n }\n\n /**\n * Runs the generic leave hook. ChannelSubscriptions owns subscription lifecycle.\n */\n async $handleLeave(socket: AuthenticatedSocket<User>, ...params: string[]): Promise<void> {\n await this.onLeave?.(socket, ...params)\n }\n\n $getPresenceInfo(socket: AuthenticatedSocket<User>): PresenceInfo {\n if (!this.getPresenceInfo) {\n throw new MissingPresenceInfoError()\n }\n\n return this.getPresenceInfo(socket)\n }\n}\n\n/** Constructor for any BaseChannel specialization, including container-injected dependencies. */\nexport interface BaseChannelConstructor {\n new (...args: any[]): BaseChannel<any, any>\n readonly name: string\n pattern: string\n options?: ChannelOptions\n middlewares?: Middleware<any>[]\n}\n"],"mappings":";;;;;AA8BA,IAAM,gCAAyD,OAAO,YAAY,KAAK,SAAS;AAC9F,QAAM,IAAI,WAAW,EAAE,OAAO,KAAK,IAAI;AACzC;AAKO,IAAM,sBAAN,cAAkC,MAAM;AAAC;AAEzC,IAAM,2BAAN,cAAuC,oBAAoB;AAAA,EAChE,cAAc;AACZ,UAAM,0DAA0D;AAAA,EAClE;AACF;AA8CO,IAAM,cAAN,MAAuE;AAAA;AAAA;AAAA;AAAA,EAM5E,OAAO;AAAA;AAAA;AAAA;AAAA,EAKP,OAAO;AAAA;AAAA;AAAA;AAAA,EAKP,OAAO;AAAA;AAAA;AAAA;AAAA,EAKG;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKV,YACE,QACA,aACA,QACA,UACM;AACN,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,SAAS;AACd,QAAI,UAAU;AACZ,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,UACR,OACA,MACM;AACN,SAAK,OAAO,GAAG,KAAK,WAAW,EAAE,KAAK,OAAO,IAAI;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKU,gBACR,UACA,OACA,MACM;AACN,SAAK,OAAO,GAAG,KAAK,WAAW,EAAE,OAAO,QAAQ,EAAE,KAAK,OAAO,IAAI;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBACJ,KACA,qBAA8C,+BAC/B;AACf,UAAM,cAAe,KAAK,YAAmC,eAAe,CAAC;AAE7E,QAAI,QAAQ;AAEZ,UAAM,WAAW,YAA2B;AAC1C,UAAI,SAAS,YAAY,OAAQ;AAEjC,YAAM,aAAa,YAAY,OAAO;AACtC,UAAI,aAAa;AACjB,YAAM,OAAO,YAA2B;AACtC,YAAI,WAAY;AAChB,qBAAa;AACb,cAAM,SAAS;AAAA,MACjB;AAEA,UAAI,OAAO,eAAe,cAAc,WAAW,WAAW,QAAQ;AACpE,cAAM,mBAAmB,YAA2C,KAAK,IAAI;AAAA,MAC/E,WAAW,OAAO,eAAe,YAAY;AAC3C,cAAO,WAAkC,KAAK,IAAI;AAAA,MACpD,OAAO;AACL,cAAM,WAAW,OAAO,KAAK,IAAI;AAAA,MACnC;AAAA,IACF;AAEA,UAAM,SAAS;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAwCA,MAAM,eACJ,QACA,OACA,MACkB;AAClB,UAAM,WAAW,4BAAkC,IAAI;AACvD,UAAM,UAAU,SAAS,KAAK;AAE9B,QAAI,OAAO,YAAY,YAAY;AACjC,aAAO,QAAQ,MAAM,SAAS,MAAM,CAAC,QAAQ,IAAI,CAAC;AAAA,IACpD;AAEA,UAAM,IAAI,oBAAoB,0BAA0B,KAAK,EAAE;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,WAAsC,QAAiC;AACvF,UAAM,KAAK,SAAS,QAAQ,GAAG,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,WAAsC,QAAiC;AACxF,UAAM,KAAK,UAAU,QAAQ,GAAG,MAAM;AAAA,EACxC;AAAA,EAEA,iBAAiB,QAAiD;AAChE,QAAI,CAAC,KAAK,iBAAiB;AACzB,YAAM,IAAI,yBAAyB;AAAA,IACrC;AAEA,WAAO,KAAK,gBAAgB,MAAM;AAAA,EACpC;AACF;","names":[]}
@@ -0,0 +1,61 @@
1
+ // src/tracing_channels.ts
2
+ import diagnostics_channel from "diagnostics_channel";
3
+ var operationRunners = /* @__PURE__ */ new WeakMap();
4
+ function setTracingOperationRunner(message, runner) {
5
+ operationRunners.set(message, runner);
6
+ }
7
+ function createTracingChannel(name) {
8
+ const channel = diagnostics_channel.tracingChannel(name);
9
+ return {
10
+ start: channel.start,
11
+ end: channel.end,
12
+ asyncStart: channel.asyncStart,
13
+ asyncEnd: channel.asyncEnd,
14
+ error: channel.error,
15
+ get hasSubscribers() {
16
+ return channel.hasSubscribers;
17
+ },
18
+ subscribe: channel.subscribe.bind(channel),
19
+ unsubscribe: channel.unsubscribe.bind(channel),
20
+ traceSync(fn, message = {}, thisArg, ...args) {
21
+ try {
22
+ return channel.traceSync(() => {
23
+ const runner = operationRunners.get(message);
24
+ return runner ? runner(() => Reflect.apply(fn, thisArg, args)) : Reflect.apply(fn, thisArg, args);
25
+ }, message);
26
+ } finally {
27
+ operationRunners.delete(message);
28
+ }
29
+ },
30
+ async tracePromise(fn, message = {}, thisArg, ...args) {
31
+ try {
32
+ return await channel.tracePromise(() => {
33
+ const runner = operationRunners.get(message);
34
+ return runner ? runner(() => Reflect.apply(fn, thisArg, args)) : Reflect.apply(fn, thisArg, args);
35
+ }, message);
36
+ } finally {
37
+ operationRunners.delete(message);
38
+ }
39
+ },
40
+ traceCallback: channel.traceCallback.bind(channel)
41
+ };
42
+ }
43
+ var connectChannel = createTracingChannel("rlanz.socket.connect");
44
+ var disconnectChannel = createTracingChannel("rlanz.socket.disconnect");
45
+ var subscribeChannel = createTracingChannel("rlanz.socket.subscribe");
46
+ var unsubscribeChannel = createTracingChannel(
47
+ "rlanz.socket.unsubscribe"
48
+ );
49
+ var channelMessageChannel = createTracingChannel("rlanz.socket.message");
50
+ var broadcastChannel = createTracingChannel("rlanz.socket.broadcast");
51
+
52
+ export {
53
+ setTracingOperationRunner,
54
+ connectChannel,
55
+ disconnectChannel,
56
+ subscribeChannel,
57
+ unsubscribeChannel,
58
+ channelMessageChannel,
59
+ broadcastChannel
60
+ };
61
+ //# sourceMappingURL=chunk-NUPBNOP3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tracing_channels.ts"],"sourcesContent":["import diagnostics_channel from 'node:diagnostics_channel'\nimport type { TracingChannel } from 'node:diagnostics_channel'\nimport type {\n SocketBroadcastMessage,\n SocketChannelMessage,\n SocketConnectMessage,\n SocketDisconnectMessage,\n SocketSubscribeMessage,\n SocketUnsubscribeMessage,\n} from './types/tracing_channels.js'\n\ntype OperationRunner = <Result>(operation: () => Result) => Result\n\nconst operationRunners = new WeakMap<object, OperationRunner>()\n\nexport function setTracingOperationRunner(message: object, runner: OperationRunner) {\n operationRunners.set(message, runner)\n}\n\nfunction createTracingChannel<Context extends object>(\n name: string\n): TracingChannel<Context, Context> {\n const channel = diagnostics_channel.tracingChannel<Context, Context>(name)\n\n return {\n start: channel.start,\n end: channel.end,\n asyncStart: channel.asyncStart,\n asyncEnd: channel.asyncEnd,\n error: channel.error,\n get hasSubscribers() {\n return channel.hasSubscribers\n },\n subscribe: channel.subscribe.bind(channel),\n unsubscribe: channel.unsubscribe.bind(channel),\n traceSync(fn, message = {} as Context, thisArg, ...args) {\n try {\n return channel.traceSync(() => {\n const runner = operationRunners.get(message)\n return runner\n ? runner(() => Reflect.apply(fn, thisArg, args))\n : Reflect.apply(fn, thisArg, args)\n }, message)\n } finally {\n operationRunners.delete(message)\n }\n },\n async tracePromise(fn, message = {} as Context, thisArg, ...args) {\n try {\n return await channel.tracePromise(() => {\n const runner = operationRunners.get(message)\n return runner\n ? runner(() => Reflect.apply(fn, thisArg, args))\n : Reflect.apply(fn, thisArg, args)\n }, message)\n } finally {\n operationRunners.delete(message)\n }\n },\n traceCallback: channel.traceCallback.bind(channel),\n } as TracingChannel<Context, Context>\n}\n\nexport const connectChannel = createTracingChannel<SocketConnectMessage>('rlanz.socket.connect')\n\nexport const disconnectChannel =\n createTracingChannel<SocketDisconnectMessage>('rlanz.socket.disconnect')\n\nexport const subscribeChannel =\n createTracingChannel<SocketSubscribeMessage>('rlanz.socket.subscribe')\n\nexport const unsubscribeChannel = createTracingChannel<SocketUnsubscribeMessage>(\n 'rlanz.socket.unsubscribe'\n)\n\nexport const channelMessageChannel =\n createTracingChannel<SocketChannelMessage>('rlanz.socket.message')\n\nexport const broadcastChannel =\n createTracingChannel<SocketBroadcastMessage>('rlanz.socket.broadcast')\n"],"mappings":";AAAA,OAAO,yBAAyB;AAahC,IAAM,mBAAmB,oBAAI,QAAiC;AAEvD,SAAS,0BAA0B,SAAiB,QAAyB;AAClF,mBAAiB,IAAI,SAAS,MAAM;AACtC;AAEA,SAAS,qBACP,MACkC;AAClC,QAAM,UAAU,oBAAoB,eAAiC,IAAI;AAEzE,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,KAAK,QAAQ;AAAA,IACb,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,IAAI,iBAAiB;AACnB,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,WAAW,QAAQ,UAAU,KAAK,OAAO;AAAA,IACzC,aAAa,QAAQ,YAAY,KAAK,OAAO;AAAA,IAC7C,UAAU,IAAI,UAAU,CAAC,GAAc,YAAY,MAAM;AACvD,UAAI;AACF,eAAO,QAAQ,UAAU,MAAM;AAC7B,gBAAM,SAAS,iBAAiB,IAAI,OAAO;AAC3C,iBAAO,SACH,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,IAAI,CAAC,IAC7C,QAAQ,MAAM,IAAI,SAAS,IAAI;AAAA,QACrC,GAAG,OAAO;AAAA,MACZ,UAAE;AACA,yBAAiB,OAAO,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,IACA,MAAM,aAAa,IAAI,UAAU,CAAC,GAAc,YAAY,MAAM;AAChE,UAAI;AACF,eAAO,MAAM,QAAQ,aAAa,MAAM;AACtC,gBAAM,SAAS,iBAAiB,IAAI,OAAO;AAC3C,iBAAO,SACH,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,IAAI,CAAC,IAC7C,QAAQ,MAAM,IAAI,SAAS,IAAI;AAAA,QACrC,GAAG,OAAO;AAAA,MACZ,UAAE;AACA,yBAAiB,OAAO,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,IACA,eAAe,QAAQ,cAAc,KAAK,OAAO;AAAA,EACnD;AACF;AAEO,IAAM,iBAAiB,qBAA2C,sBAAsB;AAExF,IAAM,oBACX,qBAA8C,yBAAyB;AAElE,IAAM,mBACX,qBAA6C,wBAAwB;AAEhE,IAAM,qBAAqB;AAAA,EAChC;AACF;AAEO,IAAM,wBACX,qBAA2C,sBAAsB;AAE5D,IAAM,mBACX,qBAA6C,wBAAwB;","names":[]}