@spfn/core 0.2.0-beta.9 → 0.3.0-beta.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 (119) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +693 -279
  3. package/dist/app-config/index.d.ts +96 -0
  4. package/dist/app-config/index.js +58 -0
  5. package/dist/app-config/index.js.map +1 -0
  6. package/dist/authz/index.d.ts +34 -0
  7. package/dist/authz/index.js +430 -0
  8. package/dist/authz/index.js.map +1 -0
  9. package/dist/boss-BiDCbbAQ.d.ts +337 -0
  10. package/dist/cache/index.js +42 -30
  11. package/dist/cache/index.js.map +1 -1
  12. package/dist/codegen/index.d.ts +121 -13
  13. package/dist/codegen/index.js +212 -15
  14. package/dist/codegen/index.js.map +1 -1
  15. package/dist/config/index.d.ts +576 -30
  16. package/dist/config/index.js +136 -17
  17. package/dist/config/index.js.map +1 -1
  18. package/dist/contract/index.d.ts +221 -0
  19. package/dist/contract/index.js +558 -0
  20. package/dist/contract/index.js.map +1 -0
  21. package/dist/db/index.d.ts +704 -94
  22. package/dist/db/index.js +1105 -260
  23. package/dist/db/index.js.map +1 -1
  24. package/dist/define-middleware-CVKgqo8S.d.ts +167 -0
  25. package/dist/env/index.d.ts +26 -2
  26. package/dist/env/index.js +15 -5
  27. package/dist/env/index.js.map +1 -1
  28. package/dist/env/loader.d.ts +26 -19
  29. package/dist/env/loader.js +55 -25
  30. package/dist/env/loader.js.map +1 -1
  31. package/dist/errors/index.d.ts +10 -0
  32. package/dist/errors/index.js +40 -7
  33. package/dist/errors/index.js.map +1 -1
  34. package/dist/event/index.d.ts +33 -3
  35. package/dist/event/index.js +24 -3
  36. package/dist/event/index.js.map +1 -1
  37. package/dist/event/sse/client.d.ts +55 -3
  38. package/dist/event/sse/client.js +164 -45
  39. package/dist/event/sse/client.js.map +1 -1
  40. package/dist/event/sse/index.d.ts +12 -5
  41. package/dist/event/sse/index.js +280 -32
  42. package/dist/event/sse/index.js.map +1 -1
  43. package/dist/event/ws/client.d.ts +59 -0
  44. package/dist/event/ws/client.js +273 -0
  45. package/dist/event/ws/client.js.map +1 -0
  46. package/dist/event/ws/index.d.ts +94 -0
  47. package/dist/event/ws/index.js +272 -0
  48. package/dist/event/ws/index.js.map +1 -0
  49. package/dist/job/index.d.ts +48 -3
  50. package/dist/job/index.js +265 -74
  51. package/dist/job/index.js.map +1 -1
  52. package/dist/logger/index.d.ts +5 -0
  53. package/dist/logger/index.js +14 -12
  54. package/dist/logger/index.js.map +1 -1
  55. package/dist/middleware/index.d.ts +352 -10
  56. package/dist/middleware/index.js +1079 -13
  57. package/dist/middleware/index.js.map +1 -1
  58. package/dist/nextjs/index.d.ts +39 -3
  59. package/dist/nextjs/index.js +82 -29
  60. package/dist/nextjs/index.js.map +1 -1
  61. package/dist/nextjs/server.d.ts +69 -52
  62. package/dist/nextjs/server.js +140 -60
  63. package/dist/nextjs/server.js.map +1 -1
  64. package/dist/ops/index.d.ts +208 -0
  65. package/dist/ops/index.js +800 -0
  66. package/dist/ops/index.js.map +1 -0
  67. package/dist/route/index.d.ts +10 -694
  68. package/dist/route/index.js +112 -23
  69. package/dist/route/index.js.map +1 -1
  70. package/dist/route-builder-2ani2jEI.d.ts +553 -0
  71. package/dist/router-DJdpwuB6.d.ts +127 -0
  72. package/dist/security/index.d.ts +83 -0
  73. package/dist/security/index.js +173 -0
  74. package/dist/security/index.js.map +1 -0
  75. package/dist/server/index.d.ts +619 -31
  76. package/dist/server/index.js +2583 -360
  77. package/dist/server/index.js.map +1 -1
  78. package/dist/token-manager-BT5EnUAR.d.ts +278 -0
  79. package/dist/types-2AbaW4Ie.d.ts +205 -0
  80. package/dist/{types-BOPTApC2.d.ts → types-9oszaJqp.d.ts} +7 -2
  81. package/dist/types-ClQVomgV.d.ts +115 -0
  82. package/dist/types-ZQODsBft.d.ts +282 -0
  83. package/docs/file-upload.md +195 -333
  84. package/package.json +250 -208
  85. package/src/cache/README.md +330 -0
  86. package/src/codegen/README.md +516 -0
  87. package/src/config/README.md +326 -0
  88. package/src/contract/README.md +326 -0
  89. package/src/db/README.md +589 -0
  90. package/src/db/manager/README.md +500 -0
  91. package/src/db/schema/README.md +354 -0
  92. package/src/db/transaction/README.md +822 -0
  93. package/src/env/README.md +651 -0
  94. package/src/errors/README.md +429 -0
  95. package/src/event/README.md +741 -0
  96. package/src/job/README.md +613 -0
  97. package/src/logger/README.md +321 -0
  98. package/src/middleware/README.md +634 -0
  99. package/src/nextjs/README.md +608 -0
  100. package/src/route/README.md +738 -0
  101. package/src/security/README.md +100 -0
  102. package/src/server/README.md +704 -0
  103. package/dist/boss-DI1r4kTS.d.ts +0 -244
  104. package/dist/router-Di7ENoah.d.ts +0 -151
  105. package/dist/types-B-e_f2dQ.d.ts +0 -121
  106. package/docs/cache.md +0 -133
  107. package/docs/codegen.md +0 -74
  108. package/docs/database.md +0 -346
  109. package/docs/entity.md +0 -539
  110. package/docs/env.md +0 -477
  111. package/docs/errors.md +0 -319
  112. package/docs/event.md +0 -116
  113. package/docs/job.md +0 -131
  114. package/docs/logger.md +0 -108
  115. package/docs/middleware.md +0 -337
  116. package/docs/nextjs.md +0 -241
  117. package/docs/repository.md +0 -496
  118. package/docs/route.md +0 -497
  119. package/docs/server.md +0 -307
@@ -0,0 +1,282 @@
1
+ import { Context } from 'hono';
2
+ import { b as EventRouterDef, I as InferEventNames, e as InferEventPayload, i as SSETokenStore, S as SSETokenManager } from './token-manager-BT5EnUAR.js';
3
+
4
+ /**
5
+ * SSE Types
6
+ *
7
+ * Type definitions for Server-Sent Events
8
+ */
9
+
10
+ /**
11
+ * SSE message sent from server
12
+ */
13
+ interface SSEMessage<TEvent extends string = string, TPayload = unknown> {
14
+ /** Event name */
15
+ event: TEvent;
16
+ /** Event payload */
17
+ data: TPayload;
18
+ /** Optional message ID for reconnection */
19
+ id?: string;
20
+ }
21
+ /**
22
+ * SSE auth configuration (internal, non-generic)
23
+ *
24
+ * Stored in SSEHandlerConfig. Generic user-facing version is SSEAuthConfig.
25
+ */
26
+ interface SSEHandlerAuthConfig {
27
+ /**
28
+ * Enable SSE token authentication
29
+ * @default false
30
+ */
31
+ enabled?: boolean;
32
+ /**
33
+ * Token TTL in milliseconds
34
+ * @default 30000
35
+ */
36
+ tokenTtl?: number;
37
+ /**
38
+ * Custom token store (e.g., Redis for multi-instance)
39
+ */
40
+ store?: SSETokenStore;
41
+ /**
42
+ * External token manager instance or lazy resolver.
43
+ *
44
+ * When provided, the SSE system uses this manager instead of creating its own.
45
+ * Useful for sharing a single token manager with auth package's one-time token system.
46
+ *
47
+ * Use a function when the manager is not available at module load time
48
+ * (e.g. initialized in a lifecycle hook that runs after config evaluation).
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * import { getOneTimeTokenManager } from '@spfn/auth/server';
53
+ *
54
+ * // Lazy resolver (recommended — avoids timing issues)
55
+ * .events(eventRouter, {
56
+ * auth: {
57
+ * enabled: true,
58
+ * tokenManager: () => getOneTimeTokenManager(),
59
+ * },
60
+ * })
61
+ * ```
62
+ */
63
+ tokenManager?: SSETokenManager | (() => SSETokenManager);
64
+ /**
65
+ * Extract subject (user ID) from Hono context
66
+ * @default (c) => c.get('auth')?.userId ?? null
67
+ */
68
+ getSubject?: (c: Context) => string | null;
69
+ /**
70
+ * Subscription authorization hook (called once on connect)
71
+ *
72
+ * Return allowed events subset. Empty array = 403 rejection.
73
+ */
74
+ authorize?: (subject: string, events: string[]) => Promise<string[]> | string[];
75
+ /**
76
+ * Per-event payload filter map (called on every event emission)
77
+ *
78
+ * Return false to skip sending the event to this user.
79
+ */
80
+ filter?: Record<string, (subject: string, payload: unknown) => boolean>;
81
+ }
82
+ /**
83
+ * SSE auth configuration (user-facing, generic)
84
+ *
85
+ * Provides type-safe event names and payload inference from EventRouter.
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * .events(eventRouter, {
90
+ * auth: {
91
+ * enabled: true,
92
+ * authorize: async (subject, events) => {
93
+ * // events: ('userCreated' | 'orderUpdated')[]
94
+ * return events.filter(e => hasPermission(subject, e));
95
+ * },
96
+ * filter: {
97
+ * orderUpdated: (subject, payload) => {
98
+ * // payload: { orderId: string; userId: string }
99
+ * return payload.userId === subject;
100
+ * },
101
+ * },
102
+ * },
103
+ * })
104
+ * ```
105
+ */
106
+ interface SSEAuthConfig<TRouter extends EventRouterDef<any>> {
107
+ enabled?: boolean;
108
+ tokenTtl?: number;
109
+ store?: SSETokenStore;
110
+ tokenManager?: SSETokenManager | (() => SSETokenManager);
111
+ getSubject?: (c: Context) => string | null;
112
+ authorize?: (subject: string, events: InferEventNames<TRouter>[]) => Promise<InferEventNames<TRouter>[]> | InferEventNames<TRouter>[];
113
+ filter?: {
114
+ [K in InferEventNames<TRouter>]?: (subject: string, payload: InferEventPayload<TRouter, K>) => boolean;
115
+ };
116
+ }
117
+ /**
118
+ * SSE Handler configuration
119
+ */
120
+ interface SSEHandlerConfig {
121
+ /**
122
+ * Keep-alive ping interval in milliseconds
123
+ * @default 10000
124
+ */
125
+ pingInterval?: number;
126
+ /**
127
+ * Custom headers for SSE response
128
+ */
129
+ headers?: Record<string, string>;
130
+ /**
131
+ * Max outbound frames buffered per connection before a slow consumer is
132
+ * dropped (connection closed). Bounds memory under a fast producer + slow
133
+ * client; the client reconnects rather than receiving corrupted/partial data.
134
+ * @default 1000
135
+ */
136
+ maxQueue?: number;
137
+ /**
138
+ * Cross-pod event broadcast via the cache (Redis/Valkey) pub/sub.
139
+ *
140
+ * When `true` (default) and a cache is configured (`CACHE_URL`), each event
141
+ * is auto-wired so an `emit` on one pod reaches subscribers on every pod.
142
+ * Without a cache this is a no-op (events stay in-process). Set `false` to
143
+ * force in-process even when a cache is present.
144
+ *
145
+ * @default true
146
+ */
147
+ multiInstance?: boolean;
148
+ /**
149
+ * Pub/sub channel prefix for cross-pod broadcast.
150
+ *
151
+ * Defaults to env `SPFN_SSE_CHANNEL_PREFIX`, else `spfn:sse:`. Use distinct
152
+ * prefixes to isolate apps/tenants that share one Redis instance.
153
+ */
154
+ channelPrefix?: string;
155
+ /**
156
+ * Authentication and authorization configuration
157
+ */
158
+ auth?: SSEHandlerAuthConfig;
159
+ }
160
+ /**
161
+ * SSE Client configuration
162
+ */
163
+ interface SSEClientConfig {
164
+ /**
165
+ * Backend API host URL
166
+ * @default NEXT_PUBLIC_SPFN_API_URL || 'http://localhost:8790'
167
+ * @example 'http://localhost:8790'
168
+ * @example 'https://api.example.com'
169
+ */
170
+ host?: string;
171
+ /**
172
+ * SSE endpoint pathname
173
+ * @default '/events/stream'
174
+ */
175
+ pathname?: string;
176
+ /**
177
+ * Full URL (overrides host + pathname)
178
+ * @deprecated Use host and pathname instead
179
+ * @example 'http://localhost:8790/events/stream'
180
+ */
181
+ url?: string;
182
+ /**
183
+ * Auto reconnect on disconnect
184
+ * @default true
185
+ */
186
+ reconnect?: boolean;
187
+ /**
188
+ * Reconnect delay in milliseconds
189
+ * @default 3000
190
+ */
191
+ reconnectDelay?: number;
192
+ /**
193
+ * Maximum reconnect attempts (0 = infinite)
194
+ * @default 0
195
+ */
196
+ maxReconnectAttempts?: number;
197
+ /**
198
+ * Include credentials (cookies) in request
199
+ * @default false
200
+ */
201
+ withCredentials?: boolean;
202
+ /**
203
+ * Acquire a one-time SSE token before connecting.
204
+ *
205
+ * Called on every (re)connect. The returned token is appended
206
+ * to the SSE URL as `?token=...`.
207
+ *
208
+ * For automatic token acquisition via RPC proxy, use `createAuthSSEClient` instead.
209
+ *
210
+ * @example
211
+ * ```typescript
212
+ * // Recommended: use createAuthSSEClient for automatic token handling
213
+ * import { createAuthSSEClient } from '@spfn/core/event/sse/client';
214
+ * const client = createAuthSSEClient<EventRouter>();
215
+ *
216
+ * // Manual: provide acquireToken directly
217
+ * acquireToken: async () => {
218
+ * const res = await fetch('/api/rpc/eventsToken', {
219
+ * method: 'POST',
220
+ * credentials: 'include',
221
+ * });
222
+ * const data = await res.json();
223
+ * return data.token;
224
+ * }
225
+ * ```
226
+ */
227
+ acquireToken?: () => Promise<string>;
228
+ }
229
+ /**
230
+ * Event handler function
231
+ */
232
+ type SSEEventHandler<TPayload> = (payload: TPayload) => void;
233
+ /**
234
+ * Event handlers map for EventRouter
235
+ */
236
+ type SSEEventHandlers<TRouter extends EventRouterDef<any>> = {
237
+ [K in InferEventNames<TRouter>]?: SSEEventHandler<InferEventPayload<TRouter, K>>;
238
+ };
239
+ /**
240
+ * Subscription options
241
+ */
242
+ interface SSESubscribeOptions<TRouter extends EventRouterDef<any>> {
243
+ /**
244
+ * Events to subscribe
245
+ */
246
+ events: InferEventNames<TRouter>[];
247
+ /**
248
+ * Event handlers
249
+ */
250
+ handlers: SSEEventHandlers<TRouter>;
251
+ /**
252
+ * Called when connection opens
253
+ */
254
+ onOpen?: () => void;
255
+ /**
256
+ * Called on connection error
257
+ */
258
+ onError?: (error: Event) => void;
259
+ /**
260
+ * Called when connection is permanently closed
261
+ *
262
+ * Triggered when:
263
+ * - unsubscribe() is called
264
+ * - client.close() is called
265
+ * - Max reconnect attempts exceeded
266
+ */
267
+ onClose?: () => void;
268
+ /**
269
+ * Called when reconnecting
270
+ */
271
+ onReconnect?: (attempt: number) => void;
272
+ }
273
+ /**
274
+ * SSE connection state
275
+ */
276
+ type SSEConnectionState = 'connecting' | 'open' | 'closed' | 'error';
277
+ /**
278
+ * Unsubscribe function
279
+ */
280
+ type SSEUnsubscribe = () => void;
281
+
282
+ export type { SSEClientConfig as S, SSESubscribeOptions as a, SSEUnsubscribe as b, SSEConnectionState as c, SSEHandlerConfig as d, SSEAuthConfig as e, SSEEventHandler as f, SSEEventHandlers as g, SSEHandlerAuthConfig as h, SSEMessage as i };