@peers-app/peers-sdk 0.27.3 → 0.27.5

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 (272) hide show
  1. package/dist/contracts/contract-proxy.d.ts +7 -0
  2. package/dist/contracts/contract-proxy.js +19 -2
  3. package/dist/contracts/contract-transport.d.ts +2 -1
  4. package/dist/contracts/contract-transport.js +24 -2
  5. package/dist/contracts/create-local-consumer.js +16 -1
  6. package/dist/contracts/index.d.ts +2 -0
  7. package/dist/contracts/index.js +2 -0
  8. package/dist/contracts/system/index.d.ts +2 -0
  9. package/dist/contracts/system/index.js +2 -0
  10. package/dist/contracts/system/invites-contract.js +2 -1
  11. package/dist/contracts/system/sync-check-contract.d.ts +97 -0
  12. package/dist/contracts/system/sync-check-contract.js +115 -0
  13. package/dist/contracts/tool-arguments.d.ts +15 -0
  14. package/dist/contracts/tool-arguments.js +41 -0
  15. package/dist/contracts/tool-catalog-service.js +2 -12
  16. package/dist/contracts/tool-catalog.js +6 -2
  17. package/dist/data/change-tracking.d.ts +40 -0
  18. package/dist/data/change-tracking.js +89 -0
  19. package/dist/data/orm/types.d.ts +24 -7
  20. package/dist/data/orm/types.js +97 -24
  21. package/dist/define/manifest.js +6 -34
  22. package/dist/device/binary-peer-connection-v2.d.ts +7 -15
  23. package/dist/device/binary-peer-connection-v2.js +14 -30
  24. package/dist/device/connection.d.ts +34 -43
  25. package/dist/device/connection.js +188 -186
  26. package/dist/device/device.d.ts +1 -8
  27. package/dist/device/device.js +1 -30
  28. package/dist/device/socket.type.d.ts +6 -12
  29. package/dist/package-loader/package-loader.js +27 -22
  30. package/dist/system-ids.d.ts +5 -0
  31. package/dist/system-ids.js +6 -1
  32. package/package.json +4 -2
  33. package/dist/context/user-context-identity.test.d.ts +0 -1
  34. package/dist/context/user-context-identity.test.js +0 -220
  35. package/dist/contracts/__tests__/action-dispatch.test.d.ts +0 -1
  36. package/dist/contracts/__tests__/action-dispatch.test.js +0 -319
  37. package/dist/contracts/__tests__/also-implements.test.d.ts +0 -1
  38. package/dist/contracts/__tests__/also-implements.test.js +0 -110
  39. package/dist/contracts/__tests__/builder.test.d.ts +0 -1
  40. package/dist/contracts/__tests__/builder.test.js +0 -669
  41. package/dist/contracts/__tests__/contract-events.test.d.ts +0 -1
  42. package/dist/contracts/__tests__/contract-events.test.js +0 -199
  43. package/dist/contracts/__tests__/contract-observables.test.d.ts +0 -1
  44. package/dist/contracts/__tests__/contract-observables.test.js +0 -290
  45. package/dist/contracts/__tests__/contract-provider-router.test.d.ts +0 -1
  46. package/dist/contracts/__tests__/contract-provider-router.test.js +0 -315
  47. package/dist/contracts/__tests__/contract-proxy.test.d.ts +0 -1
  48. package/dist/contracts/__tests__/contract-proxy.test.js +0 -657
  49. package/dist/contracts/__tests__/contract-resolvers.test.d.ts +0 -1
  50. package/dist/contracts/__tests__/contract-resolvers.test.js +0 -758
  51. package/dist/contracts/__tests__/contract-subscription-lifecycle.test.d.ts +0 -1
  52. package/dist/contracts/__tests__/contract-subscription-lifecycle.test.js +0 -353
  53. package/dist/contracts/__tests__/contract-table-events.test.d.ts +0 -1
  54. package/dist/contracts/__tests__/contract-table-events.test.js +0 -209
  55. package/dist/contracts/__tests__/contract-transport.test.d.ts +0 -1
  56. package/dist/contracts/__tests__/contract-transport.test.js +0 -163
  57. package/dist/contracts/__tests__/extract.test.d.ts +0 -1
  58. package/dist/contracts/__tests__/extract.test.js +0 -145
  59. package/dist/contracts/__tests__/frozen-contracts.test.d.ts +0 -1
  60. package/dist/contracts/__tests__/frozen-contracts.test.js +0 -191
  61. package/dist/contracts/__tests__/generic-tool-dispatch.test.d.ts +0 -1
  62. package/dist/contracts/__tests__/generic-tool-dispatch.test.js +0 -130
  63. package/dist/contracts/__tests__/host-contract-client.test.d.ts +0 -1
  64. package/dist/contracts/__tests__/host-contract-client.test.js +0 -793
  65. package/dist/contracts/__tests__/host-contract-consumer.test.d.ts +0 -1
  66. package/dist/contracts/__tests__/host-contract-consumer.test.js +0 -163
  67. package/dist/contracts/__tests__/host-contract-transport.test.d.ts +0 -1
  68. package/dist/contracts/__tests__/host-contract-transport.test.js +0 -66
  69. package/dist/contracts/__tests__/integration.test.d.ts +0 -1
  70. package/dist/contracts/__tests__/integration.test.js +0 -348
  71. package/dist/contracts/__tests__/legacy-removal.test.d.ts +0 -1
  72. package/dist/contracts/__tests__/legacy-removal.test.js +0 -128
  73. package/dist/contracts/__tests__/persistent-registry.test.d.ts +0 -1
  74. package/dist/contracts/__tests__/persistent-registry.test.js +0 -109
  75. package/dist/contracts/__tests__/playground.test.d.ts +0 -1
  76. package/dist/contracts/__tests__/playground.test.js +0 -216
  77. package/dist/contracts/__tests__/registry.test.d.ts +0 -1
  78. package/dist/contracts/__tests__/registry.test.js +0 -238
  79. package/dist/contracts/__tests__/remote-contract-transport.test.d.ts +0 -1
  80. package/dist/contracts/__tests__/remote-contract-transport.test.js +0 -119
  81. package/dist/contracts/__tests__/system-contracts.test.d.ts +0 -1
  82. package/dist/contracts/__tests__/system-contracts.test.js +0 -247
  83. package/dist/contracts/__tests__/target-dispatch.d.ts +0 -11
  84. package/dist/contracts/__tests__/target-dispatch.js +0 -24
  85. package/dist/contracts/__tests__/tool-catalog-inventory.test.d.ts +0 -1
  86. package/dist/contracts/__tests__/tool-catalog-inventory.test.js +0 -44
  87. package/dist/contracts/__tests__/tool-catalog-service.test.d.ts +0 -1
  88. package/dist/contracts/__tests__/tool-catalog-service.test.js +0 -482
  89. package/dist/contracts/__tests__/tool-catalog.test.d.ts +0 -1
  90. package/dist/contracts/__tests__/tool-catalog.test.js +0 -1199
  91. package/dist/contracts/__tests__/validate.test.d.ts +0 -1
  92. package/dist/contracts/__tests__/validate.test.js +0 -991
  93. package/dist/contracts/__tests__/workflow-context.test.d.ts +0 -1
  94. package/dist/contracts/__tests__/workflow-context.test.js +0 -50
  95. package/dist/data/access-level.test.d.ts +0 -1
  96. package/dist/data/access-level.test.js +0 -53
  97. package/dist/data/change-tracking.test.d.ts +0 -1
  98. package/dist/data/change-tracking.test.js +0 -62
  99. package/dist/data/files/files.test.d.ts +0 -1
  100. package/dist/data/files/files.test.js +0 -770
  101. package/dist/data/group-members.test.d.ts +0 -1
  102. package/dist/data/group-members.test.js +0 -336
  103. package/dist/data/group-share.test.d.ts +0 -1
  104. package/dist/data/group-share.test.js +0 -110
  105. package/dist/data/groups.test.d.ts +0 -1
  106. package/dist/data/groups.test.js +0 -153
  107. package/dist/data/orm/cursor.test.d.ts +0 -1
  108. package/dist/data/orm/cursor.test.js +0 -314
  109. package/dist/data/orm/data-query.mongo.test.d.ts +0 -1
  110. package/dist/data/orm/data-query.mongo.test.js +0 -367
  111. package/dist/data/orm/data-query.sqlite.test.d.ts +0 -1
  112. package/dist/data/orm/data-query.sqlite.test.js +0 -365
  113. package/dist/data/orm/data-query.test.d.ts +0 -1
  114. package/dist/data/orm/data-query.test.js +0 -545
  115. package/dist/data/orm/dependency-injection.test.d.ts +0 -1
  116. package/dist/data/orm/dependency-injection.test.js +0 -171
  117. package/dist/data/orm/event-registry.test.d.ts +0 -1
  118. package/dist/data/orm/event-registry.test.js +0 -44
  119. package/dist/data/orm/multi-cursors.test.d.ts +0 -1
  120. package/dist/data/orm/multi-cursors.test.js +0 -463
  121. package/dist/data/orm/sql.data-source.test.d.ts +0 -1
  122. package/dist/data/orm/sql.data-source.test.js +0 -731
  123. package/dist/data/orm/table-container-events.test.d.ts +0 -1
  124. package/dist/data/orm/table-container-events.test.js +0 -101
  125. package/dist/data/orm/table-container.test.d.ts +0 -1
  126. package/dist/data/orm/table-container.test.js +0 -273
  127. package/dist/data/orm/table.event-source.test.d.ts +0 -1
  128. package/dist/data/orm/table.event-source.test.js +0 -331
  129. package/dist/data/orm/types.test.d.ts +0 -1
  130. package/dist/data/orm/types.test.js +0 -409
  131. package/dist/data/package-table-identity.test.d.ts +0 -1
  132. package/dist/data/package-table-identity.test.js +0 -46
  133. package/dist/data/package-version-permissions.test.d.ts +0 -1
  134. package/dist/data/package-version-permissions.test.js +0 -107
  135. package/dist/data/package-version-resolver.test.d.ts +0 -4
  136. package/dist/data/package-version-resolver.test.js +0 -543
  137. package/dist/data/package-versions.test.d.ts +0 -1
  138. package/dist/data/package-versions.test.js +0 -227
  139. package/dist/data/persistent-vars.conflict.test.d.ts +0 -1
  140. package/dist/data/persistent-vars.conflict.test.js +0 -126
  141. package/dist/data/persistent-vars.migration.test.d.ts +0 -1
  142. package/dist/data/persistent-vars.migration.test.js +0 -133
  143. package/dist/data/persistent-vars.package-scope.test.d.ts +0 -1
  144. package/dist/data/persistent-vars.package-scope.test.js +0 -27
  145. package/dist/data/sync-recovery-queue.test.d.ts +0 -1
  146. package/dist/data/sync-recovery-queue.test.js +0 -215
  147. package/dist/data/table-signing.test.d.ts +0 -1
  148. package/dist/data/table-signing.test.js +0 -118
  149. package/dist/data/tool-access.test.d.ts +0 -1
  150. package/dist/data/tool-access.test.js +0 -166
  151. package/dist/data/user-permissions.test.d.ts +0 -1
  152. package/dist/data/user-permissions.test.js +0 -305
  153. package/dist/data/user-trust-levels.test.d.ts +0 -1
  154. package/dist/data/user-trust-levels.test.js +0 -37
  155. package/dist/define/also-implements.test.d.ts +0 -1
  156. package/dist/define/also-implements.test.js +0 -123
  157. package/dist/define/declare-contract.test.d.ts +0 -1
  158. package/dist/define/declare-contract.test.js +0 -573
  159. package/dist/define/define.test.d.ts +0 -1
  160. package/dist/define/define.test.js +0 -1010
  161. package/dist/define/empty-fields.test.d.ts +0 -1
  162. package/dist/define/empty-fields.test.js +0 -55
  163. package/dist/define/events-observables.test.d.ts +0 -1
  164. package/dist/define/events-observables.test.js +0 -1013
  165. package/dist/define/serve-members.test.d.ts +0 -1
  166. package/dist/define/serve-members.test.js +0 -630
  167. package/dist/define/vars.test.d.ts +0 -1
  168. package/dist/define/vars.test.js +0 -39
  169. package/dist/device/binary-peer-connection-v2.test.d.ts +0 -1
  170. package/dist/device/binary-peer-connection-v2.test.js +0 -730
  171. package/dist/device/binary-peer-connection.d.ts +0 -58
  172. package/dist/device/binary-peer-connection.js +0 -516
  173. package/dist/device/binary-peer-connection.test.d.ts +0 -1
  174. package/dist/device/binary-peer-connection.test.js +0 -184
  175. package/dist/device/connection.test.d.ts +0 -1
  176. package/dist/device/connection.test.js +0 -613
  177. package/dist/device/device-election.test.d.ts +0 -1
  178. package/dist/device/device-election.test.js +0 -516
  179. package/dist/device/device.test.d.ts +0 -1
  180. package/dist/device/device.test.js +0 -243
  181. package/dist/device/frame-cipher.test.d.ts +0 -1
  182. package/dist/device/frame-cipher.test.js +0 -219
  183. package/dist/device/get-trust-level-fn.test.d.ts +0 -1
  184. package/dist/device/get-trust-level-fn.test.js +0 -685
  185. package/dist/device/streamed-socket.d.ts +0 -23
  186. package/dist/device/streamed-socket.js +0 -255
  187. package/dist/device/streamed-socket.test.d.ts +0 -1
  188. package/dist/device/streamed-socket.test.js +0 -216
  189. package/dist/device/tx-encoding.test.d.ts +0 -1
  190. package/dist/device/tx-encoding.test.js +0 -295
  191. package/dist/device-pairing/cpace.test.d.ts +0 -1
  192. package/dist/device-pairing/cpace.test.js +0 -116
  193. package/dist/device-pairing/device-pairing.test.d.ts +0 -1
  194. package/dist/device-pairing/device-pairing.test.js +0 -211
  195. package/dist/hlc.test.d.ts +0 -1
  196. package/dist/hlc.test.js +0 -45
  197. package/dist/host-credentials.test.d.ts +0 -1
  198. package/dist/host-credentials.test.js +0 -88
  199. package/dist/identity/account-email.test.d.ts +0 -1
  200. package/dist/identity/account-email.test.js +0 -59
  201. package/dist/identity/anchor-document.test.d.ts +0 -1
  202. package/dist/identity/anchor-document.test.js +0 -16
  203. package/dist/identity/anchor-resolution.test.d.ts +0 -1
  204. package/dist/identity/anchor-resolution.test.js +0 -130
  205. package/dist/identity/key-change.test.d.ts +0 -1
  206. package/dist/identity/key-change.test.js +0 -811
  207. package/dist/invites/group-approval.test.d.ts +0 -1
  208. package/dist/invites/group-approval.test.js +0 -223
  209. package/dist/invites/invite-token.test.d.ts +0 -1
  210. package/dist/invites/invite-token.test.js +0 -123
  211. package/dist/keys.test.d.ts +0 -1
  212. package/dist/keys.test.js +0 -336
  213. package/dist/logging/console-logger.test.d.ts +0 -1
  214. package/dist/logging/console-logger.test.js +0 -300
  215. package/dist/logging/console-logs.table.test.d.ts +0 -1
  216. package/dist/logging/console-logs.table.test.js +0 -156
  217. package/dist/observable.test.d.ts +0 -1
  218. package/dist/observable.test.js +0 -309
  219. package/dist/package-build/build-package.test.d.ts +0 -1
  220. package/dist/package-build/build-package.test.js +0 -204
  221. package/dist/package-build/contract-add.test.d.ts +0 -1
  222. package/dist/package-build/contract-add.test.js +0 -467
  223. package/dist/package-build/freeze-contracts.test.d.ts +0 -1
  224. package/dist/package-build/freeze-contracts.test.js +0 -355
  225. package/dist/package-installer/package-author-signing.test.d.ts +0 -1
  226. package/dist/package-installer/package-author-signing.test.js +0 -200
  227. package/dist/package-installer/package-cloner.test.d.ts +0 -1
  228. package/dist/package-installer/package-cloner.test.js +0 -278
  229. package/dist/package-installer/package-creator.test.d.ts +0 -1
  230. package/dist/package-installer/package-creator.test.js +0 -908
  231. package/dist/package-installer/package-dev-tools.test.d.ts +0 -1
  232. package/dist/package-installer/package-dev-tools.test.js +0 -64
  233. package/dist/package-installer/package-installer.test.d.ts +0 -1
  234. package/dist/package-installer/package-installer.test.js +0 -882
  235. package/dist/package-installer/package-propagation.test.d.ts +0 -1
  236. package/dist/package-installer/package-propagation.test.js +0 -1269
  237. package/dist/package-installer/package-publisher.test.d.ts +0 -1
  238. package/dist/package-installer/package-publisher.test.js +0 -153
  239. package/dist/package-installer/package-remote-checker.test.d.ts +0 -1
  240. package/dist/package-installer/package-remote-checker.test.js +0 -334
  241. package/dist/package-installer/package-seed-installer.test.d.ts +0 -1
  242. package/dist/package-installer/package-seed-installer.test.js +0 -123
  243. package/dist/package-installer/package-tarball.test.d.ts +0 -1
  244. package/dist/package-installer/package-tarball.test.js +0 -75
  245. package/dist/package-installer/peers-core-installer.test.d.ts +0 -1
  246. package/dist/package-installer/peers-core-installer.test.js +0 -49
  247. package/dist/package-installer/peers-core-trust-anchor.test.d.ts +0 -1
  248. package/dist/package-installer/peers-core-trust-anchor.test.js +0 -155
  249. package/dist/package-loader/contract-package-loader.test.d.ts +0 -1
  250. package/dist/package-loader/contract-package-loader.test.js +0 -274
  251. package/dist/package-loader/host-authority-loading.test.d.ts +0 -1
  252. package/dist/package-loader/host-authority-loading.test.js +0 -104
  253. package/dist/package-loader/host-dispatch-policy.test.d.ts +0 -1
  254. package/dist/package-loader/host-dispatch-policy.test.js +0 -56
  255. package/dist/package-loader/isolated-artifact.test.d.ts +0 -1
  256. package/dist/package-loader/isolated-artifact.test.js +0 -688
  257. package/dist/package-loader/isolated-persistent-var-gateway.test.d.ts +0 -1
  258. package/dist/package-loader/isolated-persistent-var-gateway.test.js +0 -56
  259. package/dist/package-loader/isolated-table-gateway.test.d.ts +0 -1
  260. package/dist/package-loader/isolated-table-gateway.test.js +0 -633
  261. package/dist/package-loader/package-loader.test.d.ts +0 -1
  262. package/dist/package-loader/package-loader.test.js +0 -1764
  263. package/dist/package-loader/resolve-consumed-contracts.test.d.ts +0 -1
  264. package/dist/package-loader/resolve-consumed-contracts.test.js +0 -166
  265. package/dist/serial-json.compat.test.d.ts +0 -1
  266. package/dist/serial-json.compat.test.js +0 -369
  267. package/dist/serial-json.test.d.ts +0 -1
  268. package/dist/serial-json.test.js +0 -401
  269. package/dist/testing/mock-host-contract.test.d.ts +0 -1
  270. package/dist/testing/mock-host-contract.test.js +0 -782
  271. package/dist/utils.test.d.ts +0 -1
  272. package/dist/utils.test.js +0 -232
@@ -1,669 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const zod_1 = require("zod");
4
- const types_1 = require("../../data/orm/types");
5
- const field_type_1 = require("../../types/field-type");
6
- const utils_1 = require("../../utils");
7
- const builder_1 = require("../builder");
8
- const extract_1 = require("../extract");
9
- const types_2 = require("../types");
10
- beforeAll(() => {
11
- (0, extract_1.setSchemaToFieldsFn)(types_1.schemaToFields);
12
- });
13
- const TEST_PKG_ID = (0, utils_1.newid)();
14
- const TASKS_ID = (0, utils_1.newid)();
15
- const NOTES_ID = (0, utils_1.newid)();
16
- const AUTH_ID = (0, utils_1.newid)();
17
- const PROJECTS_ID = (0, utils_1.newid)();
18
- const FANCY_TASKS_ID = (0, utils_1.newid)();
19
- const GENERIC_ID = (0, utils_1.newid)();
20
- describe("definePackage", () => {
21
- it("carries a contract's description, or an empty one", () => {
22
- const result = (0, builder_1.definePackage)((pkg) => {
23
- pkg.packageId = TEST_PKG_ID;
24
- pkg.contract(TASKS_ID, 1, "Tasks", "Your tasks, by status.");
25
- pkg.contract(NOTES_ID, 1, "Notes");
26
- });
27
- expect(result.contracts.map(({ name, description }) => [name, description])).toEqual([
28
- ["Tasks", "Your tasks, by status."],
29
- ["Notes", ""],
30
- ]);
31
- });
32
- it("produces a contract definition from a single contract with tables and tools", () => {
33
- const result = (0, builder_1.definePackage)((pkg) => {
34
- pkg.packageId = TEST_PKG_ID;
35
- const tasks = pkg.contract(TASKS_ID, 1, "Tasks");
36
- tasks.tables = [
37
- {
38
- metaData: {
39
- name: "Tasks",
40
- description: "Task tracking",
41
- primaryKeyName: "taskId",
42
- fields: [],
43
- },
44
- schema: zod_1.z.object({
45
- taskId: zod_1.z.string().describe("PK"),
46
- title: zod_1.z.string().describe("Title"),
47
- }),
48
- },
49
- ];
50
- tasks.tools = [
51
- {
52
- tool: {
53
- name: "create-task",
54
- usageDescription: "Creates a task",
55
- inputSchema: {
56
- fields: [{ name: "title", type: field_type_1.FieldType.string, description: "Title" }],
57
- },
58
- outputSchema: {
59
- fields: [{ name: "taskId", type: field_type_1.FieldType.id, description: "ID" }],
60
- },
61
- },
62
- },
63
- ];
64
- });
65
- expect(result.contracts).toHaveLength(1);
66
- const contract = result.contracts[0];
67
- expect(contract.contractId).toBe(TASKS_ID);
68
- expect(contract.version).toBe(1);
69
- expect(contract.name).toBe("Tasks");
70
- expect(contract.description).toBe("");
71
- expect(contract.devTag).toBe("dev");
72
- expect(contract.tables).toHaveLength(1);
73
- expect(contract.tables[0].name).toBe("Tasks");
74
- expect(contract.tables[0].fields).toHaveLength(2);
75
- expect(contract.tools).toHaveLength(1);
76
- expect(contract.tools[0].name).toBe("create-task");
77
- expect(contract.tools[0].inputFields).toHaveLength(1);
78
- expect(contract.tools[0].outputFields).toHaveLength(1);
79
- });
80
- it("supports multiple contracts from one package", () => {
81
- const result = (0, builder_1.definePackage)((pkg) => {
82
- pkg.packageId = TEST_PKG_ID;
83
- const tasks = pkg.contract(TASKS_ID, 1, "Tasks");
84
- tasks.tables = [
85
- {
86
- metaData: {
87
- name: "Tasks",
88
- description: "d",
89
- primaryKeyName: "taskId",
90
- fields: [{ name: "taskId", type: field_type_1.FieldType.id }],
91
- },
92
- },
93
- ];
94
- const notes = pkg.contract(NOTES_ID, 1, "Notes");
95
- notes.tables = [
96
- {
97
- metaData: {
98
- name: "Notes",
99
- description: "d",
100
- primaryKeyName: "noteId",
101
- fields: [{ name: "noteId", type: field_type_1.FieldType.id }],
102
- },
103
- },
104
- ];
105
- });
106
- expect(result.contracts).toHaveLength(2);
107
- expect(result.contracts[0].contractId).toBe(TASKS_ID);
108
- expect(result.contracts[1].contractId).toBe(NOTES_ID);
109
- });
110
- it("records consumed contracts", () => {
111
- let tasksHandle;
112
- let authHandle;
113
- const result = (0, builder_1.definePackage)((pkg) => {
114
- pkg.packageId = TEST_PKG_ID;
115
- tasksHandle = pkg.consumes(TASKS_ID, 1);
116
- authHandle = pkg.consumes(AUTH_ID, 2);
117
- const projects = pkg.contract(PROJECTS_ID, 1, "Projects");
118
- projects.tables = [
119
- {
120
- metaData: {
121
- name: "Projects",
122
- description: "d",
123
- primaryKeyName: "projectId",
124
- fields: [{ name: "projectId", type: field_type_1.FieldType.id }],
125
- },
126
- },
127
- ];
128
- });
129
- expect(result.consumes).toHaveLength(2);
130
- expect(result.consumes[0].contractId).toBe(TASKS_ID);
131
- expect(result.consumes[0].version).toBe(1);
132
- expect(result.consumes[0].handle).toBe(tasksHandle);
133
- expect(result.consumes[1].contractId).toBe(AUTH_ID);
134
- expect(result.consumes[1].version).toBe(2);
135
- expect(result.consumes[1].handle).toBe(authHandle);
136
- });
137
- it("records remote contracts as deferred handles without requiring a consume", () => {
138
- let remoteHandle;
139
- const result = (0, builder_1.definePackage)((pkg) => {
140
- pkg.packageId = TEST_PKG_ID;
141
- // A package may target its own contract on other devices.
142
- const projects = pkg.contract(PROJECTS_ID, 1, "Projects");
143
- projects.tools = [];
144
- remoteHandle = pkg.remote(PROJECTS_ID, 1);
145
- });
146
- expect(result.consumes).toHaveLength(0);
147
- expect(result.remotes).toHaveLength(1);
148
- expect(result.remotes?.[0]).toMatchObject({ contractId: PROJECTS_ID, version: 1 });
149
- expect(result.remotes?.[0].handle).toBe(remoteHandle);
150
- expect(remoteHandle?.consumer).toBeInstanceOf(Promise);
151
- });
152
- it("validates remote declarations", () => {
153
- expect(() => (0, builder_1.definePackage)((pkg) => {
154
- pkg.packageId = TEST_PKG_ID;
155
- pkg.remote("not-an-id", 1);
156
- })).toThrow("remote contractId must be a valid peer ID");
157
- expect(() => (0, builder_1.definePackage)((pkg) => {
158
- pkg.packageId = TEST_PKG_ID;
159
- pkg.remote(TASKS_ID, 0);
160
- })).toThrow("remote version must be a positive integer");
161
- });
162
- it("preserves consume options and returns a deferred handle", () => {
163
- const preferredProviderId = (0, utils_1.newid)();
164
- const result = (0, builder_1.definePackage)((pkg) => {
165
- pkg.packageId = TEST_PKG_ID;
166
- pkg.consumes(TASKS_ID, 1, {
167
- providerPackageIds: [preferredProviderId],
168
- fallbackToDefaultProvider: true,
169
- });
170
- pkg.consumes(AUTH_ID, 2, {
171
- optional: true,
172
- providerPackageIds: [preferredProviderId],
173
- fallbackToDefaultProvider: false,
174
- });
175
- });
176
- const [required, optional] = result.consumes;
177
- expect(required).toMatchObject({
178
- contractId: TASKS_ID,
179
- version: 1,
180
- providerPackageIds: [preferredProviderId],
181
- fallbackToDefaultProvider: true,
182
- });
183
- expect(required.optional).toBeUndefined();
184
- expect(required.handle).toBeDefined();
185
- expect(typeof required.handle?.consumer.then).toBe("function");
186
- // Handle itself must not be thenable (naive await on the return value must not wait).
187
- expect(required.handle.then).toBeUndefined();
188
- expect(optional).toMatchObject({
189
- contractId: AUTH_ID,
190
- version: 2,
191
- optional: true,
192
- providerPackageIds: [preferredProviderId],
193
- fallbackToDefaultProvider: false,
194
- });
195
- expect(optional.handle).toBeDefined();
196
- });
197
- it("accepts a type argument that narrows the resolved consumer", () => {
198
- (0, builder_1.definePackage)((pkg) => {
199
- pkg.packageId = TEST_PKG_ID;
200
- const required = pkg.consumes(TASKS_ID, 1);
201
- const optional = pkg.consumes(AUTH_ID, 1, { optional: true });
202
- // Compile-time checks: required → TypedConsumer; optional → TypedConsumer | undefined.
203
- void (async () => {
204
- const requiredConsumer = await required.consumer;
205
- const optionalConsumer = await optional.consumer;
206
- void requiredConsumer;
207
- void optionalConsumer;
208
- // Named table methods (not only dataChanged) must be present on ITableProxy.
209
- const _list = requiredConsumer.tables.ConsoleLogs.list;
210
- const _deleteOldLogs = requiredConsumer.tables.ConsoleLogs.deleteOldLogs;
211
- void _list;
212
- void _deleteOldLogs;
213
- // Typed consumers may omit empty bags — these must not exist on TypedConsumer.
214
- // @ts-expect-error no tools bag on slim typed consumer
215
- void requiredConsumer.tools;
216
- // @ts-expect-error no events bag on slim typed consumer
217
- void requiredConsumer.events;
218
- // @ts-expect-error no observables bag on slim typed consumer
219
- void requiredConsumer.observables;
220
- // @ts-expect-error optional consume must allow undefined
221
- const tooNarrow = await optional.consumer;
222
- void tooNarrow;
223
- })();
224
- });
225
- });
226
- it("ILogsConsumer exposes ConsoleLogs as ITableProxy without empty bags", () => {
227
- (0, builder_1.definePackage)((pkg) => {
228
- pkg.packageId = TEST_PKG_ID;
229
- const handle = pkg.consumes(TASKS_ID, 1, { optional: true });
230
- void (async () => {
231
- const logs = await handle.consumer;
232
- if (!logs)
233
- return;
234
- const _list = logs.tables.ConsoleLogs.list;
235
- const _deleteOldLogs = logs.tables.ConsoleLogs.deleteOldLogs;
236
- void _list;
237
- void _deleteOldLogs;
238
- // @ts-expect-error ILogsConsumer has no tools bag
239
- void logs.tools;
240
- // @ts-expect-error ILogsConsumer has no events bag
241
- void logs.events;
242
- // @ts-expect-error ILogsConsumer has no observables bag
243
- void logs.observables;
244
- })();
245
- });
246
- });
247
- it("settles required handles with a consumer and optional handles with undefined", async () => {
248
- const { settleConsumedContractHandle, rejectConsumedContractHandle } = await Promise.resolve().then(() => require("../builder"));
249
- const result = (0, builder_1.definePackage)((pkg) => {
250
- pkg.packageId = TEST_PKG_ID;
251
- pkg.consumes(TASKS_ID, 1);
252
- pkg.consumes(AUTH_ID, 1, { optional: true });
253
- });
254
- const requiredHandle = result.consumes[0].handle;
255
- const optionalHandle = result.consumes[1].handle;
256
- expect(requiredHandle).toBeDefined();
257
- expect(optionalHandle).toBeDefined();
258
- if (!requiredHandle || !optionalHandle) {
259
- throw new Error("expected consumes handles");
260
- }
261
- const fakeConsumer = {
262
- contractId: TASKS_ID,
263
- version: 1,
264
- tables: {},
265
- tools: {},
266
- observables: {},
267
- events: {},
268
- loadingPromise: Promise.resolve(),
269
- dispose: () => { },
270
- };
271
- settleConsumedContractHandle(requiredHandle, fakeConsumer);
272
- settleConsumedContractHandle(optionalHandle, undefined);
273
- await expect(requiredHandle.consumer).resolves.toBe(fakeConsumer);
274
- await expect(optionalHandle.consumer).resolves.toBeUndefined();
275
- expect(() => settleConsumedContractHandle(requiredHandle, fakeConsumer)).toThrow("already been settled");
276
- expect(() => rejectConsumedContractHandle(optionalHandle, new Error("late"))).toThrow("already been settled");
277
- });
278
- it("rejects a required consume handle once", async () => {
279
- const { rejectConsumedContractHandle } = await Promise.resolve().then(() => require("../builder"));
280
- const result = (0, builder_1.definePackage)((pkg) => {
281
- pkg.packageId = TEST_PKG_ID;
282
- pkg.consumes(TASKS_ID, 1);
283
- });
284
- const requiredHandle = result.consumes[0].handle;
285
- expect(requiredHandle).toBeDefined();
286
- if (!requiredHandle) {
287
- throw new Error("expected consumes handle");
288
- }
289
- const err = new Error("No provider for Tasks");
290
- rejectConsumedContractHandle(requiredHandle, err);
291
- await expect(requiredHandle.consumer).rejects.toThrow("No provider for Tasks");
292
- expect(() => rejectConsumedContractHandle(requiredHandle, err)).toThrow("already been settled");
293
- });
294
- it("throws when consumes providerPackageIds contains an invalid peer ID", () => {
295
- expect(() => {
296
- (0, builder_1.definePackage)((pkg) => {
297
- pkg.packageId = TEST_PKG_ID;
298
- pkg.consumes(TASKS_ID, 1, { providerPackageIds: ["not-valid"] });
299
- });
300
- }).toThrow("providerPackageIds");
301
- });
302
- it("throws when consumes version is not a positive integer", () => {
303
- expect(() => {
304
- (0, builder_1.definePackage)((pkg) => {
305
- pkg.packageId = TEST_PKG_ID;
306
- pkg.consumes(TASKS_ID, 0);
307
- });
308
- }).toThrow("positive integer");
309
- });
310
- it("records alsoImplements declarations", () => {
311
- const result = (0, builder_1.definePackage)((pkg) => {
312
- pkg.packageId = TEST_PKG_ID;
313
- const fancy = pkg.contract(FANCY_TASKS_ID, 1, "Fancy Tasks");
314
- fancy.alsoImplements(TASKS_ID, 1);
315
- fancy.alsoImplements(TASKS_ID, { from: 1, to: 3 });
316
- fancy.tables = [
317
- {
318
- metaData: {
319
- name: "Tasks",
320
- description: "d",
321
- primaryKeyName: "taskId",
322
- fields: [{ name: "taskId", type: field_type_1.FieldType.id }],
323
- },
324
- },
325
- ];
326
- });
327
- const key = (0, types_2.contractKey)(FANCY_TASKS_ID, 1);
328
- expect(result.alsoImplements.has(key)).toBe(true);
329
- const decls = result.alsoImplements.get(key) ?? [];
330
- expect(decls).toHaveLength(2);
331
- expect(decls[0]).toEqual({ contractId: TASKS_ID, version: 1 });
332
- expect(decls[1]).toEqual({ contractId: TASKS_ID, version: { from: 1, to: 3 } });
333
- });
334
- it("records the contracts a hub implementation exposes", () => {
335
- const hubId = (0, utils_1.newid)();
336
- const result = (0, builder_1.definePackage)((pkg) => {
337
- pkg.packageId = TEST_PKG_ID;
338
- pkg.contract(GENERIC_ID, 1, "Generic");
339
- const hub = pkg.contract(hubId, 2, "Hub");
340
- hub.exposes(GENERIC_ID, 1);
341
- });
342
- expect(result.exposes?.get((0, types_2.contractKey)(hubId, 2))).toEqual([
343
- { contractId: GENERIC_ID, version: 1 },
344
- ]);
345
- expect(result.exposes?.has((0, types_2.contractKey)(GENERIC_ID, 1))).toBe(false);
346
- expect(result.contracts.find((contract) => contract.contractId === hubId)).not.toHaveProperty("exposes");
347
- const hub = (0, builder_1.definePackage)((pkg) => {
348
- pkg.packageId = TEST_PKG_ID;
349
- const contract = pkg.contract(hubId, 2, "Hub");
350
- expect(() => contract.exposes("short", 1)).toThrow("valid peer ID");
351
- expect(() => contract.exposes(GENERIC_ID, 0)).toThrow("positive integer");
352
- });
353
- expect(hub.exposes?.size).toBe(0);
354
- });
355
- it("rejects invalid legacy exposures before installation", () => {
356
- const hubId = (0, utils_1.newid)();
357
- const build = (targets) => (0, builder_1.definePackage)((pkg) => {
358
- pkg.packageId = TEST_PKG_ID;
359
- pkg.contract(GENERIC_ID, 1, "Generic");
360
- const hub = pkg.contract(hubId, 1, "Hub");
361
- for (const target of targets)
362
- hub.exposes(target, 1);
363
- });
364
- expect(() => build([(0, utils_1.newid)()])).toThrow("doesn't provide");
365
- expect(() => build([hubId])).toThrow("can't expose itself");
366
- expect(() => build([GENERIC_ID, GENERIC_ID])).toThrow("twice");
367
- });
368
- it("includes package-level assistants and appNavs", () => {
369
- const assistant = { id: "asst1", name: "Task Bot" };
370
- const nav = { name: "Tasks", iconClassName: "bi bi-list-task", navigationPath: "app" };
371
- const result = (0, builder_1.definePackage)((pkg) => {
372
- pkg.packageId = TEST_PKG_ID;
373
- pkg.assistants = [assistant];
374
- pkg.appNavs = [nav];
375
- const c = pkg.contract(GENERIC_ID, 1, "Generic");
376
- c.tables = [
377
- {
378
- metaData: {
379
- name: "T",
380
- description: "d",
381
- primaryKeyName: "id",
382
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
383
- },
384
- },
385
- ];
386
- });
387
- expect(result.assistants).toEqual([assistant]);
388
- expect(result.appNavs).toEqual([nav]);
389
- });
390
- it("always assigns devTag 'dev' to contracts from definePackage", () => {
391
- const devContractId = (0, utils_1.newid)();
392
- const result = (0, builder_1.definePackage)((pkg) => {
393
- pkg.packageId = TEST_PKG_ID;
394
- const c = pkg.contract(devContractId, 1, "Dev Contract");
395
- c.tables = [
396
- {
397
- metaData: {
398
- name: "T",
399
- description: "d",
400
- primaryKeyName: "id",
401
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
402
- },
403
- },
404
- ];
405
- });
406
- expect(result.contracts[0].devTag).toBe("dev");
407
- });
408
- it("supports observables on contracts", () => {
409
- const obsContractId = (0, utils_1.newid)();
410
- const result = (0, builder_1.definePackage)((pkg) => {
411
- pkg.packageId = TEST_PKG_ID;
412
- const c = pkg.contract(obsContractId, 1, "Observable Contract");
413
- c.tables = [
414
- {
415
- metaData: {
416
- name: "T",
417
- description: "d",
418
- primaryKeyName: "id",
419
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
420
- },
421
- },
422
- ];
423
- c.observables = [
424
- {
425
- name: "taskCount",
426
- description: "Count of tasks",
427
- valueType: field_type_1.FieldType.number,
428
- writable: false,
429
- },
430
- ];
431
- });
432
- expect(result.contracts[0].observables).toHaveLength(1);
433
- expect(result.contracts[0].observables[0].name).toBe("taskCount");
434
- });
435
- it("emits contract events without sharing or mutating the caller's array", () => {
436
- const eventContractId = (0, utils_1.newid)();
437
- const events = [
438
- {
439
- name: "taskChanged",
440
- description: "A task changed",
441
- payloadFields: [{ name: "taskId", type: field_type_1.FieldType.id }],
442
- },
443
- ];
444
- const result = (0, builder_1.definePackage)((pkg) => {
445
- pkg.packageId = TEST_PKG_ID;
446
- const contract = pkg.contract(eventContractId, 1, "Event Contract");
447
- contract.events = events;
448
- });
449
- const emittedEvents = result.contracts[0].events;
450
- expect(emittedEvents).toEqual(events);
451
- expect(emittedEvents).not.toBe(events);
452
- emittedEvents?.push({
453
- name: "otherEvent",
454
- description: "Another event",
455
- payloadFields: [],
456
- });
457
- expect(events).toHaveLength(1);
458
- });
459
- it("uses provided name and description on the contract definition", () => {
460
- const cid = (0, utils_1.newid)();
461
- const result = (0, builder_1.definePackage)((pkg) => {
462
- pkg.packageId = TEST_PKG_ID;
463
- const c = pkg.contract(cid, 1, "Human-Readable Name");
464
- c.tables = [
465
- {
466
- metaData: {
467
- name: "T",
468
- description: "d",
469
- primaryKeyName: "id",
470
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
471
- },
472
- },
473
- ];
474
- });
475
- expect(result.contracts[0].name).toBe("Human-Readable Name");
476
- expect(result.contracts[0].description).toBe("");
477
- });
478
- it("includes packageId and version in the result", () => {
479
- const cid = (0, utils_1.newid)();
480
- const result = (0, builder_1.definePackage)((pkg) => {
481
- pkg.packageId = TEST_PKG_ID;
482
- pkg.version = "1.2.3";
483
- const c = pkg.contract(cid, 1, "C");
484
- c.tables = [
485
- {
486
- metaData: {
487
- name: "T",
488
- description: "d",
489
- primaryKeyName: "id",
490
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
491
- },
492
- },
493
- ];
494
- });
495
- expect(result.packageId).toBe(TEST_PKG_ID);
496
- expect(result.version).toBe("1.2.3");
497
- });
498
- it("leaves version undefined when not set", () => {
499
- const cid = (0, utils_1.newid)();
500
- const result = (0, builder_1.definePackage)((pkg) => {
501
- pkg.packageId = TEST_PKG_ID;
502
- const c = pkg.contract(cid, 1, "C");
503
- c.tables = [
504
- {
505
- metaData: {
506
- name: "T",
507
- description: "d",
508
- primaryKeyName: "id",
509
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
510
- },
511
- },
512
- ];
513
- });
514
- expect(result.packageId).toBe(TEST_PKG_ID);
515
- expect(result.version).toBeUndefined();
516
- });
517
- });
518
- describe("definePackage — error cases", () => {
519
- it("throws when packageId is not set", () => {
520
- const cid = (0, utils_1.newid)();
521
- expect(() => {
522
- (0, builder_1.definePackage)((pkg) => {
523
- pkg.contract(cid, 1, "C");
524
- });
525
- }).toThrow("must set packageId");
526
- });
527
- it("throws when packageId is not a valid peer ID", () => {
528
- expect(() => {
529
- (0, builder_1.definePackage)((pkg) => {
530
- pkg.packageId = "not-valid";
531
- });
532
- }).toThrow("valid peer ID");
533
- });
534
- it("allows package with no contracts (UI-only)", () => {
535
- const nav = { name: "Game", iconClassName: "bi-controller", navigationPath: "play" };
536
- const result = (0, builder_1.definePackage)((pkg) => {
537
- pkg.packageId = TEST_PKG_ID;
538
- pkg.appNavs = [nav];
539
- });
540
- expect(result.contracts).toHaveLength(0);
541
- expect(result.consumes).toHaveLength(0);
542
- expect(result.tableDefinitions).toHaveLength(0);
543
- expect(result.appNavs).toEqual([nav]);
544
- });
545
- it("allows consumes-only package with no defined contracts", () => {
546
- const result = (0, builder_1.definePackage)((pkg) => {
547
- pkg.packageId = TEST_PKG_ID;
548
- pkg.consumes(TASKS_ID, 1);
549
- });
550
- expect(result.contracts).toHaveLength(0);
551
- expect(result.consumes).toHaveLength(1);
552
- expect(result.tableDefinitions).toHaveLength(0);
553
- });
554
- it("throws on duplicate contract ID + version", () => {
555
- const dupId = (0, utils_1.newid)();
556
- expect(() => {
557
- (0, builder_1.definePackage)((pkg) => {
558
- pkg.packageId = TEST_PKG_ID;
559
- pkg.contract(dupId, 1, "First");
560
- pkg.contract(dupId, 1, "Second");
561
- });
562
- }).toThrow("Duplicate contract");
563
- });
564
- it("allows same contractId with different versions", () => {
565
- const cid = (0, utils_1.newid)();
566
- expect(() => {
567
- (0, builder_1.definePackage)((pkg) => {
568
- pkg.packageId = TEST_PKG_ID;
569
- const v1 = pkg.contract(cid, 1, "V1");
570
- v1.tables = [
571
- {
572
- metaData: {
573
- name: "T",
574
- description: "d",
575
- primaryKeyName: "id",
576
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
577
- },
578
- },
579
- ];
580
- const v2 = pkg.contract(cid, 2, "V2");
581
- v2.tables = [
582
- {
583
- metaData: {
584
- name: "T",
585
- description: "d",
586
- primaryKeyName: "id",
587
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
588
- },
589
- },
590
- ];
591
- });
592
- }).not.toThrow();
593
- });
594
- it("throws on non-integer version", () => {
595
- const cid = (0, utils_1.newid)();
596
- expect(() => {
597
- (0, builder_1.definePackage)((pkg) => {
598
- pkg.packageId = TEST_PKG_ID;
599
- pkg.contract(cid, 1.5, "Bad Version");
600
- });
601
- }).toThrow("positive integer");
602
- });
603
- it("throws on zero version", () => {
604
- const cid = (0, utils_1.newid)();
605
- expect(() => {
606
- (0, builder_1.definePackage)((pkg) => {
607
- pkg.packageId = TEST_PKG_ID;
608
- pkg.contract(cid, 0, "Zero");
609
- });
610
- }).toThrow("positive integer");
611
- });
612
- it("throws on negative version", () => {
613
- const cid = (0, utils_1.newid)();
614
- expect(() => {
615
- (0, builder_1.definePackage)((pkg) => {
616
- pkg.packageId = TEST_PKG_ID;
617
- pkg.contract(cid, -1, "Negative");
618
- });
619
- }).toThrow("positive integer");
620
- });
621
- it("throws when contractId is not a valid peer ID", () => {
622
- expect(() => {
623
- (0, builder_1.definePackage)((pkg) => {
624
- pkg.packageId = TEST_PKG_ID;
625
- pkg.contract("tasks001", 1, "Bad ID");
626
- });
627
- }).toThrow("valid peer ID");
628
- });
629
- it("throws when consumes contractId is not a valid peer ID", () => {
630
- const cid = (0, utils_1.newid)();
631
- expect(() => {
632
- (0, builder_1.definePackage)((pkg) => {
633
- pkg.packageId = TEST_PKG_ID;
634
- pkg.consumes("not-a-peer-id", 1);
635
- const c = pkg.contract(cid, 1, "C");
636
- c.tables = [
637
- {
638
- metaData: {
639
- name: "T",
640
- description: "d",
641
- primaryKeyName: "id",
642
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
643
- },
644
- },
645
- ];
646
- });
647
- }).toThrow("valid peer ID");
648
- });
649
- it("throws when alsoImplements targetContractId is not a valid peer ID", () => {
650
- const cid = (0, utils_1.newid)();
651
- expect(() => {
652
- (0, builder_1.definePackage)((pkg) => {
653
- pkg.packageId = TEST_PKG_ID;
654
- const c = pkg.contract(cid, 1, "C");
655
- c.alsoImplements("invalid-id", 1);
656
- c.tables = [
657
- {
658
- metaData: {
659
- name: "T",
660
- description: "d",
661
- primaryKeyName: "id",
662
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
663
- },
664
- },
665
- ];
666
- });
667
- }).toThrow("valid peer ID");
668
- });
669
- });
@@ -1 +0,0 @@
1
- export {};