@spfn/core 0.2.0-beta.9 → 0.3.0-beta.2
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.
- package/LICENSE +1 -1
- package/README.md +467 -305
- package/dist/authz/index.d.ts +34 -0
- package/dist/authz/index.js +810 -0
- package/dist/authz/index.js.map +1 -0
- package/dist/{boss-DI1r4kTS.d.ts → boss-D16fO2oG.d.ts} +41 -1
- package/dist/cache/index.js +42 -30
- package/dist/cache/index.js.map +1 -1
- package/dist/codegen/index.d.ts +121 -13
- package/dist/codegen/index.js +212 -15
- package/dist/codegen/index.js.map +1 -1
- package/dist/config/index.d.ts +615 -6
- package/dist/config/index.js +124 -5
- package/dist/config/index.js.map +1 -1
- package/dist/contract/index.d.ts +220 -0
- package/dist/contract/index.js +558 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/db/index.d.ts +528 -85
- package/dist/db/index.js +831 -122
- package/dist/db/index.js.map +1 -1
- package/dist/define-middleware-DfDP39Nq.d.ts +167 -0
- package/dist/env/index.d.ts +26 -2
- package/dist/env/index.js +15 -5
- package/dist/env/index.js.map +1 -1
- package/dist/env/loader.d.ts +26 -19
- package/dist/env/loader.js +32 -25
- package/dist/env/loader.js.map +1 -1
- package/dist/errors/index.d.ts +10 -0
- package/dist/errors/index.js +418 -5
- package/dist/errors/index.js.map +1 -1
- package/dist/event/index.d.ts +33 -3
- package/dist/event/index.js +24 -3
- package/dist/event/index.js.map +1 -1
- package/dist/event/sse/client.d.ts +42 -3
- package/dist/event/sse/client.js +128 -45
- package/dist/event/sse/client.js.map +1 -1
- package/dist/event/sse/index.d.ts +12 -5
- package/dist/event/sse/index.js +280 -32
- package/dist/event/sse/index.js.map +1 -1
- package/dist/event/ws/client.d.ts +59 -0
- package/dist/event/ws/client.js +273 -0
- package/dist/event/ws/client.js.map +1 -0
- package/dist/event/ws/index.d.ts +94 -0
- package/dist/event/ws/index.js +272 -0
- package/dist/event/ws/index.js.map +1 -0
- package/dist/job/index.d.ts +2 -2
- package/dist/job/index.js +155 -42
- package/dist/job/index.js.map +1 -1
- package/dist/logger/index.d.ts +5 -0
- package/dist/logger/index.js +14 -0
- package/dist/logger/index.js.map +1 -1
- package/dist/middleware/index.d.ts +347 -9
- package/dist/middleware/index.js +1462 -15
- package/dist/middleware/index.js.map +1 -1
- package/dist/nextjs/index.d.ts +2 -2
- package/dist/nextjs/index.js +42 -28
- package/dist/nextjs/index.js.map +1 -1
- package/dist/nextjs/server.d.ts +35 -51
- package/dist/nextjs/server.js +126 -60
- package/dist/nextjs/server.js.map +1 -1
- package/dist/ops/index.d.ts +152 -0
- package/dist/ops/index.js +500 -0
- package/dist/ops/index.js.map +1 -0
- package/dist/route/index.d.ts +8 -694
- package/dist/route/index.js +111 -22
- package/dist/route/index.js.map +1 -1
- package/dist/router-Qbssr11H.d.ts +676 -0
- package/dist/security/index.d.ts +83 -0
- package/dist/security/index.js +173 -0
- package/dist/security/index.js.map +1 -0
- package/dist/server/index.d.ts +491 -22
- package/dist/server/index.js +1887 -308
- package/dist/server/index.js.map +1 -1
- package/dist/token-manager-BT5EnUAR.d.ts +278 -0
- package/dist/types-2AbaW4Ie.d.ts +205 -0
- package/dist/{types-BOPTApC2.d.ts → types-9oszaJqp.d.ts} +7 -2
- package/dist/types-D1c57Ko-.d.ts +115 -0
- package/dist/types-ZQODsBft.d.ts +282 -0
- package/package.json +244 -208
- package/dist/router-Di7ENoah.d.ts +0 -151
- package/dist/types-B-e_f2dQ.d.ts +0 -121
- package/docs/cache.md +0 -133
- package/docs/codegen.md +0 -74
- package/docs/database.md +0 -346
- package/docs/entity.md +0 -539
- package/docs/env.md +0 -477
- package/docs/errors.md +0 -319
- package/docs/event.md +0 -116
- package/docs/job.md +0 -131
- package/docs/logger.md +0 -108
- package/docs/middleware.md +0 -337
- package/docs/nextjs.md +0 -241
- package/docs/repository.md +0 -496
- package/docs/route.md +0 -497
- package/docs/server.md +0 -307
package/package.json
CHANGED
|
@@ -1,210 +1,246 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
2
|
+
"name": "@spfn/core",
|
|
3
|
+
"version": "0.3.0-beta.2",
|
|
4
|
+
"description": "Full-stack TypeScript backend for Next.js: file-based typed routes, Drizzle entities and repositories, PostgreSQL transactions and a generated end-to-end client, in one fixed vertical slice per feature",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
"./client": {
|
|
8
|
+
"types": "./dist/client/index.d.ts",
|
|
9
|
+
"import": "./dist/client/index.js",
|
|
10
|
+
"require": "./dist/client/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./nextjs": {
|
|
13
|
+
"types": "./dist/nextjs/index.d.ts",
|
|
14
|
+
"import": "./dist/nextjs/index.js",
|
|
15
|
+
"require": "./dist/nextjs/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./nextjs/server": {
|
|
18
|
+
"types": "./dist/nextjs/server.d.ts",
|
|
19
|
+
"import": "./dist/nextjs/server.js",
|
|
20
|
+
"require": "./dist/nextjs/server.js"
|
|
21
|
+
},
|
|
22
|
+
"./route": {
|
|
23
|
+
"types": "./dist/route/index.d.ts",
|
|
24
|
+
"import": "./dist/route/index.js",
|
|
25
|
+
"require": "./dist/route/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./route/types": {
|
|
28
|
+
"types": "./dist/route/types.d.ts",
|
|
29
|
+
"import": "./dist/route/types.js",
|
|
30
|
+
"require": "./dist/route/types.js"
|
|
31
|
+
},
|
|
32
|
+
"./db": {
|
|
33
|
+
"types": "./dist/db/index.d.ts",
|
|
34
|
+
"import": "./dist/db/index.js",
|
|
35
|
+
"require": "./dist/db/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./server": {
|
|
38
|
+
"types": "./dist/server/index.d.ts",
|
|
39
|
+
"import": "./dist/server/index.js",
|
|
40
|
+
"require": "./dist/server/index.js"
|
|
41
|
+
},
|
|
42
|
+
"./errors": {
|
|
43
|
+
"types": "./dist/errors/index.d.ts",
|
|
44
|
+
"import": "./dist/errors/index.js",
|
|
45
|
+
"require": "./dist/errors/index.js"
|
|
46
|
+
},
|
|
47
|
+
"./middleware": {
|
|
48
|
+
"types": "./dist/middleware/index.d.ts",
|
|
49
|
+
"import": "./dist/middleware/index.js",
|
|
50
|
+
"require": "./dist/middleware/index.js"
|
|
51
|
+
},
|
|
52
|
+
"./security": {
|
|
53
|
+
"types": "./dist/security/index.d.ts",
|
|
54
|
+
"import": "./dist/security/index.js",
|
|
55
|
+
"require": "./dist/security/index.js"
|
|
56
|
+
},
|
|
57
|
+
"./authz": {
|
|
58
|
+
"types": "./dist/authz/index.d.ts",
|
|
59
|
+
"import": "./dist/authz/index.js",
|
|
60
|
+
"require": "./dist/authz/index.js"
|
|
61
|
+
},
|
|
62
|
+
"./cache": {
|
|
63
|
+
"types": "./dist/cache/index.d.ts",
|
|
64
|
+
"import": "./dist/cache/index.js",
|
|
65
|
+
"require": "./dist/cache/index.js"
|
|
66
|
+
},
|
|
67
|
+
"./codegen": {
|
|
68
|
+
"types": "./dist/codegen/index.d.ts",
|
|
69
|
+
"import": "./dist/codegen/index.js",
|
|
70
|
+
"require": "./dist/codegen/index.js"
|
|
71
|
+
},
|
|
72
|
+
"./contract": {
|
|
73
|
+
"types": "./dist/contract/index.d.ts",
|
|
74
|
+
"import": "./dist/contract/index.js",
|
|
75
|
+
"require": "./dist/contract/index.js"
|
|
76
|
+
},
|
|
77
|
+
"./ops": {
|
|
78
|
+
"types": "./dist/ops/index.d.ts",
|
|
79
|
+
"import": "./dist/ops/index.js",
|
|
80
|
+
"require": "./dist/ops/index.js"
|
|
81
|
+
},
|
|
82
|
+
"./env": {
|
|
83
|
+
"types": "./dist/env/index.d.ts",
|
|
84
|
+
"import": "./dist/env/index.js",
|
|
85
|
+
"require": "./dist/env/index.js"
|
|
86
|
+
},
|
|
87
|
+
"./env/loader": {
|
|
88
|
+
"types": "./dist/env/loader.d.ts",
|
|
89
|
+
"import": "./dist/env/loader.js",
|
|
90
|
+
"require": "./dist/env/loader.js"
|
|
91
|
+
},
|
|
92
|
+
"./logger": {
|
|
93
|
+
"types": "./dist/logger/index.d.ts",
|
|
94
|
+
"import": "./dist/logger/index.js",
|
|
95
|
+
"require": "./dist/logger/index.js"
|
|
96
|
+
},
|
|
97
|
+
"./config": {
|
|
98
|
+
"types": "./dist/config/index.d.ts",
|
|
99
|
+
"import": "./dist/config/index.js",
|
|
100
|
+
"require": "./dist/config/index.js"
|
|
101
|
+
},
|
|
102
|
+
"./job": {
|
|
103
|
+
"types": "./dist/job/index.d.ts",
|
|
104
|
+
"import": "./dist/job/index.js",
|
|
105
|
+
"require": "./dist/job/index.js"
|
|
106
|
+
},
|
|
107
|
+
"./event": {
|
|
108
|
+
"types": "./dist/event/index.d.ts",
|
|
109
|
+
"import": "./dist/event/index.js",
|
|
110
|
+
"require": "./dist/event/index.js"
|
|
111
|
+
},
|
|
112
|
+
"./event/sse": {
|
|
113
|
+
"types": "./dist/event/sse/index.d.ts",
|
|
114
|
+
"import": "./dist/event/sse/index.js",
|
|
115
|
+
"require": "./dist/event/sse/index.js"
|
|
116
|
+
},
|
|
117
|
+
"./event/sse/client": {
|
|
118
|
+
"types": "./dist/event/sse/client.d.ts",
|
|
119
|
+
"import": "./dist/event/sse/client.js",
|
|
120
|
+
"require": "./dist/event/sse/client.js"
|
|
121
|
+
},
|
|
122
|
+
"./event/ws": {
|
|
123
|
+
"types": "./dist/event/ws/index.d.ts",
|
|
124
|
+
"import": "./dist/event/ws/index.js",
|
|
125
|
+
"require": "./dist/event/ws/index.js"
|
|
126
|
+
},
|
|
127
|
+
"./event/ws/client": {
|
|
128
|
+
"types": "./dist/event/ws/client.d.ts",
|
|
129
|
+
"import": "./dist/event/ws/client.js",
|
|
130
|
+
"require": "./dist/event/ws/client.js"
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"scripts": {
|
|
134
|
+
"build": "pnpm check:circular && tsup",
|
|
135
|
+
"prepack": "node -e \"require('fs').copyFileSync('../../LICENSE','LICENSE')\"",
|
|
136
|
+
"dev": "tsup",
|
|
137
|
+
"test": "vitest run",
|
|
138
|
+
"test:watch": "vitest",
|
|
139
|
+
"test:coverage": "vitest run --coverage",
|
|
140
|
+
"test:logger": "vitest run src/logger",
|
|
141
|
+
"test:errors": "vitest run src/errors",
|
|
142
|
+
"test:codegen": "vitest run src/codegen",
|
|
143
|
+
"test:route": "vitest run src/route",
|
|
144
|
+
"test:client": "vitest run src/client",
|
|
145
|
+
"test:middleware": "vitest run src/middleware",
|
|
146
|
+
"test:env": "vitest run src/env",
|
|
147
|
+
"test:cache": "vitest run src/cache --config vitest.integration.config.ts",
|
|
148
|
+
"test:db": "vitest run src/db --config vitest.integration.config.ts",
|
|
149
|
+
"test:server": "vitest run src/server --config vitest.integration.config.ts",
|
|
150
|
+
"check:circular": "madge --circular --extensions ts src/",
|
|
151
|
+
"type-check": "tsc --noEmit",
|
|
152
|
+
"publish:alpha": "node ../../scripts/publish-package.mjs alpha",
|
|
153
|
+
"publish:beta": "node ../../scripts/publish-package.mjs beta",
|
|
154
|
+
"publish:latest": "node ../../scripts/publish-package.mjs latest"
|
|
155
|
+
},
|
|
156
|
+
"keywords": [
|
|
157
|
+
"spfn",
|
|
158
|
+
"nextjs",
|
|
159
|
+
"backend",
|
|
160
|
+
"framework",
|
|
161
|
+
"typescript",
|
|
162
|
+
"type-safe",
|
|
163
|
+
"api",
|
|
164
|
+
"rest-api",
|
|
165
|
+
"crud",
|
|
166
|
+
"database",
|
|
167
|
+
"orm",
|
|
168
|
+
"drizzle-orm",
|
|
169
|
+
"postgres",
|
|
170
|
+
"redis",
|
|
171
|
+
"hono",
|
|
172
|
+
"fullstack",
|
|
173
|
+
"full-stack-framework",
|
|
174
|
+
"ai-coding-agent",
|
|
175
|
+
"claude-code",
|
|
176
|
+
"file-based-routing",
|
|
177
|
+
"transaction",
|
|
178
|
+
"repository-pattern"
|
|
179
|
+
],
|
|
180
|
+
"author": "Ray Im <rayim@fxy.global>",
|
|
181
|
+
"license": "MIT",
|
|
182
|
+
"repository": {
|
|
183
|
+
"type": "git",
|
|
184
|
+
"url": "git+https://github.com/fxylabs/spfn.git",
|
|
185
|
+
"directory": "packages/core"
|
|
186
|
+
},
|
|
187
|
+
"bugs": {
|
|
188
|
+
"url": "https://github.com/fxylabs/spfn/issues"
|
|
189
|
+
},
|
|
190
|
+
"homepage": "https://github.com/fxylabs/spfn/tree/main/packages/core#readme",
|
|
191
|
+
"engines": {
|
|
192
|
+
"node": ">=20.0.0"
|
|
193
|
+
},
|
|
194
|
+
"dependencies": {
|
|
195
|
+
"@hono/node-server": "^2.0.5",
|
|
196
|
+
"@sinclair/typebox": "^0.34.0",
|
|
197
|
+
"chalk": "^5.6.2",
|
|
198
|
+
"chokidar": "^4.0.3",
|
|
199
|
+
"dotenv": "^17.2.3",
|
|
200
|
+
"drizzle-typebox": "^0.3.3",
|
|
201
|
+
"hono": "^4.12.34",
|
|
202
|
+
"jiti": "^2.6.1",
|
|
203
|
+
"micromatch": "^4.0.8",
|
|
204
|
+
"pg-boss": "^11.1.2",
|
|
205
|
+
"postgres": "^3.4.0",
|
|
206
|
+
"typescript": "^5.3.3",
|
|
207
|
+
"undici": "^7.29.0",
|
|
208
|
+
"zod": "^4.4.3"
|
|
209
|
+
},
|
|
210
|
+
"optionalDependencies": {
|
|
211
|
+
"ioredis": "^5.4.1",
|
|
212
|
+
"ws": "^8.21.0"
|
|
213
|
+
},
|
|
214
|
+
"devDependencies": {
|
|
215
|
+
"@electric-sql/pglite": "0.5.4",
|
|
216
|
+
"@types/micromatch": "^4.0.9",
|
|
217
|
+
"@types/node": "^20.11.0",
|
|
218
|
+
"@types/ws": "^8.18.1",
|
|
219
|
+
"@vitest/coverage-v8": "^4.0.6",
|
|
220
|
+
"drizzle-kit": "1.0.0-rc.4",
|
|
221
|
+
"drizzle-orm": "1.0.0-rc.4",
|
|
222
|
+
"madge": "^8.0.0",
|
|
223
|
+
"next": "^16.2.11",
|
|
224
|
+
"tsup": "^8.5.0",
|
|
225
|
+
"vitest": "^4.0.6"
|
|
226
|
+
},
|
|
227
|
+
"peerDependencies": {
|
|
228
|
+
"drizzle-orm": ">=1.0.0-rc.4 <2",
|
|
229
|
+
"next": "^16.2.11"
|
|
230
|
+
},
|
|
231
|
+
"peerDependenciesMeta": {
|
|
232
|
+
"next": {
|
|
233
|
+
"optional": true
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
"files": [
|
|
237
|
+
"dist",
|
|
238
|
+
"docs",
|
|
239
|
+
"README.md",
|
|
240
|
+
"LICENSE"
|
|
241
|
+
],
|
|
242
|
+
"publishConfig": {
|
|
243
|
+
"access": "public",
|
|
244
|
+
"tag": "beta"
|
|
176
245
|
}
|
|
177
|
-
|
|
178
|
-
"files": [
|
|
179
|
-
"dist",
|
|
180
|
-
"docs",
|
|
181
|
-
"README.md",
|
|
182
|
-
"LICENSE"
|
|
183
|
-
],
|
|
184
|
-
"publishConfig": {
|
|
185
|
-
"access": "public",
|
|
186
|
-
"tag": "beta"
|
|
187
|
-
},
|
|
188
|
-
"scripts": {
|
|
189
|
-
"build": "pnpm check:circular && tsup",
|
|
190
|
-
"dev": "tsup",
|
|
191
|
-
"test": "vitest run",
|
|
192
|
-
"test:watch": "vitest",
|
|
193
|
-
"test:coverage": "vitest run --config vitest.unit.config.ts --coverage",
|
|
194
|
-
"test:logger": "vitest run src/logger",
|
|
195
|
-
"test:errors": "vitest run src/errors",
|
|
196
|
-
"test:codegen": "vitest run src/codegen",
|
|
197
|
-
"test:route": "vitest run src/route",
|
|
198
|
-
"test:client": "vitest run src/client",
|
|
199
|
-
"test:middleware": "vitest run src/middleware",
|
|
200
|
-
"test:env": "vitest run src/env",
|
|
201
|
-
"test:cache": "vitest run src/cache --config vitest.integration.config.ts",
|
|
202
|
-
"test:db": "vitest run src/db --config vitest.integration.config.ts",
|
|
203
|
-
"test:server": "vitest run src/server --config vitest.integration.config.ts",
|
|
204
|
-
"docker:test:up": "docker compose -f docker-compose.test.yml up -d",
|
|
205
|
-
"docker:test:down": "docker compose -f docker-compose.test.yml down",
|
|
206
|
-
"docker:test:logs": "docker compose -f docker-compose.test.yml logs -f",
|
|
207
|
-
"check:circular": "madge --circular --extensions ts src/",
|
|
208
|
-
"type-check": "tsc --noEmit"
|
|
209
|
-
}
|
|
210
|
-
}
|
|
246
|
+
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { TSchema } from '@sinclair/typebox';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Event System Types
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Pub/Sub capable cache interface for multi-instance events
|
|
9
|
-
*/
|
|
10
|
-
interface PubSubCache {
|
|
11
|
-
/**
|
|
12
|
-
* Publish a message to a channel
|
|
13
|
-
*/
|
|
14
|
-
publish(channel: string, message: unknown): Promise<void>;
|
|
15
|
-
/**
|
|
16
|
-
* Subscribe to a channel
|
|
17
|
-
*/
|
|
18
|
-
subscribe(channel: string, handler: (message: unknown) => void | Promise<void>): Promise<void>;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Event handler function type
|
|
22
|
-
*/
|
|
23
|
-
type EventHandler<TPayload> = (payload: TPayload) => void | Promise<void>;
|
|
24
|
-
/**
|
|
25
|
-
* Job queue sender function type (used by job module)
|
|
26
|
-
*/
|
|
27
|
-
type JobQueueSender = (queueName: string, payload: unknown) => Promise<void>;
|
|
28
|
-
/**
|
|
29
|
-
* Event definition interface
|
|
30
|
-
*/
|
|
31
|
-
interface EventDef<TPayload = void> {
|
|
32
|
-
/**
|
|
33
|
-
* Unique event name
|
|
34
|
-
*/
|
|
35
|
-
readonly name: string;
|
|
36
|
-
/**
|
|
37
|
-
* TypeBox payload schema (optional)
|
|
38
|
-
*/
|
|
39
|
-
readonly schema?: TSchema;
|
|
40
|
-
/**
|
|
41
|
-
* Subscribe to this event (in-memory handler)
|
|
42
|
-
*/
|
|
43
|
-
subscribe: (handler: EventHandler<TPayload>) => () => void;
|
|
44
|
-
/**
|
|
45
|
-
* Unsubscribe all handlers
|
|
46
|
-
*/
|
|
47
|
-
unsubscribeAll: () => void;
|
|
48
|
-
/**
|
|
49
|
-
* Emit the event (triggers all subscribers and queued jobs)
|
|
50
|
-
*/
|
|
51
|
-
emit: TPayload extends void ? () => Promise<void> : (payload: TPayload) => Promise<void>;
|
|
52
|
-
/**
|
|
53
|
-
* Enable cache-based pub/sub for multi-instance support
|
|
54
|
-
* Must await before emitting events to ensure subscription is ready
|
|
55
|
-
*/
|
|
56
|
-
useCache: (cache: PubSubCache) => Promise<EventDef<TPayload>>;
|
|
57
|
-
/**
|
|
58
|
-
* Internal: Register a job queue to receive this event
|
|
59
|
-
* Called by job registration system
|
|
60
|
-
*/
|
|
61
|
-
_registerJobQueue: (queueName: string, sender: JobQueueSender) => void;
|
|
62
|
-
/**
|
|
63
|
-
* Type inference helper
|
|
64
|
-
*/
|
|
65
|
-
_payload: TPayload;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Infer payload type from EventDef
|
|
69
|
-
*/
|
|
70
|
-
type InferEventPayload$1<TEvent> = TEvent extends EventDef<infer TPayload> ? TPayload : never;
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Event Router
|
|
74
|
-
*
|
|
75
|
-
* Type-safe event router for SSE subscription
|
|
76
|
-
*
|
|
77
|
-
* @example
|
|
78
|
-
* ```typescript
|
|
79
|
-
* import { defineEvent, defineEventRouter } from '@spfn/core/event';
|
|
80
|
-
* import { Type } from '@sinclair/typebox';
|
|
81
|
-
*
|
|
82
|
-
* const userCreated = defineEvent('user.created', Type.Object({
|
|
83
|
-
* userId: Type.String(),
|
|
84
|
-
* }));
|
|
85
|
-
*
|
|
86
|
-
* const orderPlaced = defineEvent('order.placed', Type.Object({
|
|
87
|
-
* orderId: Type.String(),
|
|
88
|
-
* amount: Type.Number(),
|
|
89
|
-
* }));
|
|
90
|
-
*
|
|
91
|
-
* export const eventRouter = defineEventRouter({
|
|
92
|
-
* userCreated,
|
|
93
|
-
* orderPlaced,
|
|
94
|
-
* });
|
|
95
|
-
*
|
|
96
|
-
* export type EventRouter = typeof eventRouter;
|
|
97
|
-
* ```
|
|
98
|
-
*/
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Event Router Definition
|
|
102
|
-
*/
|
|
103
|
-
interface EventRouterDef<TEvents extends Record<string, EventDef<any>>> {
|
|
104
|
-
/**
|
|
105
|
-
* Event definitions
|
|
106
|
-
*/
|
|
107
|
-
readonly events: TEvents;
|
|
108
|
-
/**
|
|
109
|
-
* Event names as array
|
|
110
|
-
*/
|
|
111
|
-
readonly eventNames: (keyof TEvents)[];
|
|
112
|
-
/**
|
|
113
|
-
* Type inference helper - payload types by event name
|
|
114
|
-
*/
|
|
115
|
-
readonly _types: {
|
|
116
|
-
[K in keyof TEvents]: TEvents[K]['_payload'];
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Infer event names from EventRouter
|
|
121
|
-
*/
|
|
122
|
-
type InferEventNames<T> = T extends EventRouterDef<infer E> ? keyof E & string : never;
|
|
123
|
-
/**
|
|
124
|
-
* Infer payload type for specific event
|
|
125
|
-
*/
|
|
126
|
-
type InferEventPayload<T extends EventRouterDef<any>, K extends InferEventNames<T>> = T['_types'][K];
|
|
127
|
-
/**
|
|
128
|
-
* Infer all event payloads map
|
|
129
|
-
*/
|
|
130
|
-
type InferEventPayloads<T extends EventRouterDef<any>> = T['_types'];
|
|
131
|
-
/**
|
|
132
|
-
* Define an event router for SSE subscription
|
|
133
|
-
*
|
|
134
|
-
* @example
|
|
135
|
-
* ```typescript
|
|
136
|
-
* export const eventRouter = defineEventRouter({
|
|
137
|
-
* userCreated,
|
|
138
|
-
* orderPlaced,
|
|
139
|
-
* });
|
|
140
|
-
*
|
|
141
|
-
* // Type inference
|
|
142
|
-
* type Names = InferEventNames<typeof eventRouter>;
|
|
143
|
-
* // 'userCreated' | 'orderPlaced'
|
|
144
|
-
*
|
|
145
|
-
* type Payload = InferEventPayload<typeof eventRouter, 'userCreated'>;
|
|
146
|
-
* // { userId: string }
|
|
147
|
-
* ```
|
|
148
|
-
*/
|
|
149
|
-
declare function defineEventRouter<TEvents extends Record<string, EventDef<any>>>(events: TEvents): EventRouterDef<TEvents>;
|
|
150
|
-
|
|
151
|
-
export { type EventRouterDef as E, type InferEventNames as I, type JobQueueSender as J, type PubSubCache as P, type EventDef as a, type InferEventPayload as b, type InferEventPayloads as c, defineEventRouter as d, type EventHandler as e, type InferEventPayload$1 as f };
|