@tstdl/base 0.93.182 → 0.93.183

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 (353) hide show
  1. package/api/server/api-request-token.provider.js +1 -1
  2. package/api/server/gateway.js +6 -1
  3. package/authentication/authentication.api.d.ts +13 -40
  4. package/authentication/authentication.api.js +5 -14
  5. package/authentication/client/authentication.service.d.ts +6 -14
  6. package/authentication/client/authentication.service.js +22 -4
  7. package/authentication/client/module.d.ts +1 -1
  8. package/authentication/client/module.js +4 -4
  9. package/authentication/models/index.d.ts +1 -0
  10. package/authentication/models/index.js +1 -0
  11. package/authentication/models/totp-results.model.d.ts +11 -0
  12. package/authentication/models/totp-results.model.js +37 -0
  13. package/authentication/server/authentication.api-controller.d.ts +3 -3
  14. package/authentication/server/authentication.api-controller.js +31 -4
  15. package/authentication/server/authentication.service.d.ts +5 -14
  16. package/authentication/server/authentication.service.js +6 -4
  17. package/core.d.ts +0 -5
  18. package/core.js +0 -8
  19. package/document-management/api/document-management.api.d.ts +2 -2
  20. package/document-management/service-models/document.service-model.d.ts +1 -1
  21. package/examples/config.d.ts +25 -0
  22. package/examples/config.js +26 -0
  23. package/notification/server/module.d.ts +1 -1
  24. package/notification/server/module.js +1 -1
  25. package/package.json +5 -5
  26. package/signals/api.d.ts +5 -1
  27. package/signals/api.js +3 -1
  28. package/signals/implementation/api.d.ts +13 -5
  29. package/signals/implementation/api.js +7 -1
  30. package/signals/implementation/asserts.d.ts +2 -2
  31. package/signals/implementation/asserts.js +3 -3
  32. package/signals/implementation/computed.d.ts +7 -34
  33. package/signals/implementation/computed.js +14 -83
  34. package/signals/implementation/configure.js +6 -2
  35. package/signals/implementation/effect.d.ts +65 -46
  36. package/signals/implementation/effect.js +97 -62
  37. package/signals/implementation/index.d.ts +2 -4
  38. package/signals/implementation/index.js +2 -4
  39. package/signals/implementation/linked_signal.d.ts +36 -0
  40. package/signals/implementation/linked_signal.js +34 -0
  41. package/signals/implementation/primitive/computed.d.ts +55 -0
  42. package/signals/implementation/primitive/computed.js +107 -0
  43. package/signals/implementation/primitive/effect.d.ts +26 -0
  44. package/signals/implementation/primitive/effect.js +31 -0
  45. package/signals/implementation/{equality.d.ts → primitive/equality.d.ts} +1 -1
  46. package/signals/implementation/{equality.js → primitive/equality.js} +1 -1
  47. package/signals/implementation/primitive/errors.d.ts +10 -0
  48. package/signals/implementation/{errors.js → primitive/errors.js} +3 -4
  49. package/signals/implementation/primitive/formatter.d.ts +19 -0
  50. package/signals/implementation/primitive/formatter.js +136 -0
  51. package/signals/implementation/{graph.d.ts → primitive/graph.d.ts} +68 -36
  52. package/signals/implementation/primitive/graph.js +386 -0
  53. package/signals/implementation/primitive/linked_signal.d.ts +46 -0
  54. package/signals/implementation/primitive/linked_signal.js +110 -0
  55. package/signals/implementation/primitive/signal.d.ts +31 -0
  56. package/signals/implementation/primitive/signal.js +80 -0
  57. package/signals/implementation/primitive/untracked.d.ts +12 -0
  58. package/signals/implementation/primitive/untracked.js +23 -0
  59. package/signals/implementation/{watch.d.ts → primitive/watch.d.ts} +1 -2
  60. package/signals/implementation/{watch.js → primitive/watch.js} +22 -16
  61. package/signals/implementation/resource/api.d.ts +275 -0
  62. package/signals/implementation/resource/api.js +26 -0
  63. package/signals/implementation/resource/debounce.d.ts +13 -0
  64. package/signals/implementation/resource/debounce.js +113 -0
  65. package/signals/implementation/resource/from_snapshots.d.ts +16 -0
  66. package/signals/implementation/resource/from_snapshots.js +44 -0
  67. package/signals/implementation/resource/index.d.ts +11 -0
  68. package/signals/implementation/resource/index.js +11 -0
  69. package/signals/implementation/resource/resource.d.ts +110 -0
  70. package/signals/implementation/resource/resource.js +402 -0
  71. package/signals/implementation/root_effect_scheduler.d.ts +50 -0
  72. package/signals/implementation/root_effect_scheduler.js +66 -0
  73. package/signals/implementation/signal.d.ts +42 -18
  74. package/signals/implementation/signal.js +29 -49
  75. package/signals/implementation/to-observable.d.ts +12 -5
  76. package/signals/implementation/to-observable.js +12 -2
  77. package/signals/implementation/to-signal.d.ts +9 -18
  78. package/signals/implementation/to-signal.js +46 -13
  79. package/signals/implementation/untracked.d.ts +1 -1
  80. package/signals/implementation/untracked.js +3 -11
  81. package/signals/operators/debounce.d.ts +8 -0
  82. package/signals/operators/debounce.js +19 -0
  83. package/signals/operators/derive-async.js +43 -15
  84. package/signals/operators/index.d.ts +2 -0
  85. package/signals/operators/index.js +2 -0
  86. package/signals/operators/throttle.d.ts +8 -0
  87. package/signals/operators/throttle.js +31 -0
  88. package/ai/genkit/tests/multi-region.test.d.ts +0 -2
  89. package/ai/genkit/tests/multi-region.test.js +0 -179
  90. package/ai/genkit/tests/token-limit-fallback.test.d.ts +0 -2
  91. package/ai/genkit/tests/token-limit-fallback.test.js +0 -209
  92. package/ai/prompts/tests/prompt-builder.test.d.ts +0 -1
  93. package/ai/prompts/tests/prompt-builder.test.js +0 -22
  94. package/ai/tests/instructions-formatter.test.d.ts +0 -1
  95. package/ai/tests/instructions-formatter.test.js +0 -116
  96. package/ai/tests/steering.test.d.ts +0 -1
  97. package/ai/tests/steering.test.js +0 -37
  98. package/api/client/tests/api-client.test.d.ts +0 -1
  99. package/api/client/tests/api-client.test.js +0 -194
  100. package/api/server/tests/csrf.middleware.test.d.ts +0 -1
  101. package/api/server/tests/csrf.middleware.test.js +0 -91
  102. package/authentication/tests/authentication-password-requirements.validator.test.d.ts +0 -1
  103. package/authentication/tests/authentication-password-requirements.validator.test.js +0 -29
  104. package/authentication/tests/authentication.api-controller.test.d.ts +0 -1
  105. package/authentication/tests/authentication.api-controller.test.js +0 -156
  106. package/authentication/tests/authentication.api-request-token.provider.test.d.ts +0 -1
  107. package/authentication/tests/authentication.api-request-token.provider.test.js +0 -48
  108. package/authentication/tests/authentication.client-error-handling.test.d.ts +0 -1
  109. package/authentication/tests/authentication.client-error-handling.test.js +0 -123
  110. package/authentication/tests/authentication.client-middleware.test.d.ts +0 -1
  111. package/authentication/tests/authentication.client-middleware.test.js +0 -118
  112. package/authentication/tests/authentication.client-service-methods.test.d.ts +0 -1
  113. package/authentication/tests/authentication.client-service-methods.test.js +0 -177
  114. package/authentication/tests/authentication.client-service-refresh.test.d.ts +0 -1
  115. package/authentication/tests/authentication.client-service-refresh.test.js +0 -153
  116. package/authentication/tests/authentication.client-service.test.d.ts +0 -1
  117. package/authentication/tests/authentication.client-service.test.js +0 -76
  118. package/authentication/tests/authentication.refresh-busy-loop.test.d.ts +0 -1
  119. package/authentication/tests/authentication.refresh-busy-loop.test.js +0 -84
  120. package/authentication/tests/authentication.service.test.d.ts +0 -1
  121. package/authentication/tests/authentication.service.test.js +0 -167
  122. package/authentication/tests/authentication.test-ancillary-service.d.ts +0 -9
  123. package/authentication/tests/authentication.test-ancillary-service.js +0 -27
  124. package/authentication/tests/brute-force-protection.test.d.ts +0 -1
  125. package/authentication/tests/brute-force-protection.test.js +0 -211
  126. package/authentication/tests/helper.test.d.ts +0 -1
  127. package/authentication/tests/helper.test.js +0 -122
  128. package/authentication/tests/password-requirements.error.test.d.ts +0 -1
  129. package/authentication/tests/password-requirements.error.test.js +0 -14
  130. package/authentication/tests/remember.api.test.d.ts +0 -1
  131. package/authentication/tests/remember.api.test.js +0 -117
  132. package/authentication/tests/remember.service.test.d.ts +0 -1
  133. package/authentication/tests/remember.service.test.js +0 -83
  134. package/authentication/tests/subject.service.test.d.ts +0 -1
  135. package/authentication/tests/subject.service.test.js +0 -140
  136. package/authentication/tests/suspended-subject.test.d.ts +0 -1
  137. package/authentication/tests/suspended-subject.test.js +0 -120
  138. package/authentication/tests/totp.enrollment.test.d.ts +0 -1
  139. package/authentication/tests/totp.enrollment.test.js +0 -123
  140. package/authentication/tests/totp.login.test.d.ts +0 -1
  141. package/authentication/tests/totp.login.test.js +0 -213
  142. package/authentication/tests/totp.recovery-codes.test.d.ts +0 -1
  143. package/authentication/tests/totp.recovery-codes.test.js +0 -97
  144. package/authentication/tests/totp.status.test.d.ts +0 -1
  145. package/authentication/tests/totp.status.test.js +0 -72
  146. package/cancellation/tests/coverage.test.d.ts +0 -1
  147. package/cancellation/tests/coverage.test.js +0 -49
  148. package/cancellation/tests/leak.test.d.ts +0 -1
  149. package/cancellation/tests/leak.test.js +0 -35
  150. package/cancellation/tests/token.test.d.ts +0 -1
  151. package/cancellation/tests/token.test.js +0 -136
  152. package/circuit-breaker/tests/circuit-breaker.test.d.ts +0 -1
  153. package/circuit-breaker/tests/circuit-breaker.test.js +0 -116
  154. package/cryptography/tests/cryptography.test.d.ts +0 -1
  155. package/cryptography/tests/cryptography.test.js +0 -175
  156. package/cryptography/tests/jwt.test.d.ts +0 -1
  157. package/cryptography/tests/jwt.test.js +0 -54
  158. package/cryptography/tests/modern.test.d.ts +0 -1
  159. package/cryptography/tests/modern.test.js +0 -105
  160. package/cryptography/tests/module.test.d.ts +0 -1
  161. package/cryptography/tests/module.test.js +0 -100
  162. package/cryptography/tests/totp.test.d.ts +0 -1
  163. package/cryptography/tests/totp.test.js +0 -108
  164. package/document-management/tests/ai-config-hierarchy.test.d.ts +0 -1
  165. package/document-management/tests/ai-config-hierarchy.test.js +0 -59
  166. package/document-management/tests/ai-config-integration.test.d.ts +0 -1
  167. package/document-management/tests/ai-config-integration.test.js +0 -125
  168. package/document-management/tests/ai-config-merge.test.d.ts +0 -1
  169. package/document-management/tests/ai-config-merge.test.js +0 -46
  170. package/document-management/tests/document-management-ai-overrides.test.d.ts +0 -1
  171. package/document-management/tests/document-management-ai-overrides.test.js +0 -63
  172. package/document-management/tests/document-management-core.test.d.ts +0 -1
  173. package/document-management/tests/document-management-core.test.js +0 -157
  174. package/document-management/tests/document-management.api.test.d.ts +0 -1
  175. package/document-management/tests/document-management.api.test.js +0 -101
  176. package/document-management/tests/document-statistics.service.test.d.ts +0 -1
  177. package/document-management/tests/document-statistics.service.test.js +0 -498
  178. package/document-management/tests/document-validation-ai-overrides.test.d.ts +0 -1
  179. package/document-management/tests/document-validation-ai-overrides.test.js +0 -87
  180. package/document-management/tests/document.service.test.d.ts +0 -1
  181. package/document-management/tests/document.service.test.js +0 -143
  182. package/document-management/tests/enum-helpers.test.d.ts +0 -1
  183. package/document-management/tests/enum-helpers.test.js +0 -452
  184. package/document-management/tests/helper.d.ts +0 -24
  185. package/document-management/tests/helper.js +0 -39
  186. package/errors/tests/format.test.d.ts +0 -1
  187. package/errors/tests/format.test.js +0 -84
  188. package/http/tests/server-timing.test.d.ts +0 -1
  189. package/http/tests/server-timing.test.js +0 -42
  190. package/injector/tests/advanced.test.d.ts +0 -1
  191. package/injector/tests/advanced.test.js +0 -116
  192. package/injector/tests/async-init.test.d.ts +0 -1
  193. package/injector/tests/async-init.test.js +0 -77
  194. package/injector/tests/basic.test.d.ts +0 -1
  195. package/injector/tests/basic.test.js +0 -114
  196. package/injector/tests/hierarchical.test.d.ts +0 -1
  197. package/injector/tests/hierarchical.test.js +0 -59
  198. package/injector/tests/leak.test.d.ts +0 -1
  199. package/injector/tests/leak.test.js +0 -45
  200. package/injector/tests/lifecycles.test.d.ts +0 -1
  201. package/injector/tests/lifecycles.test.js +0 -109
  202. package/logger/tests/pretty-print.test.d.ts +0 -1
  203. package/logger/tests/pretty-print.test.js +0 -60
  204. package/notification/tests/notification-api.test.d.ts +0 -1
  205. package/notification/tests/notification-api.test.js +0 -124
  206. package/notification/tests/notification-client.test.d.ts +0 -1
  207. package/notification/tests/notification-client.test.js +0 -101
  208. package/notification/tests/notification-flow.test.d.ts +0 -1
  209. package/notification/tests/notification-flow.test.js +0 -296
  210. package/notification/tests/notification-sse.service.test.d.ts +0 -1
  211. package/notification/tests/notification-sse.service.test.js +0 -43
  212. package/notification/tests/notification-type.service.test.d.ts +0 -1
  213. package/notification/tests/notification-type.service.test.js +0 -41
  214. package/object-storage/s3/tests/s3.object-storage.integration.test.d.ts +0 -1
  215. package/object-storage/s3/tests/s3.object-storage.integration.test.js +0 -303
  216. package/orm/tests/build-jsonb.test.d.ts +0 -1
  217. package/orm/tests/build-jsonb.test.js +0 -39
  218. package/orm/tests/data-types.test.d.ts +0 -1
  219. package/orm/tests/data-types.test.js +0 -39
  220. package/orm/tests/database-extension.test.d.ts +0 -1
  221. package/orm/tests/database-extension.test.js +0 -63
  222. package/orm/tests/database-migration.test.d.ts +0 -1
  223. package/orm/tests/database-migration.test.js +0 -83
  224. package/orm/tests/decorators.test.d.ts +0 -1
  225. package/orm/tests/decorators.test.js +0 -77
  226. package/orm/tests/encryption.test.d.ts +0 -1
  227. package/orm/tests/encryption.test.js +0 -31
  228. package/orm/tests/query-complex.test.d.ts +0 -1
  229. package/orm/tests/query-complex.test.js +0 -172
  230. package/orm/tests/query-converter-complex.test.d.ts +0 -1
  231. package/orm/tests/query-converter-complex.test.js +0 -131
  232. package/orm/tests/query-converter.test.d.ts +0 -1
  233. package/orm/tests/query-converter.test.js +0 -123
  234. package/orm/tests/repository-advanced.test.d.ts +0 -1
  235. package/orm/tests/repository-advanced.test.js +0 -189
  236. package/orm/tests/repository-attributes.test.d.ts +0 -1
  237. package/orm/tests/repository-attributes.test.js +0 -83
  238. package/orm/tests/repository-compound-primary-key.test.d.ts +0 -2
  239. package/orm/tests/repository-compound-primary-key.test.js +0 -226
  240. package/orm/tests/repository-comprehensive.test.d.ts +0 -1
  241. package/orm/tests/repository-comprehensive.test.js +0 -162
  242. package/orm/tests/repository-coverage.test.d.ts +0 -2
  243. package/orm/tests/repository-coverage.test.js +0 -242
  244. package/orm/tests/repository-cti-complex.test.d.ts +0 -1
  245. package/orm/tests/repository-cti-complex.test.js +0 -151
  246. package/orm/tests/repository-cti-embedded.test.d.ts +0 -1
  247. package/orm/tests/repository-cti-embedded.test.js +0 -178
  248. package/orm/tests/repository-cti-extensive.test.d.ts +0 -2
  249. package/orm/tests/repository-cti-extensive.test.js +0 -279
  250. package/orm/tests/repository-cti-mapping.test.d.ts +0 -2
  251. package/orm/tests/repository-cti-mapping.test.js +0 -108
  252. package/orm/tests/repository-cti-search.test.d.ts +0 -1
  253. package/orm/tests/repository-cti-search.test.js +0 -141
  254. package/orm/tests/repository-cti-soft-delete.test.d.ts +0 -2
  255. package/orm/tests/repository-cti-soft-delete.test.js +0 -103
  256. package/orm/tests/repository-cti-transactions.test.d.ts +0 -1
  257. package/orm/tests/repository-cti-transactions.test.js +0 -112
  258. package/orm/tests/repository-cti-upsert-many.test.d.ts +0 -2
  259. package/orm/tests/repository-cti-upsert-many.test.js +0 -115
  260. package/orm/tests/repository-cti.test.d.ts +0 -2
  261. package/orm/tests/repository-cti.test.js +0 -390
  262. package/orm/tests/repository-edge-cases.test.d.ts +0 -1
  263. package/orm/tests/repository-edge-cases.test.js +0 -178
  264. package/orm/tests/repository-expiration.test.d.ts +0 -2
  265. package/orm/tests/repository-expiration.test.js +0 -140
  266. package/orm/tests/repository-extra-coverage.test.d.ts +0 -2
  267. package/orm/tests/repository-extra-coverage.test.js +0 -402
  268. package/orm/tests/repository-mapping.test.d.ts +0 -2
  269. package/orm/tests/repository-mapping.test.js +0 -65
  270. package/orm/tests/repository-regression.test.d.ts +0 -1
  271. package/orm/tests/repository-regression.test.js +0 -288
  272. package/orm/tests/repository-search-coverage.test.d.ts +0 -1
  273. package/orm/tests/repository-search-coverage.test.js +0 -107
  274. package/orm/tests/repository-search.test.d.ts +0 -1
  275. package/orm/tests/repository-search.test.js +0 -105
  276. package/orm/tests/repository-soft-delete.test.d.ts +0 -1
  277. package/orm/tests/repository-soft-delete.test.js +0 -118
  278. package/orm/tests/repository-transactions-nested.test.d.ts +0 -1
  279. package/orm/tests/repository-transactions-nested.test.js +0 -178
  280. package/orm/tests/repository-types.test.d.ts +0 -1
  281. package/orm/tests/repository-types.test.js +0 -184
  282. package/orm/tests/repository-undelete.test.d.ts +0 -2
  283. package/orm/tests/repository-undelete.test.js +0 -201
  284. package/orm/tests/schema-converter.test.d.ts +0 -1
  285. package/orm/tests/schema-converter.test.js +0 -82
  286. package/orm/tests/schema-generation.test.d.ts +0 -2
  287. package/orm/tests/schema-generation.test.js +0 -174
  288. package/orm/tests/sql-helpers.test.d.ts +0 -1
  289. package/orm/tests/sql-helpers.test.js +0 -67
  290. package/orm/tests/transaction-safety.test.d.ts +0 -1
  291. package/orm/tests/transaction-safety.test.js +0 -81
  292. package/orm/tests/transactional.test.d.ts +0 -1
  293. package/orm/tests/transactional.test.js +0 -215
  294. package/orm/tests/utils.test.d.ts +0 -1
  295. package/orm/tests/utils.test.js +0 -70
  296. package/pdf/tests/utils.test.d.ts +0 -1
  297. package/pdf/tests/utils.test.js +0 -187
  298. package/process/tests/spawn.test.d.ts +0 -1
  299. package/process/tests/spawn.test.js +0 -182
  300. package/rate-limit/tests/postgres-rate-limiter.test.d.ts +0 -1
  301. package/rate-limit/tests/postgres-rate-limiter.test.js +0 -84
  302. package/renderer/tests/renderer.test.d.ts +0 -1
  303. package/renderer/tests/renderer.test.js +0 -88
  304. package/rpc/tests/rpc.integration.test.d.ts +0 -1
  305. package/rpc/tests/rpc.integration.test.js +0 -615
  306. package/signals/implementation/errors.d.ts +0 -2
  307. package/signals/implementation/graph.js +0 -312
  308. package/signals/implementation/writable-signal.d.ts +0 -48
  309. package/signals/implementation/writable-signal.js +0 -32
  310. package/task-queue/tests/coverage-branch.test.d.ts +0 -1
  311. package/task-queue/tests/coverage-branch.test.js +0 -395
  312. package/task-queue/tests/coverage-enhancement.test.d.ts +0 -1
  313. package/task-queue/tests/coverage-enhancement.test.js +0 -150
  314. package/task-queue/tests/dag.test.d.ts +0 -1
  315. package/task-queue/tests/dag.test.js +0 -188
  316. package/task-queue/tests/dependencies.test.d.ts +0 -1
  317. package/task-queue/tests/dependencies.test.js +0 -296
  318. package/task-queue/tests/enqueue-batch.test.d.ts +0 -1
  319. package/task-queue/tests/enqueue-batch.test.js +0 -125
  320. package/task-queue/tests/enqueue-item.test.d.ts +0 -1
  321. package/task-queue/tests/enqueue-item.test.js +0 -12
  322. package/task-queue/tests/fan-out-spawning.test.d.ts +0 -1
  323. package/task-queue/tests/fan-out-spawning.test.js +0 -94
  324. package/task-queue/tests/idempotent-replacement.test.d.ts +0 -1
  325. package/task-queue/tests/idempotent-replacement.test.js +0 -114
  326. package/task-queue/tests/missing-idempotent-tasks.test.d.ts +0 -1
  327. package/task-queue/tests/missing-idempotent-tasks.test.js +0 -39
  328. package/task-queue/tests/optimization-edge-cases.test.d.ts +0 -1
  329. package/task-queue/tests/optimization-edge-cases.test.js +0 -124
  330. package/task-queue/tests/queue-generic.test.d.ts +0 -1
  331. package/task-queue/tests/queue-generic.test.js +0 -8
  332. package/task-queue/tests/queue.test.d.ts +0 -1
  333. package/task-queue/tests/queue.test.js +0 -756
  334. package/task-queue/tests/shutdown.test.d.ts +0 -1
  335. package/task-queue/tests/shutdown.test.js +0 -41
  336. package/task-queue/tests/task-context.test.d.ts +0 -1
  337. package/task-queue/tests/task-context.test.js +0 -7
  338. package/task-queue/tests/task-union.test.d.ts +0 -1
  339. package/task-queue/tests/task-union.test.js +0 -18
  340. package/task-queue/tests/transactions.test.d.ts +0 -1
  341. package/task-queue/tests/transactions.test.js +0 -47
  342. package/task-queue/tests/typing.test.d.ts +0 -1
  343. package/task-queue/tests/typing.test.js +0 -9
  344. package/task-queue/tests/worker.test.d.ts +0 -1
  345. package/task-queue/tests/worker.test.js +0 -258
  346. package/task-queue/tests/zombie-parent.test.d.ts +0 -1
  347. package/task-queue/tests/zombie-parent.test.js +0 -45
  348. package/task-queue/tests/zombie-recovery.test.d.ts +0 -1
  349. package/task-queue/tests/zombie-recovery.test.js +0 -51
  350. package/utils/tests/backoff.test.d.ts +0 -1
  351. package/utils/tests/backoff.test.js +0 -41
  352. package/utils/tests/retry-with-backoff.test.d.ts +0 -1
  353. package/utils/tests/retry-with-backoff.test.js +0 -49
@@ -1,615 +0,0 @@
1
- import { CustomError } from '../../errors/custom.error.js';
2
- import { NotFoundError } from '../../errors/not-found.error.js';
3
- import { NotImplementedError } from '../../errors/not-implemented.error.js';
4
- import { NotSupportedError } from '../../errors/not-supported.error.js';
5
- import { internal } from '../../internal.js';
6
- import { registerSerializer, serialize } from '../../serializer/index.js';
7
- import { afterEach, beforeAll, describe, expect, it } from 'vitest';
8
- import { defaultReadableStreamRpcAdapter } from '../adapters/readable-stream.adapter.js';
9
- import { MessagePortRpcEndpoint } from '../endpoints/message-port.rpc-endpoint.js';
10
- import { RpcConnectionClosedError, RpcRemoteError } from '../rpc.error.js';
11
- import { Rpc } from '../rpc.js';
12
- class CustomData {
13
- foo;
14
- constructor(foo) {
15
- this.foo = foo;
16
- }
17
- }
18
- class MyAppError extends CustomError {
19
- static errorName = 'MyAppError';
20
- code;
21
- constructor(message, code) {
22
- super({ message });
23
- this.code = code;
24
- }
25
- }
26
- describe('Rpc Integration', () => {
27
- afterEach(() => {
28
- Rpc.reset();
29
- });
30
- beforeAll(async () => {
31
- try {
32
- Rpc.registerAdapter(defaultReadableStreamRpcAdapter);
33
- }
34
- catch {
35
- // ignore
36
- }
37
- try {
38
- registerSerializer(CustomData, 'CustomData', (instance) => ({ foo: instance.foo }), (data) => new CustomData(data.foo));
39
- registerSerializer(MyAppError, 'MyAppError', (instance) => ({ message: instance.message, code: instance.code, stack: instance.stack }), (data) => {
40
- const error = new MyAppError(data.message, data.code);
41
- error.stack = data.stack;
42
- return error;
43
- });
44
- registerSerializer(NotSupportedError, 'NotSupportedError', (instance) => ({ message: instance.message, stack: instance.stack }), (data) => {
45
- const error = new NotSupportedError(data.message);
46
- error.stack = data.stack;
47
- return error;
48
- });
49
- registerSerializer(NotImplementedError, 'NotImplementedError', (instance) => ({ message: instance.message, stack: instance.stack }), (data) => {
50
- const error = new NotImplementedError(data.message);
51
- error.stack = data.stack;
52
- return error;
53
- });
54
- registerSerializer(NotFoundError, 'NotFoundError', (instance) => ({ message: instance.message, stack: instance.stack }), (data) => {
55
- const error = new NotFoundError(data.message);
56
- error.stack = data.stack;
57
- return error;
58
- });
59
- }
60
- catch {
61
- // ignore
62
- }
63
- });
64
- it('should expose and connect to an object', async () => {
65
- const { port1, port2 } = new MessageChannel();
66
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
67
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
68
- const target = {
69
- add(a, b) {
70
- return a + b;
71
- },
72
- greet(name) {
73
- return `Hello, ${name}!`;
74
- },
75
- };
76
- Rpc.expose(target, 'test-service-1');
77
- Rpc.listen(serverEndpoint);
78
- const proxy = await Rpc.connect(clientEndpoint, 'test-service-1');
79
- const sum = await proxy.add(5, 3);
80
- expect(sum).toBe(8);
81
- const greeting = await proxy.greet('World');
82
- expect(greeting).toBe('Hello, World!');
83
- serverEndpoint.close();
84
- clientEndpoint.close();
85
- });
86
- it('should support property access', async () => {
87
- const { port1, port2 } = new MessageChannel();
88
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
89
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
90
- const target = {
91
- version: '1.0.0',
92
- config: {
93
- enabled: true,
94
- },
95
- };
96
- Rpc.expose(target, 'test-service-2');
97
- Rpc.listen(serverEndpoint);
98
- const proxy = await Rpc.connect(clientEndpoint, 'test-service-2');
99
- expect(await proxy.version).toBe('1.0.0');
100
- expect(await proxy.config.enabled).toBe(true);
101
- serverEndpoint.close();
102
- clientEndpoint.close();
103
- });
104
- it('should support setting properties via helper', async () => {
105
- const { port1, port2 } = new MessageChannel();
106
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
107
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
108
- const target = {
109
- value: 0,
110
- };
111
- Rpc.expose(target, 'test-service-3');
112
- Rpc.listen(serverEndpoint);
113
- const proxy = await Rpc.connect(clientEndpoint, 'test-service-3');
114
- await Rpc.set(proxy, 'value', 42);
115
- expect(await proxy.value).toBe(42);
116
- expect(target.value).toBe(42);
117
- serverEndpoint.close();
118
- clientEndpoint.close();
119
- });
120
- it('should handle errors and preserve custom properties', async () => {
121
- const { port1, port2 } = new MessageChannel();
122
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
123
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
124
- const target = {
125
- fail() {
126
- throw new MyAppError('Operation failed', 500);
127
- },
128
- };
129
- Rpc.expose(target, 'test-service-4');
130
- Rpc.listen(serverEndpoint);
131
- const proxy = await Rpc.connect(clientEndpoint, 'test-service-4');
132
- try {
133
- await proxy.fail();
134
- expect.fail('Should have thrown');
135
- }
136
- catch (error) {
137
- expect(error.message).toContain('Received error from remote: Operation failed');
138
- expect(error.cause).toBeInstanceOf(RpcRemoteError);
139
- expect(error.code).toBe(500);
140
- }
141
- serverEndpoint.close();
142
- clientEndpoint.close();
143
- });
144
- it('should support isAlive and release', async () => {
145
- const { port1, port2 } = new MessageChannel();
146
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
147
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
148
- Rpc.expose({ foo: 'bar' }, 'test-service-5');
149
- Rpc.listen(serverEndpoint);
150
- const proxy = await Rpc.connect(clientEndpoint, 'test-service-5');
151
- expect(Rpc.isAlive(proxy)).toBe(true);
152
- Rpc.release(proxy);
153
- expect(Rpc.isAlive(proxy)).toBe(false);
154
- await expect(proxy.foo).rejects.toThrow(RpcConnectionClosedError);
155
- serverEndpoint.close();
156
- clientEndpoint.close();
157
- });
158
- it('should support deleteProperty, defineProperty and has traps', async () => {
159
- const { port1, port2 } = new MessageChannel();
160
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
161
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
162
- const target = {
163
- foo: 'bar',
164
- };
165
- Rpc.expose(target, 'test-service-6');
166
- Rpc.listen(serverEndpoint);
167
- const proxy = await Rpc.connect(clientEndpoint, 'test-service-6');
168
- expect(await Reflect.has(proxy, 'foo')).toBe(true);
169
- await Reflect.deleteProperty(proxy, 'foo');
170
- expect(await proxy.foo).toBeUndefined();
171
- expect(target.foo).toBeUndefined();
172
- await Reflect.defineProperty(proxy, 'newProp', { value: 123, enumerable: true, configurable: true, writable: true });
173
- expect(await proxy.newProp).toBe(123);
174
- expect(target.newProp).toBe(123);
175
- serverEndpoint.close();
176
- clientEndpoint.close();
177
- });
178
- it('should support Rpc.delete and Rpc.has helpers', async () => {
179
- const { port1, port2 } = new MessageChannel();
180
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
181
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
182
- const target = {
183
- foo: 'bar',
184
- };
185
- Rpc.expose(target, 'test-service-helpers');
186
- Rpc.listen(serverEndpoint);
187
- const proxy = await Rpc.connect(clientEndpoint, 'test-service-helpers');
188
- expect(await Rpc.has(proxy, 'foo')).toBe(true);
189
- expect(await Rpc.has(proxy, 'nonExistent')).toBe(false);
190
- // Standard Reflect.has on a proxy with async traps will always be true (truthy promise)
191
- expect(Reflect.has(proxy, 'nonExistent')).toBe(true);
192
- const deleteResult = await Rpc.delete(proxy, 'foo');
193
- expect(deleteResult).toBe(true);
194
- expect(await Rpc.has(proxy, 'foo')).toBe(false);
195
- expect(target.foo).toBeUndefined();
196
- serverEndpoint.close();
197
- clientEndpoint.close();
198
- });
199
- it('should support automatic proxying of nested objects via root', async () => {
200
- const { port1, port2 } = new MessageChannel();
201
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
202
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
203
- const nested = {
204
- id: 'nested-1',
205
- async getValue() { return 'val'; },
206
- };
207
- const target = {
208
- getNested() {
209
- return Rpc.proxy(nested, target);
210
- },
211
- };
212
- Rpc.expose(target, 'test-nested-root');
213
- Rpc.listen(serverEndpoint);
214
- const proxy = await Rpc.connect(clientEndpoint, 'test-nested-root');
215
- const nestedProxy = await proxy.getNested();
216
- expect(await nestedProxy.id).toBe('nested-1');
217
- expect(await nestedProxy.getValue()).toBe('val');
218
- serverEndpoint.close();
219
- clientEndpoint.close();
220
- });
221
- it('should support transfers', async () => {
222
- const { port1, port2 } = new MessageChannel();
223
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
224
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
225
- const target = {
226
- async sum(buffer) {
227
- const view = new Uint8Array(buffer);
228
- return view.reduce((a, b) => a + b, 0);
229
- },
230
- };
231
- Rpc.expose(target, 'test-transfer');
232
- Rpc.listen(serverEndpoint);
233
- const proxy = await Rpc.connect(clientEndpoint, 'test-transfer');
234
- const buffer = new Uint8Array([1, 2, 3, 4, 5]).buffer;
235
- const sum = await proxy.sum(Rpc.transfer(buffer, [buffer]));
236
- expect(sum).toBe(15);
237
- expect(buffer.byteLength).toBe(0); // Should be detached
238
- serverEndpoint.close();
239
- clientEndpoint.close();
240
- });
241
- it('should support ReadableStream adapter', async () => {
242
- const { port1, port2 } = new MessageChannel();
243
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
244
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
245
- const target = {
246
- async getStream() {
247
- const stream = new ReadableStream({
248
- start(controller) {
249
- controller.enqueue(1);
250
- controller.enqueue(2);
251
- controller.enqueue(3);
252
- controller.close();
253
- },
254
- });
255
- return Rpc.adapt(stream, defaultReadableStreamRpcAdapter);
256
- },
257
- };
258
- Rpc.expose(target, 'test-stream');
259
- Rpc.listen(serverEndpoint);
260
- const proxy = await Rpc.connect(clientEndpoint, 'test-stream');
261
- const stream = await proxy.getStream();
262
- const reader = stream.getReader();
263
- const results = [];
264
- while (true) {
265
- const { done, value } = await reader.read();
266
- if (done) {
267
- break;
268
- }
269
- results.push(value);
270
- }
271
- expect(results).toEqual([1, 2, 3]);
272
- serverEndpoint.close();
273
- clientEndpoint.close();
274
- });
275
- it('should support direct function exposure', async () => {
276
- const { port1, port2 } = new MessageChannel();
277
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
278
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
279
- const target = (name) => `Hello, ${name}!`;
280
- Rpc.expose(target, 'test-function');
281
- Rpc.listen(serverEndpoint);
282
- const proxy = await Rpc.connect(clientEndpoint, 'test-function');
283
- const result = await proxy('World');
284
- expect(result).toBe('Hello, World!');
285
- serverEndpoint.close();
286
- clientEndpoint.close();
287
- });
288
- it('should support constructor exposure and construct trap', async () => {
289
- const { port1, port2 } = new MessageChannel();
290
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
291
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
292
- class Target {
293
- name;
294
- constructor(name) {
295
- this.name = name;
296
- }
297
- greet() {
298
- return `Hello, ${this.name}!`;
299
- }
300
- }
301
- Rpc.expose(Target, 'test-constructor');
302
- Rpc.listen(serverEndpoint);
303
- const ProxyClass = await Rpc.connect(clientEndpoint, 'test-constructor');
304
- const instance = await new ProxyClass('World');
305
- expect(await instance.name).toBe('World');
306
- expect(await instance.greet()).toBe('Hello, World!');
307
- serverEndpoint.close();
308
- clientEndpoint.close();
309
- });
310
- it('should return null for getPrototypeOf', async () => {
311
- const { port1, port2 } = new MessageChannel();
312
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
313
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
314
- Rpc.expose({ foo: 'bar' }, 'test-proto');
315
- Rpc.listen(serverEndpoint);
316
- const proxy = await Rpc.connect(clientEndpoint, 'test-proto');
317
- expect(Object.getPrototypeOf(proxy)).toBeNull();
318
- serverEndpoint.close();
319
- clientEndpoint.close();
320
- });
321
- it('should support isProxied helper', () => {
322
- const obj = { foo: 'bar' };
323
- expect(Rpc.isProxied(obj)).toBe(false);
324
- Rpc.proxy(obj);
325
- expect(Rpc.isProxied(obj)).toBe(true);
326
- });
327
- it('should throw error when connecting to non-existent service', async () => {
328
- const { port1, port2 } = new MessageChannel();
329
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
330
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
331
- Rpc.listen(serverEndpoint);
332
- await expect(Rpc.connect(clientEndpoint, 'non-existent')).rejects.toThrow('Could not connect to "non-existent" as nothing with that name is exposed.');
333
- serverEndpoint.close();
334
- clientEndpoint.close();
335
- });
336
- it('should reset exposed services', async () => {
337
- const { port1, port2 } = new MessageChannel();
338
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
339
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
340
- Rpc.expose({ foo: 'bar' }, 'test-reset');
341
- Rpc.listen(serverEndpoint);
342
- const proxy = await Rpc.connect(clientEndpoint, 'test-reset');
343
- expect(await proxy.foo).toBe('bar');
344
- Rpc.reset();
345
- await expect(Rpc.connect(clientEndpoint, 'test-reset')).rejects.toThrow('Could not connect to "test-reset" as nothing with that name is exposed.');
346
- serverEndpoint.close();
347
- clientEndpoint.close();
348
- });
349
- it('should support complex serialization with nested proxies', async () => {
350
- const { port1, port2 } = new MessageChannel();
351
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
352
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
353
- const nested = {
354
- id: 'nested',
355
- async getValue() { return 'val'; },
356
- };
357
- const target = {
358
- getData() {
359
- return Rpc.serialize({
360
- info: 'some info',
361
- item: Rpc.proxy(nested),
362
- });
363
- },
364
- };
365
- Rpc.expose(target, 'test-complex-serialization');
366
- Rpc.listen(serverEndpoint);
367
- const proxy = await Rpc.connect(clientEndpoint, 'test-complex-serialization');
368
- const result = await proxy.getData();
369
- expect(result.info).toBe('some info');
370
- expect(await result.item.id).toBe('nested');
371
- expect(await result.item.getValue()).toBe('val');
372
- serverEndpoint.close();
373
- clientEndpoint.close();
374
- });
375
- it('should handle non-object errors', async () => {
376
- const { port1, port2 } = new MessageChannel();
377
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
378
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
379
- const target = {
380
- fail() {
381
- throw 'String error';
382
- },
383
- };
384
- Rpc.expose(target, 'test-string-error');
385
- Rpc.listen(serverEndpoint);
386
- const proxy = await Rpc.connect(clientEndpoint, 'test-string-error');
387
- try {
388
- await proxy.fail();
389
- expect.fail('Should have thrown');
390
- }
391
- catch (error) {
392
- expect(error.message).toContain('Received error from remote:');
393
- expect(error.message).toContain('String error');
394
- }
395
- serverEndpoint.close();
396
- clientEndpoint.close();
397
- });
398
- it('should support ReadableStream cancellation', async () => {
399
- const { port1, port2 } = new MessageChannel();
400
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
401
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
402
- let cancelled = false;
403
- let cancelReason;
404
- const target = {
405
- getStream() {
406
- const stream = new ReadableStream({
407
- cancel(reason) {
408
- cancelled = true;
409
- cancelReason = reason;
410
- },
411
- });
412
- return Rpc.adapt(stream, defaultReadableStreamRpcAdapter);
413
- },
414
- };
415
- Rpc.expose(target, 'test-stream-cancel');
416
- Rpc.listen(serverEndpoint);
417
- const proxy = await Rpc.connect(clientEndpoint, 'test-stream-cancel');
418
- const stream = await proxy.getStream();
419
- await stream.cancel('my reason');
420
- expect(cancelled).toBe(true);
421
- expect(cancelReason).toBe('my reason');
422
- serverEndpoint.close();
423
- clientEndpoint.close();
424
- });
425
- it('should throw when adapter is not registered on receiver side', async () => {
426
- const { port1, port2 } = new MessageChannel();
427
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
428
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
429
- const fakeAdapter = {
430
- name: 'Fake',
431
- adaptSource: () => ({ data: undefined }),
432
- adaptTarget: () => ({}),
433
- };
434
- const target2 = {
435
- getFake() {
436
- return Rpc.adapt({}, fakeAdapter);
437
- },
438
- };
439
- Rpc.expose(target2, 'test-fake-adapter');
440
- Rpc.listen(serverEndpoint);
441
- const proxy = await Rpc.connect(clientEndpoint, 'test-fake-adapter');
442
- await expect(proxy.getFake()).rejects.toThrow('No adapter registration for "RpcAdapter:Fake" found.');
443
- serverEndpoint.close();
444
- clientEndpoint.close();
445
- });
446
- it('should support MessagePortRpcEndpoint.from', () => {
447
- const { port1 } = new MessageChannel();
448
- const endpoint = MessagePortRpcEndpoint.from(port1);
449
- expect(endpoint).toBeInstanceOf(MessagePortRpcEndpoint);
450
- endpoint.close();
451
- });
452
- it('should handle SharedWorker in browser-like environment', async () => {
453
- const originalSharedWorker = globalThis.SharedWorker;
454
- const originalWindow = globalThis.window;
455
- // Mock SharedWorker and browser environment
456
- const mockPort = {
457
- addEventListener: () => { },
458
- removeEventListener: () => { },
459
- start: () => { },
460
- close: () => { },
461
- postMessage: () => { },
462
- };
463
- const MockSharedWorker = class {
464
- port = mockPort;
465
- addEventListener = () => { };
466
- removeEventListener = () => { };
467
- };
468
- globalThis.SharedWorker = MockSharedWorker;
469
- globalThis.window = { document: {} };
470
- // Re-importing or relying on the fact that isBrowser check happens at runtime in constructor
471
- // Actually, it uses isBrowser which is imported.
472
- // Let's just mock the transport property check.
473
- const worker = new MockSharedWorker();
474
- const endpoint = new MessagePortRpcEndpoint(worker);
475
- // If isBrowser was false, it would use source (worker) instead of source.port (mockPort)
476
- // To ensure it hits the branch, we can try to force isBrowser to true if we were using a proxy or something,
477
- // but here we just want to see if we can trigger the logic.
478
- // Since isBrowser is already evaluated, we might need to mock it earlier or use a different approach.
479
- // But let's see what happens.
480
- // expect((endpoint as any).transport).toBe(mockPort);
481
- globalThis.SharedWorker = originalSharedWorker;
482
- globalThis.window = originalWindow;
483
- });
484
- it('should throw for unsupported message types in listen', async () => {
485
- const { port1, port2 } = new MessageChannel();
486
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
487
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
488
- Rpc.listen(serverEndpoint);
489
- const controlChannel = clientEndpoint.getOrOpenChannel('control');
490
- const response = await controlChannel.request({ type: 'unsupported' });
491
- expect(() => Rpc[internal].parseRpcMessageValue(response, clientEndpoint)).toThrow('Message type unsupported not supported in listen.');
492
- serverEndpoint.close();
493
- clientEndpoint.close();
494
- });
495
- it('should throw for unsupported message types in exposeObject', async () => {
496
- const { port1, port2 } = new MessageChannel();
497
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
498
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
499
- Rpc.expose({ foo: 'bar' }, 'test-unsupported-proxy');
500
- Rpc.listen(serverEndpoint);
501
- const controlChannel = clientEndpoint.getOrOpenChannel('control');
502
- const response = await controlChannel.request({ type: 'connect', name: 'test-unsupported-proxy' });
503
- const proxyChannel = clientEndpoint.getChannel(response.channel);
504
- const response2 = await proxyChannel.request({ type: 'unsupported', path: ['foo'] });
505
- expect(() => Rpc[internal].parseRpcMessageValue(response2, clientEndpoint)).toThrow('Unsupported message type unsupported.');
506
- serverEndpoint.close();
507
- clientEndpoint.close();
508
- });
509
- it('should support adapt with root object', async () => {
510
- const { port1, port2 } = new MessageChannel();
511
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
512
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
513
- const stream = new ReadableStream();
514
- const root = { stream: Rpc.adapt(stream, defaultReadableStreamRpcAdapter, stream) };
515
- Rpc.expose(root, 'test-adapt-root');
516
- Rpc.listen(serverEndpoint);
517
- const proxy = await Rpc.connect(clientEndpoint, 'test-adapt-root');
518
- expect(await proxy.stream).toBeInstanceOf(ReadableStream);
519
- serverEndpoint.close();
520
- clientEndpoint.close();
521
- });
522
- it('should throw when serializing a marked rpc proxy directly', async () => {
523
- const proxyInstance = new Rpc[internal].RpcProxy();
524
- expect(() => serialize(proxyInstance)).toThrow(NotSupportedError);
525
- });
526
- it('should support serializing an object marked with Rpc.adapt', async () => {
527
- const { port1, port2 } = new MessageChannel();
528
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
529
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
530
- const adapter = {
531
- name: 'test-serialize-adapt',
532
- adaptSource: () => ({ data: 'some-data', transfer: [] }),
533
- adaptTarget: (data) => ({ deserializedData: data }),
534
- };
535
- Rpc.registerAdapter(adapter);
536
- const target = {
537
- getAdapted() {
538
- const obj = {};
539
- Rpc.adapt(obj, adapter);
540
- return Rpc.serialize(obj);
541
- },
542
- };
543
- Rpc.expose(target, 'test-serialize-adapt-service');
544
- Rpc.listen(serverEndpoint);
545
- const proxy = await Rpc.connect(clientEndpoint, 'test-serialize-adapt-service');
546
- const result = await proxy.getAdapted();
547
- expect(result.deserializedData).toBe('some-data');
548
- serverEndpoint.close();
549
- clientEndpoint.close();
550
- });
551
- it('should throw for unsupported message types in ReadableStreamRpcAdapter', async () => {
552
- const { port1, port2 } = new MessageChannel();
553
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
554
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
555
- const stream = new ReadableStream();
556
- const channel = serverEndpoint.openChannel();
557
- defaultReadableStreamRpcAdapter.adaptSource(stream, channel);
558
- // Wait for channel to be established on both sides
559
- await new Promise((resolve) => setTimeout(resolve, 10));
560
- const clientChannel = clientEndpoint.getChannel(channel.id);
561
- const response = await clientChannel.request({ type: 'unsupported' });
562
- expect(() => Rpc[internal].parseRpcMessageValue(response, clientEndpoint)).toThrow('Type unsupported is not supported.');
563
- serverEndpoint.close();
564
- clientEndpoint.close();
565
- });
566
- it('should support MessagePortRpcEndpoint.close', () => {
567
- const { port1 } = new MessageChannel();
568
- const endpoint = new MessagePortRpcEndpoint(port1);
569
- endpoint.close(); // Should not throw
570
- });
571
- it('should throw for unsupported response types in ReadableStreamRpcAdapter target', async () => {
572
- const { port1, port2 } = new MessageChannel();
573
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
574
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
575
- const channel = serverEndpoint.openChannel();
576
- const stream = defaultReadableStreamRpcAdapter.adaptTarget(undefined, channel);
577
- const clientChannel = clientEndpoint.getChannel(channel.id);
578
- clientChannel.request$.subscribe(({ id }) => {
579
- clientChannel.respond(id, { type: 'unsupported' });
580
- });
581
- const reader = stream.getReader();
582
- await expect(reader.read()).rejects.toThrow('Type unsupported is not supported.');
583
- serverEndpoint.close();
584
- clientEndpoint.close();
585
- });
586
- it('should throw RpcConnectionClosedError when channel is closed during request', async () => {
587
- const { port1, port2 } = new MessageChannel();
588
- const serverEndpoint = new MessagePortRpcEndpoint(port1);
589
- const clientEndpoint = new MessagePortRpcEndpoint(port2);
590
- const channel = clientEndpoint.openChannel();
591
- const requestPromise = channel.request({ type: 'get', path: ['foo'] });
592
- channel.close();
593
- await expect(requestPromise).rejects.toThrow(RpcConnectionClosedError);
594
- serverEndpoint.close();
595
- clientEndpoint.close();
596
- });
597
- it('should throw for unsupported rpc value types', () => {
598
- expect(() => Rpc[internal].parseRpcMessageValue({ type: 'unsupported' }, {})).toThrow('Type unsupported not supported');
599
- });
600
- it('should handle open-channel message for existing channel', async () => {
601
- const { port1, port2 } = new MessageChannel();
602
- const sourceEndpoint = new MessagePortRpcEndpoint(port1);
603
- const targetEndpoint = new MessagePortRpcEndpoint(port2);
604
- const channelId = 'existing-channel';
605
- const channel = sourceEndpoint.openChannel(channelId);
606
- const { port2: p2 } = new MessageChannel();
607
- // Manually trigger handleOpenChannelMessage on the target side
608
- targetEndpoint.handleOpenChannelMessage({ seq: 1, type: 'open-channel', id: channelId, port: p2 });
609
- // It should just update the transport
610
- expect(targetEndpoint[internal].channels.has(channelId)).toBe(true);
611
- channel.close();
612
- sourceEndpoint.close();
613
- targetEndpoint.close();
614
- });
615
- });
@@ -1,2 +0,0 @@
1
- export declare function throwInvalidWriteToSignalError(): void;
2
- export declare function setThrowInvalidWriteToSignalError(fn: () => never): void;