@modularizer/plat 0.1.0

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 (287) hide show
  1. package/README.md +574 -0
  2. package/bin/z2.js +5 -0
  3. package/dist/args/coerce.d.ts +54 -0
  4. package/dist/args/coerce.d.ts.map +1 -0
  5. package/dist/args/coerce.js +236 -0
  6. package/dist/args/coerce.js.map +1 -0
  7. package/dist/args/index.d.ts +2 -0
  8. package/dist/args/index.d.ts.map +1 -0
  9. package/dist/args/index.js +2 -0
  10. package/dist/args/index.js.map +1 -0
  11. package/dist/args/scalars.d.ts +87 -0
  12. package/dist/args/scalars.d.ts.map +1 -0
  13. package/dist/args/scalars.js +22 -0
  14. package/dist/args/scalars.js.map +1 -0
  15. package/dist/args/validate.d.ts +23 -0
  16. package/dist/args/validate.d.ts.map +1 -0
  17. package/dist/args/validate.js +185 -0
  18. package/dist/args/validate.js.map +1 -0
  19. package/dist/args/z2.d.ts +27 -0
  20. package/dist/args/z2.d.ts.map +1 -0
  21. package/dist/args/z2.js +24 -0
  22. package/dist/args/z2.js.map +1 -0
  23. package/dist/cli/commands/api-proxy.d.ts +9 -0
  24. package/dist/cli/commands/api-proxy.d.ts.map +1 -0
  25. package/dist/cli/commands/api-proxy.js +292 -0
  26. package/dist/cli/commands/api-proxy.js.map +1 -0
  27. package/dist/cli/commands/env.d.ts +32 -0
  28. package/dist/cli/commands/env.d.ts.map +1 -0
  29. package/dist/cli/commands/env.js +157 -0
  30. package/dist/cli/commands/env.js.map +1 -0
  31. package/dist/cli/commands/gen.d.ts +2 -0
  32. package/dist/cli/commands/gen.d.ts.map +1 -0
  33. package/dist/cli/commands/gen.js +88 -0
  34. package/dist/cli/commands/gen.js.map +1 -0
  35. package/dist/cli/commands/init-project.d.ts +9 -0
  36. package/dist/cli/commands/init-project.d.ts.map +1 -0
  37. package/dist/cli/commands/init-project.js +143 -0
  38. package/dist/cli/commands/init-project.js.map +1 -0
  39. package/dist/cli/commands/jwt-cmd.d.ts +10 -0
  40. package/dist/cli/commands/jwt-cmd.d.ts.map +1 -0
  41. package/dist/cli/commands/jwt-cmd.js +33 -0
  42. package/dist/cli/commands/jwt-cmd.js.map +1 -0
  43. package/dist/cli/commands/run.d.ts +5 -0
  44. package/dist/cli/commands/run.d.ts.map +1 -0
  45. package/dist/cli/commands/run.js +31 -0
  46. package/dist/cli/commands/run.js.map +1 -0
  47. package/dist/cli/commands/serve.d.ts +2 -0
  48. package/dist/cli/commands/serve.d.ts.map +1 -0
  49. package/dist/cli/commands/serve.js +43 -0
  50. package/dist/cli/commands/serve.js.map +1 -0
  51. package/dist/cli/commands/watch.d.ts +5 -0
  52. package/dist/cli/commands/watch.d.ts.map +1 -0
  53. package/dist/cli/commands/watch.js +119 -0
  54. package/dist/cli/commands/watch.js.map +1 -0
  55. package/dist/cli/index.d.ts +11 -0
  56. package/dist/cli/index.d.ts.map +1 -0
  57. package/dist/cli/index.js +11 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/cli/jwt-helper.d.ts +32 -0
  60. package/dist/cli/jwt-helper.d.ts.map +1 -0
  61. package/dist/cli/jwt-helper.js +84 -0
  62. package/dist/cli/jwt-helper.js.map +1 -0
  63. package/dist/cli/proxy.d.ts +40 -0
  64. package/dist/cli/proxy.d.ts.map +1 -0
  65. package/dist/cli/proxy.js +171 -0
  66. package/dist/cli/proxy.js.map +1 -0
  67. package/dist/cli/runtime.d.ts +17 -0
  68. package/dist/cli/runtime.d.ts.map +1 -0
  69. package/dist/cli/runtime.js +286 -0
  70. package/dist/cli/runtime.js.map +1 -0
  71. package/dist/cli/spec-source.d.ts +13 -0
  72. package/dist/cli/spec-source.d.ts.map +1 -0
  73. package/dist/cli/spec-source.js +207 -0
  74. package/dist/cli/spec-source.js.map +1 -0
  75. package/dist/cli/z2.d.ts +7 -0
  76. package/dist/cli/z2.d.ts.map +1 -0
  77. package/dist/cli/z2.js +93 -0
  78. package/dist/cli/z2.js.map +1 -0
  79. package/dist/client/file-transport-plugin.d.ts +25 -0
  80. package/dist/client/file-transport-plugin.d.ts.map +1 -0
  81. package/dist/client/file-transport-plugin.js +80 -0
  82. package/dist/client/file-transport-plugin.js.map +1 -0
  83. package/dist/client/http-transport-plugin.d.ts +27 -0
  84. package/dist/client/http-transport-plugin.d.ts.map +1 -0
  85. package/dist/client/http-transport-plugin.js +48 -0
  86. package/dist/client/http-transport-plugin.js.map +1 -0
  87. package/dist/client/index.d.ts +6 -0
  88. package/dist/client/index.d.ts.map +1 -0
  89. package/dist/client/index.js +6 -0
  90. package/dist/client/index.js.map +1 -0
  91. package/dist/client/openapi-client.d.ts +332 -0
  92. package/dist/client/openapi-client.d.ts.map +1 -0
  93. package/dist/client/openapi-client.js +879 -0
  94. package/dist/client/openapi-client.js.map +1 -0
  95. package/dist/client/proxy.d.ts +5 -0
  96. package/dist/client/proxy.d.ts.map +1 -0
  97. package/dist/client/proxy.js +353 -0
  98. package/dist/client/proxy.js.map +1 -0
  99. package/dist/client/request-builder.d.ts +4 -0
  100. package/dist/client/request-builder.d.ts.map +1 -0
  101. package/dist/client/request-builder.js +88 -0
  102. package/dist/client/request-builder.js.map +1 -0
  103. package/dist/client/rpc-transport-plugin.d.ts +17 -0
  104. package/dist/client/rpc-transport-plugin.d.ts.map +1 -0
  105. package/dist/client/rpc-transport-plugin.js +69 -0
  106. package/dist/client/rpc-transport-plugin.js.map +1 -0
  107. package/dist/client/tools.d.ts +69 -0
  108. package/dist/client/tools.d.ts.map +1 -0
  109. package/dist/client/tools.js +122 -0
  110. package/dist/client/tools.js.map +1 -0
  111. package/dist/client/transport-plugin.d.ts +62 -0
  112. package/dist/client/transport-plugin.d.ts.map +1 -0
  113. package/dist/client/transport-plugin.js +40 -0
  114. package/dist/client/transport-plugin.js.map +1 -0
  115. package/dist/index.d.ts +9 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +8 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/logging.d.ts +9 -0
  120. package/dist/logging.d.ts.map +1 -0
  121. package/dist/logging.js +29 -0
  122. package/dist/logging.js.map +1 -0
  123. package/dist/rpc.d.ts +39 -0
  124. package/dist/rpc.d.ts.map +1 -0
  125. package/dist/rpc.js +2 -0
  126. package/dist/rpc.js.map +1 -0
  127. package/dist/server/auth/index.d.ts +4 -0
  128. package/dist/server/auth/index.d.ts.map +1 -0
  129. package/dist/server/auth/index.js +2 -0
  130. package/dist/server/auth/index.js.map +1 -0
  131. package/dist/server/auth/jwt.d.ts +27 -0
  132. package/dist/server/auth/jwt.d.ts.map +1 -0
  133. package/dist/server/auth/jwt.js +95 -0
  134. package/dist/server/auth/jwt.js.map +1 -0
  135. package/dist/server/cache/index.d.ts +2 -0
  136. package/dist/server/cache/index.d.ts.map +1 -0
  137. package/dist/server/cache/index.js +2 -0
  138. package/dist/server/cache/index.js.map +1 -0
  139. package/dist/server/cache/utils.d.ts +30 -0
  140. package/dist/server/cache/utils.d.ts.map +1 -0
  141. package/dist/server/cache/utils.js +116 -0
  142. package/dist/server/cache/utils.js.map +1 -0
  143. package/dist/server/call-sessions.d.ts +50 -0
  144. package/dist/server/call-sessions.d.ts.map +1 -0
  145. package/dist/server/call-sessions.js +90 -0
  146. package/dist/server/call-sessions.js.map +1 -0
  147. package/dist/server/config/bucket.d.ts +9 -0
  148. package/dist/server/config/bucket.d.ts.map +1 -0
  149. package/dist/server/config/bucket.js +57 -0
  150. package/dist/server/config/bucket.js.map +1 -0
  151. package/dist/server/config/defaults.d.ts +3 -0
  152. package/dist/server/config/defaults.d.ts.map +1 -0
  153. package/dist/server/config/defaults.js +29 -0
  154. package/dist/server/config/defaults.js.map +1 -0
  155. package/dist/server/config/index.d.ts +5 -0
  156. package/dist/server/config/index.d.ts.map +1 -0
  157. package/dist/server/config/index.js +5 -0
  158. package/dist/server/config/index.js.map +1 -0
  159. package/dist/server/config/logger.d.ts +3 -0
  160. package/dist/server/config/logger.d.ts.map +1 -0
  161. package/dist/server/config/logger.js +2 -0
  162. package/dist/server/config/logger.js.map +1 -0
  163. package/dist/server/config/types.d.ts +198 -0
  164. package/dist/server/config/types.d.ts.map +1 -0
  165. package/dist/server/config/types.js +2 -0
  166. package/dist/server/config/types.js.map +1 -0
  167. package/dist/server/core.d.ts +42 -0
  168. package/dist/server/core.d.ts.map +1 -0
  169. package/dist/server/core.js +202 -0
  170. package/dist/server/core.js.map +1 -0
  171. package/dist/server/env.d.ts +39 -0
  172. package/dist/server/env.d.ts.map +1 -0
  173. package/dist/server/env.js +66 -0
  174. package/dist/server/env.js.map +1 -0
  175. package/dist/server/file-queue-protocol-plugin.d.ts +7 -0
  176. package/dist/server/file-queue-protocol-plugin.d.ts.map +1 -0
  177. package/dist/server/file-queue-protocol-plugin.js +150 -0
  178. package/dist/server/file-queue-protocol-plugin.js.map +1 -0
  179. package/dist/server/file-queue.d.ts +25 -0
  180. package/dist/server/file-queue.d.ts.map +1 -0
  181. package/dist/server/file-queue.js +2 -0
  182. package/dist/server/file-queue.js.map +1 -0
  183. package/dist/server/help.d.ts +19 -0
  184. package/dist/server/help.d.ts.map +1 -0
  185. package/dist/server/help.js +91 -0
  186. package/dist/server/help.js.map +1 -0
  187. package/dist/server/index.d.ts +29 -0
  188. package/dist/server/index.d.ts.map +1 -0
  189. package/dist/server/index.js +29 -0
  190. package/dist/server/index.js.map +1 -0
  191. package/dist/server/operation-registry.d.ts +9 -0
  192. package/dist/server/operation-registry.d.ts.map +1 -0
  193. package/dist/server/operation-registry.js +16 -0
  194. package/dist/server/operation-registry.js.map +1 -0
  195. package/dist/server/param-aliases.d.ts +40 -0
  196. package/dist/server/param-aliases.d.ts.map +1 -0
  197. package/dist/server/param-aliases.js +112 -0
  198. package/dist/server/param-aliases.js.map +1 -0
  199. package/dist/server/protocol-plugin.d.ts +72 -0
  200. package/dist/server/protocol-plugin.d.ts.map +1 -0
  201. package/dist/server/protocol-plugin.js +2 -0
  202. package/dist/server/protocol-plugin.js.map +1 -0
  203. package/dist/server/rate-limit/index.d.ts +2 -0
  204. package/dist/server/rate-limit/index.d.ts.map +1 -0
  205. package/dist/server/rate-limit/index.js +2 -0
  206. package/dist/server/rate-limit/index.js.map +1 -0
  207. package/dist/server/rate-limit/utils.d.ts +27 -0
  208. package/dist/server/rate-limit/utils.d.ts.map +1 -0
  209. package/dist/server/rate-limit/utils.js +126 -0
  210. package/dist/server/rate-limit/utils.js.map +1 -0
  211. package/dist/server/routing.d.ts +39 -0
  212. package/dist/server/routing.d.ts.map +1 -0
  213. package/dist/server/routing.js +70 -0
  214. package/dist/server/routing.js.map +1 -0
  215. package/dist/server/rpc-protocol-plugin.d.ts +12 -0
  216. package/dist/server/rpc-protocol-plugin.d.ts.map +1 -0
  217. package/dist/server/rpc-protocol-plugin.js +134 -0
  218. package/dist/server/rpc-protocol-plugin.js.map +1 -0
  219. package/dist/server/server.d.ts +143 -0
  220. package/dist/server/server.d.ts.map +1 -0
  221. package/dist/server/server.js +1161 -0
  222. package/dist/server/server.js.map +1 -0
  223. package/dist/server/token-limit/index.d.ts +2 -0
  224. package/dist/server/token-limit/index.d.ts.map +1 -0
  225. package/dist/server/token-limit/index.js +2 -0
  226. package/dist/server/token-limit/index.js.map +1 -0
  227. package/dist/server/token-limit/utils.d.ts +44 -0
  228. package/dist/server/token-limit/utils.d.ts.map +1 -0
  229. package/dist/server/token-limit/utils.js +260 -0
  230. package/dist/server/token-limit/utils.js.map +1 -0
  231. package/dist/server/tools.d.ts +51 -0
  232. package/dist/server/tools.d.ts.map +1 -0
  233. package/dist/server/tools.js +225 -0
  234. package/dist/server/tools.js.map +1 -0
  235. package/dist/server/transports.d.ts +25 -0
  236. package/dist/server/transports.d.ts.map +1 -0
  237. package/dist/server/transports.js +2 -0
  238. package/dist/server/transports.js.map +1 -0
  239. package/dist/spec/decorators.d.ts +41 -0
  240. package/dist/spec/decorators.d.ts.map +1 -0
  241. package/dist/spec/decorators.js +93 -0
  242. package/dist/spec/decorators.js.map +1 -0
  243. package/dist/spec/index.d.ts +3 -0
  244. package/dist/spec/index.d.ts.map +1 -0
  245. package/dist/spec/index.js +3 -0
  246. package/dist/spec/index.js.map +1 -0
  247. package/dist/spec/metadata.d.ts +5 -0
  248. package/dist/spec/metadata.d.ts.map +1 -0
  249. package/dist/spec/metadata.js +37 -0
  250. package/dist/spec/metadata.js.map +1 -0
  251. package/dist/types/client.d.ts +81 -0
  252. package/dist/types/client.d.ts.map +1 -0
  253. package/dist/types/client.js +14 -0
  254. package/dist/types/client.js.map +1 -0
  255. package/dist/types/endpoints.d.ts +76 -0
  256. package/dist/types/endpoints.d.ts.map +1 -0
  257. package/dist/types/endpoints.js +2 -0
  258. package/dist/types/endpoints.js.map +1 -0
  259. package/dist/types/errors.d.ts +86 -0
  260. package/dist/types/errors.d.ts.map +1 -0
  261. package/dist/types/errors.js +153 -0
  262. package/dist/types/errors.js.map +1 -0
  263. package/dist/types/http.d.ts +80 -0
  264. package/dist/types/http.d.ts.map +1 -0
  265. package/dist/types/http.js +61 -0
  266. package/dist/types/http.js.map +1 -0
  267. package/dist/types/index.d.ts +9 -0
  268. package/dist/types/index.d.ts.map +1 -0
  269. package/dist/types/index.js +9 -0
  270. package/dist/types/index.js.map +1 -0
  271. package/dist/types/openapi.d.ts +220 -0
  272. package/dist/types/openapi.d.ts.map +1 -0
  273. package/dist/types/openapi.js +11 -0
  274. package/dist/types/openapi.js.map +1 -0
  275. package/dist/types/opts.d.ts +46 -0
  276. package/dist/types/opts.d.ts.map +1 -0
  277. package/dist/types/opts.js +2 -0
  278. package/dist/types/opts.js.map +1 -0
  279. package/dist/types/plugins.d.ts +93 -0
  280. package/dist/types/plugins.d.ts.map +1 -0
  281. package/dist/types/plugins.js +5 -0
  282. package/dist/types/plugins.js.map +1 -0
  283. package/dist/types/tools.d.ts +52 -0
  284. package/dist/types/tools.d.ts.map +1 -0
  285. package/dist/types/tools.js +2 -0
  286. package/dist/types/tools.js.map +1 -0
  287. package/package.json +84 -0
@@ -0,0 +1,72 @@
1
+ import type { Logger } from './config/logger';
2
+ import type { PLATServerCallEnvelope, PLATServerResolvedOperation } from './transports';
3
+ import type { RouteContext } from '../types';
4
+ export interface PLATServerConnectionRequest {
5
+ protocol: string;
6
+ meta?: Record<string, unknown>;
7
+ }
8
+ export interface PLATServerRequestEnvelope extends PLATServerCallEnvelope {
9
+ }
10
+ export interface PLATServerUpdateEnvelope {
11
+ id: string;
12
+ event: string;
13
+ data?: unknown;
14
+ }
15
+ export interface PLATServerResponseEnvelope {
16
+ id: string;
17
+ ok: boolean;
18
+ result?: unknown;
19
+ error?: unknown;
20
+ statusCode?: number;
21
+ }
22
+ export interface PLATServerHostContext {
23
+ kind: string;
24
+ app?: unknown;
25
+ server?: unknown;
26
+ meta?: Record<string, unknown>;
27
+ }
28
+ export interface PLATServerTransportRuntime {
29
+ logger: Logger;
30
+ resolveOperation(envelope: Pick<PLATServerCallEnvelope, 'operationId' | 'method' | 'path'>): PLATServerResolvedOperation | undefined;
31
+ dispatch(operation: PLATServerResolvedOperation, envelope: PLATServerCallEnvelope): Promise<{
32
+ kind: 'success' | 'help';
33
+ result: any;
34
+ statusCode: number;
35
+ }>;
36
+ normalizeInput(input: Record<string, any>): Record<string, any>;
37
+ serializeValue(value: unknown): unknown;
38
+ createCallContext(args: {
39
+ ctx: RouteContext;
40
+ sessionId: string;
41
+ mode: 'rpc' | 'deferred';
42
+ signal?: AbortSignal;
43
+ emit: (event: 'progress' | 'log' | 'chunk' | 'message', data?: unknown) => Promise<void> | void;
44
+ }): RouteContext['call'];
45
+ createEnvelope(args: {
46
+ protocol: string;
47
+ operation: PLATServerResolvedOperation;
48
+ input: Record<string, any>;
49
+ headers?: Record<string, string>;
50
+ ctx: RouteContext;
51
+ requestId?: string;
52
+ req?: unknown;
53
+ res?: unknown;
54
+ allowHelp?: boolean;
55
+ helpRequested?: boolean;
56
+ }): PLATServerCallEnvelope;
57
+ }
58
+ export interface PLATServerProtocolPlugin {
59
+ name: string;
60
+ setup?(runtime: PLATServerTransportRuntime): void | Promise<void>;
61
+ attach?(runtime: PLATServerTransportRuntime, host: PLATServerHostContext): void | Promise<void>;
62
+ getConnectionRequest?(runtime: PLATServerTransportRuntime): Promise<PLATServerConnectionRequest | null | undefined> | PLATServerConnectionRequest | null | undefined;
63
+ onConnectionRequest?(request: PLATServerConnectionRequest, runtime: PLATServerTransportRuntime): void | Promise<void>;
64
+ getRequest?(runtime: PLATServerTransportRuntime): Promise<PLATServerRequestEnvelope | null | undefined> | PLATServerRequestEnvelope | null | undefined;
65
+ onRequest?(request: PLATServerRequestEnvelope, runtime: PLATServerTransportRuntime): void | Promise<void>;
66
+ handleRequest?(request: PLATServerRequestEnvelope, runtime: PLATServerTransportRuntime): Promise<PLATServerResponseEnvelope | null | undefined> | PLATServerResponseEnvelope | null | undefined;
67
+ sendUpdate?(update: PLATServerUpdateEnvelope, runtime: PLATServerTransportRuntime): Promise<void> | void;
68
+ sendResponse?(response: PLATServerResponseEnvelope, runtime: PLATServerTransportRuntime): Promise<void> | void;
69
+ teardown?(runtime: PLATServerTransportRuntime): Promise<void> | void;
70
+ start?(runtime: PLATServerTransportRuntime): void | Promise<void>;
71
+ }
72
+ //# sourceMappingURL=protocol-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-plugin.d.ts","sourceRoot":"","sources":["../../src/server/protocol-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protocol-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-plugin.js","sourceRoot":"","sources":["../../src/server/protocol-plugin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from './utils';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/rate-limit/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './utils';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/rate-limit/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { RateLimitController, RateLimitMeta, RateLimitConfigs, ResolvedRateLimitEntry } from '../../types/plugins';
2
+ /**
3
+ * Resolve rate limit key with substitutions:
4
+ * - :route → methodName
5
+ * - :parent → basePath
6
+ * - :user:{field} → user[field] from auth context (e.g., :user:plan, :user:id)
7
+ */
8
+ export declare function resolveRateLimitKey(raw: string, methodName: string, basePath: string, user?: any): string;
9
+ /**
10
+ * Create an in-memory rate limit controller with token-bucket algorithm
11
+ * Lazy fills bucket on each access
12
+ */
13
+ export declare function createInMemoryRateLimit(): RateLimitController;
14
+ /**
15
+ * Pre-handler: normalize → array, resolve keys, lookup config,
16
+ * call controller.deduct(), return resolved entries + remaining balances
17
+ */
18
+ export declare function applyRateLimitCheck(meta: RateLimitMeta | undefined, controller: RateLimitController, configs: RateLimitConfigs, methodName: string, basePath: string, user?: any): Promise<{
19
+ entries: ResolvedRateLimitEntry[];
20
+ remainingBalances: number[];
21
+ }>;
22
+ /**
23
+ * Post-handler: refund if statusCode in refundedStatusCodes,
24
+ * OR if refundSuccessful && 2xx
25
+ */
26
+ export declare function applyRateLimitRefund(entries: ResolvedRateLimitEntry[], controller: RateLimitController, statusCode: number): Promise<void>;
27
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/rate-limit/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,mBAAmB,EAEnB,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,qBAAqB,CAAA;AAM5B;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,GAAG,GACT,MAAM,CAoBR;AAWD;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,mBAAmB,CAoE7D;AAMD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC;IAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA6B7E;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,sBAAsB,EAAE,EACjC,UAAU,EAAE,mBAAmB,EAC/B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -0,0 +1,126 @@
1
+ import { HttpError } from "../../types";
2
+ // ============================================================================
3
+ // KEY SUBSTITUTION
4
+ // ============================================================================
5
+ /**
6
+ * Resolve rate limit key with substitutions:
7
+ * - :route → methodName
8
+ * - :parent → basePath
9
+ * - :user:{field} → user[field] from auth context (e.g., :user:plan, :user:id)
10
+ */
11
+ export function resolveRateLimitKey(raw, methodName, basePath, user) {
12
+ let key = raw
13
+ .replace(':route', methodName)
14
+ .replace(':parent', basePath);
15
+ // Replace :user:{field} with user property
16
+ if (user) {
17
+ const userMatches = key.match(/:user:(\w+)/g);
18
+ if (userMatches) {
19
+ for (const match of userMatches) {
20
+ const field = match.slice(6); // Remove ':user:'
21
+ const value = user[field];
22
+ if (value !== undefined) {
23
+ key = key.replace(match, String(value));
24
+ }
25
+ }
26
+ }
27
+ }
28
+ return key;
29
+ }
30
+ /**
31
+ * Create an in-memory rate limit controller with token-bucket algorithm
32
+ * Lazy fills bucket on each access
33
+ */
34
+ export function createInMemoryRateLimit() {
35
+ const buckets = new Map();
36
+ function refillBucket(key, config) {
37
+ const now = Date.now();
38
+ let bucket = buckets.get(key);
39
+ if (!bucket) {
40
+ bucket = { balance: config.maxBalance, lastRefillMs: now };
41
+ buckets.set(key, bucket);
42
+ return bucket.balance;
43
+ }
44
+ const elapsedMs = now - bucket.lastRefillMs;
45
+ const intervalsElapsed = Math.floor(elapsedMs / config.fillInterval);
46
+ if (intervalsElapsed > 0) {
47
+ const tokensGenerated = intervalsElapsed * config.fillAmount;
48
+ bucket.balance = Math.min(config.maxBalance, bucket.balance + tokensGenerated);
49
+ bucket.lastRefillMs = now - (elapsedMs % config.fillInterval);
50
+ }
51
+ return bucket.balance;
52
+ }
53
+ return {
54
+ check(key, config) {
55
+ const balance = refillBucket(key, config);
56
+ return balance;
57
+ },
58
+ deduct(key, cost, config) {
59
+ const balance = refillBucket(key, config);
60
+ const minBalance = config.minBalance ?? 0;
61
+ const newBalance = balance - cost;
62
+ if (newBalance < minBalance) {
63
+ const deficit = minBalance - newBalance;
64
+ const intervalsNeeded = Math.ceil(deficit / config.fillAmount);
65
+ const retryAfterMs = intervalsNeeded * config.fillInterval;
66
+ throw new HttpError(429, 'Rate limit exceeded', { retryAfterMs });
67
+ }
68
+ const bucket = buckets.get(key);
69
+ bucket.balance = newBalance;
70
+ return newBalance;
71
+ },
72
+ refund(key, cost, config) {
73
+ let bucket = buckets.get(key);
74
+ if (!bucket) {
75
+ bucket = { balance: Math.min(config.maxBalance, cost), lastRefillMs: Date.now() };
76
+ buckets.set(key, bucket);
77
+ }
78
+ else {
79
+ bucket.balance = Math.min(config.maxBalance, bucket.balance + cost);
80
+ }
81
+ },
82
+ };
83
+ }
84
+ // ============================================================================
85
+ // PIPELINE HELPERS
86
+ // ============================================================================
87
+ /**
88
+ * Pre-handler: normalize → array, resolve keys, lookup config,
89
+ * call controller.deduct(), return resolved entries + remaining balances
90
+ */
91
+ export async function applyRateLimitCheck(meta, controller, configs, methodName, basePath, user) {
92
+ if (!meta) {
93
+ return { entries: [], remainingBalances: [] };
94
+ }
95
+ const entries = Array.isArray(meta) ? meta : [meta];
96
+ const resolved = [];
97
+ const remainingBalances = [];
98
+ for (const entry of entries) {
99
+ const rawKey = entry.key ?? ':route';
100
+ const key = resolveRateLimitKey(rawKey, methodName, basePath, user);
101
+ const cost = entry.cost ?? 1;
102
+ const config = entry.config ?? configs[key];
103
+ if (!config) {
104
+ throw new Error(`Rate limit config not found for key "${key}". ` +
105
+ `Define it in server.rateLimit.configs or inline in route metadata.`);
106
+ }
107
+ const remaining = await controller.deduct(key, cost, config);
108
+ resolved.push({ key, cost, config });
109
+ remainingBalances.push(remaining);
110
+ }
111
+ return { entries: resolved, remainingBalances };
112
+ }
113
+ /**
114
+ * Post-handler: refund if statusCode in refundedStatusCodes,
115
+ * OR if refundSuccessful && 2xx
116
+ */
117
+ export async function applyRateLimitRefund(entries, controller, statusCode) {
118
+ for (const entry of entries) {
119
+ const shouldRefund = (entry.config.refundedStatusCodes?.includes(statusCode)) ||
120
+ (entry.config.refundSuccessful && statusCode >= 200 && statusCode < 300);
121
+ if (shouldRefund) {
122
+ await controller.refund(entry.key, entry.cost, entry.config);
123
+ }
124
+ }
125
+ }
126
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/server/rate-limit/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Routing Utilities for plat
3
+ *
4
+ * Provides functions to generate route variants:
5
+ * - Case variants: camelCase -> snake_case, kebab-case
6
+ * - HTTP method flexibility: GET ↔ POST
7
+ */
8
+ /**
9
+ * Convert camelCase to snake_case
10
+ * e.g., getOrder -> get_order
11
+ */
12
+ export declare function toSnakeCase(str: string): string;
13
+ /**
14
+ * Convert camelCase to kebab-case
15
+ * e.g., getOrder -> get-order
16
+ */
17
+ export declare function toKebabCase(str: string): string;
18
+ /**
19
+ * Generate all case variants of a method name
20
+ * e.g., getOrder -> [getOrder, get_order, get-order]
21
+ */
22
+ export declare function getCaseVariants(methodName: string): string[];
23
+ /**
24
+ * Get the flexible HTTP methods for a route
25
+ * GET can also accept POST, POST can also accept GET
26
+ * This allows more resilient APIs
27
+ */
28
+ export declare function getFlexibleMethods(httpMethod: string): string[];
29
+ /**
30
+ * Create route registration entries for all variants
31
+ * Takes a method and generates:
32
+ * - All case variants (camelCase, snake_case, kebab-case)
33
+ * - All flexible HTTP methods
34
+ */
35
+ export declare function generateRouteVariants(methodName: string, httpMethod: string): Array<{
36
+ path: string;
37
+ method: string;
38
+ }>;
39
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/server/routing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAe/D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAezC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Routing Utilities for plat
3
+ *
4
+ * Provides functions to generate route variants:
5
+ * - Case variants: camelCase -> snake_case, kebab-case
6
+ * - HTTP method flexibility: GET ↔ POST
7
+ */
8
+ /**
9
+ * Convert camelCase to snake_case
10
+ * e.g., getOrder -> get_order
11
+ */
12
+ export function toSnakeCase(str) {
13
+ return str.replace(/([A-Z])/g, '_$1').toLowerCase();
14
+ }
15
+ /**
16
+ * Convert camelCase to kebab-case
17
+ * e.g., getOrder -> get-order
18
+ */
19
+ export function toKebabCase(str) {
20
+ return str.replace(/([A-Z])/g, '-$1').toLowerCase();
21
+ }
22
+ /**
23
+ * Generate all case variants of a method name
24
+ * e.g., getOrder -> [getOrder, get_order, get-order]
25
+ */
26
+ export function getCaseVariants(methodName) {
27
+ return [methodName, toSnakeCase(methodName), toKebabCase(methodName)];
28
+ }
29
+ /**
30
+ * Get the flexible HTTP methods for a route
31
+ * GET can also accept POST, POST can also accept GET
32
+ * This allows more resilient APIs
33
+ */
34
+ export function getFlexibleMethods(httpMethod) {
35
+ const method = httpMethod.toUpperCase();
36
+ if (method === 'GET') {
37
+ return ['GET', 'POST'];
38
+ }
39
+ if (method === 'POST') {
40
+ return ['POST', 'GET'];
41
+ }
42
+ if (method === 'PUT') {
43
+ return ['PUT', 'PATCH', 'POST'];
44
+ }
45
+ if (method === 'DELETE') {
46
+ return ['DELETE', 'POST'];
47
+ }
48
+ return [method];
49
+ }
50
+ /**
51
+ * Create route registration entries for all variants
52
+ * Takes a method and generates:
53
+ * - All case variants (camelCase, snake_case, kebab-case)
54
+ * - All flexible HTTP methods
55
+ */
56
+ export function generateRouteVariants(methodName, httpMethod) {
57
+ const routes = [];
58
+ const caseVariants = getCaseVariants(methodName);
59
+ const methodVariants = getFlexibleMethods(httpMethod);
60
+ for (const caseVariant of caseVariants) {
61
+ for (const method of methodVariants) {
62
+ routes.push({
63
+ path: '/' + caseVariant,
64
+ method: method,
65
+ });
66
+ }
67
+ }
68
+ return routes;
69
+ }
70
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/server/routing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAA;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;IACvC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC3B,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,CAAA;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,UAAkB;IAElB,MAAM,MAAM,GAA4C,EAAE,CAAA;IAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IAChD,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;IAErD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,GAAG,GAAG,WAAW;gBACvB,MAAM,EAAE,MAAM;aACf,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { PLATServerHostContext, PLATServerProtocolPlugin } from './protocol-plugin';
2
+ export interface RpcProtocolPluginOptions {
3
+ /** true, false, or a custom path like '/ws' */
4
+ enabled: boolean | string;
5
+ }
6
+ export declare function createRpcProtocolPlugin(options: RpcProtocolPluginOptions): PLATServerProtocolPlugin;
7
+ /**
8
+ * Attach the RPC WebSocket server to an existing HTTP server.
9
+ * Must be called after plugin.setup(runtime) and before server.listen().
10
+ */
11
+ export declare function attachRpcProtocolPlugin(plugin: PLATServerProtocolPlugin, options: RpcProtocolPluginOptions, host: PLATServerHostContext): void;
12
+ //# sourceMappingURL=rpc-protocol-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-protocol-plugin.d.ts","sourceRoot":"","sources":["../../src/server/rpc-protocol-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,wBAAwB,EAA8B,MAAM,mBAAmB,CAAA;AAEpH,MAAM,WAAW,wBAAwB;IACvC,+CAA+C;IAC/C,OAAO,EAAE,OAAO,GAAG,MAAM,CAAA;CAC1B;AAOD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,wBAAwB,CAcnG;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,wBAAwB,EAChC,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAE,qBAAqB,GAC1B,IAAI,CAwHN"}
@@ -0,0 +1,134 @@
1
+ import { WebSocketServer } from 'ws';
2
+ import { DEFAULT_RPC_PATH } from '../rpc';
3
+ import { HttpError } from '../types';
4
+ export function createRpcProtocolPlugin(options) {
5
+ const plugin = {
6
+ name: 'rpc',
7
+ setup(rt) {
8
+ plugin._runtime = rt;
9
+ },
10
+ attach(rt, host) {
11
+ attachRpcProtocolPlugin(plugin, options, host);
12
+ },
13
+ teardown() {
14
+ plugin._runtime = undefined;
15
+ },
16
+ };
17
+ return plugin;
18
+ }
19
+ /**
20
+ * Attach the RPC WebSocket server to an existing HTTP server.
21
+ * Must be called after plugin.setup(runtime) and before server.listen().
22
+ */
23
+ export function attachRpcProtocolPlugin(plugin, options, host) {
24
+ if (options.enabled === false || plugin.name !== 'rpc')
25
+ return;
26
+ const rt = plugin._runtime;
27
+ if (!rt)
28
+ return;
29
+ if (host.kind !== 'node-http' || !host.server)
30
+ return;
31
+ const rpcPath = typeof options.enabled === 'string' ? options.enabled : DEFAULT_RPC_PATH;
32
+ const serialize = (v) => rt.serializeValue(v);
33
+ const activeRpcCalls = new Map();
34
+ const server = host.server;
35
+ const wss = new WebSocketServer({ server, path: rpcPath });
36
+ // Store for teardown
37
+ const originalTeardown = plugin.teardown;
38
+ plugin.teardown = async (runtime) => {
39
+ for (const ac of activeRpcCalls.values())
40
+ ac.abort();
41
+ activeRpcCalls.clear();
42
+ wss.close();
43
+ await originalTeardown?.(runtime);
44
+ };
45
+ wss.on('connection', (socket) => {
46
+ socket.on('message', async (message) => {
47
+ const raw = typeof message === 'string' ? message : message.toString();
48
+ let request;
49
+ try {
50
+ request = JSON.parse(raw);
51
+ }
52
+ catch {
53
+ socket.send(JSON.stringify({
54
+ jsonrpc: '2.0', id: 'invalid', ok: false,
55
+ error: { status: 400, message: 'Invalid RPC payload' },
56
+ }));
57
+ return;
58
+ }
59
+ if (request.cancel) {
60
+ activeRpcCalls.get(request.id)?.abort();
61
+ socket.send(JSON.stringify({
62
+ jsonrpc: '2.0', id: request.id, ok: true, result: { cancelled: true },
63
+ }));
64
+ return;
65
+ }
66
+ const operation = rt.resolveOperation({
67
+ operationId: request.operationId,
68
+ method: request.method,
69
+ path: request.path,
70
+ });
71
+ if (!operation) {
72
+ socket.send(JSON.stringify({
73
+ jsonrpc: '2.0', id: request.id, ok: false,
74
+ error: { status: 404, message: `RPC operation not found for ${request.method} ${request.path}` },
75
+ }));
76
+ return;
77
+ }
78
+ const abortController = new AbortController();
79
+ activeRpcCalls.set(request.id, abortController);
80
+ try {
81
+ const normalizedInput = rt.normalizeInput(typeof request.input === 'object' && request.input !== null ? request.input : {});
82
+ const ctx = {
83
+ method: operation.method,
84
+ url: operation.path,
85
+ headers: request.headers ?? {},
86
+ opts: operation.routeMeta?.opts,
87
+ };
88
+ rt.createCallContext({
89
+ ctx,
90
+ sessionId: request.id,
91
+ mode: 'rpc',
92
+ signal: abortController.signal,
93
+ emit: async (event, data) => {
94
+ socket.send(JSON.stringify({
95
+ jsonrpc: '2.0', id: request.id, ok: true, event,
96
+ data: serialize(data),
97
+ }));
98
+ },
99
+ });
100
+ const envelope = rt.createEnvelope({
101
+ protocol: 'rpc',
102
+ operation,
103
+ input: normalizedInput,
104
+ headers: request.headers ?? {},
105
+ ctx,
106
+ requestId: request.id,
107
+ req: { headers: request.headers ?? {} },
108
+ allowHelp: false,
109
+ helpRequested: false,
110
+ });
111
+ const execution = await rt.dispatch(operation, envelope);
112
+ socket.send(JSON.stringify({
113
+ jsonrpc: '2.0', id: request.id, ok: true,
114
+ result: serialize(execution.result),
115
+ }));
116
+ }
117
+ catch (error) {
118
+ const status = error instanceof HttpError ? error.statusCode : 500;
119
+ socket.send(JSON.stringify({
120
+ jsonrpc: '2.0', id: request.id, ok: false,
121
+ error: {
122
+ status,
123
+ message: error?.message ?? 'Internal server error',
124
+ data: error instanceof HttpError ? error.data : undefined,
125
+ },
126
+ }));
127
+ }
128
+ finally {
129
+ activeRpcCalls.delete(request.id);
130
+ }
131
+ });
132
+ });
133
+ }
134
+ //# sourceMappingURL=rpc-protocol-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-protocol-plugin.js","sourceRoot":"","sources":["../../src/server/rpc-protocol-plugin.ts"],"names":[],"mappings":"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"}