silgi 0.0.14 → 0.1.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 (210) hide show
  1. package/README.md +102 -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 +120 -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 +75 -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 +19 -0
  37. package/dist/client/adapters/fetch/index.mjs +82 -0
  38. package/dist/client/adapters/ofetch/index.d.mts +57 -0
  39. package/dist/client/adapters/ofetch/index.mjs +100 -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 +62 -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/compile.d.mts +46 -0
  79. package/dist/compile.mjs +332 -0
  80. package/dist/contract.d.mts +36 -0
  81. package/dist/contract.mjs +40 -0
  82. package/dist/core/codec.mjs +67 -0
  83. package/dist/core/dispatch.mjs +62 -0
  84. package/dist/core/error.d.mts +104 -0
  85. package/dist/core/error.mjs +139 -0
  86. package/dist/core/handler.d.mts +6 -0
  87. package/dist/core/handler.mjs +148 -0
  88. package/dist/core/input.mjs +49 -0
  89. package/dist/core/iterator.d.mts +17 -0
  90. package/dist/core/iterator.mjs +79 -0
  91. package/dist/core/router-utils.d.mts +25 -0
  92. package/dist/core/router-utils.mjs +98 -0
  93. package/dist/core/schema.d.mts +20 -0
  94. package/dist/core/schema.mjs +33 -0
  95. package/dist/core/serve.d.mts +51 -0
  96. package/dist/core/serve.mjs +76 -0
  97. package/dist/core/sse.d.mts +18 -0
  98. package/dist/core/sse.mjs +98 -0
  99. package/dist/core/storage.d.mts +20 -0
  100. package/dist/core/storage.mjs +61 -0
  101. package/dist/core/task.d.mts +62 -0
  102. package/dist/core/task.mjs +165 -0
  103. package/dist/core/utils.mjs +24 -0
  104. package/dist/index.d.mts +18 -37
  105. package/dist/index.mjs +15 -7
  106. package/dist/integrations/ai/index.d.mts +25 -0
  107. package/dist/integrations/ai/index.mjs +117 -0
  108. package/dist/integrations/better-auth/index.d.mts +61 -0
  109. package/dist/integrations/better-auth/index.mjs +332 -0
  110. package/dist/integrations/drizzle/index.d.mts +27 -0
  111. package/dist/integrations/drizzle/index.mjs +286 -0
  112. package/dist/integrations/hey-api/index.d.mts +2 -0
  113. package/dist/integrations/hey-api/index.mjs +2 -0
  114. package/dist/integrations/hey-api/to-client.d.mts +20 -0
  115. package/dist/integrations/hey-api/to-client.mjs +39 -0
  116. package/dist/integrations/pinia-colada/general-utils.d.mts +13 -0
  117. package/dist/integrations/pinia-colada/general-utils.mjs +9 -0
  118. package/dist/integrations/pinia-colada/index.d.mts +6 -0
  119. package/dist/integrations/pinia-colada/index.mjs +5 -0
  120. package/dist/integrations/pinia-colada/key.d.mts +11 -0
  121. package/dist/integrations/pinia-colada/key.mjs +11 -0
  122. package/dist/integrations/pinia-colada/procedure-utils.d.mts +25 -0
  123. package/dist/integrations/pinia-colada/procedure-utils.mjs +33 -0
  124. package/dist/integrations/pinia-colada/router-utils.d.mts +17 -0
  125. package/dist/integrations/pinia-colada/router-utils.mjs +30 -0
  126. package/dist/integrations/pinia-colada/types.d.mts +25 -0
  127. package/dist/integrations/react/index.d.mts +83 -0
  128. package/dist/integrations/react/index.mjs +196 -0
  129. package/dist/integrations/tanstack-query/index.d.mts +120 -0
  130. package/dist/integrations/tanstack-query/index.mjs +100 -0
  131. package/dist/integrations/tanstack-query/ssr.d.mts +60 -0
  132. package/dist/integrations/tanstack-query/ssr.mjs +102 -0
  133. package/dist/integrations/zod/converter.d.mts +75 -0
  134. package/dist/integrations/zod/converter.mjs +345 -0
  135. package/dist/integrations/zod/index.d.mts +2 -0
  136. package/dist/integrations/zod/index.mjs +2 -0
  137. package/dist/lazy.d.mts +22 -0
  138. package/dist/lazy.mjs +34 -0
  139. package/dist/lifecycle.d.mts +36 -0
  140. package/dist/lifecycle.mjs +46 -0
  141. package/dist/map-input.d.mts +17 -0
  142. package/dist/map-input.mjs +47 -0
  143. package/dist/plugins/analytics.d.mts +236 -0
  144. package/dist/plugins/analytics.mjs +816 -0
  145. package/dist/plugins/batch-server.d.mts +20 -0
  146. package/dist/plugins/batch-server.mjs +91 -0
  147. package/dist/plugins/body-limit.d.mts +19 -0
  148. package/dist/plugins/body-limit.mjs +49 -0
  149. package/dist/plugins/cache.d.mts +170 -0
  150. package/dist/plugins/cache.mjs +212 -0
  151. package/dist/plugins/coerce.d.mts +24 -0
  152. package/dist/plugins/coerce.mjs +70 -0
  153. package/dist/plugins/cookies.d.mts +14 -0
  154. package/dist/plugins/cookies.mjs +48 -0
  155. package/dist/plugins/cors.d.mts +43 -0
  156. package/dist/plugins/cors.mjs +62 -0
  157. package/dist/plugins/file-upload.d.mts +38 -0
  158. package/dist/plugins/file-upload.mjs +102 -0
  159. package/dist/plugins/index.d.mts +14 -0
  160. package/dist/plugins/index.mjs +14 -0
  161. package/dist/plugins/otel.d.mts +35 -0
  162. package/dist/plugins/otel.mjs +40 -0
  163. package/dist/plugins/pino.d.mts +60 -0
  164. package/dist/plugins/pino.mjs +42 -0
  165. package/dist/plugins/pubsub.d.mts +50 -0
  166. package/dist/plugins/pubsub.mjs +53 -0
  167. package/dist/plugins/ratelimit.d.mts +53 -0
  168. package/dist/plugins/ratelimit.mjs +92 -0
  169. package/dist/plugins/signing.d.mts +41 -0
  170. package/dist/plugins/signing.mjs +118 -0
  171. package/dist/plugins/strict-get.d.mts +10 -0
  172. package/dist/plugins/strict-get.mjs +33 -0
  173. package/dist/scalar.d.mts +49 -0
  174. package/dist/scalar.mjs +311 -0
  175. package/dist/silgi.d.mts +144 -0
  176. package/dist/silgi.mjs +156 -0
  177. package/dist/trpc-interop.d.mts +22 -0
  178. package/dist/trpc-interop.mjs +68 -0
  179. package/dist/types.d.mts +108 -0
  180. package/dist/ws.d.mts +88 -0
  181. package/dist/ws.mjs +205 -0
  182. package/lib/dashboard/index.html +123 -0
  183. package/lib/ocache.d.mts +1 -0
  184. package/lib/ocache.mjs +1 -0
  185. package/lib/ofetch.d.mts +1 -0
  186. package/lib/ofetch.mjs +1 -0
  187. package/lib/srvx.d.mts +1 -0
  188. package/lib/srvx.mjs +1 -0
  189. package/lib/unstorage.d.mts +1 -0
  190. package/lib/unstorage.mjs +1 -0
  191. package/package.json +324 -65
  192. package/bin/silgi.mjs +0 -3
  193. package/dist/chunks/generate.mjs +0 -933
  194. package/dist/chunks/init.mjs +0 -21
  195. package/dist/cli/config.d.mts +0 -19
  196. package/dist/cli/config.d.ts +0 -19
  197. package/dist/cli/config.mjs +0 -5
  198. package/dist/cli/index.d.mts +0 -2
  199. package/dist/cli/index.d.ts +0 -2
  200. package/dist/cli/index.mjs +0 -119
  201. package/dist/index.d.ts +0 -37
  202. package/dist/plugins/openapi.d.mts +0 -138
  203. package/dist/plugins/openapi.d.ts +0 -138
  204. package/dist/plugins/openapi.mjs +0 -204
  205. package/dist/plugins/scalar.d.mts +0 -14
  206. package/dist/plugins/scalar.d.ts +0 -14
  207. package/dist/plugins/scalar.mjs +0 -66
  208. package/dist/shared/silgi.BMCYk2cR.mjs +0 -841
  209. package/dist/shared/silgi.D5qK9QOm.d.mts +0 -301
  210. package/dist/shared/silgi.D5qK9QOm.d.ts +0 -301
package/dist/ws.mjs ADDED
@@ -0,0 +1,205 @@
1
+ import { SilgiError, toSilgiError } from "./core/error.mjs";
2
+ import { compileRouter, createContext, releaseContext } from "./compile.mjs";
3
+ import { stringifyJSON } from "./core/utils.mjs";
4
+ import { decode, encode } from "./codec/msgpack.mjs";
5
+ //#region src/ws.ts
6
+ /**
7
+ * WebSocket RPC adapter — powered by crossws.
8
+ *
9
+ * Bidirectional type-safe RPC over WebSocket.
10
+ * Supports subscriptions (server → client streaming) natively.
11
+ *
12
+ * Protocol:
13
+ * Client → Server: { id: string, path: string, input?: unknown }
14
+ * Server → Client: { id: string, result?: unknown, error?: unknown }
15
+ * Server → Client (stream): { id: string, data: unknown, done?: boolean }
16
+ */
17
+ const peerAbortControllers = /* @__PURE__ */ new WeakMap();
18
+ const peerKeepaliveTimers = /* @__PURE__ */ new WeakMap();
19
+ /**
20
+ * Create crossws-compatible hooks for Silgi RPC over WebSocket.
21
+ *
22
+ * Works with any crossws integration — Nitro, Deno, Bun, Cloudflare, etc.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * // Nitro / Nuxt
27
+ * import { createWSHooks } from "silgi/ws";
28
+ * export default defineWebSocketHandler(createWSHooks(appRouter));
29
+ *
30
+ * // With context
31
+ * export default defineWebSocketHandler(createWSHooks(appRouter, {
32
+ * context: (peer) => ({ userId: peer.request?.headers.get('x-user-id') }),
33
+ * }));
34
+ * ```
35
+ */
36
+ function createWSHooks(routerDef, options = {}) {
37
+ const flat = compileRouter(routerDef);
38
+ const useMsgpack = options.protocol === "messagepack" || options.protocol == null && (options.binary ?? false);
39
+ const contextFactory = options.context;
40
+ const keepaliveMs = options.keepalive === false ? 0 : options.keepalive ?? 3e4;
41
+ function send(peer, data) {
42
+ const compress = !!options.compress;
43
+ if (useMsgpack) peer.send(encode(data), { compress });
44
+ else peer.send(stringifyJSON(data), { compress });
45
+ }
46
+ function parseMessage(message) {
47
+ if (useMsgpack) return decode(message.uint8Array());
48
+ return message.json();
49
+ }
50
+ return {
51
+ open(peer) {
52
+ peerAbortControllers.set(peer, /* @__PURE__ */ new Set());
53
+ if (keepaliveMs > 0) {
54
+ const ws = peer._internal?.ws;
55
+ if (ws && typeof ws.ping === "function") {
56
+ let alive = true;
57
+ ws.on("pong", () => {
58
+ alive = true;
59
+ });
60
+ const timer = setInterval(() => {
61
+ if (!alive) {
62
+ clearInterval(timer);
63
+ ws.terminate();
64
+ return;
65
+ }
66
+ alive = false;
67
+ ws.ping();
68
+ }, keepaliveMs);
69
+ peerKeepaliveTimers.set(peer, timer);
70
+ }
71
+ }
72
+ },
73
+ async message(peer, message) {
74
+ let req;
75
+ try {
76
+ req = parseMessage(message);
77
+ } catch {
78
+ send(peer, {
79
+ id: "0",
80
+ error: {
81
+ code: "BAD_REQUEST",
82
+ status: 400,
83
+ message: "Invalid message format"
84
+ }
85
+ });
86
+ return;
87
+ }
88
+ const { id, path, input } = req;
89
+ const route = flat("POST", "/" + path)?.data;
90
+ if (!route || !route.ws) {
91
+ send(peer, {
92
+ id,
93
+ error: {
94
+ code: "NOT_FOUND",
95
+ status: 404,
96
+ message: `Procedure "${path}" not found`
97
+ }
98
+ });
99
+ return;
100
+ }
101
+ const ctx = createContext();
102
+ if (contextFactory) try {
103
+ const baseResult = contextFactory(peer);
104
+ const base = baseResult instanceof Promise ? await baseResult : baseResult;
105
+ const keys = Object.keys(base);
106
+ for (let i = 0; i < keys.length; i++) ctx[keys[i]] = base[keys[i]];
107
+ } catch (err) {
108
+ releaseContext(ctx);
109
+ send(peer, {
110
+ id,
111
+ error: (err instanceof SilgiError ? err : toSilgiError(err)).toJSON()
112
+ });
113
+ return;
114
+ }
115
+ const ac = new AbortController();
116
+ const controllers = peerAbortControllers.get(peer);
117
+ controllers?.add(ac);
118
+ try {
119
+ const result = route.handler(ctx, input ?? {}, ac.signal);
120
+ const output = result instanceof Promise ? await result : result;
121
+ if (output && typeof output === "object" && Symbol.asyncIterator in output) {
122
+ const iter = output;
123
+ try {
124
+ for await (const data of iter) {
125
+ if (ac.signal.aborted) break;
126
+ send(peer, {
127
+ id,
128
+ data
129
+ });
130
+ }
131
+ if (!ac.signal.aborted) send(peer, {
132
+ id,
133
+ data: null,
134
+ done: true
135
+ });
136
+ } catch (err) {
137
+ if (!ac.signal.aborted) send(peer, {
138
+ id,
139
+ error: (err instanceof SilgiError ? err : toSilgiError(err)).toJSON()
140
+ });
141
+ } finally {
142
+ await iter.return?.();
143
+ }
144
+ return;
145
+ }
146
+ send(peer, {
147
+ id,
148
+ result: output
149
+ });
150
+ } catch (err) {
151
+ send(peer, {
152
+ id,
153
+ error: (err instanceof SilgiError ? err : toSilgiError(err)).toJSON()
154
+ });
155
+ } finally {
156
+ controllers?.delete(ac);
157
+ releaseContext(ctx);
158
+ }
159
+ },
160
+ close(peer, _details) {
161
+ const timer = peerKeepaliveTimers.get(peer);
162
+ if (timer) {
163
+ clearInterval(timer);
164
+ peerKeepaliveTimers.delete(peer);
165
+ }
166
+ const controllers = peerAbortControllers.get(peer);
167
+ if (controllers) {
168
+ for (const ac of controllers) ac.abort();
169
+ controllers.clear();
170
+ peerAbortControllers.delete(peer);
171
+ }
172
+ },
173
+ error(_peer, error) {
174
+ console.error("[silgi:ws] error:", error);
175
+ }
176
+ };
177
+ }
178
+ /**
179
+ * Attach WebSocket RPC handler to an existing Node.js HTTP server.
180
+ *
181
+ * @example
182
+ * ```ts
183
+ * import { createServer } from "node:http";
184
+ * import { attachWebSocket } from "silgi/ws";
185
+ *
186
+ * const server = createServer(httpHandler);
187
+ * attachWebSocket(server, appRouter);
188
+ * server.listen(3000);
189
+ * ```
190
+ */
191
+ async function attachWebSocket(server, routerDef, options = {}) {
192
+ const nodeAdapter = (await import("crossws/adapters/node")).default;
193
+ const serverOptions = {};
194
+ if (options.compress) serverOptions.perMessageDeflate = typeof options.compress === "object" ? options.compress : true;
195
+ if (options.maxPayload !== void 0) serverOptions.maxPayload = options.maxPayload;
196
+ const ws = nodeAdapter({
197
+ hooks: createWSHooks(routerDef, options),
198
+ ...Object.keys(serverOptions).length > 0 && { serverOptions }
199
+ });
200
+ server.on("upgrade", (req, socket, head) => {
201
+ ws.handleUpgrade(req, socket, head);
202
+ });
203
+ }
204
+ //#endregion
205
+ export { attachWebSocket, createWSHooks };