@meshline/sdk 0.0.0-stage → 0.1.0-alpha.1

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 (338) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +43 -2
  3. package/dist/channels/repository.d.ts +73 -0
  4. package/dist/channels/repository.d.ts.map +1 -0
  5. package/dist/channels/repository.js +367 -0
  6. package/dist/channels/repository.js.map +1 -0
  7. package/dist/client/account-operations.d.ts +41 -0
  8. package/dist/client/account-operations.d.ts.map +1 -0
  9. package/dist/client/account-operations.js +304 -0
  10. package/dist/client/account-operations.js.map +1 -0
  11. package/dist/client/conversations.d.ts +36 -0
  12. package/dist/client/conversations.d.ts.map +1 -0
  13. package/dist/client/conversations.js +144 -0
  14. package/dist/client/conversations.js.map +1 -0
  15. package/dist/client.d.ts +53 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +162 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/components/account.d.ts +38 -0
  20. package/dist/components/account.d.ts.map +1 -0
  21. package/dist/components/account.js +243 -0
  22. package/dist/components/account.js.map +1 -0
  23. package/dist/components/channel.d.ts +78 -0
  24. package/dist/components/channel.d.ts.map +1 -0
  25. package/dist/components/channel.js +475 -0
  26. package/dist/components/channel.js.map +1 -0
  27. package/dist/components/component.d.ts +49 -0
  28. package/dist/components/component.d.ts.map +1 -0
  29. package/dist/components/component.js +194 -0
  30. package/dist/components/component.js.map +1 -0
  31. package/dist/components/device.d.ts +60 -0
  32. package/dist/components/device.d.ts.map +1 -0
  33. package/dist/components/device.js +648 -0
  34. package/dist/components/device.js.map +1 -0
  35. package/dist/components/group.d.ts +141 -0
  36. package/dist/components/group.d.ts.map +1 -0
  37. package/dist/components/group.js +933 -0
  38. package/dist/components/group.js.map +1 -0
  39. package/dist/components/message.d.ts +63 -0
  40. package/dist/components/message.d.ts.map +1 -0
  41. package/dist/components/message.js +439 -0
  42. package/dist/components/message.js.map +1 -0
  43. package/dist/components/profile.d.ts +37 -0
  44. package/dist/components/profile.d.ts.map +1 -0
  45. package/dist/components/profile.js +232 -0
  46. package/dist/components/profile.js.map +1 -0
  47. package/dist/crypto/groups.d.ts +56 -0
  48. package/dist/crypto/groups.d.ts.map +1 -0
  49. package/dist/crypto/groups.js +163 -0
  50. package/dist/crypto/groups.js.map +1 -0
  51. package/dist/crypto/messages.d.ts +52 -0
  52. package/dist/crypto/messages.d.ts.map +1 -0
  53. package/dist/crypto/messages.js +180 -0
  54. package/dist/crypto/messages.js.map +1 -0
  55. package/dist/crypto/primitives.d.ts +30 -0
  56. package/dist/crypto/primitives.d.ts.map +1 -0
  57. package/dist/crypto/primitives.js +102 -0
  58. package/dist/crypto/primitives.js.map +1 -0
  59. package/dist/errors.d.ts +11 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/errors.js +14 -0
  62. package/dist/errors.js.map +1 -0
  63. package/dist/groups/account-sync.d.ts +28 -0
  64. package/dist/groups/account-sync.d.ts.map +1 -0
  65. package/dist/groups/account-sync.js +235 -0
  66. package/dist/groups/account-sync.js.map +1 -0
  67. package/dist/groups/messages.d.ts +39 -0
  68. package/dist/groups/messages.d.ts.map +1 -0
  69. package/dist/groups/messages.js +141 -0
  70. package/dist/groups/messages.js.map +1 -0
  71. package/dist/groups/operations.d.ts +57 -0
  72. package/dist/groups/operations.d.ts.map +1 -0
  73. package/dist/groups/operations.js +225 -0
  74. package/dist/groups/operations.js.map +1 -0
  75. package/dist/groups/repository.d.ts +56 -0
  76. package/dist/groups/repository.d.ts.map +1 -0
  77. package/dist/groups/repository.js +254 -0
  78. package/dist/groups/repository.js.map +1 -0
  79. package/dist/groups/secrets.d.ts +67 -0
  80. package/dist/groups/secrets.d.ts.map +1 -0
  81. package/dist/groups/secrets.js +452 -0
  82. package/dist/groups/secrets.js.map +1 -0
  83. package/dist/groups/state.d.ts +39 -0
  84. package/dist/groups/state.d.ts.map +1 -0
  85. package/dist/groups/state.js +201 -0
  86. package/dist/groups/state.js.map +1 -0
  87. package/dist/identity/identifiers.d.ts +9 -0
  88. package/dist/identity/identifiers.d.ts.map +1 -0
  89. package/dist/identity/identifiers.js +37 -0
  90. package/dist/identity/identifiers.js.map +1 -0
  91. package/dist/identity/neo.d.ts +11 -0
  92. package/dist/identity/neo.d.ts.map +1 -0
  93. package/dist/identity/neo.js +77 -0
  94. package/dist/identity/neo.js.map +1 -0
  95. package/dist/index.d.ts +53 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +46 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/interactions.d.ts +31 -0
  100. package/dist/interactions.d.ts.map +1 -0
  101. package/dist/interactions.js +2 -0
  102. package/dist/interactions.js.map +1 -0
  103. package/dist/messages/account-sender.d.ts +9 -0
  104. package/dist/messages/account-sender.d.ts.map +1 -0
  105. package/dist/messages/account-sender.js +46 -0
  106. package/dist/messages/account-sender.js.map +1 -0
  107. package/dist/messages/contacts.d.ts +103 -0
  108. package/dist/messages/contacts.d.ts.map +1 -0
  109. package/dist/messages/contacts.js +525 -0
  110. package/dist/messages/contacts.js.map +1 -0
  111. package/dist/messages/outbox.d.ts +66 -0
  112. package/dist/messages/outbox.d.ts.map +1 -0
  113. package/dist/messages/outbox.js +167 -0
  114. package/dist/messages/outbox.js.map +1 -0
  115. package/dist/messages/receiver.d.ts +35 -0
  116. package/dist/messages/receiver.d.ts.map +1 -0
  117. package/dist/messages/receiver.js +113 -0
  118. package/dist/messages/receiver.js.map +1 -0
  119. package/dist/messages/repository.d.ts +89 -0
  120. package/dist/messages/repository.d.ts.map +1 -0
  121. package/dist/messages/repository.js +295 -0
  122. package/dist/messages/repository.js.map +1 -0
  123. package/dist/models/authentication.d.ts +37 -0
  124. package/dist/models/authentication.d.ts.map +1 -0
  125. package/dist/models/authentication.js +53 -0
  126. package/dist/models/authentication.js.map +1 -0
  127. package/dist/models/channels.d.ts +141 -0
  128. package/dist/models/channels.d.ts.map +1 -0
  129. package/dist/models/channels.js +258 -0
  130. package/dist/models/channels.js.map +1 -0
  131. package/dist/models/contacts.d.ts +68 -0
  132. package/dist/models/contacts.d.ts.map +1 -0
  133. package/dist/models/contacts.js +186 -0
  134. package/dist/models/contacts.js.map +1 -0
  135. package/dist/models/content.d.ts +37 -0
  136. package/dist/models/content.d.ts.map +1 -0
  137. package/dist/models/content.js +137 -0
  138. package/dist/models/content.js.map +1 -0
  139. package/dist/models/device-state.d.ts +8 -0
  140. package/dist/models/device-state.d.ts.map +1 -0
  141. package/dist/models/device-state.js +22 -0
  142. package/dist/models/device-state.js.map +1 -0
  143. package/dist/models/group-admission.d.ts +111 -0
  144. package/dist/models/group-admission.d.ts.map +1 -0
  145. package/dist/models/group-admission.js +153 -0
  146. package/dist/models/group-admission.js.map +1 -0
  147. package/dist/models/group-keys.d.ts +30 -0
  148. package/dist/models/group-keys.d.ts.map +1 -0
  149. package/dist/models/group-keys.js +52 -0
  150. package/dist/models/group-keys.js.map +1 -0
  151. package/dist/models/group-management.d.ts +190 -0
  152. package/dist/models/group-management.d.ts.map +1 -0
  153. package/dist/models/group-management.js +263 -0
  154. package/dist/models/group-management.js.map +1 -0
  155. package/dist/models/groups.d.ts +81 -0
  156. package/dist/models/groups.d.ts.map +1 -0
  157. package/dist/models/groups.js +127 -0
  158. package/dist/models/groups.js.map +1 -0
  159. package/dist/models/identity.d.ts +47 -0
  160. package/dist/models/identity.d.ts.map +1 -0
  161. package/dist/models/identity.js +136 -0
  162. package/dist/models/identity.js.map +1 -0
  163. package/dist/models/messages.d.ts +104 -0
  164. package/dist/models/messages.d.ts.map +1 -0
  165. package/dist/models/messages.js +168 -0
  166. package/dist/models/messages.js.map +1 -0
  167. package/dist/models/profile.d.ts +24 -0
  168. package/dist/models/profile.d.ts.map +1 -0
  169. package/dist/models/profile.js +47 -0
  170. package/dist/models/profile.js.map +1 -0
  171. package/dist/models/relay.d.ts +39 -0
  172. package/dist/models/relay.d.ts.map +1 -0
  173. package/dist/models/relay.js +160 -0
  174. package/dist/models/relay.js.map +1 -0
  175. package/dist/protocol/codec.d.ts +36 -0
  176. package/dist/protocol/codec.d.ts.map +1 -0
  177. package/dist/protocol/codec.js +144 -0
  178. package/dist/protocol/codec.js.map +1 -0
  179. package/dist/protocol/context.d.ts +14 -0
  180. package/dist/protocol/context.d.ts.map +1 -0
  181. package/dist/protocol/context.js +43 -0
  182. package/dist/protocol/context.js.map +1 -0
  183. package/dist/protocol/encoding.d.ts +15 -0
  184. package/dist/protocol/encoding.d.ts.map +1 -0
  185. package/dist/protocol/encoding.js +133 -0
  186. package/dist/protocol/encoding.js.map +1 -0
  187. package/dist/protocol/json.d.ts +16 -0
  188. package/dist/protocol/json.d.ts.map +1 -0
  189. package/dist/protocol/json.js +172 -0
  190. package/dist/protocol/json.js.map +1 -0
  191. package/dist/protocol/validation.d.ts +4 -0
  192. package/dist/protocol/validation.d.ts.map +1 -0
  193. package/dist/protocol/validation.js +18 -0
  194. package/dist/protocol/validation.js.map +1 -0
  195. package/dist/runtime/abort.d.ts +6 -0
  196. package/dist/runtime/abort.d.ts.map +1 -0
  197. package/dist/runtime/abort.js +32 -0
  198. package/dist/runtime/abort.js.map +1 -0
  199. package/dist/runtime/async-gate.d.ts +6 -0
  200. package/dist/runtime/async-gate.d.ts.map +1 -0
  201. package/dist/runtime/async-gate.js +15 -0
  202. package/dist/runtime/async-gate.js.map +1 -0
  203. package/dist/runtime/async-pulse.d.ts +7 -0
  204. package/dist/runtime/async-pulse.d.ts.map +1 -0
  205. package/dist/runtime/async-pulse.js +23 -0
  206. package/dist/runtime/async-pulse.js.map +1 -0
  207. package/dist/runtime/clock.d.ts +16 -0
  208. package/dist/runtime/clock.d.ts.map +1 -0
  209. package/dist/runtime/clock.js +62 -0
  210. package/dist/runtime/clock.js.map +1 -0
  211. package/dist/runtime/events.d.ts +11 -0
  212. package/dist/runtime/events.d.ts.map +1 -0
  213. package/dist/runtime/events.js +45 -0
  214. package/dist/runtime/events.js.map +1 -0
  215. package/dist/runtime/url.d.ts +3 -0
  216. package/dist/runtime/url.d.ts.map +1 -0
  217. package/dist/runtime/url.js +23 -0
  218. package/dist/runtime/url.js.map +1 -0
  219. package/dist/storage/signed-request.d.ts +14 -0
  220. package/dist/storage/signed-request.d.ts.map +1 -0
  221. package/dist/storage/signed-request.js +26 -0
  222. package/dist/storage/signed-request.js.map +1 -0
  223. package/dist/storage/store.d.ts +58 -0
  224. package/dist/storage/store.d.ts.map +1 -0
  225. package/dist/storage/store.js +52 -0
  226. package/dist/storage/store.js.map +1 -0
  227. package/dist/storage/transaction.d.ts +7 -0
  228. package/dist/storage/transaction.d.ts.map +1 -0
  229. package/dist/storage/transaction.js +22 -0
  230. package/dist/storage/transaction.js.map +1 -0
  231. package/dist/transport/client.d.ts +61 -0
  232. package/dist/transport/client.d.ts.map +1 -0
  233. package/dist/transport/client.js +392 -0
  234. package/dist/transport/client.js.map +1 -0
  235. package/dist/transport/discovery.d.ts +19 -0
  236. package/dist/transport/discovery.d.ts.map +1 -0
  237. package/dist/transport/discovery.js +75 -0
  238. package/dist/transport/discovery.js.map +1 -0
  239. package/dist/transport/endpoint.d.ts +6 -0
  240. package/dist/transport/endpoint.d.ts.map +1 -0
  241. package/dist/transport/endpoint.js +35 -0
  242. package/dist/transport/endpoint.js.map +1 -0
  243. package/dist/transport/http.d.ts +52 -0
  244. package/dist/transport/http.d.ts.map +1 -0
  245. package/dist/transport/http.js +128 -0
  246. package/dist/transport/http.js.map +1 -0
  247. package/dist/transport/pool.d.ts +31 -0
  248. package/dist/transport/pool.d.ts.map +1 -0
  249. package/dist/transport/pool.js +137 -0
  250. package/dist/transport/pool.js.map +1 -0
  251. package/dist/transport/relay-error.d.ts +23 -0
  252. package/dist/transport/relay-error.d.ts.map +1 -0
  253. package/dist/transport/relay-error.js +47 -0
  254. package/dist/transport/relay-error.js.map +1 -0
  255. package/dist/transport/rpc.d.ts +31 -0
  256. package/dist/transport/rpc.d.ts.map +1 -0
  257. package/dist/transport/rpc.js +56 -0
  258. package/dist/transport/rpc.js.map +1 -0
  259. package/dist/transport/session.d.ts +49 -0
  260. package/dist/transport/session.d.ts.map +1 -0
  261. package/dist/transport/session.js +169 -0
  262. package/dist/transport/session.js.map +1 -0
  263. package/dist/transport/socket.d.ts +55 -0
  264. package/dist/transport/socket.d.ts.map +1 -0
  265. package/dist/transport/socket.js +266 -0
  266. package/dist/transport/socket.js.map +1 -0
  267. package/dist/transport/subscription.d.ts +36 -0
  268. package/dist/transport/subscription.d.ts.map +1 -0
  269. package/dist/transport/subscription.js +169 -0
  270. package/dist/transport/subscription.js.map +1 -0
  271. package/package.json +35 -4
  272. package/src/channels/repository.ts +244 -0
  273. package/src/client/account-operations.ts +183 -0
  274. package/src/client/conversations.ts +95 -0
  275. package/src/client.ts +108 -0
  276. package/src/components/account.ts +206 -0
  277. package/src/components/channel.ts +253 -0
  278. package/src/components/component.ts +151 -0
  279. package/src/components/device.ts +455 -0
  280. package/src/components/group.ts +546 -0
  281. package/src/components/message.ts +253 -0
  282. package/src/components/profile.ts +179 -0
  283. package/src/crypto/groups.ts +107 -0
  284. package/src/crypto/messages.ts +129 -0
  285. package/src/crypto/primitives.ts +103 -0
  286. package/src/errors.ts +13 -0
  287. package/src/groups/account-sync.ts +144 -0
  288. package/src/groups/messages.ts +89 -0
  289. package/src/groups/operations.ts +145 -0
  290. package/src/groups/repository.ts +161 -0
  291. package/src/groups/secrets.ts +256 -0
  292. package/src/groups/state.ts +138 -0
  293. package/src/identity/identifiers.ts +41 -0
  294. package/src/identity/neo.ts +72 -0
  295. package/src/index.ts +52 -0
  296. package/src/interactions.ts +35 -0
  297. package/src/messages/account-sender.ts +33 -0
  298. package/src/messages/contacts.ts +379 -0
  299. package/src/messages/outbox.ts +152 -0
  300. package/src/messages/receiver.ts +86 -0
  301. package/src/messages/repository.ts +230 -0
  302. package/src/models/authentication.ts +63 -0
  303. package/src/models/channels.ts +155 -0
  304. package/src/models/contacts.ts +141 -0
  305. package/src/models/content.ts +105 -0
  306. package/src/models/device-state.ts +18 -0
  307. package/src/models/group-admission.ts +110 -0
  308. package/src/models/group-keys.ts +34 -0
  309. package/src/models/group-management.ts +182 -0
  310. package/src/models/groups.ts +100 -0
  311. package/src/models/identity.ts +164 -0
  312. package/src/models/messages.ts +139 -0
  313. package/src/models/profile.ts +46 -0
  314. package/src/models/relay.ts +151 -0
  315. package/src/protocol/codec.ts +144 -0
  316. package/src/protocol/context.ts +39 -0
  317. package/src/protocol/encoding.ts +106 -0
  318. package/src/protocol/json.ts +140 -0
  319. package/src/protocol/validation.ts +13 -0
  320. package/src/runtime/abort.ts +27 -0
  321. package/src/runtime/async-gate.ts +16 -0
  322. package/src/runtime/async-pulse.ts +20 -0
  323. package/src/runtime/clock.ts +63 -0
  324. package/src/runtime/events.ts +31 -0
  325. package/src/runtime/url.ts +17 -0
  326. package/src/storage/signed-request.ts +26 -0
  327. package/src/storage/store.ts +90 -0
  328. package/src/storage/transaction.ts +17 -0
  329. package/src/transport/client.ts +328 -0
  330. package/src/transport/discovery.ts +64 -0
  331. package/src/transport/endpoint.ts +32 -0
  332. package/src/transport/http.ts +129 -0
  333. package/src/transport/pool.ts +115 -0
  334. package/src/transport/relay-error.ts +46 -0
  335. package/src/transport/rpc.ts +56 -0
  336. package/src/transport/session.ts +154 -0
  337. package/src/transport/socket.ts +248 -0
  338. package/src/transport/subscription.ts +117 -0
@@ -0,0 +1,144 @@
1
+ import { ProtocolError } from '../errors.js';
2
+ import { decodeBase64Url, encodeBase64Url } from './encoding.js';
3
+ import { canonicalJson, parseJson, requireObject, requireSafeInteger } from './json.js';
4
+ export const text = {
5
+ decode(value) {
6
+ if (typeof value !== 'string')
7
+ throw new ProtocolError('invalid_field', 'Expected a string.');
8
+ return value;
9
+ },
10
+ encode(value) { return this.decode(value); },
11
+ };
12
+ export const integer = {
13
+ decode(value) { requireSafeInteger(value); return value; },
14
+ encode(value) { return this.decode(value); },
15
+ };
16
+ export const boolean = {
17
+ decode(value) {
18
+ if (typeof value !== 'boolean')
19
+ throw new ProtocolError('invalid_field', 'Expected a boolean.');
20
+ return value;
21
+ },
22
+ encode(value) { return this.decode(value); },
23
+ };
24
+ export const bytes = {
25
+ decode(value) { return decodeBase64Url(text.decode(value)); },
26
+ encode(value) {
27
+ if (!(value instanceof Uint8Array))
28
+ throw new ProtocolError('invalid_field', 'Expected a Uint8Array.');
29
+ return encodeBase64Url(value);
30
+ },
31
+ };
32
+ export function array(item) {
33
+ return {
34
+ decode(value) {
35
+ if (!Array.isArray(value))
36
+ throw new ProtocolError('invalid_field', 'Expected an array.');
37
+ return value.map(element => item.decode(element));
38
+ },
39
+ encode(value) {
40
+ if (!Array.isArray(value))
41
+ throw new ProtocolError('invalid_field', 'Expected an array.');
42
+ return value.map(element => item.encode(element));
43
+ },
44
+ };
45
+ }
46
+ export function dictionary(item) {
47
+ return {
48
+ decode(value) {
49
+ const result = Object.create(null);
50
+ for (const [key, field] of Object.entries(requireObject(value)))
51
+ result[key] = item.decode(field);
52
+ return result;
53
+ },
54
+ encode(value) {
55
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
56
+ throw new ProtocolError('invalid_field', 'Expected a dictionary.');
57
+ const result = Object.create(null);
58
+ for (const [key, field] of Object.entries(value))
59
+ result[key] = item.encode(field);
60
+ return result;
61
+ },
62
+ };
63
+ }
64
+ export function enumeration(...values) {
65
+ return {
66
+ decode(value) {
67
+ if (typeof value !== 'string' || !values.includes(value))
68
+ throw new ProtocolError('invalid_field', 'Unknown enum value.');
69
+ return value;
70
+ },
71
+ encode(value) { return this.decode(value); },
72
+ };
73
+ }
74
+ /** Creates an explicit mapping without guessing wire names or discarding signed extensions. */
75
+ export function defineCodec(fields, type) {
76
+ const entries = Object.entries(fields);
77
+ const wireNames = new Set(entries.map(([, field]) => field.wire));
78
+ if (type !== undefined)
79
+ wireNames.add('$type');
80
+ if (wireNames.size !== entries.length + (type === undefined ? 0 : 1))
81
+ throw new Error('Duplicate codec field definition.');
82
+ const modelNames = new Set(entries.map(([name]) => name));
83
+ const codec = {
84
+ decode(value) {
85
+ const object = requireObject(value);
86
+ // Also enforces scalar, integer and depth rules for direct object inputs.
87
+ canonicalJson(object);
88
+ if (type !== undefined && object['$type'] !== type)
89
+ throw new ProtocolError('invalid_type', `Expected ${type}.`);
90
+ const result = {};
91
+ for (const [name, field] of entries) {
92
+ if (!Object.hasOwn(object, field.wire)) {
93
+ if (!field.optional)
94
+ throw new ProtocolError('missing_field', `Missing ${field.wire}.`);
95
+ continue;
96
+ }
97
+ const input = object[field.wire];
98
+ if (input === null && field.nullable)
99
+ result[name] = null;
100
+ else
101
+ result[name] = field.codec.decode(input);
102
+ }
103
+ const extras = Object.create(null);
104
+ for (const [name, field] of Object.entries(object))
105
+ if (!wireNames.has(name))
106
+ extras[name] = field;
107
+ if (Object.keys(extras).length !== 0)
108
+ result.additionalProperties = requireObject(parseJson(canonicalJson(extras)));
109
+ return result;
110
+ },
111
+ encode(value) {
112
+ if (value === null || typeof value !== 'object')
113
+ throw new ProtocolError('invalid_model', 'Expected a model object.');
114
+ for (const name of Object.keys(value))
115
+ if (name !== 'additionalProperties' && !modelNames.has(name))
116
+ throw new ProtocolError('invalid_model', `Unknown model member ${name}; use additionalProperties for wire extensions.`);
117
+ const result = Object.create(null);
118
+ if (type !== undefined)
119
+ result['$type'] = type;
120
+ for (const [name, field] of entries) {
121
+ const input = value[name];
122
+ if (input === undefined && field.optional)
123
+ continue;
124
+ if (input === undefined)
125
+ throw new ProtocolError('missing_field', `Missing ${name}.`);
126
+ if (input === null && field.nullable)
127
+ result[field.wire] = null;
128
+ else
129
+ result[field.wire] = field.codec.encode(input);
130
+ }
131
+ for (const [name, field] of Object.entries(value.additionalProperties ?? {})) {
132
+ if (wireNames.has(name))
133
+ throw new ProtocolError('conflicting_extension', `Extension conflicts with ${name}.`);
134
+ result[name] = field;
135
+ }
136
+ // Copy extensions and validate the entire resulting tree without normalizing fields.
137
+ return requireObject(parseJson(canonicalJson(result)));
138
+ },
139
+ parse(input) { return this.decode(parseJson(input)); },
140
+ stringify(value) { return canonicalJson(this.encode(value)); },
141
+ };
142
+ return codec;
143
+ }
144
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/protocol/codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type JsonObject } from './json.js';
2
+ /** Trusted network identity; a remote document cannot supply this configuration. */
3
+ export declare class NetworkContext {
4
+ readonly reference: number;
5
+ readonly registry: string;
6
+ constructor(reference: number, registry: string);
7
+ static parse(value: string): NetworkContext;
8
+ toString(): string;
9
+ }
10
+ /** Binds a complete object to the trusted network, excluding only named root fields. */
11
+ export declare function signingInput(value: JsonObject, context: NetworkContext, excluded?: readonly string[]): Uint8Array;
12
+ /** Advances a counter without overflow, approximation, or reuse of a previous value. */
13
+ export declare function nextRevision(known: number, requested?: number): number;
14
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/protocol/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAEhF,oFAAoF;AACpF,qBAAa,cAAc;IACX,QAAQ,CAAC,SAAS,EAAE,MAAM;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAAjE,YAAqB,SAAS,EAAE,MAAM,EAAW,QAAQ,EAAE,MAAM,EAKhE;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAI1C;IAED,QAAQ,IAAI,MAAM,CAAqD;CAC1E;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,GAAE,SAAS,MAAM,EAAO,GAAG,UAAU,CAOrH;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAMtE"}
@@ -0,0 +1,43 @@
1
+ import { ProtocolError } from '../errors.js';
2
+ import { canonicalBytes, requireSafeInteger } from './json.js';
3
+ /** Trusted network identity; a remote document cannot supply this configuration. */
4
+ export class NetworkContext {
5
+ reference;
6
+ registry;
7
+ constructor(reference, registry) {
8
+ this.reference = reference;
9
+ this.registry = registry;
10
+ requireSafeInteger(reference, 0);
11
+ if (reference > 0xffff_ffff || registry.length !== 42 || !/^0x[0-9a-f]{40}$/.test(registry))
12
+ throw new ProtocolError('invalid_context', 'Expected a Neo uint32 network reference and lowercase registry hash.');
13
+ Object.freeze(this);
14
+ }
15
+ static parse(value) {
16
+ const match = /^neo:(0|[1-9][0-9]{0,9}):(0x[0-9a-f]{40})$/.exec(value);
17
+ if (!match || match[0] !== value)
18
+ throw new ProtocolError('invalid_context', 'Expected a canonical network context.');
19
+ return new NetworkContext(Number(match[1]), match[2]);
20
+ }
21
+ toString() { return `neo:${this.reference}:${this.registry}`; }
22
+ }
23
+ /** Binds a complete object to the trusted network, excluding only named root fields. */
24
+ export function signingInput(value, context, excluded = []) {
25
+ if (Object.hasOwn(value, '$context'))
26
+ throw new ProtocolError('invalid_context', 'A protocol object must not contain a root $context property.');
27
+ const result = Object.create(null);
28
+ for (const [name, field] of Object.entries(value))
29
+ if (!excluded.includes(name))
30
+ result[name] = field;
31
+ result['$context'] = context.toString();
32
+ return canonicalBytes(result);
33
+ }
34
+ /** Advances a counter without overflow, approximation, or reuse of a previous value. */
35
+ export function nextRevision(known, requested) {
36
+ requireSafeInteger(known, -1);
37
+ const result = requested ?? known + 1;
38
+ requireSafeInteger(result, 0);
39
+ if (result <= known)
40
+ throw new ProtocolError('revision_exhausted', 'Revision must exceed every known revision.');
41
+ return result;
42
+ }
43
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/protocol/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAmB,MAAM,WAAW,CAAC;AAEhF,oFAAoF;AACpF,MAAM,OAAO,cAAc;IACF,SAAS;IAAmB,QAAQ;IAAzD,YAAqB,SAAiB,EAAW,QAAgB;yBAA5C,SAAS;wBAAmB,QAAQ;QACrD,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjC,IAAI,SAAS,GAAG,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACvF,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,sEAAsE,CAAC,CAAC;QACvH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAa;QACtB,MAAM,KAAK,GAAG,4CAA4C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK;YAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,uCAAuC,CAAC,CAAC;QACtH,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IAC3D,CAAC;IAED,QAAQ,KAAa,OAAO,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;CAC1E;AAED,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,KAAiB,EAAE,OAAuB,EAAE,QAAQ,GAAsB,EAAE;IACrG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC;QAChC,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,8DAA8D,CAAC,CAAC;IAC/G,MAAM,MAAM,GAAe,MAAM,CAAC,MAAM,CAAC,IAAI,CAAe,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACtG,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACxC,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,SAAkB;IAC1D,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,SAAS,IAAI,KAAK,GAAG,CAAC,CAAC;IACtC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9B,IAAI,MAAM,IAAI,KAAK;QAAE,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,4CAA4C,CAAC,CAAC;IACjH,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** Rejects unpaired UTF-16 surrogates without normalizing valid text. */
2
+ export declare function validateUnicode(value: string): void;
3
+ /** Encodes Unicode scalar values as UTF-8 without silently replacing invalid text. */
4
+ export declare function encodeUtf8(value: string): Uint8Array;
5
+ /** Strict UTF-8 decoding, independent of platform TextDecoder error handling. */
6
+ export declare function decodeUtf8(bytes: Uint8Array): string;
7
+ /** Encodes bytes as canonical unpadded base64url. */
8
+ export declare function encodeBase64Url(bytes: Uint8Array): string;
9
+ /** Decodes only canonical unpadded base64url, including zero trailing pad bits. */
10
+ export declare function decodeBase64Url(value: string, expectedLength?: number): Uint8Array;
11
+ /** Concatenates byte arrays without retaining references to the inputs. */
12
+ export declare function concatBytes(...values: readonly Uint8Array[]): Uint8Array;
13
+ /** Compares byte values without an early exit on unequal content. */
14
+ export declare function equalBytes(left: Uint8Array, right: Uint8Array): boolean;
15
+ //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/protocol/encoding.ts"],"names":[],"mappings":"AAIA,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAWnD;AAED,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAGpD;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CA0BpD;AAED,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAczD;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,CAkBlF;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,CAKxE;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAKvE"}
@@ -0,0 +1,133 @@
1
+ import { ProtocolError } from '../errors.js';
2
+ const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
3
+ /** Rejects unpaired UTF-16 surrogates without normalizing valid text. */
4
+ export function validateUnicode(value) {
5
+ for (let index = 0; index < value.length; index++) {
6
+ const unit = value.charCodeAt(index);
7
+ if (unit >= 0xd800 && unit <= 0xdbff) {
8
+ const next = value.charCodeAt(++index);
9
+ if (!(next >= 0xdc00 && next <= 0xdfff))
10
+ throw new ProtocolError('invalid_unicode', 'Unpaired high surrogate.');
11
+ }
12
+ else if (unit >= 0xdc00 && unit <= 0xdfff) {
13
+ throw new ProtocolError('invalid_unicode', 'Unpaired low surrogate.');
14
+ }
15
+ }
16
+ }
17
+ /** Encodes Unicode scalar values as UTF-8 without silently replacing invalid text. */
18
+ export function encodeUtf8(value) {
19
+ validateUnicode(value);
20
+ return new TextEncoder().encode(value);
21
+ }
22
+ /** Strict UTF-8 decoding, independent of platform TextDecoder error handling. */
23
+ export function decodeUtf8(bytes) {
24
+ const chunks = [];
25
+ let chunk = '';
26
+ for (let index = 0; index < bytes.length;) {
27
+ const first = bytes[index++];
28
+ let scalar;
29
+ let count;
30
+ let minimum;
31
+ if (first <= 0x7f) {
32
+ scalar = first;
33
+ count = 0;
34
+ minimum = 0;
35
+ }
36
+ else if (first >= 0xc2 && first <= 0xdf) {
37
+ scalar = first & 31;
38
+ count = 1;
39
+ minimum = 0x80;
40
+ }
41
+ else if (first >= 0xe0 && first <= 0xef) {
42
+ scalar = first & 15;
43
+ count = 2;
44
+ minimum = 0x800;
45
+ }
46
+ else if (first >= 0xf0 && first <= 0xf4) {
47
+ scalar = first & 7;
48
+ count = 3;
49
+ minimum = 0x10000;
50
+ }
51
+ else
52
+ throw new ProtocolError('invalid_utf8', 'Invalid UTF-8 leading byte.');
53
+ for (let part = 0; part < count; part++) {
54
+ const continuation = bytes[index++];
55
+ if (continuation === undefined || (continuation & 0xc0) !== 0x80)
56
+ throw new ProtocolError('invalid_utf8', 'Invalid or incomplete UTF-8 sequence.');
57
+ scalar = (scalar << 6) | (continuation & 63);
58
+ }
59
+ if (scalar < minimum || scalar > 0x10ffff || (scalar >= 0xd800 && scalar <= 0xdfff))
60
+ throw new ProtocolError('invalid_utf8', 'Noncanonical UTF-8 scalar.');
61
+ chunk += String.fromCodePoint(scalar);
62
+ if (chunk.length >= 4096) {
63
+ chunks.push(chunk);
64
+ chunk = '';
65
+ }
66
+ }
67
+ chunks.push(chunk);
68
+ return chunks.join('');
69
+ }
70
+ /** Encodes bytes as canonical unpadded base64url. */
71
+ export function encodeBase64Url(bytes) {
72
+ const chunks = [];
73
+ let chunk = '';
74
+ for (let index = 0; index < bytes.length; index += 3) {
75
+ const first = bytes[index];
76
+ const second = bytes[index + 1];
77
+ const third = bytes[index + 2];
78
+ chunk += alphabet[first >>> 2] + alphabet[((first & 3) << 4) | ((second ?? 0) >>> 4)];
79
+ if (second !== undefined)
80
+ chunk += alphabet[((second & 15) << 2) | ((third ?? 0) >>> 6)];
81
+ if (third !== undefined)
82
+ chunk += alphabet[third & 63];
83
+ if (chunk.length >= 4096) {
84
+ chunks.push(chunk);
85
+ chunk = '';
86
+ }
87
+ }
88
+ chunks.push(chunk);
89
+ return chunks.join('');
90
+ }
91
+ /** Decodes only canonical unpadded base64url, including zero trailing pad bits. */
92
+ export function decodeBase64Url(value, expectedLength) {
93
+ if (/[^A-Za-z0-9_-]/.test(value) || value.length % 4 === 1)
94
+ throw new ProtocolError('invalid_base64url', 'Expected canonical unpadded base64url.');
95
+ const tail = value.length === 0 ? 0 : alphabet.indexOf(value.at(-1));
96
+ if ((value.length % 4 === 2 && (tail & 15) !== 0) || (value.length % 4 === 3 && (tail & 3) !== 0))
97
+ throw new ProtocolError('invalid_base64url', 'Nonzero base64url padding bits.');
98
+ const result = new Uint8Array(Math.floor(value.length * 6 / 8));
99
+ if (expectedLength !== undefined && result.length !== expectedLength)
100
+ throw new ProtocolError('invalid_length', `Expected ${expectedLength} bytes.`);
101
+ let bits = 0;
102
+ let available = 0;
103
+ let offset = 0;
104
+ for (const character of value) {
105
+ bits = (bits << 6) | alphabet.indexOf(character);
106
+ available += 6;
107
+ if (available >= 8) {
108
+ available -= 8;
109
+ result[offset++] = (bits >>> available) & 255;
110
+ }
111
+ }
112
+ return result;
113
+ }
114
+ /** Concatenates byte arrays without retaining references to the inputs. */
115
+ export function concatBytes(...values) {
116
+ const result = new Uint8Array(values.reduce((size, value) => size + value.length, 0));
117
+ let offset = 0;
118
+ for (const value of values) {
119
+ result.set(value, offset);
120
+ offset += value.length;
121
+ }
122
+ return result;
123
+ }
124
+ /** Compares byte values without an early exit on unequal content. */
125
+ export function equalBytes(left, right) {
126
+ if (left.length !== right.length)
127
+ return false;
128
+ let difference = 0;
129
+ for (let index = 0; index < left.length; index++)
130
+ difference |= left[index] ^ right[index];
131
+ return difference === 0;
132
+ }
133
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/protocol/encoding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type JsonValue = null | boolean | number | string | JsonValue[] | JsonObject;
2
+ export interface JsonObject {
3
+ [name: string]: JsonValue;
4
+ }
5
+ export declare const maximumJsonDepth = 16;
6
+ /** Checks the exact safe-integer domain used by protocol JSON. */
7
+ export declare function requireSafeInteger(value: unknown, minimum?: number): asserts value is number;
8
+ /** Parses protocol JSON before duplicate names or numeric spelling can be lost. */
9
+ export declare function parseJson(input: string | Uint8Array): JsonValue;
10
+ /** Encodes only JSON data, preserving unknown properties and UTF-16 key ordering. */
11
+ export declare function canonicalJson(value: JsonValue): string;
12
+ /** Encodes canonical protocol JSON as strict UTF-8. */
13
+ export declare function canonicalBytes(value: JsonValue): Uint8Array;
14
+ /** Requires a JSON object; arrays and null do not qualify. */
15
+ export declare function requireObject(value: JsonValue): JsonObject;
16
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/protocol/json.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,GAAG,UAAU,CAAC;AACpF,MAAM,WAAW,UAAU;IAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;AACzD,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,SAA2B,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAG9G;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAkF/D;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CA4BtD;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAE3D;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAI1D"}
@@ -0,0 +1,172 @@
1
+ import { ProtocolError } from '../errors.js';
2
+ import { decodeUtf8, encodeUtf8, validateUnicode } from './encoding.js';
3
+ export const maximumJsonDepth = 16;
4
+ /** Checks the exact safe-integer domain used by protocol JSON. */
5
+ export function requireSafeInteger(value, minimum = -Number.MAX_SAFE_INTEGER) {
6
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || Object.is(value, -0) || value < minimum)
7
+ throw new ProtocolError('invalid_integer', 'Expected a safe integer in the allowed range.');
8
+ }
9
+ /** Parses protocol JSON before duplicate names or numeric spelling can be lost. */
10
+ export function parseJson(input) {
11
+ const source = typeof input === 'string' ? input : decodeUtf8(input);
12
+ validateUnicode(source);
13
+ let position = 0;
14
+ const fail = (message) => { throw new ProtocolError('invalid_json', `${message} At offset ${position}.`); };
15
+ const whitespace = () => { while (/[\x20\t\r\n]/.test(source[position] ?? '') && position < source.length)
16
+ position++; };
17
+ function string() {
18
+ const start = position++;
19
+ while (position < source.length) {
20
+ const character = source[position++];
21
+ if (character === '"') {
22
+ let result;
23
+ try {
24
+ result = JSON.parse(source.slice(start, position));
25
+ }
26
+ catch (cause) {
27
+ throw new ProtocolError('invalid_json', 'Invalid JSON string.', { cause });
28
+ }
29
+ validateUnicode(result);
30
+ return result;
31
+ }
32
+ if (character === '\\') {
33
+ const escape = source[position++];
34
+ if (escape === 'u') {
35
+ if (!/^[0-9a-fA-F]{4}$/.test(source.slice(position, position + 4)))
36
+ fail('Invalid Unicode escape.');
37
+ position += 4;
38
+ }
39
+ else if (escape === undefined || !'"\\/bfnrt'.includes(escape))
40
+ fail('Invalid string escape.');
41
+ }
42
+ else if (character.charCodeAt(0) < 32)
43
+ fail('Unescaped control character.');
44
+ }
45
+ return fail('Unterminated string.');
46
+ }
47
+ function value(depth) {
48
+ if (depth > maximumJsonDepth)
49
+ fail('JSON depth exceeds 16.');
50
+ whitespace();
51
+ const character = source[position];
52
+ if (character === '"')
53
+ return string();
54
+ if (character === '{') {
55
+ position++;
56
+ const result = Object.create(null);
57
+ whitespace();
58
+ if (source[position] === '}') {
59
+ position++;
60
+ return result;
61
+ }
62
+ while (true) {
63
+ whitespace();
64
+ if (source[position] !== '"')
65
+ fail('Expected an object property name.');
66
+ const name = string();
67
+ if (Object.hasOwn(result, name))
68
+ fail('Duplicate property name.');
69
+ whitespace();
70
+ if (source[position++] !== ':')
71
+ fail('Expected a colon.');
72
+ result[name] = value(depth + 1);
73
+ whitespace();
74
+ const separator = source[position++];
75
+ if (separator === '}')
76
+ return result;
77
+ if (separator !== ',')
78
+ fail('Expected an object separator.');
79
+ }
80
+ }
81
+ if (character === '[') {
82
+ position++;
83
+ const result = [];
84
+ whitespace();
85
+ if (source[position] === ']') {
86
+ position++;
87
+ return result;
88
+ }
89
+ while (true) {
90
+ result.push(value(depth + 1));
91
+ whitespace();
92
+ const separator = source[position++];
93
+ if (separator === ']')
94
+ return result;
95
+ if (separator !== ',')
96
+ fail('Expected an array separator.');
97
+ }
98
+ }
99
+ for (const [literal, result] of [['true', true], ['false', false], ['null', null]]) {
100
+ if (source.startsWith(literal, position)) {
101
+ position += literal.length;
102
+ return result;
103
+ }
104
+ }
105
+ const start = position;
106
+ while (position < source.length && /[0-9eE+.\-]/.test(source[position]))
107
+ position++;
108
+ const token = source.slice(start, position);
109
+ if (!/^-?(0|[1-9][0-9]*)$/.test(token) || token === '-0')
110
+ fail('Expected a shortest decimal integer.');
111
+ const result = Number(token);
112
+ requireSafeInteger(result);
113
+ return result;
114
+ }
115
+ const result = value(0);
116
+ whitespace();
117
+ if (position !== source.length)
118
+ fail('Trailing non-whitespace data.');
119
+ return result;
120
+ }
121
+ /** Encodes only JSON data, preserving unknown properties and UTF-16 key ordering. */
122
+ export function canonicalJson(value) {
123
+ function encode(input, depth) {
124
+ if (depth > maximumJsonDepth)
125
+ throw new ProtocolError('invalid_json', 'JSON depth exceeds 16.');
126
+ if (input === null)
127
+ return 'null';
128
+ if (typeof input === 'string') {
129
+ validateUnicode(input);
130
+ return JSON.stringify(input);
131
+ }
132
+ if (typeof input === 'boolean')
133
+ return input ? 'true' : 'false';
134
+ if (typeof input === 'number') {
135
+ requireSafeInteger(input);
136
+ return String(input);
137
+ }
138
+ if (Array.isArray(input)) {
139
+ const parts = [];
140
+ for (let index = 0; index < input.length; index++) {
141
+ if (!Object.hasOwn(input, index))
142
+ throw new ProtocolError('invalid_json', 'Sparse arrays are not JSON data.');
143
+ parts.push(encode(input[index], depth + 1));
144
+ }
145
+ return `[${parts.join(',')}]`;
146
+ }
147
+ if (typeof input !== 'object' || ![Object.prototype, null].includes(Object.getPrototypeOf(input)))
148
+ throw new ProtocolError('invalid_json', 'Expected plain JSON data.');
149
+ if (Object.getOwnPropertySymbols(input).length !== 0)
150
+ throw new ProtocolError('invalid_json', 'Symbol properties are not JSON data.');
151
+ const properties = Object.keys(input).sort().map(name => {
152
+ validateUnicode(name);
153
+ const descriptor = Object.getOwnPropertyDescriptor(input, name);
154
+ if (!('value' in descriptor))
155
+ throw new ProtocolError('invalid_json', 'JSON properties cannot be accessors.');
156
+ return `${JSON.stringify(name)}:${encode(descriptor.value, depth + 1)}`;
157
+ });
158
+ return `{${properties.join(',')}}`;
159
+ }
160
+ return encode(value, 0);
161
+ }
162
+ /** Encodes canonical protocol JSON as strict UTF-8. */
163
+ export function canonicalBytes(value) {
164
+ return encodeUtf8(canonicalJson(value));
165
+ }
166
+ /** Requires a JSON object; arrays and null do not qualify. */
167
+ export function requireObject(value) {
168
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
169
+ throw new ProtocolError('invalid_object', 'Expected a JSON object.');
170
+ return value;
171
+ }
172
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/protocol/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type JsonObject } from './json.js';
2
+ /** Complete business objects do not permit null, including extensions, unless their schema explicitly says otherwise. */
3
+ export declare function validateCompleteObject(value: JsonObject): void;
4
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/protocol/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,UAAU,EAAkB,MAAM,WAAW,CAAC;AAE3E,yHAAyH;AACzH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAQ9D"}
@@ -0,0 +1,18 @@
1
+ import { ProtocolError } from '../errors.js';
2
+ import { canonicalJson } from './json.js';
3
+ /** Complete business objects do not permit null, including extensions, unless their schema explicitly says otherwise. */
4
+ export function validateCompleteObject(value) {
5
+ canonicalJson(value);
6
+ function visit(node) {
7
+ if (node === null)
8
+ throw new ProtocolError('invalid_null', 'Null is not permitted in this complete protocol object.');
9
+ if (Array.isArray(node))
10
+ for (const item of node)
11
+ visit(item);
12
+ else if (typeof node === 'object')
13
+ for (const item of Object.values(node))
14
+ visit(item);
15
+ }
16
+ visit(value);
17
+ }
18
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/protocol/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAmC,MAAM,WAAW,CAAC;AAE3E,yHAAyH;AACzH,MAAM,UAAU,sBAAsB,CAAC,KAAiB;IACpD,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,SAAS,KAAK,CAAC,IAAe;QAC1B,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,yDAAyD,CAAC,CAAC;QACtH,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,KAAK,MAAM,IAAI,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC;aACzD,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3F,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Legacy caller signals cannot expose a reason their runtime already discarded. */
2
+ export declare function abortReason(signal: AbortSignal): unknown;
3
+ /** Keep the platform's real signal and synchronous abort event, adding reason
4
+ * only to SDK-owned legacy signals. Globals and caller-owned signals are untouched. */
5
+ export declare function createAbortController(): AbortController;
6
+ //# sourceMappingURL=abort.d.ts.map