@rlanz/socket 0.0.1-0

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 (44) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +387 -0
  3. package/build/chunk-4UPUCRVG.js +1772 -0
  4. package/build/chunk-4UPUCRVG.js.map +1 -0
  5. package/build/chunk-GKAD2UOA.js +18 -0
  6. package/build/chunk-GKAD2UOA.js.map +1 -0
  7. package/build/chunk-HK7Z65DA.js +19 -0
  8. package/build/chunk-HK7Z65DA.js.map +1 -0
  9. package/build/chunk-XUDFDJME.js +42 -0
  10. package/build/chunk-XUDFDJME.js.map +1 -0
  11. package/build/index.d.ts +10 -0
  12. package/build/index.js +21 -0
  13. package/build/index.js.map +1 -0
  14. package/build/providers/socket_provider.d.ts +40 -0
  15. package/build/providers/socket_provider.js +132 -0
  16. package/build/providers/socket_provider.js.map +1 -0
  17. package/build/services/socket.d.ts +12 -0
  18. package/build/services/socket.js +10 -0
  19. package/build/services/socket.js.map +1 -0
  20. package/build/shared_types-Dw9AphfO.d.ts +21 -0
  21. package/build/socket_service-jxIaH5Rs.d.ts +144 -0
  22. package/build/src/client/index.d.ts +106 -0
  23. package/build/src/client/index.js +671 -0
  24. package/build/src/client/index.js.map +1 -0
  25. package/build/src/client/types.d.ts +101 -0
  26. package/build/src/client/types.js +1 -0
  27. package/build/src/client/types.js.map +1 -0
  28. package/build/src/decorators.d.ts +17 -0
  29. package/build/src/decorators.js +9 -0
  30. package/build/src/decorators.js.map +1 -0
  31. package/build/src/health_check.d.ts +18 -0
  32. package/build/src/health_check.js +7 -0
  33. package/build/src/health_check.js.map +1 -0
  34. package/build/src/otel.d.ts +31 -0
  35. package/build/src/otel.js +276 -0
  36. package/build/src/otel.js.map +1 -0
  37. package/build/src/types/tracing_channels.d.ts +40 -0
  38. package/build/src/types/tracing_channels.js +1 -0
  39. package/build/src/types/tracing_channels.js.map +1 -0
  40. package/build/src/types.d.ts +5 -0
  41. package/build/src/types.js +1 -0
  42. package/build/src/types.js.map +1 -0
  43. package/build/types-C0rDwbry.d.ts +393 -0
  44. package/package.json +105 -0
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Types shared between the server and the client.
3
+ */
4
+ /**
5
+ * Message sent by the client to a channel.
6
+ */
7
+ interface ChannelMessage {
8
+ channel: string;
9
+ event: string;
10
+ data?: unknown;
11
+ }
12
+ /**
13
+ * Channel handler acknowledgement response.
14
+ */
15
+ interface ChannelAck<T = unknown> {
16
+ ok: boolean;
17
+ data?: T;
18
+ error?: string;
19
+ }
20
+
21
+ export type { ChannelAck as C, ChannelMessage as a };
@@ -0,0 +1,144 @@
1
+ import { Server } from 'node:http';
2
+ import { Logger } from '@adonisjs/logger';
3
+ import Emittery from 'emittery';
4
+ import { WebSocketServer } from 'ws';
5
+ import { B as BaseChannel, b as ChannelMatch, A as AuthenticatedSocket, C as ChannelEventMap, c as PresenceData, d as ChannelOptions, S as SocketEvents, P as PresenceManager, e as SocketConfig, f as SocketServiceStatus, g as SocketHealthSnapshot } from './types-C0rDwbry.js';
6
+
7
+ /**
8
+ * Matches channel names against registered patterns.
9
+ *
10
+ * Pattern: chat/:roomId
11
+ * Channel: chat/general
12
+ *
13
+ * chat / :roomId
14
+ * | |
15
+ * chat / general => { roomId: "general" }
16
+ */
17
+ declare class ChannelRouter {
18
+ #private;
19
+ /**
20
+ * Registers a channel.
21
+ */
22
+ register(channel: typeof BaseChannel): void;
23
+ /**
24
+ * Matches a channel name against registered patterns.
25
+ */
26
+ match(channelName: string): ChannelMatch | null;
27
+ /**
28
+ * Authorizes a socket before it joins a channel.
29
+ */
30
+ authorize<User = unknown, HttpContext = unknown>(socket: AuthenticatedSocket<User, HttpContext>, channelName: string): Promise<{
31
+ readonly success: false;
32
+ readonly error: string;
33
+ readonly instance?: undefined;
34
+ readonly params?: undefined;
35
+ readonly paramValues?: undefined;
36
+ readonly presenceData?: undefined;
37
+ } | {
38
+ readonly success: true;
39
+ readonly instance: BaseChannel<User, ChannelEventMap, HttpContext>;
40
+ readonly params: Record<string, string>;
41
+ readonly paramValues: string[];
42
+ readonly presenceData: Record<string, unknown> | PresenceData | null;
43
+ readonly error?: undefined;
44
+ }>;
45
+ /**
46
+ * Lists all registered channels.
47
+ */
48
+ list(): {
49
+ pattern: string;
50
+ name: string;
51
+ options: ChannelOptions | undefined;
52
+ }[];
53
+ /**
54
+ * Number of registered channels.
55
+ */
56
+ get size(): number;
57
+ }
58
+
59
+ type SocketEmission = {
60
+ target: 'global';
61
+ event: string;
62
+ data: unknown;
63
+ } | {
64
+ target: 'channel';
65
+ channel: string;
66
+ event: string;
67
+ data: unknown;
68
+ except?: string[];
69
+ } | {
70
+ target: 'user';
71
+ userId: string | number;
72
+ room: string;
73
+ event: string;
74
+ data: unknown;
75
+ };
76
+ type SocketEmissionTarget = SocketEmission['target'];
77
+ interface SocketEmissionSink {
78
+ dispatch(emission: SocketEmission): void;
79
+ }
80
+
81
+ type SocketFakeTarget = SocketEmissionTarget;
82
+ type SocketFakeEmission = SocketEmission;
83
+ interface SocketFakeEmissionQuery {
84
+ data?: unknown | ((data: unknown) => boolean);
85
+ except?: string[] | ((except: string[] | undefined) => boolean);
86
+ }
87
+ interface SocketFakeCountQuery extends SocketFakeEmissionQuery {
88
+ target?: SocketFakeTarget;
89
+ event?: string;
90
+ channel?: string;
91
+ userId?: string | number;
92
+ }
93
+ declare class SocketFake implements SocketEmissionSink {
94
+ #private;
95
+ constructor(restore: () => void);
96
+ get emissions(): SocketFakeEmission[];
97
+ record(emission: SocketFakeEmission): void;
98
+ dispatch(emission: SocketFakeEmission): void;
99
+ clear(): void;
100
+ restore(): void;
101
+ [Symbol.dispose](): void;
102
+ assertBroadcasted(event: string, query?: SocketFakeEmissionQuery): void;
103
+ assertNotBroadcasted(event: string, query?: SocketFakeEmissionQuery): void;
104
+ assertEmittedTo(channel: string, event: string, query?: SocketFakeEmissionQuery): void;
105
+ assertNotEmittedTo(channel: string, event: string, query?: SocketFakeEmissionQuery): void;
106
+ assertEmittedToUser(userId: string | number, event: string, query?: SocketFakeEmissionQuery): void;
107
+ assertNotEmittedToUser(userId: string | number, event: string, query?: SocketFakeEmissionQuery): void;
108
+ assertEmittedCount(count: number, query?: SocketFakeCountQuery): void;
109
+ assertNothingEmitted(): void;
110
+ }
111
+
112
+ /**
113
+ * Main service for managing WebSocket connections.
114
+ */
115
+ declare class SocketService<User = unknown, HttpContext = unknown> extends Emittery<SocketEvents<User, HttpContext>> {
116
+ #private;
117
+ /**
118
+ * Accesses the underlying ws server.
119
+ */
120
+ get server(): WebSocketServer;
121
+ setPresenceManager(presenceManager: PresenceManager): void;
122
+ boot(httpServer: Server, config: SocketConfig<User, HttpContext>, channelRouter: ChannelRouter, logger: Logger): Promise<void>;
123
+ to(channel: string): {
124
+ emit: (event: string, data: unknown) => void;
125
+ except: (socketId: string) => {
126
+ emit: (event: string, data: unknown) => void;
127
+ };
128
+ };
129
+ toUser(userId: string | number): {
130
+ emit: (event: string, data: unknown) => void;
131
+ };
132
+ broadcast(event: string, data: unknown): void;
133
+ getSocket(socketId: string): AuthenticatedSocket<User, HttpContext> | undefined;
134
+ get connectionsCount(): number;
135
+ get status(): SocketServiceStatus;
136
+ get ready(): boolean;
137
+ fake(): SocketFake;
138
+ restore(): void;
139
+ markFailed(error: unknown): void;
140
+ health(): SocketHealthSnapshot;
141
+ close(): Promise<void>;
142
+ }
143
+
144
+ export { ChannelRouter as C, SocketService as S, SocketFake as a, type SocketFakeCountQuery as b, type SocketFakeEmission as c, type SocketFakeEmissionQuery as d, type SocketFakeTarget as e };
@@ -0,0 +1,106 @@
1
+ import { SocketClientTransport, PresenceUser, EventHandler, SubscribeOptions, UnsubscribeOptions, SocketOptions, ConnectionState } from './types.js';
2
+ export { PresenceData, SubscribeAckData, SubscribeResult } from './types.js';
3
+ export { C as ChannelAck, a as ChannelMessage } from '../../shared_types-Dw9AphfO.js';
4
+
5
+ /**
6
+ * Represents a subscribed channel.
7
+ * Chainable API inspired by Laravel Echo.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * socket.channel('chat/general')
12
+ * .here((users) => setOnlineUsers(users))
13
+ * .joining((user) => console.log(`${user.name} joined`))
14
+ * .leaving((user) => console.log(`${user.name} left`))
15
+ * .listen('chat:message', (msg) => addMessage(msg))
16
+ * .subscribe()
17
+ * ```
18
+ */
19
+ declare class Channel {
20
+ #private;
21
+ /**
22
+ * Channel name.
23
+ */
24
+ readonly name: string;
25
+ constructor(name: string, transport: SocketClientTransport);
26
+ /**
27
+ * Whether the channel should stay subscribed.
28
+ */
29
+ get subscribed(): boolean;
30
+ /**
31
+ * Whether the channel is active on the server.
32
+ */
33
+ get active(): boolean;
34
+ /**
35
+ * List of present users.
36
+ */
37
+ get users(): PresenceUser[];
38
+ /**
39
+ * Number of present users.
40
+ */
41
+ get count(): number;
42
+ /**
43
+ * Registers a handler called with the present users.
44
+ * Called immediately on subscribe and after each presence change.
45
+ */
46
+ here(handler: EventHandler<PresenceUser[]>): this;
47
+ /**
48
+ * Registers a handler called when a user joins.
49
+ */
50
+ joining(handler: EventHandler<PresenceUser>): this;
51
+ /**
52
+ * Registers a handler called when a user leaves.
53
+ */
54
+ leaving(handler: EventHandler<PresenceUser>): this;
55
+ /**
56
+ * Listens for an event on this channel.
57
+ */
58
+ listen<T = unknown>(event: string, handler: EventHandler<T>): this;
59
+ /**
60
+ * Removes an event listener.
61
+ */
62
+ stopListening(event: string, handler?: EventHandler): this;
63
+ /**
64
+ * Subscribes to the channel.
65
+ *
66
+ * client listeners -> subscribe ack -> active channel
67
+ * | | |
68
+ * v v v
69
+ * events ready presence sync send/listen
70
+ */
71
+ subscribe(options?: SubscribeOptions): Promise<this>;
72
+ /**
73
+ * Unsubscribes from the channel.
74
+ */
75
+ unsubscribe(options?: UnsubscribeOptions): Promise<void>;
76
+ /**
77
+ * Sends an event to the server.
78
+ */
79
+ send<T = unknown>(event: string, data?: T): this;
80
+ /**
81
+ * Sends an event and waits for a response.
82
+ */
83
+ sendWithAck<T = unknown, R = unknown>(event: string, data?: T): Promise<R>;
84
+ }
85
+
86
+ /**
87
+ * Main Socket client.
88
+ */
89
+ declare class Socket implements SocketClientTransport {
90
+ #private;
91
+ constructor(options?: SocketOptions);
92
+ get state(): ConnectionState;
93
+ get connected(): boolean;
94
+ get id(): string | undefined;
95
+ connect(): Promise<void>;
96
+ disconnect(): void;
97
+ channel(name: string): Channel;
98
+ leave(name: string): Promise<void>;
99
+ onStateChange(handler: EventHandler<ConnectionState>): () => void;
100
+ on<T = unknown>(event: string, handler: EventHandler<T>): () => void;
101
+ off(event: string, handler: EventHandler): void;
102
+ send(message: Record<string, unknown>): void;
103
+ sendRequest<T = unknown>(message: Record<string, unknown>, timeout?: number): Promise<T>;
104
+ }
105
+
106
+ export { Channel, ConnectionState, EventHandler, PresenceUser, Socket, SocketOptions, SubscribeOptions, UnsubscribeOptions };