silgi 0.43.29 → 0.50.1

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 (478) hide show
  1. package/README.md +103 -1
  2. package/dist/_virtual/_rolldown/runtime.mjs +5 -0
  3. package/dist/adapters/_fetch-adapter.d.mts +18 -0
  4. package/dist/adapters/_fetch-adapter.mjs +53 -0
  5. package/dist/adapters/astro.d.mts +15 -0
  6. package/dist/adapters/astro.mjs +31 -0
  7. package/dist/adapters/aws-lambda.d.mts +42 -0
  8. package/dist/adapters/aws-lambda.mjs +92 -0
  9. package/dist/adapters/express.d.mts +16 -0
  10. package/dist/adapters/express.mjs +110 -0
  11. package/dist/adapters/message-port.d.mts +42 -0
  12. package/dist/adapters/message-port.mjs +132 -0
  13. package/dist/adapters/nestjs.d.mts +25 -0
  14. package/dist/adapters/nestjs.mjs +83 -0
  15. package/dist/adapters/nextjs.d.mts +14 -0
  16. package/dist/adapters/nextjs.mjs +29 -0
  17. package/dist/adapters/peer.d.mts +27 -0
  18. package/dist/adapters/peer.mjs +36 -0
  19. package/dist/adapters/remix.d.mts +15 -0
  20. package/dist/adapters/remix.mjs +30 -0
  21. package/dist/adapters/solidstart.d.mts +12 -0
  22. package/dist/adapters/solidstart.mjs +29 -0
  23. package/dist/adapters/sveltekit.d.mts +14 -0
  24. package/dist/adapters/sveltekit.mjs +30 -0
  25. package/dist/broker/index.d.mts +62 -0
  26. package/dist/broker/index.mjs +153 -0
  27. package/dist/broker/nats.d.mts +33 -0
  28. package/dist/broker/nats.mjs +31 -0
  29. package/dist/broker/redis.d.mts +51 -0
  30. package/dist/broker/redis.mjs +92 -0
  31. package/dist/builder.d.mts +55 -0
  32. package/dist/builder.mjs +70 -0
  33. package/dist/callable.d.mts +19 -0
  34. package/dist/callable.mjs +42 -0
  35. package/dist/caller.mjs +90 -0
  36. package/dist/client/adapters/fetch/index.d.mts +15 -0
  37. package/dist/client/adapters/fetch/index.mjs +57 -0
  38. package/dist/client/adapters/ofetch/index.d.mts +55 -0
  39. package/dist/client/adapters/ofetch/index.mjs +91 -0
  40. package/dist/client/adapters/websocket/index.d.mts +20 -0
  41. package/dist/client/adapters/websocket/index.mjs +101 -0
  42. package/dist/client/client.d.mts +37 -0
  43. package/dist/client/client.mjs +80 -0
  44. package/dist/client/consume.d.mts +50 -0
  45. package/dist/client/consume.mjs +66 -0
  46. package/dist/client/dynamic-link.d.mts +16 -0
  47. package/dist/client/dynamic-link.mjs +19 -0
  48. package/dist/client/index.d.mts +6 -0
  49. package/dist/client/index.mjs +5 -0
  50. package/dist/client/interceptor.d.mts +31 -0
  51. package/dist/client/interceptor.mjs +34 -0
  52. package/dist/client/openapi.d.mts +29 -0
  53. package/dist/client/openapi.mjs +89 -0
  54. package/dist/client/plugins/batch.d.mts +26 -0
  55. package/dist/client/plugins/batch.mjs +64 -0
  56. package/dist/client/plugins/circuit-breaker.d.mts +24 -0
  57. package/dist/client/plugins/circuit-breaker.mjs +60 -0
  58. package/dist/client/plugins/csrf.d.mts +13 -0
  59. package/dist/client/plugins/csrf.mjs +20 -0
  60. package/dist/client/plugins/dedupe.d.mts +10 -0
  61. package/dist/client/plugins/dedupe.mjs +28 -0
  62. package/dist/client/plugins/index.d.mts +8 -0
  63. package/dist/client/plugins/index.mjs +8 -0
  64. package/dist/client/plugins/otel.d.mts +12 -0
  65. package/dist/client/plugins/otel.mjs +27 -0
  66. package/dist/client/plugins/retry.d.mts +34 -0
  67. package/dist/client/plugins/retry.mjs +79 -0
  68. package/dist/client/plugins/timeout.d.mts +10 -0
  69. package/dist/client/plugins/timeout.mjs +14 -0
  70. package/dist/client/server.d.mts +16 -0
  71. package/dist/client/server.mjs +59 -0
  72. package/dist/client/types.d.mts +29 -0
  73. package/dist/codec/devalue.d.mts +21 -0
  74. package/dist/codec/devalue.mjs +33 -0
  75. package/dist/codec/msgpack.d.mts +18 -0
  76. package/dist/codec/msgpack.mjs +45 -0
  77. package/dist/codec/sanitize.mjs +38 -0
  78. package/dist/codegen/emitters.d.mts +51 -0
  79. package/dist/codegen/emitters.mjs +143 -0
  80. package/dist/codegen/generate.d.mts +25 -0
  81. package/dist/codegen/generate.mjs +224 -0
  82. package/dist/codegen/index.d.mts +44 -0
  83. package/dist/codegen/index.mjs +103 -0
  84. package/dist/codegen/parse.d.mts +124 -0
  85. package/dist/codegen/parse.mjs +135 -0
  86. package/dist/codegen/preserve.d.mts +21 -0
  87. package/dist/codegen/preserve.mjs +62 -0
  88. package/dist/codegen/schema-to-code.d.mts +57 -0
  89. package/dist/codegen/schema-to-code.mjs +167 -0
  90. package/dist/compile.d.mts +46 -0
  91. package/dist/compile.mjs +332 -0
  92. package/dist/core/codec.mjs +67 -0
  93. package/dist/core/context-bridge.mjs +11 -0
  94. package/dist/core/dispatch.mjs +62 -0
  95. package/dist/core/error.d.mts +99 -60
  96. package/dist/core/error.mjs +125 -92
  97. package/dist/core/handler.d.mts +6 -0
  98. package/dist/core/handler.mjs +153 -0
  99. package/dist/core/input.mjs +49 -0
  100. package/dist/core/iterator.d.mts +17 -0
  101. package/dist/core/iterator.mjs +79 -0
  102. package/dist/core/router-utils.mjs +22 -0
  103. package/dist/core/schema.d.mts +20 -0
  104. package/dist/core/schema.mjs +33 -0
  105. package/dist/core/serve.d.mts +51 -0
  106. package/dist/core/serve.mjs +76 -0
  107. package/dist/core/sse.d.mts +18 -0
  108. package/dist/core/sse.mjs +110 -0
  109. package/dist/core/storage.d.mts +17 -4
  110. package/dist/core/storage.mjs +60 -13
  111. package/dist/core/task.d.mts +62 -0
  112. package/dist/core/task.mjs +165 -0
  113. package/dist/core/trace-map.d.mts +13 -0
  114. package/dist/core/trace-map.mjs +13 -0
  115. package/dist/core/url.mjs +28 -0
  116. package/dist/core/utils.mjs +24 -0
  117. package/dist/index.d.mts +17 -21
  118. package/dist/index.mjs +14 -22
  119. package/dist/integrations/ai/index.d.mts +25 -0
  120. package/dist/integrations/ai/index.mjs +117 -0
  121. package/dist/integrations/better-auth/index.d.mts +41 -0
  122. package/dist/integrations/better-auth/index.mjs +331 -0
  123. package/dist/integrations/drizzle/index.d.mts +27 -0
  124. package/dist/integrations/drizzle/index.mjs +285 -0
  125. package/dist/integrations/hey-api/index.d.mts +2 -0
  126. package/dist/integrations/hey-api/index.mjs +2 -0
  127. package/dist/integrations/hey-api/to-client.d.mts +20 -0
  128. package/dist/integrations/hey-api/to-client.mjs +39 -0
  129. package/dist/integrations/pinia-colada/general-utils.d.mts +13 -0
  130. package/dist/integrations/pinia-colada/general-utils.mjs +9 -0
  131. package/dist/integrations/pinia-colada/index.d.mts +6 -0
  132. package/dist/integrations/pinia-colada/index.mjs +5 -0
  133. package/dist/integrations/pinia-colada/key.d.mts +11 -0
  134. package/dist/integrations/pinia-colada/key.mjs +11 -0
  135. package/dist/integrations/pinia-colada/procedure-utils.d.mts +25 -0
  136. package/dist/integrations/pinia-colada/procedure-utils.mjs +33 -0
  137. package/dist/integrations/pinia-colada/router-utils.d.mts +17 -0
  138. package/dist/integrations/pinia-colada/router-utils.mjs +30 -0
  139. package/dist/integrations/pinia-colada/types.d.mts +25 -0
  140. package/dist/integrations/react/index.d.mts +83 -0
  141. package/dist/integrations/react/index.mjs +196 -0
  142. package/dist/integrations/tanstack-query/index.d.mts +120 -0
  143. package/dist/integrations/tanstack-query/index.mjs +100 -0
  144. package/dist/integrations/tanstack-query/ssr.d.mts +60 -0
  145. package/dist/integrations/tanstack-query/ssr.mjs +102 -0
  146. package/dist/integrations/zod/converter.d.mts +75 -0
  147. package/dist/integrations/zod/converter.mjs +345 -0
  148. package/dist/integrations/zod/index.d.mts +2 -0
  149. package/dist/integrations/zod/index.mjs +2 -0
  150. package/dist/lazy.d.mts +22 -0
  151. package/dist/lazy.mjs +34 -0
  152. package/dist/lifecycle.d.mts +36 -0
  153. package/dist/lifecycle.mjs +46 -0
  154. package/dist/map-input.d.mts +17 -0
  155. package/dist/map-input.mjs +47 -0
  156. package/dist/plugins/analytics/accumulator.d.mts +24 -0
  157. package/dist/plugins/analytics/accumulator.mjs +91 -0
  158. package/dist/plugins/analytics/alerts.d.mts +59 -0
  159. package/dist/plugins/analytics/alerts.mjs +140 -0
  160. package/dist/plugins/analytics/collector.d.mts +38 -0
  161. package/dist/plugins/analytics/collector.mjs +275 -0
  162. package/dist/plugins/analytics/cost.d.mts +61 -0
  163. package/dist/plugins/analytics/cost.mjs +97 -0
  164. package/dist/plugins/analytics/export.d.mts +7 -0
  165. package/dist/plugins/analytics/export.mjs +86 -0
  166. package/dist/plugins/analytics/normalize.mjs +144 -0
  167. package/dist/plugins/analytics/query.mjs +164 -0
  168. package/dist/plugins/analytics/request-id.mjs +34 -0
  169. package/dist/plugins/analytics/routes.d.mts +11 -0
  170. package/dist/plugins/analytics/routes.mjs +211 -0
  171. package/dist/plugins/analytics/sse.d.mts +31 -0
  172. package/dist/plugins/analytics/sse.mjs +74 -0
  173. package/dist/plugins/analytics/store.mjs +103 -0
  174. package/dist/plugins/analytics/timeseries.d.mts +50 -0
  175. package/dist/plugins/analytics/timeseries.mjs +169 -0
  176. package/dist/plugins/analytics/trace.d.mts +48 -0
  177. package/dist/plugins/analytics/trace.mjs +83 -0
  178. package/dist/plugins/analytics/types.d.mts +145 -0
  179. package/dist/plugins/analytics/types.mjs +40 -0
  180. package/dist/plugins/analytics/utils.d.mts +4 -0
  181. package/dist/plugins/analytics/utils.mjs +56 -0
  182. package/dist/plugins/analytics.d.mts +18 -0
  183. package/dist/plugins/analytics.mjs +188 -0
  184. package/dist/plugins/batch-server.d.mts +20 -0
  185. package/dist/plugins/batch-server.mjs +91 -0
  186. package/dist/plugins/body-limit.d.mts +19 -0
  187. package/dist/plugins/body-limit.mjs +49 -0
  188. package/dist/plugins/cache.d.mts +170 -0
  189. package/dist/plugins/cache.mjs +212 -0
  190. package/dist/plugins/coerce.d.mts +24 -0
  191. package/dist/plugins/coerce.mjs +70 -0
  192. package/dist/plugins/cookies.d.mts +14 -0
  193. package/dist/plugins/cookies.mjs +48 -0
  194. package/dist/plugins/cors.d.mts +43 -0
  195. package/dist/plugins/cors.mjs +62 -0
  196. package/dist/plugins/file-upload.d.mts +38 -0
  197. package/dist/plugins/file-upload.mjs +102 -0
  198. package/dist/plugins/index.d.mts +18 -0
  199. package/dist/plugins/index.mjs +17 -0
  200. package/dist/plugins/otel.d.mts +35 -0
  201. package/dist/plugins/otel.mjs +40 -0
  202. package/dist/plugins/pino.d.mts +60 -0
  203. package/dist/plugins/pino.mjs +42 -0
  204. package/dist/plugins/pubsub.d.mts +50 -0
  205. package/dist/plugins/pubsub.mjs +53 -0
  206. package/dist/plugins/ratelimit.d.mts +53 -0
  207. package/dist/plugins/ratelimit.mjs +92 -0
  208. package/dist/plugins/signing.d.mts +41 -0
  209. package/dist/plugins/signing.mjs +118 -0
  210. package/dist/plugins/strict-get.d.mts +10 -0
  211. package/dist/plugins/strict-get.mjs +33 -0
  212. package/dist/scalar.d.mts +49 -0
  213. package/dist/scalar.mjs +311 -0
  214. package/dist/silgi.d.mts +144 -0
  215. package/dist/silgi.mjs +164 -0
  216. package/dist/trpc-interop.d.mts +22 -0
  217. package/dist/trpc-interop.mjs +68 -0
  218. package/dist/types.d.mts +108 -0
  219. package/dist/ws.d.mts +88 -0
  220. package/dist/ws.mjs +205 -0
  221. package/lib/dashboard/index.html +120 -0
  222. package/lib/ocache.d.mts +1 -0
  223. package/lib/ocache.mjs +1 -0
  224. package/lib/ofetch.d.mts +1 -0
  225. package/lib/ofetch.mjs +1 -0
  226. package/lib/srvx.d.mts +1 -0
  227. package/lib/srvx.mjs +1 -0
  228. package/lib/unstorage.d.mts +1 -0
  229. package/lib/unstorage.mjs +1 -0
  230. package/package.json +313 -150
  231. package/dist/build.d.mts +0 -3
  232. package/dist/build.mjs +0 -4
  233. package/dist/cli/build/build.mjs +0 -15
  234. package/dist/cli/build/dev.d.mts +0 -10
  235. package/dist/cli/build/dev.mjs +0 -92
  236. package/dist/cli/build/prepare.d.mts +0 -6
  237. package/dist/cli/build/prepare.mjs +0 -15
  238. package/dist/cli/commands/commands.mjs +0 -90
  239. package/dist/cli/commands/env.mjs +0 -53
  240. package/dist/cli/commands/init.mjs +0 -84
  241. package/dist/cli/commands/install.mjs +0 -52
  242. package/dist/cli/commands/prepare.mjs +0 -65
  243. package/dist/cli/commands/reset.mjs +0 -46
  244. package/dist/cli/commands/run.mjs +0 -31
  245. package/dist/cli/commands/watch.mjs +0 -153
  246. package/dist/cli/config/defaults.mjs +0 -117
  247. package/dist/cli/config/index.d.mts +0 -3
  248. package/dist/cli/config/index.mjs +0 -4
  249. package/dist/cli/config/loader.d.mts +0 -6
  250. package/dist/cli/config/loader.mjs +0 -71
  251. package/dist/cli/config/resolvers/compatibility.mjs +0 -71
  252. package/dist/cli/config/resolvers/imports.mjs +0 -35
  253. package/dist/cli/config/resolvers/paths.mjs +0 -98
  254. package/dist/cli/config/resolvers/storage.mjs +0 -23
  255. package/dist/cli/config/resolvers/url.mjs +0 -9
  256. package/dist/cli/config/types.d.mts +0 -14
  257. package/dist/cli/config/types.mjs +0 -147
  258. package/dist/cli/core/apiful.mjs +0 -36
  259. package/dist/cli/core/devServer.mjs +0 -10
  260. package/dist/cli/core/env.mjs +0 -68
  261. package/dist/cli/core/installPackage.mjs +0 -60
  262. package/dist/cli/core/runtimeConfig.mjs +0 -70
  263. package/dist/cli/core/scan.mjs +0 -35
  264. package/dist/cli/core/silgi.mjs +0 -111
  265. package/dist/cli/framework/emptyFramework.mjs +0 -7
  266. package/dist/cli/framework/h3.mjs +0 -55
  267. package/dist/cli/framework/index.mjs +0 -15
  268. package/dist/cli/framework/nitro.mjs +0 -24
  269. package/dist/cli/framework/nuxt.mjs +0 -10
  270. package/dist/cli/index.d.mts +0 -1
  271. package/dist/cli/index.mjs +0 -29
  272. package/dist/cli/module/exportScan.mjs +0 -180
  273. package/dist/cli/module/install.mjs +0 -49
  274. package/dist/cli/module/scan.mjs +0 -193
  275. package/dist/cli/scan/prepareCommands.mjs +0 -40
  276. package/dist/cli/scan/prepareConfigs.mjs +0 -33
  277. package/dist/cli/scan/prepareCoreFile.mjs +0 -118
  278. package/dist/cli/scan/prepareScanFile.mjs +0 -59
  279. package/dist/cli/scan/prepareSchema.mjs +0 -128
  280. package/dist/cli/scan/scanExportFile.mjs +0 -288
  281. package/dist/cli/scan/writeCoreFile.mjs +0 -22
  282. package/dist/cli/scan/writeTypesAndFiles.mjs +0 -72
  283. package/dist/cli/utils/cancel.mjs +0 -14
  284. package/dist/cli/utils/common.mjs +0 -15
  285. package/dist/cli/utils/compatibility.mjs +0 -33
  286. package/dist/cli/utils/debug.mjs +0 -11
  287. package/dist/cli/utils/ignore.mjs +0 -56
  288. package/dist/cli/utils/processManager.mjs +0 -170
  289. package/dist/cli/utils/readScanFile.mjs +0 -58
  290. package/dist/cli/utils/storage.mjs +0 -23
  291. package/dist/core/context.d.mts +0 -30
  292. package/dist/core/context.mjs +0 -32
  293. package/dist/core/createSilgi.d.mts +0 -6
  294. package/dist/core/createSilgi.mjs +0 -153
  295. package/dist/core/event.d.mts +0 -26
  296. package/dist/core/event.mjs +0 -44
  297. package/dist/core/index.d.mts +0 -25
  298. package/dist/core/index.mjs +0 -30
  299. package/dist/core/orchestrate.mjs +0 -115
  300. package/dist/core/response.d.mts +0 -20
  301. package/dist/core/response.mjs +0 -105
  302. package/dist/core/silgi.d.mts +0 -19
  303. package/dist/core/silgi.mjs +0 -141
  304. package/dist/core/silgiApp.d.mts +0 -9
  305. package/dist/core/silgiApp.mjs +0 -23
  306. package/dist/core/unctx.d.mts +0 -21
  307. package/dist/core/unctx.mjs +0 -35
  308. package/dist/core/utils/event-stream.d.mts +0 -53
  309. package/dist/core/utils/event-stream.mjs +0 -38
  310. package/dist/core/utils/event.d.mts +0 -8
  311. package/dist/core/utils/event.mjs +0 -12
  312. package/dist/core/utils/internal/event-stream.d.mts +0 -45
  313. package/dist/core/utils/internal/event-stream.mjs +0 -137
  314. package/dist/core/utils/internal/obj.mjs +0 -9
  315. package/dist/core/utils/internal/object.mjs +0 -29
  316. package/dist/core/utils/internal/query.mjs +0 -73
  317. package/dist/core/utils/internal/req.mjs +0 -35
  318. package/dist/core/utils/merge.d.mts +0 -14
  319. package/dist/core/utils/merge.mjs +0 -27
  320. package/dist/core/utils/middleware.d.mts +0 -14
  321. package/dist/core/utils/middleware.mjs +0 -12
  322. package/dist/core/utils/request.mjs +0 -35
  323. package/dist/core/utils/resolver.d.mts +0 -7
  324. package/dist/core/utils/resolver.mjs +0 -29
  325. package/dist/core/utils/runtime.d.mts +0 -7
  326. package/dist/core/utils/runtime.mjs +0 -20
  327. package/dist/core/utils/sanitize.mjs +0 -22
  328. package/dist/core/utils/schema.d.mts +0 -34
  329. package/dist/core/utils/schema.mjs +0 -33
  330. package/dist/core/utils/service.d.mts +0 -13
  331. package/dist/core/utils/service.mjs +0 -19
  332. package/dist/core/utils/shared.d.mts +0 -6
  333. package/dist/core/utils/shared.mjs +0 -7
  334. package/dist/core/utils/storage.d.mts +0 -24
  335. package/dist/core/utils/storage.mjs +0 -54
  336. package/dist/kit/add/add-commands.d.mts +0 -6
  337. package/dist/kit/add/add-commands.mjs +0 -12
  338. package/dist/kit/add/add-core-file.d.mts +0 -9
  339. package/dist/kit/add/add-core-file.mjs +0 -11
  340. package/dist/kit/add/add-imports.d.mts +0 -14
  341. package/dist/kit/add/add-imports.mjs +0 -56
  342. package/dist/kit/add/add-npm.d.mts +0 -14
  343. package/dist/kit/add/add-npm.mjs +0 -23
  344. package/dist/kit/define.d.mts +0 -28
  345. package/dist/kit/define.mjs +0 -25
  346. package/dist/kit/errors.d.mts +0 -6
  347. package/dist/kit/errors.mjs +0 -11
  348. package/dist/kit/esm.d.mts +0 -11
  349. package/dist/kit/esm.mjs +0 -21
  350. package/dist/kit/fs.d.mts +0 -4
  351. package/dist/kit/fs.mjs +0 -13
  352. package/dist/kit/function-utils.d.mts +0 -27
  353. package/dist/kit/function-utils.mjs +0 -75
  354. package/dist/kit/gen.d.mts +0 -5
  355. package/dist/kit/gen.mjs +0 -26
  356. package/dist/kit/hash.d.mts +0 -4
  357. package/dist/kit/hash.mjs +0 -10
  358. package/dist/kit/index.d.mts +0 -22
  359. package/dist/kit/index.mjs +0 -23
  360. package/dist/kit/isFramework.d.mts +0 -6
  361. package/dist/kit/isFramework.mjs +0 -21
  362. package/dist/kit/logger.d.mts +0 -6
  363. package/dist/kit/logger.mjs +0 -10
  364. package/dist/kit/migration.d.mts +0 -113
  365. package/dist/kit/migration.mjs +0 -301
  366. package/dist/kit/module.d.mts +0 -14
  367. package/dist/kit/module.mjs +0 -53
  368. package/dist/kit/path.d.mts +0 -7
  369. package/dist/kit/path.mjs +0 -26
  370. package/dist/kit/preset.d.mts +0 -8
  371. package/dist/kit/preset.mjs +0 -11
  372. package/dist/kit/resolve.d.mts +0 -37
  373. package/dist/kit/resolve.mjs +0 -82
  374. package/dist/kit/template.d.mts +0 -19
  375. package/dist/kit/template.mjs +0 -91
  376. package/dist/kit/useRequest.d.mts +0 -19
  377. package/dist/kit/useRequest.mjs +0 -63
  378. package/dist/kit/utils.d.mts +0 -34
  379. package/dist/kit/utils.mjs +0 -91
  380. package/dist/package.mjs +0 -176
  381. package/dist/presets/_all.gen.d.mts +0 -6
  382. package/dist/presets/_all.gen.mjs +0 -18
  383. package/dist/presets/_resolve.d.mts +0 -12
  384. package/dist/presets/_resolve.mjs +0 -57
  385. package/dist/presets/_types.gen.d.mts +0 -8
  386. package/dist/presets/_types.gen.mjs +0 -5
  387. package/dist/presets/h3/preset.d.mts +0 -6
  388. package/dist/presets/h3/preset.mjs +0 -35
  389. package/dist/presets/hono/preset.d.mts +0 -6
  390. package/dist/presets/hono/preset.mjs +0 -30
  391. package/dist/presets/index.d.mts +0 -3
  392. package/dist/presets/index.mjs +0 -3
  393. package/dist/presets/nitro/preset.d.mts +0 -6
  394. package/dist/presets/nitro/preset.mjs +0 -37
  395. package/dist/presets/npmpackage/preset.d.mts +0 -6
  396. package/dist/presets/npmpackage/preset.mjs +0 -29
  397. package/dist/presets/nuxt/preset.d.mts +0 -6
  398. package/dist/presets/nuxt/preset.mjs +0 -41
  399. package/dist/runtime/index.d.mts +0 -4
  400. package/dist/runtime/index.mjs +0 -5
  401. package/dist/runtime/internal/config.d.mts +0 -11
  402. package/dist/runtime/internal/config.mjs +0 -97
  403. package/dist/runtime/internal/debug.d.mts +0 -6
  404. package/dist/runtime/internal/debug.mjs +0 -11
  405. package/dist/runtime/internal/defu.d.mts +0 -4
  406. package/dist/runtime/internal/defu.mjs +0 -9
  407. package/dist/runtime/internal/index.d.mts +0 -7
  408. package/dist/runtime/internal/index.mjs +0 -8
  409. package/dist/runtime/internal/nitro.d.mts +0 -6
  410. package/dist/runtime/internal/nitro.mjs +0 -36
  411. package/dist/runtime/internal/nuxt.d.mts +0 -12
  412. package/dist/runtime/internal/nuxt.mjs +0 -16
  413. package/dist/runtime/internal/ofetch.d.mts +0 -8
  414. package/dist/runtime/internal/ofetch.mjs +0 -39
  415. package/dist/runtime/internal/plugin.d.mts +0 -7
  416. package/dist/runtime/internal/plugin.mjs +0 -8
  417. package/dist/types/cliConfig.d.mts +0 -288
  418. package/dist/types/cliConfig.mjs +0 -0
  419. package/dist/types/cliHooks.d.mts +0 -142
  420. package/dist/types/cliHooks.mjs +0 -0
  421. package/dist/types/compatibility.d.mts +0 -13
  422. package/dist/types/compatibility.mjs +0 -0
  423. package/dist/types/config.d.mts +0 -46
  424. package/dist/types/config.mjs +0 -0
  425. package/dist/types/dotenv.d.mts +0 -29
  426. package/dist/types/dotenv.mjs +0 -0
  427. package/dist/types/event.d.mts +0 -63
  428. package/dist/types/event.mjs +0 -0
  429. package/dist/types/global.d.mts +0 -24
  430. package/dist/types/global.mjs +0 -0
  431. package/dist/types/helper.d.mts +0 -25
  432. package/dist/types/helper.mjs +0 -0
  433. package/dist/types/hooks.d.mts +0 -37
  434. package/dist/types/hooks.mjs +0 -0
  435. package/dist/types/index.d.mts +0 -26
  436. package/dist/types/index.mjs +0 -0
  437. package/dist/types/kits.d.mts +0 -32
  438. package/dist/types/kits.mjs +0 -0
  439. package/dist/types/middleware.d.mts +0 -31
  440. package/dist/types/middleware.mjs +0 -0
  441. package/dist/types/module.d.mts +0 -102
  442. package/dist/types/module.mjs +0 -0
  443. package/dist/types/preset.d.mts +0 -20
  444. package/dist/types/preset.mjs +0 -0
  445. package/dist/types/route.d.mts +0 -59
  446. package/dist/types/route.mjs +0 -0
  447. package/dist/types/runtime/index.d.mts +0 -5
  448. package/dist/types/runtime/index.mjs +0 -0
  449. package/dist/types/runtime/nuxt.d.mts +0 -13
  450. package/dist/types/runtime/nuxt.mjs +0 -0
  451. package/dist/types/runtime/ofetch.d.mts +0 -14
  452. package/dist/types/runtime/ofetch.mjs +0 -0
  453. package/dist/types/runtime/plugin.d.mts +0 -8
  454. package/dist/types/runtime/plugin.mjs +0 -0
  455. package/dist/types/runtime/silgi.d.mts +0 -11
  456. package/dist/types/runtime/silgi.mjs +0 -0
  457. package/dist/types/schema.d.mts +0 -86
  458. package/dist/types/schema.mjs +0 -0
  459. package/dist/types/service.d.mts +0 -102
  460. package/dist/types/service.mjs +0 -0
  461. package/dist/types/shared.d.mts +0 -19
  462. package/dist/types/shared.mjs +0 -0
  463. package/dist/types/silgi.d.mts +0 -71
  464. package/dist/types/silgi.mjs +0 -0
  465. package/dist/types/silgiCLI.d.mts +0 -118
  466. package/dist/types/silgiCLI.mjs +0 -0
  467. package/dist/types/standard-schema.d.mts +0 -61
  468. package/dist/types/standard-schema.mjs +0 -0
  469. package/dist/types/storage.d.mts +0 -30
  470. package/dist/types/storage.mjs +0 -0
  471. package/dist/types/tree-kill.d.mts +0 -18
  472. package/dist/types/tree-kill.mjs +0 -0
  473. package/lib/config.d.mts +0 -7
  474. package/lib/config.mjs +0 -5
  475. package/lib/meta.d.mts +0 -4
  476. package/lib/meta.mjs +0 -6
  477. package/lib/runtime-meta.d.mts +0 -4
  478. package/lib/runtime-meta.mjs +0 -32
package/README.md CHANGED
@@ -1 +1,103 @@
1
- v0.0.0
1
+ <p align="center">
2
+ <br>
3
+ <img src=".github/assets/cover.png" alt="Silgi — Type-safe RPC framework for TypeScript" width="100%">
4
+ <br><br>
5
+ <a href="https://npmjs.com/package/silgi"><img src="https://img.shields.io/npm/v/silgi?style=flat&colorA=0a0908&colorB=edc462" alt="npm version"></a>
6
+ <a href="https://npmjs.com/package/silgi"><img src="https://img.shields.io/npm/dm/silgi?style=flat&colorA=0a0908&colorB=edc462" alt="npm downloads"></a>
7
+ <a href="https://github.com/productdevbook/silgi/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/productdevbook/silgi/ci.yml?style=flat&colorA=0a0908&colorB=edc462" alt="CI"></a>
8
+ <a href="https://github.com/productdevbook/silgi/blob/main/LICENSE"><img src="https://img.shields.io/github/license/productdevbook/silgi?style=flat&colorA=0a0908&colorB=edc462" alt="license"></a>
9
+ </p>
10
+
11
+ ## Quick Start
12
+
13
+ ```bash
14
+ npm install silgi
15
+ ```
16
+
17
+ ```ts
18
+ import { silgi } from 'silgi'
19
+ import { z } from 'zod'
20
+
21
+ const s = silgi({ context: (req) => ({ db: getDB() }) })
22
+
23
+ const appRouter = s.router({
24
+ users: {
25
+ list: k
26
+ .$input(z.object({ limit: z.number().optional() }))
27
+ .$resolve(({ input, ctx }) => ctx.db.users.find({ take: input.limit })),
28
+ },
29
+ })
30
+
31
+ s.serve(appRouter, { port: 3000, scalar: true })
32
+ ```
33
+
34
+ ## Features
35
+
36
+ - **Single package** — server, client, 15 plugins, 14 adapters. One install.
37
+ - **Compiled pipeline** — guards unrolled, handlers pre-linked at startup.
38
+ - **Guard / Wrap** — guards enrich context (flat, sync fast-path). Wraps run before + after (onion).
39
+ - **Content negotiation** — JSON, MessagePack, devalue. Automatic from `Accept` header.
40
+ - **Contract-first** — define API shape, share types, implement separately.
41
+ - **Standard Schema** — Zod, Valibot, ArkType.
42
+
43
+ ## Adapters
44
+
45
+ | | Import |
46
+ |---|---|
47
+ | Standalone | `s.serve()` / `s.handler()` |
48
+ | Nitro v3 | `serverEntry` + `s.handler()` |
49
+ | Express | `silgi/express` |
50
+ | Fastify | `silgi/fastify` |
51
+ | Elysia | `silgi/elysia` |
52
+ | Next.js | `silgi/nextjs` |
53
+ | Nuxt | via Nitro `serverEntry` |
54
+ | SvelteKit | `silgi/sveltekit` |
55
+ | Remix | `silgi/remix` |
56
+ | Astro | `silgi/astro` |
57
+ | SolidStart | `silgi/solidstart` |
58
+ | NestJS | `silgi/nestjs` |
59
+ | AWS Lambda | `silgi/aws-lambda` |
60
+ | MessagePort | `silgi/message-port` |
61
+
62
+ ## Ecosystem
63
+
64
+ Built-in re-exports — no extra dependencies needed:
65
+
66
+ | Import | Package | Use case |
67
+ |---|---|---|
68
+ | `silgi/unstorage` | unstorage | Key-value storage (Redis, KV, S3) |
69
+ | `silgi/ocache` | ocache | Cached functions with TTL + SWR |
70
+ | `silgi/ofetch` | ofetch | Universal fetch with auto-retry |
71
+ | `silgi/srvx` | srvx | Universal server (Node, Deno, Bun) |
72
+
73
+ ## Integrations
74
+
75
+ - **TanStack Query** — `queryOptions`, `mutationOptions`, `infiniteOptions`, `skipToken`
76
+ - **React Server Actions** — `createAction`, `useServerAction`, `useOptimisticServerAction`
77
+ - **AI SDK** — `routerToTools()` turns procedures into LLM tools
78
+ - **tRPC Interop** — `fromTRPC()` for incremental migration
79
+
80
+ ## Examples
81
+
82
+ ```bash
83
+ npx giget@latest gh:productdevbook/silgi/examples/standalone my-app
84
+ npx giget@latest gh:productdevbook/silgi/examples/nextjs my-nextjs-app
85
+ npx giget@latest gh:productdevbook/silgi/examples/nuxt my-nuxt-app
86
+ ```
87
+
88
+ 10 examples: standalone, bun, express, elysia, nitro, nitro-h3, nextjs, nuxt, sveltekit, client-react.
89
+
90
+ ## Documentation
91
+
92
+ [silgi.dev](https://silgi.dev)
93
+
94
+ ## Credits
95
+
96
+ - [oRPC](https://github.com/unnoq/orpc) — Pipeline architecture, client proxy, error handling, contract-first workflow
97
+ - [tRPC](https://github.com/trpc/trpc) — Router/procedure model, end-to-end type inference
98
+ - [Elysia](https://github.com/elysiajs/elysia) — Sucrose-style static handler analysis
99
+
100
+
101
+ ## License
102
+
103
+ MIT
@@ -0,0 +1,5 @@
1
+ import { createRequire } from "node:module";
2
+ //#region \0rolldown/runtime.js
3
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
4
+ //#endregion
5
+ export { __require };
@@ -0,0 +1,18 @@
1
+ //#region src/adapters/_fetch-adapter.d.ts
2
+ interface FetchAdapterConfig<TCtx extends Record<string, unknown>> {
3
+ /** Route prefix to strip. Default: "/api/rpc" */
4
+ prefix?: string;
5
+ /** Context factory — receives the Request (or framework event via eventMap). */
6
+ context?: (req: Request) => TCtx | Promise<TCtx>;
7
+ }
8
+ /**
9
+ * For adapters where the context factory needs access to a framework event
10
+ * (SvelteKit RequestEvent, SolidStart event), use this extended config.
11
+ */
12
+ interface FetchAdapterConfigWithEvent<TCtx extends Record<string, unknown>, TEvent = any> {
13
+ prefix?: string;
14
+ /** Context factory — receives the framework event, not raw Request. */
15
+ context?: (event: TEvent) => TCtx | Promise<TCtx>;
16
+ }
17
+ //#endregion
18
+ export { FetchAdapterConfig, FetchAdapterConfigWithEvent };
@@ -0,0 +1,53 @@
1
+ import { createFetchHandler } from "../core/handler.mjs";
2
+ //#region src/adapters/_fetch-adapter.ts
3
+ /**
4
+ * Shared factory for fetch-passthrough adapters.
5
+ *
6
+ * Next.js, Astro, Remix, SvelteKit, and SolidStart all do the same thing:
7
+ * strip URL prefix → rewrite request → dispatch to fetch handler.
8
+ *
9
+ * This module eliminates the duplication. Each adapter file becomes a thin
10
+ * wrapper that extracts the framework-specific Request and calls this factory.
11
+ */
12
+ /** Strip prefix from request URL and create a rewritten Request. */
13
+ function rewriteRequest(request, prefix) {
14
+ const url = new URL(request.url);
15
+ let pathname = url.pathname;
16
+ if (pathname.startsWith(prefix)) {
17
+ pathname = pathname.slice(prefix.length);
18
+ if (!pathname.startsWith("/")) pathname = "/" + pathname;
19
+ }
20
+ return new Request(new URL(pathname + url.search, url.origin), request);
21
+ }
22
+ /**
23
+ * Create a fetch-passthrough adapter that strips a prefix and delegates to handler.
24
+ * Used by adapters that receive a standard Request (Next.js, Astro, Remix).
25
+ */
26
+ function createFetchAdapter(router, options, defaultPrefix) {
27
+ const prefix = options.prefix ?? defaultPrefix;
28
+ const handler = createFetchHandler(router, options.context ?? (() => ({})));
29
+ return (request) => {
30
+ return handler(rewriteRequest(request, prefix));
31
+ };
32
+ }
33
+ /**
34
+ * Create a fetch-passthrough adapter for frameworks that pass an event object
35
+ * with a `.request` property (SvelteKit, SolidStart).
36
+ * Uses a WeakMap to safely pass the event into the context factory per-request.
37
+ */
38
+ function createEventFetchAdapter(router, options, defaultPrefix, extractRequest) {
39
+ const prefix = options.prefix ?? defaultPrefix;
40
+ const requestEventMap = /* @__PURE__ */ new WeakMap();
41
+ const handler = createFetchHandler(router, (_req) => {
42
+ const eventRef = requestEventMap.get(_req);
43
+ if (options.context && eventRef) return options.context(eventRef);
44
+ return {};
45
+ });
46
+ return (event) => {
47
+ const rewritten = rewriteRequest(extractRequest(event), prefix);
48
+ requestEventMap.set(rewritten, event);
49
+ return handler(rewritten);
50
+ };
51
+ }
52
+ //#endregion
53
+ export { createEventFetchAdapter, createFetchAdapter };
@@ -0,0 +1,15 @@
1
+ import { RouterDef } from "../types.mjs";
2
+ import { FetchAdapterConfig } from "./_fetch-adapter.mjs";
3
+
4
+ //#region src/adapters/astro.d.ts
5
+ interface AstroAdapterOptions<TCtx extends Record<string, unknown>> extends FetchAdapterConfig<TCtx> {}
6
+ /**
7
+ * Create an Astro API route handler.
8
+ * Astro passes { request, params } — we extract request and delegate.
9
+ */
10
+ declare function createHandler<TCtx extends Record<string, unknown>>(router: RouterDef, options?: AstroAdapterOptions<TCtx>): (ctx: {
11
+ request: Request;
12
+ params: Record<string, string>;
13
+ }) => Response | Promise<Response>;
14
+ //#endregion
15
+ export { AstroAdapterOptions, createHandler };
@@ -0,0 +1,31 @@
1
+ import { createFetchAdapter } from "./_fetch-adapter.mjs";
2
+ //#region src/adapters/astro.ts
3
+ /**
4
+ * Astro adapter — use Silgi with Astro API routes.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * // src/pages/api/rpc/[...path].ts
9
+ * import { createHandler } from "silgi/astro"
10
+ * import { appRouter } from "~/server/rpc"
11
+ *
12
+ * const handler = createHandler(appRouter, {
13
+ * prefix: "/api/rpc",
14
+ * context: (req) => ({ db: getDB() }),
15
+ * })
16
+ *
17
+ * export const GET = handler
18
+ * export const POST = handler
19
+ * export const ALL = handler
20
+ * ```
21
+ */
22
+ /**
23
+ * Create an Astro API route handler.
24
+ * Astro passes { request, params } — we extract request and delegate.
25
+ */
26
+ function createHandler(router, options = {}) {
27
+ const handler = createFetchAdapter(router, options, "/api/rpc");
28
+ return ({ request }) => handler(request);
29
+ }
30
+ //#endregion
31
+ export { createHandler };
@@ -0,0 +1,42 @@
1
+ import { RouterDef } from "../types.mjs";
2
+
3
+ //#region src/adapters/aws-lambda.d.ts
4
+ interface LambdaAdapterOptions<TCtx extends Record<string, unknown>> {
5
+ /** Context factory — receives the Lambda event */
6
+ context?: (event: LambdaEvent) => TCtx | Promise<TCtx>;
7
+ /** Route prefix to strip. Default: none */
8
+ prefix?: string;
9
+ }
10
+ interface LambdaEvent {
11
+ httpMethod?: string;
12
+ path?: string;
13
+ version?: string;
14
+ rawPath?: string;
15
+ requestContext?: {
16
+ http?: {
17
+ method: string;
18
+ path: string;
19
+ };
20
+ [key: string]: unknown;
21
+ };
22
+ body: string | null;
23
+ headers: Record<string, string>;
24
+ queryStringParameters: Record<string, string> | null;
25
+ isBase64Encoded?: boolean;
26
+ }
27
+ interface LambdaContext {
28
+ getRemainingTimeInMillis?: () => number;
29
+ }
30
+ interface LambdaResponse {
31
+ statusCode: number;
32
+ headers: Record<string, string>;
33
+ body: string;
34
+ }
35
+ /**
36
+ * Create an AWS Lambda handler from a Silgi router.
37
+ *
38
+ * Supports API Gateway v1 (REST) and v2 (HTTP) event formats.
39
+ */
40
+ declare function createHandler<TCtx extends Record<string, unknown>>(router: RouterDef, options?: LambdaAdapterOptions<TCtx>): (event: LambdaEvent, context?: LambdaContext) => Promise<LambdaResponse>;
41
+ //#endregion
42
+ export { LambdaAdapterOptions, createHandler };
@@ -0,0 +1,92 @@
1
+ import { compileRouter } from "../compile.mjs";
2
+ import { buildContext, isMethodAllowed, parseQueryData, serializeError } from "../core/dispatch.mjs";
3
+ //#region src/adapters/aws-lambda.ts
4
+ /**
5
+ * AWS Lambda adapter — deploy Silgi as a Lambda function.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { createHandler } from "silgi/aws-lambda"
10
+ *
11
+ * export const handler = createHandler(appRouter, {
12
+ * context: (event) => ({ db: getDB(), userId: event.requestContext?.authorizer?.userId }),
13
+ * })
14
+ * ```
15
+ */
16
+ /**
17
+ * Create an AWS Lambda handler from a Silgi router.
18
+ *
19
+ * Supports API Gateway v1 (REST) and v2 (HTTP) event formats.
20
+ */
21
+ function createHandler(router, options = {}) {
22
+ const flatRouter = compileRouter(router);
23
+ const prefix = options.prefix ?? "";
24
+ const JSON_HDR = { "content-type": "application/json" };
25
+ return async (event, context) => {
26
+ const isV2 = event.version === "2.0";
27
+ const method = isV2 ? event.requestContext?.http?.method ?? "GET" : event.httpMethod ?? "GET";
28
+ let pathname = isV2 ? event.rawPath ?? "/" : event.path ?? "/";
29
+ if (prefix && pathname.startsWith(prefix)) pathname = pathname.slice(prefix.length);
30
+ if (pathname.startsWith("/")) pathname = pathname.slice(1);
31
+ const match = flatRouter(method, "/" + pathname);
32
+ if (!match) return {
33
+ statusCode: 404,
34
+ headers: JSON_HDR,
35
+ body: JSON.stringify({
36
+ code: "NOT_FOUND",
37
+ status: 404,
38
+ message: "Procedure not found"
39
+ })
40
+ };
41
+ const route = match.data;
42
+ if (!isMethodAllowed(method, route.method)) return {
43
+ statusCode: 405,
44
+ headers: {
45
+ ...JSON_HDR,
46
+ allow: route.method
47
+ },
48
+ body: JSON.stringify({
49
+ code: "METHOD_NOT_ALLOWED",
50
+ status: 405,
51
+ message: `Method ${method} not allowed`
52
+ })
53
+ };
54
+ try {
55
+ const ctx = buildContext(options.context ? await options.context(event) : void 0, match.params);
56
+ let input;
57
+ if (event.body) {
58
+ const body = event.isBase64Encoded ? Buffer.from(event.body, "base64").toString("utf-8") : event.body;
59
+ try {
60
+ input = JSON.parse(body);
61
+ } catch {
62
+ return {
63
+ statusCode: 400,
64
+ headers: JSON_HDR,
65
+ body: JSON.stringify({
66
+ code: "BAD_REQUEST",
67
+ status: 400,
68
+ message: "Invalid JSON body"
69
+ })
70
+ };
71
+ }
72
+ } else if (event.queryStringParameters?.data) input = parseQueryData(event.queryStringParameters.data);
73
+ const timeoutMs = context?.getRemainingTimeInMillis ? context.getRemainingTimeInMillis() - 500 : 3e4;
74
+ const signal = AbortSignal.timeout(Math.max(timeoutMs, 1e3));
75
+ const output = await route.handler(ctx, input, signal);
76
+ return {
77
+ statusCode: 200,
78
+ headers: JSON_HDR,
79
+ body: JSON.stringify(output)
80
+ };
81
+ } catch (error) {
82
+ const body = serializeError(error);
83
+ return {
84
+ statusCode: body.status,
85
+ headers: JSON_HDR,
86
+ body: JSON.stringify(body)
87
+ };
88
+ }
89
+ };
90
+ }
91
+ //#endregion
92
+ export { createHandler };
@@ -0,0 +1,16 @@
1
+ import { RouterDef } from "../types.mjs";
2
+
3
+ //#region src/adapters/express.d.ts
4
+ interface ExpressAdapterOptions<TCtx extends Record<string, unknown>> {
5
+ /** Context factory — receives the Express request */
6
+ context?: (req: any) => TCtx | Promise<TCtx>;
7
+ }
8
+ /**
9
+ * Create Express middleware that routes to Silgi procedures.
10
+ *
11
+ * Mount at a prefix — the remainder of the path is the procedure name.
12
+ * Requires `express.json()` middleware for POST body parsing.
13
+ */
14
+ declare function createHandler<TCtx extends Record<string, unknown>>(router: RouterDef, options?: ExpressAdapterOptions<TCtx>): (req: any, res: any, next: any) => void;
15
+ //#endregion
16
+ export { ExpressAdapterOptions, createHandler };
@@ -0,0 +1,110 @@
1
+ import { compileRouter } from "../compile.mjs";
2
+ import { buildContext, isMethodAllowed, parseQueryData, serializeError } from "../core/dispatch.mjs";
3
+ import { iteratorToEventStream } from "../core/sse.mjs";
4
+ //#region src/adapters/express.ts
5
+ /**
6
+ * Express adapter — use Silgi as Express middleware.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import express from "express"
11
+ * import { createHandler } from "silgi/express"
12
+ *
13
+ * const app = express()
14
+ * app.use("/rpc", createHandler(appRouter, {
15
+ * context: (req) => ({ db: getDB(), user: req.user }),
16
+ * }))
17
+ * app.listen(3000)
18
+ * ```
19
+ */
20
+ /**
21
+ * Create Express middleware that routes to Silgi procedures.
22
+ *
23
+ * Mount at a prefix — the remainder of the path is the procedure name.
24
+ * Requires `express.json()` middleware for POST body parsing.
25
+ */
26
+ function createHandler(router, options = {}) {
27
+ const flatRouter = compileRouter(router);
28
+ return (req, res, next) => {
29
+ let pathname = req.path ?? req.url ?? "";
30
+ if (pathname.startsWith("/")) pathname = pathname.slice(1);
31
+ const match = flatRouter(req.method, "/" + pathname);
32
+ if (!match) return next();
33
+ const route = match.data;
34
+ if (!isMethodAllowed(req.method, route.method)) {
35
+ res.status(405).set("allow", route.method).json({
36
+ code: "METHOD_NOT_ALLOWED",
37
+ status: 405,
38
+ message: `Method ${req.method} not allowed`
39
+ });
40
+ return;
41
+ }
42
+ const handle = async () => {
43
+ try {
44
+ const ctx = buildContext(options.context ? await options.context(req) : void 0, match.params);
45
+ let input;
46
+ if (req.method === "POST" || req.method === "PUT" || req.method === "PATCH") input = req.body;
47
+ else if (req.query?.data) input = typeof req.query.data === "string" ? parseQueryData(req.query.data) : req.query.data;
48
+ const ac = new AbortController();
49
+ const onClose = () => ac.abort();
50
+ req.on("close", onClose);
51
+ try {
52
+ const output = await route.handler(ctx, input, ac.signal);
53
+ if (output instanceof Response) {
54
+ res.status(output.status);
55
+ output.headers.forEach((v, k) => res.setHeader(k, v));
56
+ const body = output.body ? Buffer.from(await output.arrayBuffer()) : "";
57
+ res.end(body);
58
+ } else if (output instanceof ReadableStream) {
59
+ res.setHeader("content-type", "application/octet-stream");
60
+ const reader = output.getReader();
61
+ req.on("close", () => reader.cancel());
62
+ try {
63
+ while (true) {
64
+ const { done, value } = await reader.read();
65
+ if (done) {
66
+ res.end();
67
+ break;
68
+ }
69
+ res.write(value);
70
+ }
71
+ } finally {
72
+ reader.releaseLock();
73
+ }
74
+ } else if (output && typeof output === "object" && Symbol.asyncIterator in output) {
75
+ const stream = iteratorToEventStream(output);
76
+ res.setHeader("content-type", "text/event-stream");
77
+ res.setHeader("cache-control", "no-cache");
78
+ const reader = stream.getReader();
79
+ req.on("close", () => reader.cancel());
80
+ try {
81
+ while (true) {
82
+ const { done, value } = await reader.read();
83
+ if (done) {
84
+ res.end();
85
+ break;
86
+ }
87
+ res.write(value);
88
+ }
89
+ } finally {
90
+ reader.releaseLock();
91
+ }
92
+ } else res.json(output);
93
+ } finally {
94
+ req.removeListener("close", onClose);
95
+ }
96
+ } catch (error) {
97
+ const body = serializeError(error);
98
+ res.status(body.status).json(body);
99
+ }
100
+ };
101
+ handle().catch((error) => {
102
+ if (!res.headersSent) {
103
+ const body = serializeError(error);
104
+ res.status(body.status).json(body);
105
+ }
106
+ });
107
+ };
108
+ }
109
+ //#endregion
110
+ export { createHandler };
@@ -0,0 +1,42 @@
1
+ import { RouterDef } from "../types.mjs";
2
+ import { ClientContext, ClientLink, ClientOptions } from "../client/types.mjs";
3
+
4
+ //#region src/adapters/message-port.d.ts
5
+ interface MessagePortAdapterOptions<TCtx extends Record<string, unknown>> {
6
+ context?: () => TCtx | Promise<TCtx>;
7
+ }
8
+ /**
9
+ * Attach Silgi to a MessagePort (server side).
10
+ * Listens for RPC messages and responds with results.
11
+ * Returns a dispose function to stop listening.
12
+ */
13
+ declare function createHandler<TCtx extends Record<string, unknown>>(router: RouterDef, port: {
14
+ postMessage(msg: unknown): void;
15
+ addEventListener(type: 'message', handler: (event: {
16
+ data: unknown;
17
+ }) => void): void;
18
+ removeEventListener(type: 'message', handler: (event: {
19
+ data: unknown;
20
+ }) => void): void;
21
+ }, options?: MessagePortAdapterOptions<TCtx>): () => void;
22
+ /**
23
+ * Client-side MessagePort link.
24
+ * Sends RPC messages and resolves promises when responses arrive.
25
+ */
26
+ declare class MessagePortLink<TCtx extends ClientContext = ClientContext> implements ClientLink<TCtx> {
27
+ #private;
28
+ constructor(port: {
29
+ postMessage(msg: unknown): void;
30
+ addEventListener(type: 'message', handler: (event: {
31
+ data: unknown;
32
+ }) => void): void;
33
+ removeEventListener?(type: 'message', handler: (event: {
34
+ data: unknown;
35
+ }) => void): void;
36
+ });
37
+ call(path: readonly string[], input: unknown, options: ClientOptions<TCtx>): Promise<unknown>;
38
+ /** Reject all pending calls and stop listening. */
39
+ dispose(): void;
40
+ }
41
+ //#endregion
42
+ export { MessagePortAdapterOptions, MessagePortLink, createHandler };
@@ -0,0 +1,132 @@
1
+ import { SilgiError } from "../core/error.mjs";
2
+ import { compileRouter } from "../compile.mjs";
3
+ import { buildContext, serializeError } from "../core/dispatch.mjs";
4
+ //#region src/adapters/message-port.ts
5
+ /**
6
+ * Message Port adapter — use Silgi over MessagePort/MessageChannel.
7
+ *
8
+ * Works with Electron (main↔renderer), browser extensions (background↔popup),
9
+ * Web Workers, and Node.js Worker Threads.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // Worker / Electron main
14
+ * import { createHandler } from "silgi/message-port"
15
+ *
16
+ * const dispose = createHandler(appRouter, port, {
17
+ * context: () => ({ db: getDB() }),
18
+ * })
19
+ *
20
+ * // Client side
21
+ * import { MessagePortLink } from "silgi/message-port"
22
+ * import { createClient } from "silgi/client"
23
+ *
24
+ * const client = createClient<AppRouter>(new MessagePortLink(port))
25
+ * const users = await client.users.list({ limit: 10 })
26
+ * ```
27
+ */
28
+ /**
29
+ * Attach Silgi to a MessagePort (server side).
30
+ * Listens for RPC messages and responds with results.
31
+ * Returns a dispose function to stop listening.
32
+ */
33
+ function createHandler(router, port, options = {}) {
34
+ const flatRouter = compileRouter(router);
35
+ const handler = async (event) => {
36
+ const msg = event.data;
37
+ if (!msg || typeof msg !== "object" || !msg.__silgi || msg.__type !== "request") return;
38
+ const match = flatRouter("POST", "/" + msg.path);
39
+ if (!match) {
40
+ port.postMessage({
41
+ __silgi: true,
42
+ __type: "response",
43
+ id: msg.id,
44
+ error: {
45
+ code: "NOT_FOUND",
46
+ status: 404,
47
+ message: "Procedure not found"
48
+ }
49
+ });
50
+ return;
51
+ }
52
+ const route = match.data;
53
+ try {
54
+ const ctx = buildContext(options.context ? await options.context() : void 0, match.params);
55
+ const ac = new AbortController();
56
+ const result = await route.handler(ctx, msg.input, ac.signal);
57
+ port.postMessage({
58
+ __silgi: true,
59
+ __type: "response",
60
+ id: msg.id,
61
+ result
62
+ });
63
+ } catch (error) {
64
+ port.postMessage({
65
+ __silgi: true,
66
+ __type: "response",
67
+ id: msg.id,
68
+ error: serializeError(error)
69
+ });
70
+ }
71
+ };
72
+ port.addEventListener("message", handler);
73
+ return () => port.removeEventListener("message", handler);
74
+ }
75
+ /**
76
+ * Client-side MessagePort link.
77
+ * Sends RPC messages and resolves promises when responses arrive.
78
+ */
79
+ var MessagePortLink = class {
80
+ #port;
81
+ #pending = /* @__PURE__ */ new Map();
82
+ #nextId = 1;
83
+ #messageHandler;
84
+ constructor(port) {
85
+ this.#port = port;
86
+ this.#messageHandler = (event) => {
87
+ const msg = event.data;
88
+ if (!msg || typeof msg !== "object" || !msg.__silgi || msg.__type !== "response") return;
89
+ const pending = this.#pending.get(msg.id);
90
+ if (!pending) return;
91
+ this.#pending.delete(msg.id);
92
+ if (msg.error) pending.reject(new SilgiError(msg.error.code, {
93
+ status: msg.error.status,
94
+ message: msg.error.message,
95
+ data: msg.error.data
96
+ }));
97
+ else pending.resolve(msg.result);
98
+ };
99
+ port.addEventListener("message", this.#messageHandler);
100
+ }
101
+ call(path, input, options) {
102
+ return new Promise((resolve, reject) => {
103
+ const id = String(this.#nextId++);
104
+ this.#pending.set(id, {
105
+ resolve,
106
+ reject
107
+ });
108
+ if (options.signal) options.signal.addEventListener("abort", () => {
109
+ const pending = this.#pending.get(id);
110
+ if (pending) {
111
+ this.#pending.delete(id);
112
+ pending.reject(new DOMException("Aborted", "AbortError"));
113
+ }
114
+ }, { once: true });
115
+ this.#port.postMessage({
116
+ __silgi: true,
117
+ __type: "request",
118
+ id,
119
+ path: path.join("/"),
120
+ input
121
+ });
122
+ });
123
+ }
124
+ /** Reject all pending calls and stop listening. */
125
+ dispose() {
126
+ for (const [, pending] of this.#pending) pending.reject(new DOMException("Link disposed", "AbortError"));
127
+ this.#pending.clear();
128
+ this.#port.removeEventListener?.("message", this.#messageHandler);
129
+ }
130
+ };
131
+ //#endregion
132
+ export { MessagePortLink, createHandler };