raffel 1.0.9 → 1.0.10-next.22f4d4e

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 (76) hide show
  1. package/dist/adapters/index.d.ts +1 -1
  2. package/dist/adapters/index.d.ts.map +1 -1
  3. package/dist/adapters/websocket.d.ts +100 -1
  4. package/dist/adapters/websocket.d.ts.map +1 -1
  5. package/dist/adapters/websocket.js +428 -14
  6. package/dist/adapters/websocket.js.map +1 -1
  7. package/dist/channels/channel-manager.d.ts.map +1 -1
  8. package/dist/channels/channel-manager.js +265 -4
  9. package/dist/channels/channel-manager.js.map +1 -1
  10. package/dist/channels/history.d.ts +54 -0
  11. package/dist/channels/history.d.ts.map +1 -0
  12. package/dist/channels/history.js +78 -0
  13. package/dist/channels/history.js.map +1 -0
  14. package/dist/channels/index.d.ts +9 -1
  15. package/dist/channels/index.d.ts.map +1 -1
  16. package/dist/channels/index.js +8 -1
  17. package/dist/channels/index.js.map +1 -1
  18. package/dist/channels/recovery.d.ts +57 -0
  19. package/dist/channels/recovery.d.ts.map +1 -0
  20. package/dist/channels/recovery.js +58 -0
  21. package/dist/channels/recovery.js.map +1 -0
  22. package/dist/channels/rest-api.d.ts +32 -0
  23. package/dist/channels/rest-api.d.ts.map +1 -0
  24. package/dist/channels/rest-api.js +197 -0
  25. package/dist/channels/rest-api.js.map +1 -0
  26. package/dist/channels/ticket-store.d.ts +25 -0
  27. package/dist/channels/ticket-store.d.ts.map +1 -0
  28. package/dist/channels/ticket-store.js +70 -0
  29. package/dist/channels/ticket-store.js.map +1 -0
  30. package/dist/channels/types.d.ts +267 -5
  31. package/dist/channels/types.d.ts.map +1 -1
  32. package/dist/channels/types.js +15 -1
  33. package/dist/channels/types.js.map +1 -1
  34. package/dist/client/index.d.ts +39 -0
  35. package/dist/client/index.d.ts.map +1 -0
  36. package/dist/client/index.js +531 -0
  37. package/dist/client/index.js.map +1 -0
  38. package/dist/client/reconnect.d.ts +33 -0
  39. package/dist/client/reconnect.d.ts.map +1 -0
  40. package/dist/client/reconnect.js +60 -0
  41. package/dist/client/reconnect.js.map +1 -0
  42. package/dist/client/types.d.ts +107 -0
  43. package/dist/client/types.d.ts.map +1 -0
  44. package/dist/client/types.js +5 -0
  45. package/dist/client/types.js.map +1 -0
  46. package/dist/index.d.ts +9 -4
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +10 -2
  49. package/dist/index.js.map +1 -1
  50. package/dist/middleware/interceptors/field-filter.d.ts +51 -0
  51. package/dist/middleware/interceptors/field-filter.d.ts.map +1 -0
  52. package/dist/middleware/interceptors/field-filter.js +81 -0
  53. package/dist/middleware/interceptors/field-filter.js.map +1 -0
  54. package/dist/middleware/interceptors/guard.d.ts +51 -0
  55. package/dist/middleware/interceptors/guard.d.ts.map +1 -0
  56. package/dist/middleware/interceptors/guard.js +45 -0
  57. package/dist/middleware/interceptors/guard.js.map +1 -0
  58. package/dist/middleware/interceptors/index.d.ts +4 -0
  59. package/dist/middleware/interceptors/index.d.ts.map +1 -1
  60. package/dist/middleware/interceptors/index.js +4 -0
  61. package/dist/middleware/interceptors/index.js.map +1 -1
  62. package/dist/resource-module/index.d.ts +44 -0
  63. package/dist/resource-module/index.d.ts.map +1 -0
  64. package/dist/resource-module/index.js +146 -0
  65. package/dist/resource-module/index.js.map +1 -0
  66. package/dist/resource-module/types.d.ts +109 -0
  67. package/dist/resource-module/types.d.ts.map +1 -0
  68. package/dist/resource-module/types.js +7 -0
  69. package/dist/resource-module/types.js.map +1 -0
  70. package/dist/resource-module/watch-helpers.d.ts +16 -0
  71. package/dist/resource-module/watch-helpers.d.ts.map +1 -0
  72. package/dist/resource-module/watch-helpers.js +65 -0
  73. package/dist/resource-module/watch-helpers.js.map +1 -0
  74. package/dist/server/types.d.ts +27 -0
  75. package/dist/server/types.d.ts.map +1 -1
  76. package/package.json +9 -1
@@ -11,7 +11,7 @@
11
11
  * @deprecated Import from 'adapters/inbound' or 'adapters/outbound' for hexagonal clarity.
12
12
  */
13
13
  export { createWebSocketAdapter } from './websocket.js';
14
- export type { WebSocketAdapter, WebSocketAdapterOptions } from './websocket.js';
14
+ export type { WebSocketAdapter, WebSocketAdapterOptions, WebSocketClientInfo } from './websocket.js';
15
15
  export { createHttpAdapter } from './http.js';
16
16
  export type { HttpAdapter, HttpAdapterOptions, HttpMiddleware } from './http.js';
17
17
  export { createTcpAdapter, createTcpClient } from './tcp.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAG/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAGhF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC5D,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAG7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC5D,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAG7D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACtF,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAGhG,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC/D,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAGjJ,OAAO,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAA;AACpG,YAAY,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAGpG,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAGhF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC5D,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAG7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC5D,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAG7D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACtF,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAGhG,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC/D,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAGjJ,OAAO,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAA;AACpG,YAAY,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA"}
@@ -8,7 +8,8 @@ import { WebSocket } from 'ws';
8
8
  import type { IncomingMessage, Server } from 'node:http';
9
9
  import type { Router } from '../core/router.js';
10
10
  import type { ContextSeed } from '../types/index.js';
11
- import { type ChannelOptions, type ChannelManager } from '../channels/index.js';
11
+ import { type ChannelOptions, type ChannelManager, type WebSocketAuthConfig, type BackpressureConfig } from '../channels/index.js';
12
+ import { type ConnectionRecoveryPort } from '../channels/recovery.js';
12
13
  import { type WebSocketConnectionFilter } from './utils/connection-filter.js';
13
14
  /**
14
15
  * WebSocket adapter configuration
@@ -54,6 +55,78 @@ export interface WebSocketAdapterOptions {
54
55
  channels?: ChannelOptions;
55
56
  /** Inbound connection filter — controls which source IPs/origins may connect */
56
57
  filter?: WebSocketConnectionFilter;
58
+ /** WebSocket authentication (ticket, bearer, or custom) */
59
+ auth?: WebSocketAuthConfig;
60
+ /** Backpressure handling for slow consumers */
61
+ backpressure?: BackpressureConfig;
62
+ /** Enable per-message compression (default: false) */
63
+ compression?: boolean | {
64
+ /** Minimum payload size in bytes to compress (default: 1024) */
65
+ threshold?: number;
66
+ /** zlib compression level 1-9 (default: 1) */
67
+ level?: number;
68
+ };
69
+ /** Connection state recovery (requires channels to be enabled) */
70
+ recovery?: {
71
+ /** Enable connection recovery (default: false) */
72
+ enabled: boolean;
73
+ /** TTL in ms for recovery sessions (default: 120000 = 2 minutes) */
74
+ ttl?: number;
75
+ /** Custom recovery store (default: in-memory) */
76
+ store?: ConnectionRecoveryPort;
77
+ };
78
+ /**
79
+ * Raw message handler — called BEFORE any Raffel processing.
80
+ * Return `true` to indicate the message was handled (skip default processing).
81
+ * Return `false` to let Raffel process it normally.
82
+ *
83
+ * Use this to implement your own protocol on top of WebSocket,
84
+ * or to intercept/modify messages before they reach the router.
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * onMessage: (socketId, raw, send) => {
89
+ * const msg = JSON.parse(raw)
90
+ * if (msg.type === 'my-custom-type') {
91
+ * send({ type: 'my-response', data: 'handled' })
92
+ * return true // Handled, skip Raffel
93
+ * }
94
+ * return false // Let Raffel handle it
95
+ * }
96
+ * ```
97
+ */
98
+ onMessage?: (socketId: string, raw: string | Buffer, send: (message: unknown) => void) => boolean | Promise<boolean>;
99
+ /**
100
+ * Called when a new client connects (after auth + filter).
101
+ * Receives the socket ID and a send function for the connection.
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * onConnection: (socketId, send, req) => {
106
+ * send({ type: 'welcome', socketId })
107
+ * }
108
+ * ```
109
+ */
110
+ onConnection?: (socketId: string, send: (message: unknown) => void, req: IncomingMessage) => void | Promise<void>;
111
+ /**
112
+ * Called when a client disconnects.
113
+ */
114
+ onClose?: (socketId: string, code: number, reason: string) => void | Promise<void>;
115
+ }
116
+ /**
117
+ * Minimal client info exposed by the adapter
118
+ */
119
+ export interface WebSocketClientInfo {
120
+ /** Unique socket ID */
121
+ id: string;
122
+ /** Remote IP address */
123
+ remoteAddress?: string;
124
+ /** Connection metadata (headers) */
125
+ metadata: Record<string, string>;
126
+ /** Auth context seed (if authenticated) */
127
+ authSeed?: ContextSeed;
128
+ /** When the client connected */
129
+ connectedAt: number;
57
130
  }
58
131
  /**
59
132
  * WebSocket Adapter
@@ -70,6 +143,32 @@ export interface WebSocketAdapter {
70
143
  * Only available when `channels` option is provided.
71
144
  */
72
145
  readonly channels: ChannelManager | null;
146
+ /**
147
+ * Send a raw message to a specific client by socket ID.
148
+ * Works regardless of channel subscriptions.
149
+ */
150
+ send(socketId: string, message: unknown): void;
151
+ /**
152
+ * Send raw data (string or Buffer) to a specific client.
153
+ * Bypasses JSON serialization — use for binary or custom protocols.
154
+ */
155
+ sendRaw(socketId: string, data: string | Buffer): void;
156
+ /**
157
+ * Broadcast a message to ALL connected clients.
158
+ */
159
+ broadcast(message: unknown, except?: string): void;
160
+ /**
161
+ * Get info about a specific connected client.
162
+ */
163
+ getClient(socketId: string): WebSocketClientInfo | undefined;
164
+ /**
165
+ * Get all connected clients.
166
+ */
167
+ getClients(): WebSocketClientInfo[];
168
+ /**
169
+ * Disconnect a specific client.
170
+ */
171
+ disconnect(socketId: string, code?: number, reason?: string): void;
73
172
  }
74
173
  /**
75
174
  * Create a WebSocket adapter
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/adapters/websocket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAA;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAqB,WAAW,EAAE,MAAM,mBAAmB,CAAA;AASvE,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,cAAc,EAIpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,8BAA8B,CAAA;AAIrC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B,mDAAmD;IACnD,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAE5F;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAA;IAEzB,gFAAgF;IAChF,MAAM,CAAC,EAAE,yBAAyB,CAAA;CACnC;AAeD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAEtB,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAErB,iCAAiC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAE5B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAA;CACzC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,GAC/B,gBAAgB,CA0hBlB"}
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/adapters/websocket.ts"],"names":[],"mappings":"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"}