sonamu 0.10.11 → 0.10.13

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 (519) hide show
  1. package/dist/ai/agents/agent.d.ts +1 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +5 -6
  4. package/dist/ai/agents/types.d.ts +1 -1
  5. package/dist/ai/agents/types.d.ts.map +1 -1
  6. package/dist/ai/providers/rtzr/api.js +18 -18
  7. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  8. package/dist/ai/providers/rtzr/error.js +17 -15
  9. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  10. package/dist/ai/providers/rtzr/model.js +3 -2
  11. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  12. package/dist/ai/providers/rtzr/options.js +16 -16
  13. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  14. package/dist/ai/providers/rtzr/provider.js +9 -9
  15. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/utils.js +1 -1
  17. package/dist/api/caster.d.ts.map +1 -1
  18. package/dist/api/caster.js +17 -17
  19. package/dist/api/code-converters.d.ts +4 -2
  20. package/dist/api/code-converters.d.ts.map +1 -1
  21. package/dist/api/code-converters.js +100 -19
  22. package/dist/api/config.d.ts +16 -1
  23. package/dist/api/config.d.ts.map +1 -1
  24. package/dist/api/config.js +28 -21
  25. package/dist/api/context.d.ts +2 -2
  26. package/dist/api/context.d.ts.map +1 -1
  27. package/dist/api/context.js +1 -1
  28. package/dist/api/decorators.d.ts.map +1 -1
  29. package/dist/api/decorators.js +18 -11
  30. package/dist/api/http-validator.d.ts +36 -0
  31. package/dist/api/http-validator.d.ts.map +1 -0
  32. package/dist/api/http-validator.js +72 -0
  33. package/dist/api/index.js +6 -4
  34. package/dist/api/sonamu.d.ts +59 -20
  35. package/dist/api/sonamu.d.ts.map +1 -1
  36. package/dist/api/sonamu.js +250 -106
  37. package/dist/api/websocket-helpers.d.ts +7 -5
  38. package/dist/api/websocket-helpers.d.ts.map +1 -1
  39. package/dist/api/websocket-helpers.js +6 -6
  40. package/dist/auth/audit-log/builders.d.ts.map +1 -1
  41. package/dist/auth/audit-log/builders.js +1 -1
  42. package/dist/auth/audit-log/client-ip.d.ts +1 -1
  43. package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
  44. package/dist/auth/audit-log/client-ip.js +4 -2
  45. package/dist/auth/audit-log/events.d.ts +5 -1
  46. package/dist/auth/audit-log/events.d.ts.map +1 -1
  47. package/dist/auth/audit-log/events.js +1 -1
  48. package/dist/auth/audit-log/plugin.d.ts +0 -8
  49. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  50. package/dist/auth/audit-log/plugin.js +48 -52
  51. package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
  52. package/dist/auth/audit-log-ingestor.js +16 -12
  53. package/dist/auth/auth-generator.d.ts.map +1 -1
  54. package/dist/auth/auth-generator.js +1 -1
  55. package/dist/auth/better-auth-request.d.ts.map +1 -1
  56. package/dist/auth/better-auth-request.js +6 -5
  57. package/dist/auth/knex-adapter.js +1 -1
  58. package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
  59. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  60. package/dist/auth/plugins/entity-definitions/index.js +1 -1
  61. package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
  62. package/dist/bin/build-config.d.ts +25 -0
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +105 -2
  65. package/dist/bin/cli.js +133 -29
  66. package/dist/bin/compiler-policy.d.ts +3 -0
  67. package/dist/bin/compiler-policy.d.ts.map +1 -0
  68. package/dist/bin/compiler-policy.js +24 -0
  69. package/dist/bin/fixture.d.ts.map +1 -1
  70. package/dist/bin/fixture.js +5 -3
  71. package/dist/bin/test-command.d.ts +22 -1
  72. package/dist/bin/test-command.d.ts.map +1 -1
  73. package/dist/bin/test-command.js +18 -10
  74. package/dist/bin/ts-loader-registration.d.ts +7 -1
  75. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  76. package/dist/bin/ts-loader-registration.js +13 -4
  77. package/dist/cache/decorator.d.ts.map +1 -1
  78. package/dist/cache/decorator.js +11 -4
  79. package/dist/compress/compress.d.ts.map +1 -1
  80. package/dist/compress/compress.js +1 -1
  81. package/dist/cone/cone-generator.d.ts +14 -1
  82. package/dist/cone/cone-generator.d.ts.map +1 -1
  83. package/dist/cone/cone-generator.js +13 -9
  84. package/dist/database/_batch_update.js +1 -1
  85. package/dist/database/base-model.d.ts +22 -10
  86. package/dist/database/base-model.d.ts.map +1 -1
  87. package/dist/database/base-model.js +26 -16
  88. package/dist/database/base-model.types.d.ts +15 -3
  89. package/dist/database/base-model.types.d.ts.map +1 -1
  90. package/dist/database/db.d.ts +12 -2
  91. package/dist/database/db.d.ts.map +1 -1
  92. package/dist/database/db.js +10 -7
  93. package/dist/database/knex.d.ts.map +1 -1
  94. package/dist/database/knex.js +17 -14
  95. package/dist/database/puri.d.ts +11 -9
  96. package/dist/database/puri.d.ts.map +1 -1
  97. package/dist/database/puri.js +93 -79
  98. package/dist/database/puri.types.d.ts +21 -21
  99. package/dist/database/puri.types.d.ts.map +1 -1
  100. package/dist/database/puri.types.js +1 -1
  101. package/dist/database/upsert-builder.d.ts +12 -10
  102. package/dist/database/upsert-builder.d.ts.map +1 -1
  103. package/dist/database/upsert-builder.js +20 -12
  104. package/dist/dict/sd.d.ts.map +1 -1
  105. package/dist/dict/sd.js +1 -1
  106. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  107. package/dist/dict/sonamu-dictionary.js +1 -1
  108. package/dist/dict/utils.d.ts.map +1 -1
  109. package/dist/dict/utils.js +7 -2
  110. package/dist/entity/entity-manager.d.ts +13 -4
  111. package/dist/entity/entity-manager.d.ts.map +1 -1
  112. package/dist/entity/entity-manager.js +19 -11
  113. package/dist/entity/entity-template-cone.d.ts +73 -5
  114. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  115. package/dist/entity/entity-template-cone.js +4 -2
  116. package/dist/entity/entity.d.ts +6 -2
  117. package/dist/entity/entity.d.ts.map +1 -1
  118. package/dist/entity/entity.js +30 -28
  119. package/dist/env.d.ts +3 -1
  120. package/dist/env.d.ts.map +1 -1
  121. package/dist/env.js +1 -1
  122. package/dist/exceptions/error-handler.d.ts.map +1 -1
  123. package/dist/exceptions/error-handler.js +7 -2
  124. package/dist/exceptions/so-exceptions.d.ts +24 -20
  125. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  126. package/dist/exceptions/so-exceptions.js +4 -2
  127. package/dist/filter/utils.d.ts +7 -2
  128. package/dist/filter/utils.d.ts.map +1 -1
  129. package/dist/filter/utils.js +8 -6
  130. package/dist/index.d.ts +3 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +13 -7
  133. package/dist/logger/configure.d.ts.map +1 -1
  134. package/dist/logger/configure.js +10 -10
  135. package/dist/migration/code-generation.d.ts.map +1 -1
  136. package/dist/migration/code-generation.js +50 -46
  137. package/dist/migration/index-where-predicate.d.ts.map +1 -1
  138. package/dist/migration/index-where-predicate.js +22 -8
  139. package/dist/migration/migration-set.d.ts.map +1 -1
  140. package/dist/migration/migration-set.js +1 -1
  141. package/dist/migration/migrator.d.ts +61 -36
  142. package/dist/migration/migrator.d.ts.map +1 -1
  143. package/dist/migration/migrator.js +276 -167
  144. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  145. package/dist/migration/postgresql-schema-reader.js +51 -36
  146. package/dist/migration/slack-confirm.d.ts.map +1 -1
  147. package/dist/migration/slack-confirm.js +1 -1
  148. package/dist/migration/types.d.ts +54 -0
  149. package/dist/migration/types.d.ts.map +1 -1
  150. package/dist/naite/naite-reporter.js +2 -2
  151. package/dist/naite/naite.d.ts +74 -15
  152. package/dist/naite/naite.d.ts.map +1 -1
  153. package/dist/naite/naite.js +5 -19
  154. package/dist/runtime-type.d.ts +6 -0
  155. package/dist/runtime-type.d.ts.map +1 -0
  156. package/dist/runtime-type.js +26 -0
  157. package/dist/ssr/hmr-opt-out.d.ts +26 -0
  158. package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
  159. package/dist/ssr/hmr-opt-out.js +59 -0
  160. package/dist/ssr/renderer.d.ts.map +1 -1
  161. package/dist/ssr/renderer.js +4 -1
  162. package/dist/storage/base-file.js +14 -14
  163. package/dist/storage/buffered-file.d.ts +2 -2
  164. package/dist/storage/buffered-file.d.ts.map +1 -1
  165. package/dist/storage/buffered-file.js +12 -12
  166. package/dist/storage/s3-driver.d.ts.map +1 -1
  167. package/dist/storage/s3-driver.js +1 -1
  168. package/dist/storage/uploaded-file.d.ts +2 -2
  169. package/dist/storage/uploaded-file.d.ts.map +1 -1
  170. package/dist/storage/uploaded-file.js +8 -8
  171. package/dist/stream/sse.js +11 -11
  172. package/dist/stream/ws-core.d.ts +1 -1
  173. package/dist/stream/ws-core.d.ts.map +1 -1
  174. package/dist/stream/ws-delivery.d.ts +1 -1
  175. package/dist/stream/ws-delivery.d.ts.map +1 -1
  176. package/dist/stream/ws-delivery.js +6 -4
  177. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  178. package/dist/stream/ws-local-connection-store.js +4 -2
  179. package/dist/stream/ws-presence-store.js +1 -1
  180. package/dist/stream/ws-registry.d.ts +4 -4
  181. package/dist/stream/ws-registry.d.ts.map +1 -1
  182. package/dist/stream/ws-registry.js +4 -2
  183. package/dist/stream/ws-telemetry.d.ts +16 -12
  184. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  185. package/dist/stream/ws-telemetry.js +22 -18
  186. package/dist/stream/ws.d.ts +18 -12
  187. package/dist/stream/ws.d.ts.map +1 -1
  188. package/dist/stream/ws.js +26 -22
  189. package/dist/syncer/api-parser.js +1 -1
  190. package/dist/syncer/checksum.d.ts.map +1 -1
  191. package/dist/syncer/checksum.js +7 -8
  192. package/dist/syncer/code-generator.d.ts.map +1 -1
  193. package/dist/syncer/code-generator.js +13 -14
  194. package/dist/syncer/entity-operations.d.ts.map +1 -1
  195. package/dist/syncer/entity-operations.js +5 -6
  196. package/dist/syncer/file-copy.d.ts +5 -0
  197. package/dist/syncer/file-copy.d.ts.map +1 -0
  198. package/dist/syncer/file-copy.js +36 -0
  199. package/dist/syncer/file-patterns.d.ts +1 -0
  200. package/dist/syncer/file-patterns.d.ts.map +1 -1
  201. package/dist/syncer/file-patterns.js +5 -2
  202. package/dist/syncer/file-tracking.d.ts.map +1 -1
  203. package/dist/syncer/file-tracking.js +5 -4
  204. package/dist/syncer/filesystem-dependencies.d.ts +15 -0
  205. package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
  206. package/dist/syncer/filesystem-dependencies.js +53 -0
  207. package/dist/syncer/module-loader.d.ts +1 -1
  208. package/dist/syncer/module-loader.d.ts.map +1 -1
  209. package/dist/syncer/module-loader.js +6 -4
  210. package/dist/syncer/syncer-actions.d.ts +4 -0
  211. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  212. package/dist/syncer/syncer-actions.js +34 -17
  213. package/dist/syncer/syncer.d.ts +17 -6
  214. package/dist/syncer/syncer.d.ts.map +1 -1
  215. package/dist/syncer/syncer.js +71 -29
  216. package/dist/syncer/watcher.d.ts.map +1 -1
  217. package/dist/syncer/watcher.js +3 -3
  218. package/dist/tasks/decorator.d.ts +6 -6
  219. package/dist/tasks/decorator.d.ts.map +1 -1
  220. package/dist/tasks/decorator.js +4 -4
  221. package/dist/tasks/step-wrapper.d.ts +6 -4
  222. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  223. package/dist/tasks/step-wrapper.js +5 -5
  224. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  225. package/dist/tasks/workflow-manager.js +13 -7
  226. package/dist/template/entity-converter.d.ts +1 -1
  227. package/dist/template/entity-converter.d.ts.map +1 -1
  228. package/dist/template/entity-converter.js +2 -2
  229. package/dist/template/helpers.d.ts +8 -6
  230. package/dist/template/helpers.d.ts.map +1 -1
  231. package/dist/template/helpers.js +1 -1
  232. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  233. package/dist/template/implementations/generated.template.js +4 -4
  234. package/dist/template/implementations/generated_http.template.d.ts +7 -4
  235. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  236. package/dist/template/implementations/generated_http.template.js +21 -21
  237. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  238. package/dist/template/implementations/generated_sso.template.js +6 -3
  239. package/dist/template/implementations/http_validators.template.d.ts +18 -0
  240. package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
  241. package/dist/template/implementations/http_validators.template.js +127 -0
  242. package/dist/template/implementations/model.template.d.ts.map +1 -1
  243. package/dist/template/implementations/model.template.js +1 -1
  244. package/dist/template/implementations/queries.template.js +1 -1
  245. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  246. package/dist/template/implementations/sd.template.js +79 -39
  247. package/dist/template/implementations/services.template.d.ts.map +1 -1
  248. package/dist/template/implementations/services.template.js +6 -4
  249. package/dist/template/implementations/view_form.template.d.ts +6 -1
  250. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  251. package/dist/template/implementations/view_form.template.js +23 -15
  252. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  253. package/dist/template/implementations/view_list.template.js +11 -6
  254. package/dist/template/template-manager.d.ts.map +1 -1
  255. package/dist/template/template-manager.js +9 -7
  256. package/dist/template/template-types.d.ts +12 -5
  257. package/dist/template/template-types.d.ts.map +1 -1
  258. package/dist/template/template-types.js +1 -1
  259. package/dist/template/template.d.ts +2 -2
  260. package/dist/template/template.d.ts.map +1 -1
  261. package/dist/template/template.js +6 -4
  262. package/dist/template/zod-converter.d.ts +0 -19
  263. package/dist/template/zod-converter.d.ts.map +1 -1
  264. package/dist/template/zod-converter.js +100 -84
  265. package/dist/testing/_relation-graph.d.ts.map +1 -1
  266. package/dist/testing/_relation-graph.js +2 -1
  267. package/dist/testing/bootstrap.d.ts.map +1 -1
  268. package/dist/testing/bootstrap.js +9 -6
  269. package/dist/testing/data-explorer.d.ts +32 -7
  270. package/dist/testing/data-explorer.d.ts.map +1 -1
  271. package/dist/testing/data-explorer.js +77 -31
  272. package/dist/testing/dev-test-routes.d.ts +8 -1
  273. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  274. package/dist/testing/dev-test-routes.js +125 -108
  275. package/dist/testing/dev-vitest-manager.d.ts +54 -8
  276. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  277. package/dist/testing/dev-vitest-manager.js +24 -9
  278. package/dist/testing/faker-mappings.d.ts +412 -1
  279. package/dist/testing/faker-mappings.d.ts.map +1 -1
  280. package/dist/testing/faker-mappings.js +1 -1
  281. package/dist/testing/filesystem.d.ts +2 -0
  282. package/dist/testing/filesystem.d.ts.map +1 -0
  283. package/dist/testing/filesystem.js +7 -0
  284. package/dist/testing/fixture-generator.d.ts +25 -8
  285. package/dist/testing/fixture-generator.d.ts.map +1 -1
  286. package/dist/testing/fixture-generator.js +132 -73
  287. package/dist/testing/fixture-loader.d.ts +3 -1
  288. package/dist/testing/fixture-loader.d.ts.map +1 -1
  289. package/dist/testing/fixture-loader.js +1 -20
  290. package/dist/testing/fixture-manager.d.ts +8 -7
  291. package/dist/testing/fixture-manager.d.ts.map +1 -1
  292. package/dist/testing/fixture-manager.js +91 -59
  293. package/dist/testing/global-setup.d.ts.map +1 -1
  294. package/dist/testing/global-setup.js +5 -2
  295. package/dist/testing/index.d.ts +2 -0
  296. package/dist/testing/index.d.ts.map +1 -1
  297. package/dist/testing/index.js +6 -3
  298. package/dist/types/types.d.ts +101 -99
  299. package/dist/types/types.d.ts.map +1 -1
  300. package/dist/types/types.js +234 -225
  301. package/dist/ui/ai-api.d.ts.map +1 -1
  302. package/dist/ui/ai-api.js +1 -1
  303. package/dist/ui/ai-client.d.ts.map +1 -1
  304. package/dist/ui/ai-client.js +28 -18
  305. package/dist/ui/api.d.ts.map +1 -1
  306. package/dist/ui/api.js +146 -210
  307. package/dist/ui/async-route.d.ts +3 -0
  308. package/dist/ui/async-route.d.ts.map +1 -0
  309. package/dist/ui/async-route.js +12 -0
  310. package/dist/ui/cdd-service.d.ts +9 -7
  311. package/dist/ui/cdd-service.d.ts.map +1 -1
  312. package/dist/ui/cdd-service.js +7 -5
  313. package/dist/ui/migrations-api.d.ts +3 -0
  314. package/dist/ui/migrations-api.d.ts.map +1 -0
  315. package/dist/ui/migrations-api.js +215 -0
  316. package/dist/ui-web/assets/index-D3QNH-Dv.css +1 -0
  317. package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
  318. package/dist/ui-web/index.html +2 -2
  319. package/dist/utils/formatter.d.ts.map +1 -1
  320. package/dist/utils/formatter.js +7 -5
  321. package/dist/utils/fs-utils.d.ts +3 -3
  322. package/dist/utils/fs-utils.d.ts.map +1 -1
  323. package/dist/utils/fs-utils.js +6 -6
  324. package/dist/utils/model.d.ts +3 -5
  325. package/dist/utils/model.d.ts.map +1 -1
  326. package/dist/utils/model.js +1 -1
  327. package/dist/utils/object-utils.d.ts +1 -1
  328. package/dist/utils/object-utils.d.ts.map +1 -1
  329. package/dist/utils/object-utils.js +17 -16
  330. package/dist/utils/process-utils.d.ts.map +1 -1
  331. package/dist/utils/process-utils.js +4 -2
  332. package/dist/utils/runtime-value.d.ts +13 -0
  333. package/dist/utils/runtime-value.d.ts.map +1 -0
  334. package/dist/utils/runtime-value.js +40 -0
  335. package/dist/utils/sql-parser.d.ts +8 -1
  336. package/dist/utils/sql-parser.d.ts.map +1 -1
  337. package/dist/utils/sql-parser.js +6 -3
  338. package/dist/utils/type-utils.d.ts.map +1 -1
  339. package/dist/utils/type-utils.js +10 -8
  340. package/dist/utils/utils.d.ts +2 -2
  341. package/dist/utils/utils.d.ts.map +1 -1
  342. package/dist/utils/utils.js +11 -8
  343. package/dist/utils/zod-error.d.ts.map +1 -1
  344. package/dist/utils/zod-error.js +7 -4
  345. package/dist/vector/chunking.d.ts.map +1 -1
  346. package/dist/vector/chunking.js +1 -1
  347. package/dist/vector/embedding.d.ts.map +1 -1
  348. package/dist/vector/embedding.js +1 -1
  349. package/dist/vector/types.d.ts +3 -2
  350. package/dist/vector/types.d.ts.map +1 -1
  351. package/package.json +11 -7
  352. package/src/ai/agents/agent.ts +5 -5
  353. package/src/ai/agents/types.ts +1 -1
  354. package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
  355. package/src/ai/providers/rtzr/error.ts +5 -3
  356. package/src/ai/providers/rtzr/model.ts +3 -2
  357. package/src/ai/providers/rtzr/options.ts +10 -5
  358. package/src/ai/providers/rtzr/provider.ts +10 -10
  359. package/src/ai/providers/rtzr/utils.ts +3 -1
  360. package/src/api/__tests__/config.test.ts +11 -21
  361. package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
  362. package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
  363. package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
  364. package/src/api/caster.ts +6 -8
  365. package/src/api/code-converters.ts +136 -36
  366. package/src/api/config.ts +62 -4
  367. package/src/api/context.ts +3 -3
  368. package/src/api/decorators.ts +28 -17
  369. package/src/api/http-validator.ts +149 -0
  370. package/src/api/sonamu.ts +459 -152
  371. package/src/api/websocket-helpers.ts +24 -17
  372. package/src/auth/audit-log/builders.ts +3 -2
  373. package/src/auth/audit-log/client-ip.ts +4 -2
  374. package/src/auth/audit-log/events.ts +15 -1
  375. package/src/auth/audit-log/plugin.ts +129 -200
  376. package/src/auth/audit-log-ingestor.ts +19 -15
  377. package/src/auth/auth-generator.ts +10 -5
  378. package/src/auth/better-auth-request.ts +4 -3
  379. package/src/auth/knex-adapter.ts +8 -2
  380. package/src/auth/plugins/entity-definitions/index.ts +6 -5
  381. package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
  382. package/src/bin/__tests__/test-command.test.ts +9 -15
  383. package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
  384. package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
  385. package/src/bin/build-config.ts +167 -0
  386. package/src/bin/cli.ts +155 -38
  387. package/src/bin/compiler-policy.ts +35 -0
  388. package/src/bin/fixture.ts +14 -3
  389. package/src/bin/test-command.ts +74 -29
  390. package/src/bin/ts-loader-registration.ts +22 -4
  391. package/src/cache/decorator.ts +10 -3
  392. package/src/compress/compress.ts +17 -4
  393. package/src/cone/cone-generator.ts +34 -6
  394. package/src/database/__tests__/db.test.ts +1 -0
  395. package/src/database/__tests__/puri.test.ts +16 -15
  396. package/src/database/__tests__/transaction-scope.test.ts +5 -0
  397. package/src/database/_batch_update.ts +1 -0
  398. package/src/database/base-model.ts +81 -50
  399. package/src/database/base-model.types.ts +6 -6
  400. package/src/database/db.ts +29 -19
  401. package/src/database/knex.ts +30 -17
  402. package/src/database/puri-subset.test-d.ts +17 -0
  403. package/src/database/puri.ts +181 -143
  404. package/src/database/puri.types.test-d.ts +31 -1
  405. package/src/database/puri.types.ts +23 -21
  406. package/src/database/upsert-builder.ts +75 -53
  407. package/src/dict/sd.ts +15 -5
  408. package/src/dict/sonamu-dictionary.ts +6 -6
  409. package/src/dict/utils.ts +9 -1
  410. package/src/entity/entity-manager.ts +26 -9
  411. package/src/entity/entity-template-cone.ts +5 -10
  412. package/src/entity/entity.ts +50 -34
  413. package/src/env.ts +7 -3
  414. package/src/exceptions/error-handler.ts +17 -2
  415. package/src/exceptions/so-exceptions.ts +26 -20
  416. package/src/filter/utils.ts +21 -11
  417. package/src/index.ts +3 -0
  418. package/src/logger/configure.ts +26 -18
  419. package/src/migration/__tests__/migrator.test.ts +50 -57
  420. package/src/migration/code-generation.ts +132 -104
  421. package/src/migration/index-where-predicate.ts +51 -24
  422. package/src/migration/migration-set.ts +11 -5
  423. package/src/migration/migrator.ts +392 -244
  424. package/src/migration/postgresql-schema-reader.ts +52 -47
  425. package/src/migration/slack-confirm.ts +17 -15
  426. package/src/migration/types.ts +57 -0
  427. package/src/naite/naite-reporter.ts +1 -1
  428. package/src/naite/naite.ts +97 -24
  429. package/src/runtime-type.ts +34 -0
  430. package/src/ssr/hmr-opt-out.ts +78 -0
  431. package/src/ssr/renderer.ts +6 -0
  432. package/src/storage/base-file.ts +13 -13
  433. package/src/storage/buffered-file.ts +11 -11
  434. package/src/storage/s3-driver.ts +4 -1
  435. package/src/storage/uploaded-file.ts +8 -8
  436. package/src/stream/__tests__/ws-contracts.test.ts +4 -2
  437. package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
  438. package/src/stream/__tests__/ws.test.ts +30 -6
  439. package/src/stream/sse.ts +12 -11
  440. package/src/stream/ws-core.ts +1 -1
  441. package/src/stream/ws-delivery.ts +16 -7
  442. package/src/stream/ws-local-connection-store.ts +2 -3
  443. package/src/stream/ws-presence-store.ts +6 -1
  444. package/src/stream/ws-registry.ts +16 -7
  445. package/src/stream/ws-telemetry.ts +66 -43
  446. package/src/stream/ws.ts +73 -39
  447. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
  448. package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
  449. package/src/syncer/api-parser.ts +67 -27
  450. package/src/syncer/checksum.ts +17 -11
  451. package/src/syncer/code-generator.ts +25 -17
  452. package/src/syncer/entity-operations.ts +3 -5
  453. package/src/syncer/file-copy.ts +46 -0
  454. package/src/syncer/file-patterns.ts +11 -8
  455. package/src/syncer/file-tracking.ts +3 -4
  456. package/src/syncer/filesystem-dependencies.ts +73 -0
  457. package/src/syncer/module-loader.ts +8 -4
  458. package/src/syncer/syncer-actions.ts +56 -18
  459. package/src/syncer/syncer.ts +116 -43
  460. package/src/syncer/watcher.ts +8 -4
  461. package/src/tasks/decorator.ts +20 -12
  462. package/src/tasks/step-wrapper.ts +19 -9
  463. package/src/tasks/workflow-manager.ts +15 -9
  464. package/src/template/__tests__/http_validators.template.test.ts +160 -0
  465. package/src/template/__tests__/services.template.mutation.test.ts +24 -23
  466. package/src/template/__tests__/services.template.websocket.test.ts +21 -25
  467. package/src/template/entity-converter.ts +5 -2
  468. package/src/template/helpers.ts +8 -9
  469. package/src/template/implementations/generated.template.ts +5 -4
  470. package/src/template/implementations/generated_http.template.ts +61 -15
  471. package/src/template/implementations/generated_sso.template.ts +15 -4
  472. package/src/template/implementations/http_validators.template.ts +175 -0
  473. package/src/template/implementations/model.template.ts +3 -1
  474. package/src/template/implementations/sd.template.ts +81 -41
  475. package/src/template/implementations/services.template.ts +2 -2
  476. package/src/template/implementations/view_form.template.ts +56 -39
  477. package/src/template/implementations/view_list.template.ts +31 -23
  478. package/src/template/template-manager.ts +15 -13
  479. package/src/template/template-types.ts +13 -5
  480. package/src/template/template.ts +4 -3
  481. package/src/template/zod-converter.ts +206 -91
  482. package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
  483. package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
  484. package/src/testing/_relation-graph.ts +4 -1
  485. package/src/testing/bootstrap.ts +12 -5
  486. package/src/testing/data-explorer.ts +102 -53
  487. package/src/testing/dev-test-routes.ts +87 -50
  488. package/src/testing/dev-vitest-manager.ts +88 -32
  489. package/src/testing/faker-mappings.ts +2 -2
  490. package/src/testing/filesystem.ts +1 -0
  491. package/src/testing/fixture-generator.ts +191 -131
  492. package/src/testing/fixture-loader.ts +5 -1
  493. package/src/testing/fixture-manager.ts +129 -90
  494. package/src/testing/global-setup.ts +7 -3
  495. package/src/testing/index.ts +5 -0
  496. package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
  497. package/src/types/types.ts +184 -158
  498. package/src/ui/ai-api.ts +9 -7
  499. package/src/ui/ai-client.ts +61 -56
  500. package/src/ui/api.ts +726 -770
  501. package/src/ui/async-route.ts +4 -0
  502. package/src/ui/cdd-service.ts +35 -12
  503. package/src/ui/migrations-api.ts +381 -0
  504. package/src/utils/formatter.ts +7 -3
  505. package/src/utils/fs-utils.ts +5 -5
  506. package/src/utils/model.ts +4 -5
  507. package/src/utils/object-utils.ts +32 -22
  508. package/src/utils/process-utils.ts +4 -1
  509. package/src/utils/runtime-value.ts +43 -0
  510. package/src/utils/sql-parser.ts +13 -6
  511. package/src/utils/type-utils.ts +9 -7
  512. package/src/utils/utils.ts +19 -21
  513. package/src/utils/zod-error.ts +4 -2
  514. package/src/vector/chunking.ts +6 -1
  515. package/src/vector/embedding.ts +2 -1
  516. package/src/vector/types.ts +4 -2
  517. package/tsdown.api.config.ts +5 -2
  518. package/dist/ui-web/assets/index-CJf8uJYf.js +0 -176
  519. package/dist/ui-web/assets/index-GMMIVGja.css +0 -1
@@ -17,46 +17,46 @@ export abstract class BaseFile {
17
17
  url?: string;
18
18
  signedUrl?: string;
19
19
  }) {
20
- this._filename = params.filename;
21
- this._mimetype = params.mimetype;
22
- this._size = params.size;
23
- this._url = params.url;
24
- this._signedUrl = params.signedUrl;
20
+ this["_filename"] = params.filename;
21
+ this["_mimetype"] = params.mimetype;
22
+ this["_size"] = params.size;
23
+ this["_url"] = params.url;
24
+ this["_signedUrl"] = params.signedUrl;
25
25
  }
26
26
 
27
27
  /** 원본 파일명 */
28
28
  get filename(): string {
29
- return this._filename;
29
+ return this["_filename"];
30
30
  }
31
31
 
32
32
  /** MIME 타입 */
33
33
  get mimetype(): string {
34
- return this._mimetype;
34
+ return this["_mimetype"];
35
35
  }
36
36
 
37
37
  /** 파일 크기 (bytes) */
38
38
  get size(): number {
39
- return this._size;
39
+ return this["_size"];
40
40
  }
41
41
 
42
42
  /** 확장자 (점 제외) */
43
43
  get extname(): string | false {
44
- return mime.extension(this._mimetype);
44
+ return mime.extension(this["_mimetype"]);
45
45
  }
46
46
 
47
47
  /** 저장된 URL (Unsigned) */
48
48
  get url(): string {
49
- if (this._url === undefined) {
49
+ if (this["_url"] === undefined) {
50
50
  throw new Error("url이 설정되지 않았습니다.");
51
51
  }
52
- return this._url;
52
+ return this["_url"];
53
53
  }
54
54
 
55
55
  /** 저장된 URL (Signed) */
56
56
  get signedUrl(): string {
57
- if (this._signedUrl === undefined) {
57
+ if (this["_signedUrl"] === undefined) {
58
58
  throw new Error("signedUrl이 설정되지 않았습니다.");
59
59
  }
60
- return this._signedUrl;
60
+ return this["_signedUrl"];
61
61
  }
62
62
  }
@@ -10,8 +10,8 @@ import { type DriverKey } from "./drivers";
10
10
  * 메모리에 로드된 상태로, md5 계산이나 이미지 처리 등 유연한 작업이 가능합니다.
11
11
  */
12
12
  export class BufferedFile extends BaseFile {
13
- private _file: MultipartFile;
14
- private _buffer: Buffer;
13
+ private fileValue: MultipartFile;
14
+ private bufferValue: Buffer;
15
15
 
16
16
  constructor(file: MultipartFile, buffer: Buffer) {
17
17
  super({
@@ -19,18 +19,18 @@ export class BufferedFile extends BaseFile {
19
19
  mimetype: file.mimetype,
20
20
  size: buffer.length,
21
21
  });
22
- this._file = file;
23
- this._buffer = buffer;
22
+ this.fileValue = file;
23
+ this.bufferValue = buffer;
24
24
  }
25
25
 
26
26
  /** 파일 Buffer */
27
27
  get buffer(): Buffer {
28
- return this._buffer;
28
+ return this.bufferValue;
29
29
  }
30
30
 
31
31
  /** MD5 해시 계산 */
32
32
  async md5(): Promise<string> {
33
- return createHash("md5").update(this._buffer).digest("hex");
33
+ return createHash("md5").update(this.bufferValue).digest("hex");
34
34
  }
35
35
 
36
36
  /**
@@ -44,19 +44,19 @@ export class BufferedFile extends BaseFile {
44
44
  const { Sonamu } = await import("../api/sonamu");
45
45
  const disk = Sonamu.storage.use(diskName);
46
46
 
47
- await disk.put(key, new Uint8Array(this._buffer), {
47
+ await disk.put(key, new Uint8Array(this.bufferValue), {
48
48
  contentType: this.mimetype,
49
49
  });
50
50
 
51
- this._url = await disk.getUrl(key);
52
- this._signedUrl = await disk.getSignedUrl(key);
51
+ this["_url"] = await disk.getUrl(key);
52
+ this["_signedUrl"] = await disk.getSignedUrl(key);
53
53
 
54
54
  // signed url은 만료 시간이 있기 때문에, unsigned url을 반환합니다.
55
- return this._url;
55
+ return this["_url"];
56
56
  }
57
57
 
58
58
  /** 원본 MultipartFile 접근 */
59
59
  get raw(): MultipartFile {
60
- return this._file;
60
+ return this.fileValue;
61
61
  }
62
62
  }
@@ -62,7 +62,10 @@ export class SonamuS3Driver extends S3Driver {
62
62
 
63
63
  // ACL 지원 시에만 설정
64
64
  if (this.sonamuSupportsACL) {
65
- uploadParams.ACL = (visibility === "public" ? "public-read" : "private") as ObjectCannedACL;
65
+ uploadParams.ACL =
66
+ /* SAFETY: 호출 경계의 선행 검증과 소유 타입 계약이 이 값의 타입을 보장한다. */ (
67
+ visibility === "public" ? "public-read" : "private"
68
+ ) as ObjectCannedACL;
66
69
  }
67
70
 
68
71
  const upload = new Upload({
@@ -6,8 +6,8 @@ import { type DriverKey } from "./drivers";
6
6
  * 이미 저장소에 스트리밍 완료된 상태로, url/key 등 메타데이터만 접근 가능합니다.
7
7
  */
8
8
  export class UploadedFile extends BaseFile {
9
- private _key: string;
10
- private _diskName: DriverKey;
9
+ private keyValue: string;
10
+ private diskNameValue: DriverKey;
11
11
 
12
12
  constructor(params: {
13
13
  filename: string;
@@ -25,18 +25,18 @@ export class UploadedFile extends BaseFile {
25
25
  url: params.url,
26
26
  signedUrl: params.signedUrl,
27
27
  });
28
- this._key = params.key;
29
- this._diskName = params.diskName;
28
+ this.keyValue = params.key;
29
+ this.diskNameValue = params.diskName;
30
30
  }
31
31
 
32
32
  /** 저장소 내 키 */
33
33
  get key(): string {
34
- return this._key;
34
+ return this.keyValue;
35
35
  }
36
36
 
37
37
  /** 저장된 디스크 이름 */
38
38
  get diskName(): DriverKey {
39
- return this._diskName;
39
+ return this.diskNameValue;
40
40
  }
41
41
 
42
42
  /**
@@ -45,9 +45,9 @@ export class UploadedFile extends BaseFile {
45
45
  */
46
46
  async download(): Promise<Buffer> {
47
47
  const { Sonamu } = await import("../api/sonamu");
48
- const disk = Sonamu.storage.use(this._diskName);
48
+ const disk = Sonamu.storage.use(this.diskNameValue);
49
49
 
50
- const uint8Array = await disk.get(this._key);
50
+ const uint8Array = await disk.get(this.keyValue);
51
51
  return Buffer.from(uint8Array);
52
52
  }
53
53
  }
@@ -13,6 +13,8 @@ import { WebSocketDeliveryEngine } from "../ws-delivery";
13
13
  import { WebSocketLocalConnectionStore } from "../ws-local-connection-store";
14
14
  import { InMemoryWebSocketPresenceStore } from "../ws-presence-store";
15
15
 
16
+ type PublishedData = Parameters<ManagedWebSocketConnection["publishUntyped"]>[1];
17
+
16
18
  async function waitForAsyncQueue(rounds: number = 3): Promise<void> {
17
19
  for (let index = 0; index < rounds; index += 1) {
18
20
  await new Promise<void>((resolve) => {
@@ -48,7 +50,7 @@ class ContractClusterBus implements WebSocketClusterBus {
48
50
  }
49
51
 
50
52
  class ContractConnection implements ManagedWebSocketConnection {
51
- readonly sent: Array<{ event: string; data: unknown }> = [];
53
+ readonly sent: Array<{ event: string; data: PublishedData }> = [];
52
54
  closed = false;
53
55
 
54
56
  constructor(
@@ -56,7 +58,7 @@ class ContractConnection implements ManagedWebSocketConnection {
56
58
  readonly namespace: string,
57
59
  ) {}
58
60
 
59
- publishUntyped(event: string, data: unknown): void {
61
+ publishUntyped<Data>(event: string, data: Data): void {
60
62
  this.sent.push({ event, data });
61
63
  }
62
64
 
@@ -562,7 +562,7 @@ describe("metric source", () => {
562
562
  };
563
563
 
564
564
  const unsubscribe = controller.registerMetricSource(source);
565
- expect(typeof unsubscribe).toBe("function");
565
+ expect(unsubscribe).toBeInstanceOf(Function);
566
566
 
567
567
  const snapshotBefore = controller.getMetricsSnapshot();
568
568
  expect(snapshotBefore.activeConnections).toBe(7);
@@ -1,10 +1,9 @@
1
1
  import { EventEmitter } from "node:events";
2
2
 
3
3
  import { describe, expect, it, vi } from "vitest";
4
- import { type WebSocket } from "ws";
5
4
  import { z } from "zod";
6
5
 
7
- import { createWebSocketRuntime } from "../ws";
6
+ import { createWebSocketRuntime, type WebSocketTransport } from "../ws";
8
7
  import { WebSocketAudience } from "../ws-audience";
9
8
  import {
10
9
  type WebSocketClusterBus,
@@ -48,8 +47,33 @@ class FakeWebSocket extends EventEmitter {
48
47
  }
49
48
  }
50
49
 
51
- function asWebSocket(socket: FakeWebSocket): WebSocket {
52
- return socket as unknown as WebSocket;
50
+ function asWebSocket(socket: FakeWebSocket): WebSocketTransport {
51
+ return {
52
+ get bufferedAmount() {
53
+ return socket.bufferedAmount;
54
+ },
55
+ get readyState() {
56
+ return socket.readyState;
57
+ },
58
+ close(code, reason) {
59
+ socket.close(code, reason?.toString());
60
+ },
61
+ off(...args) {
62
+ socket.off(...args);
63
+ },
64
+ on(...args) {
65
+ socket.on(...args);
66
+ },
67
+ ping() {
68
+ socket.ping();
69
+ },
70
+ send(data) {
71
+ socket.send(data.toString());
72
+ },
73
+ terminate() {
74
+ socket.terminate();
75
+ },
76
+ };
53
77
  }
54
78
 
55
79
  class FakeClusterBus implements WebSocketClusterBus {
@@ -665,8 +689,8 @@ describe("WebSocketRuntime", () => {
665
689
  namespace: "chat",
666
690
  });
667
691
 
668
- let unhandled: unknown = null;
669
- const handleUnhandledRejection = (reason: unknown) => {
692
+ let unhandled: Error | null = null;
693
+ const handleUnhandledRejection = (reason: Error) => {
670
694
  unhandled = reason;
671
695
  };
672
696
  process.once("unhandledRejection", handleUnhandledRejection);
package/src/stream/sse.ts CHANGED
@@ -29,26 +29,26 @@ export interface SSEConnection<T extends z.ZodObject> {
29
29
  }
30
30
 
31
31
  class SSEConnectionImpl<T extends z.ZodObject> implements SSEConnection<T> {
32
- private _closed = false;
33
- private _closeCallbacks: Array<() => void> = [];
32
+ private closedState = false;
33
+ private closeCallbacks: Array<() => void> = [];
34
34
 
35
35
  private readonly markClosed = () => {
36
- this._closed = true;
36
+ this.closedState = true;
37
37
  this.fireCloseCallbacks();
38
38
  };
39
39
 
40
40
  get closed(): boolean {
41
- return this._closed;
41
+ return this.closedState;
42
42
  }
43
43
 
44
44
  onClose(callback: () => void): void {
45
- this._closeCallbacks.push(callback);
45
+ this.closeCallbacks.push(callback);
46
46
  }
47
47
 
48
48
  // 콜백을 한 번만 실행하고 배열을 비워 중복 호출을 방지
49
49
  private fireCloseCallbacks(): void {
50
- const callbacks = this._closeCallbacks;
51
- this._closeCallbacks = [];
50
+ const callbacks = this.closeCallbacks;
51
+ this.closeCallbacks = [];
52
52
  for (const cb of callbacks) {
53
53
  cb();
54
54
  }
@@ -63,22 +63,23 @@ class SSEConnectionImpl<T extends z.ZodObject> implements SSEConnection<T> {
63
63
  }
64
64
 
65
65
  publish<K extends keyof z.infer<T>>(event: K, data: z.infer<T>[K]): void {
66
- if (this._closed) {
66
+ if (this.closedState) {
67
67
  return;
68
68
  }
69
69
 
70
70
  this.reply.sse({
71
- event: event as string,
71
+ event:
72
+ /* SAFETY: 등록된 WebSocket 이벤트 스키마가 이 값의 타입을 보장한다. */ event as string,
72
73
  data: JSON.stringify(data),
73
74
  });
74
75
  }
75
76
 
76
77
  async end(): Promise<void> {
77
- if (this._closed) {
78
+ if (this.closedState) {
78
79
  return;
79
80
  }
80
81
 
81
- this._closed = true;
82
+ this.closedState = true;
82
83
  this.socket.off("close", this.markClosed);
83
84
  this.socket.off("error", this.markClosed);
84
85
  this.fireCloseCallbacks();
@@ -7,7 +7,7 @@ export interface ManagedWebSocketConnection {
7
7
  closed: boolean;
8
8
  // setUserId/clearUserId 호출로 갱신됨. telemetry emit 사이트에서 hot path lookup을 피하기 위해 connection에 캐싱한다
9
9
  readonly userId?: string;
10
- publishUntyped(event: string, data: unknown): void;
10
+ publishUntyped<Data>(event: string, data: Data): void;
11
11
  close(code?: number, reason?: string): void;
12
12
  }
13
13
 
@@ -1,5 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
 
3
+ import { runtimeTypeOf } from "../runtime-type";
3
4
  import { type WebSocketAudience } from "./ws-audience";
4
5
  import { type WebSocketAudienceResolver } from "./ws-audience-resolver";
5
6
  import { type WebSocketClusterBus, type WebSocketClusterEnvelope } from "./ws-cluster-bus";
@@ -43,7 +44,7 @@ export class WebSocketDeliveryEngine {
43
44
  });
44
45
  }
45
46
 
46
- publishToAudience(audience: WebSocketAudience, event: string, data: unknown): void {
47
+ publishToAudience<Data>(audience: WebSocketAudience, event: string, data: Data): void {
47
48
  const routingPlan = this.options.audienceResolver.resolve(audience);
48
49
  const localTargets = this.options.localConnections.getConnections(routingPlan.localSessionIds);
49
50
 
@@ -99,7 +100,7 @@ export class WebSocketDeliveryEngine {
99
100
  },
100
101
  });
101
102
  })
102
- .catch((error: unknown) => {
103
+ .catch((cause: unknown) => {
103
104
  const durationMs = performance.now() - publishStartedAt;
104
105
  this.telemetry.emit({
105
106
  name: "ws.cluster.envelope.failed",
@@ -112,7 +113,7 @@ export class WebSocketDeliveryEngine {
112
113
  durationMs,
113
114
  status: "error",
114
115
  attributes: { event },
115
- errorType: error instanceof Error ? error.name : typeof error,
116
+ errorType: cause instanceof Error ? cause.name : runtimeTypeOf(cause),
116
117
  });
117
118
  });
118
119
  }
@@ -123,7 +124,7 @@ export class WebSocketDeliveryEngine {
123
124
  await this.options.clusterBus.shutdown();
124
125
  }
125
126
 
126
- getTelemetrySnapshot(): { pendingFanOutJobs: number; pendingFanOutTargets: number } {
127
+ getTelemetrySnapshot() {
127
128
  let pendingFanOutTargets = 0;
128
129
 
129
130
  for (const job of this.pendingFanOutJobs) {
@@ -183,7 +184,11 @@ export class WebSocketDeliveryEngine {
183
184
  });
184
185
  }
185
186
 
186
- private enqueueFanOut(targets: ManagedWebSocketConnection[], event: string, data: unknown): void {
187
+ private enqueueFanOut<Data>(
188
+ targets: ManagedWebSocketConnection[],
189
+ event: string,
190
+ data: Data,
191
+ ): void {
187
192
  if (targets.length === 0) {
188
193
  return;
189
194
  }
@@ -236,7 +241,7 @@ export class WebSocketDeliveryEngine {
236
241
  }
237
242
  } catch (error) {
238
243
  status = "error";
239
- errorType = error instanceof Error ? error.name : typeof error;
244
+ errorType = error instanceof Error ? error.name : runtimeTypeOf(error);
240
245
  throw error;
241
246
  } finally {
242
247
  const durationMs = performance.now() - startedAt;
@@ -260,7 +265,11 @@ export class WebSocketDeliveryEngine {
260
265
  }
261
266
  }
262
267
 
263
- private safePublish(connection: ManagedWebSocketConnection, event: string, data: unknown): void {
268
+ private safePublish<Data>(
269
+ connection: ManagedWebSocketConnection,
270
+ event: string,
271
+ data: Data,
272
+ ): void {
264
273
  try {
265
274
  if (!connection.closed) {
266
275
  connection.publishUntyped(event, data);
@@ -1,3 +1,4 @@
1
+ import { isFunctionValue } from "../utils/runtime-value";
1
2
  import { type ManagedWebSocketConnection } from "./ws-core";
2
3
  import {
3
4
  type WebSocketTelemetryConnectionSnapshot,
@@ -71,7 +72,5 @@ export class WebSocketLocalConnectionStore {
71
72
  function isTelemetryInspectableConnection(
72
73
  connection: ManagedWebSocketConnection,
73
74
  ): connection is ManagedWebSocketConnection & TelemetryInspectableConnection {
74
- return (
75
- "getTelemetrySnapshot" in connection && typeof connection.getTelemetrySnapshot === "function"
76
- );
75
+ return "getTelemetrySnapshot" in connection && isFunctionValue(connection.getTelemetrySnapshot);
77
76
  }
@@ -317,7 +317,12 @@ function getBindingKey(namespace: string, id: string): string {
317
317
  return `${namespace}::${id}`;
318
318
  }
319
319
 
320
- function parseBindingKey(key: string): { namespace: string; id: string } {
320
+ interface PresenceBinding {
321
+ namespace: string;
322
+ id: string;
323
+ }
324
+
325
+ function parseBindingKey(key: string): PresenceBinding {
321
326
  const [namespace, ...rest] = key.split("::");
322
327
  return {
323
328
  namespace,
@@ -1,3 +1,4 @@
1
+ import { isFunctionValue } from "../utils/runtime-value";
1
2
  import { WebSocketAudience, type WebSocketAudience as WebSocketAudienceSpec } from "./ws-audience";
2
3
  import { WebSocketAudienceResolver } from "./ws-audience-resolver";
3
4
  import { NoopWebSocketClusterBus, type WebSocketClusterBus } from "./ws-cluster-bus";
@@ -253,19 +254,29 @@ export class WebSocketRegistry {
253
254
  });
254
255
  }
255
256
 
256
- broadcast(event: string, data: unknown, namespace?: string): void {
257
+ broadcast<Data>(event: string, data: Data, namespace?: string): void {
257
258
  this.publishToAudience(WebSocketAudience.all(namespace), event, data);
258
259
  }
259
260
 
260
- publishToRoom(roomId: WebSocketRoomId, event: string, data: unknown, namespace?: string): void {
261
+ publishToRoom<Data>(
262
+ roomId: WebSocketRoomId,
263
+ event: string,
264
+ data: Data,
265
+ namespace?: string,
266
+ ): void {
261
267
  this.publishToAudience(WebSocketAudience.room(roomId, namespace), event, data);
262
268
  }
263
269
 
264
- publishToUser(userId: WebSocketUserId, event: string, data: unknown, namespace?: string): void {
270
+ publishToUser<Data>(
271
+ userId: WebSocketUserId,
272
+ event: string,
273
+ data: Data,
274
+ namespace?: string,
275
+ ): void {
265
276
  this.publishToAudience(WebSocketAudience.user(userId, namespace), event, data);
266
277
  }
267
278
 
268
- publishToAudience(audience: WebSocketAudienceSpec, event: string, data: unknown): void {
279
+ publishToAudience<Data>(audience: WebSocketAudienceSpec, event: string, data: Data): void {
269
280
  this.deliveryEngine.publishToAudience(audience, event, data);
270
281
  }
271
282
 
@@ -313,7 +324,5 @@ function formatUserId(userId: WebSocketUserId | undefined): string | undefined {
313
324
  function isTelemetryContextProvider(
314
325
  connection: ManagedWebSocketConnection,
315
326
  ): connection is ManagedWebSocketConnection & TelemetryContextProvider {
316
- return (
317
- "getTelemetryContext" in connection && typeof connection.getTelemetryContext === "function"
318
- );
327
+ return "getTelemetryContext" in connection && isFunctionValue(connection.getTelemetryContext);
319
328
  }