@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,201 @@
1
+ import { groupManagementHash } from '../crypto/groups.js';
2
+ import { ProtocolError } from '../errors.js';
3
+ import { deriveResourceId } from '../identity/identifiers.js';
4
+ import { groupEventCodec, groupManagementPayloadCodec, validateGroupEvent, verifyGroupManagementPayload } from '../models/group-management.js';
5
+ import { groupMessageEnvelopeCodec, validateGroupRef, verifyGroupMessageEnvelope } from '../models/groups.js';
6
+ import { certificateId, validateCertificate } from '../models/identity.js';
7
+ import { equalBytes } from '../protocol/encoding.js';
8
+ import { requireObject } from '../protocol/json.js';
9
+ export const groupChangeKinds = ['properties', 'members', 'roles', 'bans', 'nickname', 'status'];
10
+ const managementChanges = {
11
+ create: ['properties', 'members', 'roles', 'status'], update: ['properties'], applicationApproval: ['members'], roleUpdate: ['roles'], ownerTransfer: ['roles'],
12
+ memberLeave: ['members'], memberRemoval: ['members'], memberBan: ['members', 'bans'], memberUnban: ['bans'], memberRecoveryApproval: ['members'], secretRotation: ['members'], close: ['status'],
13
+ };
14
+ /** Applies one timeline event without mutating the preceding projection. Invalid administration stops the chain; invalid ordinary messages retain an explicit rejection. */
15
+ export function applyGroupEvent(previous, source, certificate, group, context) {
16
+ validateGroupRef(group);
17
+ const entry = groupEventCodec.decode(groupEventCodec.encode(source));
18
+ validateGroupEvent(entry);
19
+ if (previous && (previous.groupId !== group.groupId || previous.relayId !== group.relayId))
20
+ throw new ProtocolError('invalid_binding', 'Verified group state belongs to another group or relay.');
21
+ if (entry.sequence <= (previous?.sequence ?? -1))
22
+ throw new ProtocolError('invalid_sequence', 'A group event must advance the verified sequence.');
23
+ if (previous?.state.status === 'closed')
24
+ throw new ProtocolError('group_closed', 'A closed group cannot append events.');
25
+ if (entry.signerDeviceId !== undefined) {
26
+ if (!certificate)
27
+ throw new ProtocolError('missing_certificate', 'Group event signing certificate is missing.');
28
+ validateCertificate(certificate, context);
29
+ if (certificateId(certificate, context) !== entry.signerDeviceId)
30
+ throw new ProtocolError('invalid_identity', 'Group event signing certificate belongs to another device.');
31
+ }
32
+ if (entry.payload.$type === 'meshline.group.key.rotated') {
33
+ if (!previous || certificate !== undefined || entry.epoch <= previous.epoch)
34
+ throw new ProtocolError('invalid_epoch', 'Relay key rotation requires an established group and a newer epoch.');
35
+ return { projection: { ...previous, sequence: entry.sequence, epoch: entry.epoch } };
36
+ }
37
+ if (entry.payload.$type === 'meshline.group.message') {
38
+ if (!previous || entry.epoch !== previous.epoch)
39
+ throw new ProtocolError('invalid_epoch', 'Group message must use the verified current epoch.');
40
+ const projection = { ...previous, sequence: entry.sequence };
41
+ try {
42
+ const member = previous.members.find(value => value.account === certificate.account);
43
+ if (!member || previous.bans.includes(certificate.account))
44
+ throw new ProtocolError('unauthorized_member', 'Group message sender is not a current unbanned member.');
45
+ const envelope = groupMessageEnvelopeCodec.decode(entry.payload);
46
+ if (envelope.groupId !== group.groupId || envelope.epoch !== entry.epoch)
47
+ throw new ProtocolError('invalid_binding', 'Group envelope and event have inconsistent group or epoch bindings.');
48
+ verifyGroupMessageEnvelope(envelope, certificate, entry.signerDeviceId, context);
49
+ return { projection, message: { envelope, sender: certificate, signerDeviceId: entry.signerDeviceId, joinedAtSequence: member.joinedAtSequence } };
50
+ }
51
+ catch (error) {
52
+ if (!(error instanceof ProtocolError))
53
+ throw error;
54
+ return { projection, rejection: error };
55
+ }
56
+ }
57
+ const payload = groupManagementPayloadCodec.decode(entry.payload);
58
+ verifyGroupManagementPayload(payload, certificate, context);
59
+ const actor = certificate.account;
60
+ if (payload.kind === 'create') {
61
+ const value = payload.value;
62
+ if (previous || entry.sequence !== 0 || entry.epoch !== 0 || value.owner.account !== actor || value.groupId !== group.groupId
63
+ || deriveResourceId('group', actor, group.relayId, value.nonce, context) !== group.groupId)
64
+ throw new ProtocolError('invalid_creation', 'Group creation does not establish the expected owner, group and hosting relay.');
65
+ return { changeKinds: managementChanges.create, projection: { ...group, sequence: 0, epoch: 0, managementHash: groupManagementHash(requireObject(groupManagementPayloadCodec.encode(payload)), context), clientSecretCommitment: value.clientSecretCommitment,
66
+ state: { groupId: group.groupId, name: value.name, ...(value.description === undefined ? {} : { description: value.description }), status: 'active', owner: actor, memberCapacity: value.memberCapacity, memberCount: 1, invitePolicy: value.invitePolicy },
67
+ members: [{ account: actor, role: 'owner', memberEncryptionPublicKey: value.owner.memberEncryptionPublicKey.slice(), joinedAtSequence: 0 }], bans: [], departures: {} } };
68
+ }
69
+ if (!previous || payload.value.groupId !== group.groupId || payload.value.prevHash !== previous.managementHash)
70
+ throw new ProtocolError('invalid_management_chain', 'Group management predecessor does not match the verified head.');
71
+ const members = new Map(previous.members.map(value => [value.account, { ...value, memberEncryptionPublicKey: value.memberEncryptionPublicKey.slice() }]));
72
+ const bans = new Set(previous.bans);
73
+ const departures = { ...previous.departures };
74
+ const author = members.get(actor);
75
+ if (!author || bans.has(actor))
76
+ throw new ProtocolError('unauthorized_member', 'Group administrator is not a current unbanned member.');
77
+ const owner = author.role === 'owner';
78
+ const administrator = owner || author.role === 'administrator';
79
+ let state = { ...previous.state };
80
+ let commitment = previous.clientSecretCommitment;
81
+ let advances = false;
82
+ const member = (account) => { const value = members.get(account); if (!value)
83
+ throw new ProtocolError('missing_member', 'Group management target is not a current member.'); return value; };
84
+ const authorize = (allowed) => { if (!allowed)
85
+ throw new ProtocolError('unauthorized_role', 'Group actor is not authorized for this operation.'); };
86
+ const add = (value) => { members.set(value.account, { account: value.account, role: 'member', memberEncryptionPublicKey: value.memberEncryptionPublicKey.slice(), joinedAtSequence: entry.sequence }); delete departures[value.account]; };
87
+ const remove = (account, departure) => { members.delete(account); departures[account] = departure; };
88
+ switch (payload.kind) {
89
+ case 'update': {
90
+ authorize(owner);
91
+ const value = payload.value;
92
+ if (value.name !== undefined)
93
+ state = { ...state, name: value.name };
94
+ if (value.description === null)
95
+ delete state.description;
96
+ else if (value.description !== undefined)
97
+ state = { ...state, description: value.description };
98
+ if (value.memberCapacity !== undefined)
99
+ state = { ...state, memberCapacity: value.memberCapacity };
100
+ if (value.invitePolicy !== undefined)
101
+ state = { ...state, invitePolicy: value.invitePolicy };
102
+ break;
103
+ }
104
+ case 'applicationApproval':
105
+ authorize(administrator);
106
+ if (members.size + payload.value.members.length > state.memberCapacity)
107
+ throw new ProtocolError('group_capacity', 'Group admission exceeds the current capacity.');
108
+ for (const value of payload.value.members) {
109
+ if (members.has(value.account) || bans.has(value.account))
110
+ throw new ProtocolError('invalid_admission', 'An existing or banned account cannot be admitted.');
111
+ add(value);
112
+ }
113
+ advances = true;
114
+ break;
115
+ case 'roleUpdate': {
116
+ authorize(owner);
117
+ const target = member(payload.value.account);
118
+ authorize(target.role !== 'owner');
119
+ members.set(target.account, { ...target, role: payload.value.role });
120
+ break;
121
+ }
122
+ case 'ownerTransfer': {
123
+ authorize(owner);
124
+ const target = member(payload.value.newOwnerAccount);
125
+ authorize(target.account !== actor && !bans.has(target.account));
126
+ members.set(actor, { ...author, role: 'member' });
127
+ members.set(target.account, { ...target, role: 'owner' });
128
+ state = { ...state, owner: target.account };
129
+ break;
130
+ }
131
+ case 'memberLeave':
132
+ authorize(!owner && payload.value.account === actor);
133
+ remove(actor, 'left');
134
+ advances = true;
135
+ break;
136
+ case 'memberRemoval':
137
+ authorize(administrator);
138
+ for (const account of payload.value.accounts) {
139
+ const target = member(account);
140
+ authorize(account !== actor && target.role !== 'owner' && (owner || target.role === 'member'));
141
+ remove(account, 'removed');
142
+ }
143
+ advances = true;
144
+ break;
145
+ case 'memberBan':
146
+ authorize(administrator);
147
+ for (const account of payload.value.accounts) {
148
+ const target = members.get(account);
149
+ authorize(account !== actor && (!target || target.role !== 'owner' && (owner || target.role === 'member')));
150
+ if (target) {
151
+ remove(account, 'banned');
152
+ advances = true;
153
+ }
154
+ else
155
+ departures[account] = 'banned';
156
+ bans.add(account);
157
+ }
158
+ break;
159
+ case 'memberUnban':
160
+ authorize(administrator);
161
+ for (const account of payload.value.accounts) {
162
+ bans.delete(account);
163
+ if (departures[account] === 'banned')
164
+ departures[account] = 'not_member';
165
+ }
166
+ break;
167
+ case 'memberRecoveryApproval':
168
+ authorize(administrator);
169
+ for (const value of payload.value.members) {
170
+ const target = member(value.account);
171
+ authorize(owner || target.role === 'member' && target.account !== actor);
172
+ if (equalBytes(target.memberEncryptionPublicKey, value.memberEncryptionPublicKey))
173
+ throw new ProtocolError('unchanged_key', 'Recovered member public key must change.');
174
+ members.set(target.account, { ...target, memberEncryptionPublicKey: value.memberEncryptionPublicKey.slice() });
175
+ }
176
+ advances = true;
177
+ break;
178
+ case 'secretRotation':
179
+ authorize(owner);
180
+ if (payload.value.clientSecretCommitment === commitment)
181
+ throw new ProtocolError('unchanged_secret', 'Client secret rotation must change its commitment.');
182
+ commitment = payload.value.clientSecretCommitment;
183
+ if (payload.value.ownerEncryptionPublicKey) {
184
+ if (equalBytes(author.memberEncryptionPublicKey, payload.value.ownerEncryptionPublicKey))
185
+ throw new ProtocolError('unchanged_key', 'Specified owner public key must change.');
186
+ members.set(actor, { ...author, memberEncryptionPublicKey: payload.value.ownerEncryptionPublicKey.slice() });
187
+ }
188
+ advances = true;
189
+ break;
190
+ case 'close':
191
+ authorize(owner);
192
+ state = { ...state, status: 'closed' };
193
+ break;
194
+ }
195
+ if (advances ? entry.epoch <= previous.epoch : entry.epoch !== previous.epoch)
196
+ throw new ProtocolError('invalid_epoch', 'Group management event has an invalid epoch transition.');
197
+ state = { ...state, memberCount: members.size };
198
+ return { changeKinds: managementChanges[payload.kind], projection: { ...group, sequence: entry.sequence, epoch: entry.epoch, state, members: [...members.values()], bans: [...bans], departures,
199
+ clientSecretCommitment: commitment, managementHash: groupManagementHash(requireObject(groupManagementPayloadCodec.encode(payload)), context) } };
200
+ }
201
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/groups/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type RandomSource } from '../crypto/primitives.js';
2
+ import { NetworkContext } from '../protocol/context.js';
3
+ export type IdentifierKind = 'device' | 'message' | 'channel' | 'group' | 'invite';
4
+ /** Checks canonical representation only, not existence or authorization. */
5
+ export declare function validateIdentifier(kind: IdentifierKind, value: string): void;
6
+ export declare function createIdentifier(kind: 'message' | 'invite', random?: RandomSource): string;
7
+ export declare function deriveDeviceId(account: string, signingPublicKey: Uint8Array, encryptionPublicKey: Uint8Array, context: NetworkContext): string;
8
+ export declare function deriveResourceId(kind: 'channel' | 'group', creator: string, relayId: string, nonce: Uint8Array, context: NetworkContext): string;
9
+ //# sourceMappingURL=identifiers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifiers.d.ts","sourceRoot":"","sources":["../../src/identity/identifiers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEjG,OAAO,EAAE,cAAc,EAAgB,MAAM,wBAAwB,CAAC;AAItE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAGnF,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI5E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,EAAE,MAAM,GAAE,YAA2B,GAAG,MAAM,CAIxG;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAU9I;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAMhJ"}
@@ -0,0 +1,37 @@
1
+ import { sha256, requireLength, systemRandom } from '../crypto/primitives.js';
2
+ import { ProtocolError } from '../errors.js';
3
+ import { NetworkContext, signingInput } from '../protocol/context.js';
4
+ import { decodeBase64Url, encodeBase64Url } from '../protocol/encoding.js';
5
+ import { validateAccountId, validateRelayId } from './neo.js';
6
+ const prefixes = { device: 'dev_', message: 'msg_', channel: 'chan_', group: 'grp_', invite: 'inv_' };
7
+ /** Checks canonical representation only, not existence or authorization. */
8
+ export function validateIdentifier(kind, value) {
9
+ const prefix = prefixes[kind];
10
+ if (!value.startsWith(prefix))
11
+ throw new ProtocolError('invalid_identifier', `Expected ${prefix} identifier.`);
12
+ decodeBase64Url(value.slice(prefix.length), 16);
13
+ }
14
+ export function createIdentifier(kind, random = systemRandom) {
15
+ const bytes = random.bytes(16);
16
+ requireLength(bytes, 16, 'Identifier randomness');
17
+ return prefixes[kind] + encodeBase64Url(bytes);
18
+ }
19
+ export function deriveDeviceId(account, signingPublicKey, encryptionPublicKey, context) {
20
+ validateAccountId(account);
21
+ requireLength(signingPublicKey, 32, 'Signing public key');
22
+ requireLength(encryptionPublicKey, 32, 'Encryption public key');
23
+ const input = signingInput({
24
+ $type: 'meshline.device.identity', account,
25
+ signing_public_key: encodeBase64Url(signingPublicKey),
26
+ encryption_public_key: encodeBase64Url(encryptionPublicKey),
27
+ }, context);
28
+ return 'dev_' + encodeBase64Url(sha256(input).subarray(0, 16));
29
+ }
30
+ export function deriveResourceId(kind, creator, relayId, nonce, context) {
31
+ validateAccountId(creator);
32
+ validateRelayId(relayId);
33
+ requireLength(nonce, 16, 'Resource nonce');
34
+ const input = signingInput({ $type: `meshline.${kind}.identity`, creator, relay_id: relayId, nonce: encodeBase64Url(nonce) }, context);
35
+ return prefixes[kind] + encodeBase64Url(sha256(input).subarray(0, 16));
36
+ }
37
+ //# sourceMappingURL=identifiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/identity/identifiers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAqB,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG9D,MAAM,QAAQ,GAAmC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAEtI,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,IAAoB,EAAE,KAAa;IAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,YAAY,MAAM,cAAc,CAAC,CAAC;IAC/G,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAA0B,EAAE,MAAM,GAAiB,YAAY;IAC5F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/B,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,uBAAuB,CAAC,CAAC;IAClD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,gBAA4B,EAAE,mBAA+B,EAAE,OAAuB;IAClI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,aAAa,CAAC,gBAAgB,EAAE,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAC1D,aAAa,CAAC,mBAAmB,EAAE,EAAE,EAAE,uBAAuB,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,YAAY,CAAC;QACvB,KAAK,EAAE,0BAA0B,EAAE,OAAO;QAC1C,kBAAkB,EAAE,eAAe,CAAC,gBAAgB,CAAC;QACrD,qBAAqB,EAAE,eAAe,CAAC,mBAAmB,CAAC;KAC9D,EAAE,OAAO,CAAC,CAAC;IACZ,OAAO,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAyB,EAAE,OAAe,EAAE,OAAe,EAAE,KAAiB,EAAE,OAAuB;IACpI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,YAAY,IAAI,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACvI,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Derives a canonical CAIP-10 Neo N3 account identifier. */
2
+ export declare function getAccountId(chainId: string, publicKey: Uint8Array): string;
3
+ /** Checks account format and address checksum without normalizing the input. */
4
+ export declare function validateAccountId(accountId: string): void;
5
+ /** Verifies that the public key identifies the account, including its chain reference. */
6
+ export declare function matchesAccount(accountId: string, publicKey: Uint8Array): boolean;
7
+ /** Derives a lowercase display-order Neo script hash for a relay. */
8
+ export declare function getRelayId(publicKey: Uint8Array): string;
9
+ export declare function validateRelayId(relayId: string): void;
10
+ export declare function verifyRelay(relayId: string, publicKey: Uint8Array, input: Uint8Array, signature: Uint8Array): boolean;
11
+ //# sourceMappingURL=neo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo.d.ts","sourceRoot":"","sources":["../../src/identity/neo.ts"],"names":[],"mappings":"AAsBA,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,MAAM,CAS3E;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAezD;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAGhF;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGrD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAGrH"}
@@ -0,0 +1,77 @@
1
+ import { p256 } from '@noble/curves/nist.js';
2
+ import { hash160, sha256, verifyAccount } from '../crypto/primitives.js';
3
+ import { concatBytes, equalBytes } from '../protocol/encoding.js';
4
+ import { ProtocolError } from '../errors.js';
5
+ const base58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
6
+ function scriptHash(publicKey) {
7
+ if (publicKey.length !== 33 || (publicKey[0] !== 2 && publicKey[0] !== 3))
8
+ throw new ProtocolError('invalid_key', 'Expected a compressed P-256 key.');
9
+ try {
10
+ p256.Point.fromBytes(publicKey).assertValidity();
11
+ }
12
+ catch (cause) {
13
+ throw new ProtocolError('invalid_key', 'The account key is not a valid P-256 point.', { cause });
14
+ }
15
+ return hash160(concatBytes(new Uint8Array([0x0c, 0x21]), publicKey, new Uint8Array([0x41, 0x56, 0xe7, 0xb3, 0x27])));
16
+ }
17
+ function chainReference(chainId) {
18
+ const match = /^neo:(0|[1-9][0-9]{0,9})$/.exec(chainId);
19
+ if (!match || match[0] !== chainId || Number(match[1]) > 0xffff_ffff)
20
+ throw new ProtocolError('invalid_account', 'Expected a canonical Neo chain identifier.');
21
+ return Number(match[1]);
22
+ }
23
+ /** Derives a canonical CAIP-10 Neo N3 account identifier. */
24
+ export function getAccountId(chainId, publicKey) {
25
+ chainReference(chainId);
26
+ const payload = concatBytes(new Uint8Array([0x35]), scriptHash(publicKey));
27
+ const encoded = concatBytes(payload, sha256(sha256(payload)).subarray(0, 4));
28
+ let integer = 0n;
29
+ for (const byte of encoded)
30
+ integer = (integer << 8n) | BigInt(byte);
31
+ let address = '';
32
+ while (integer > 0n) {
33
+ address = base58[Number(integer % 58n)] + address;
34
+ integer /= 58n;
35
+ }
36
+ return `${chainId}:${address}`;
37
+ }
38
+ /** Checks account format and address checksum without normalizing the input. */
39
+ export function validateAccountId(accountId) {
40
+ const split = accountId.lastIndexOf(':');
41
+ chainReference(accountId.slice(0, split));
42
+ const address = accountId.slice(split + 1);
43
+ if (address.length !== 34)
44
+ throw new ProtocolError('invalid_account', 'A Neo N3 address contains 34 characters.');
45
+ let integer = 0n;
46
+ for (const character of address) {
47
+ const digit = base58.indexOf(character);
48
+ if (digit < 0)
49
+ throw new ProtocolError('invalid_account', 'Invalid Base58 address character.');
50
+ integer = integer * 58n + BigInt(digit);
51
+ }
52
+ const payload = new Uint8Array(25);
53
+ for (let index = 24; index >= 0; index--) {
54
+ payload[index] = Number(integer & 255n);
55
+ integer >>= 8n;
56
+ }
57
+ if (integer !== 0n || payload[0] !== 0x35 || !equalBytes(payload.subarray(21), sha256(sha256(payload.subarray(0, 21))).subarray(0, 4)))
58
+ throw new ProtocolError('invalid_account', 'Invalid Neo address version, length, or checksum.');
59
+ }
60
+ /** Verifies that the public key identifies the account, including its chain reference. */
61
+ export function matchesAccount(accountId, publicKey) {
62
+ validateAccountId(accountId);
63
+ return getAccountId(accountId.slice(0, accountId.lastIndexOf(':')), publicKey) === accountId;
64
+ }
65
+ /** Derives a lowercase display-order Neo script hash for a relay. */
66
+ export function getRelayId(publicKey) {
67
+ return '0x' + Array.from(scriptHash(publicKey).reverse(), byte => byte.toString(16).padStart(2, '0')).join('');
68
+ }
69
+ export function validateRelayId(relayId) {
70
+ if (!/^0x[0-9a-f]{40}$/.test(relayId) || relayId.length !== 42)
71
+ throw new ProtocolError('invalid_relay', 'Expected a canonical lowercase Neo script hash.');
72
+ }
73
+ export function verifyRelay(relayId, publicKey, input, signature) {
74
+ validateRelayId(relayId);
75
+ return verifyAccount(input, signature, publicKey) && getRelayId(publicKey) === relayId;
76
+ }
77
+ //# sourceMappingURL=neo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo.js","sourceRoot":"","sources":["../../src/identity/neo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export * from './errors.js';
2
+ export * from './protocol/encoding.js';
3
+ export * from './protocol/json.js';
4
+ export * from './protocol/context.js';
5
+ export * from './crypto/primitives.js';
6
+ export * from './identity/neo.js';
7
+ export * from './identity/identifiers.js';
8
+ export type { ExtensibleModel, ProtocolCodec } from './protocol/codec.js';
9
+ export * from './models/identity.js';
10
+ export * from './storage/store.js';
11
+ export * from './runtime/async-gate.js';
12
+ export * from './runtime/clock.js';
13
+ export * from './models/authentication.js';
14
+ export * from './transport/endpoint.js';
15
+ export * from './transport/relay-error.js';
16
+ export * from './transport/http.js';
17
+ export * from './interactions.js';
18
+ export * from './transport/session.js';
19
+ export * from './transport/rpc.js';
20
+ export * from './transport/socket.js';
21
+ export * from './models/relay.js';
22
+ export * from './transport/discovery.js';
23
+ export * from './runtime/events.js';
24
+ export * from './transport/client.js';
25
+ export type { RelaySubscription, RelaySubscriptionOptions, SubscriptionMethod } from './transport/subscription.js';
26
+ export * from './transport/pool.js';
27
+ export * from './components/component.js';
28
+ export * from './components/account.js';
29
+ export * from './models/content.js';
30
+ export * from './models/profile.js';
31
+ export * from './components/profile.js';
32
+ export * from './models/device-state.js';
33
+ export * from './components/device.js';
34
+ export * from './models/contacts.js';
35
+ export * from './protocol/validation.js';
36
+ export * from './models/messages.js';
37
+ export * from './models/channels.js';
38
+ export * from './crypto/messages.js';
39
+ export * from './models/groups.js';
40
+ export * from './models/group-management.js';
41
+ export * from './models/group-keys.js';
42
+ export * from './models/group-admission.js';
43
+ export * from './crypto/groups.js';
44
+ export * from './components/message.js';
45
+ export * from './components/channel.js';
46
+ export type { ChannelInfo, ChannelPostInfo, ChannelPostChange } from './channels/repository.js';
47
+ export type { MessageKey, MessageInfo, AccountMessage } from './messages/repository.js';
48
+ export type { MessageSendState, MessageSendStatus } from './messages/outbox.js';
49
+ export type { ContactInfo, ContactGrantState, ContactRequestInfo, ContactRequestDirection, ContactChange, ContactChangeKind, ContactRequestChange, ContactRequestChangeKind } from './messages/contacts.js';
50
+ export * from './components/group.js';
51
+ export type { GroupMessageInfo } from './groups/messages.js';
52
+ export * from './client.js';
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1E,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACnH,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAChG,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACxF,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAChF,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAC5M,cAAc,uBAAuB,CAAC;AACtC,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,cAAc,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,46 @@
1
+ export * from './errors.js';
2
+ export * from './protocol/encoding.js';
3
+ export * from './protocol/json.js';
4
+ export * from './protocol/context.js';
5
+ export * from './crypto/primitives.js';
6
+ export * from './identity/neo.js';
7
+ export * from './identity/identifiers.js';
8
+ export * from './models/identity.js';
9
+ export * from './storage/store.js';
10
+ export * from './runtime/async-gate.js';
11
+ export * from './runtime/clock.js';
12
+ export * from './models/authentication.js';
13
+ export * from './transport/endpoint.js';
14
+ export * from './transport/relay-error.js';
15
+ export * from './transport/http.js';
16
+ export * from './interactions.js';
17
+ export * from './transport/session.js';
18
+ export * from './transport/rpc.js';
19
+ export * from './transport/socket.js';
20
+ export * from './models/relay.js';
21
+ export * from './transport/discovery.js';
22
+ export * from './runtime/events.js';
23
+ export * from './transport/client.js';
24
+ export * from './transport/pool.js';
25
+ export * from './components/component.js';
26
+ export * from './components/account.js';
27
+ export * from './models/content.js';
28
+ export * from './models/profile.js';
29
+ export * from './components/profile.js';
30
+ export * from './models/device-state.js';
31
+ export * from './components/device.js';
32
+ export * from './models/contacts.js';
33
+ export * from './protocol/validation.js';
34
+ export * from './models/messages.js';
35
+ export * from './models/channels.js';
36
+ export * from './crypto/messages.js';
37
+ export * from './models/groups.js';
38
+ export * from './models/group-management.js';
39
+ export * from './models/group-keys.js';
40
+ export * from './models/group-admission.js';
41
+ export * from './crypto/groups.js';
42
+ export * from './components/message.js';
43
+ export * from './components/channel.js';
44
+ export * from './components/group.js';
45
+ export * from './client.js';
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AAEtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AAKxC,cAAc,uBAAuB,CAAC;AAEtC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { DeviceCertificate } from './models/identity.js';
2
+ import type { NetworkContext } from './protocol/context.js';
3
+ /** The application retains its account private key and signs the exact input using Neo P-256/SHA-256. */
4
+ export interface AccountSigner {
5
+ readonly accountId: string;
6
+ readonly publicKey: Uint8Array;
7
+ sign(input: Uint8Array, signal?: AbortSignal): Promise<Uint8Array>;
8
+ }
9
+ /** Device signatures are Ed25519 over the exact supplied bytes. */
10
+ export interface DeviceSigner {
11
+ readonly certificate: DeviceCertificate;
12
+ sign(input: Uint8Array, signal?: AbortSignal): Promise<Uint8Array>;
13
+ }
14
+ export interface RelayEntry {
15
+ readonly relayId: string;
16
+ readonly endpoint: string;
17
+ readonly status: 'active' | 'disabled' | 'suspended';
18
+ /** Registry UInt64 timestamp, in Unix milliseconds; this is not a protocol JSON number. */
19
+ readonly updatedAt: bigint;
20
+ }
21
+ export interface RelayRegistry {
22
+ readonly context: NetworkContext;
23
+ getRelay(relayId: string, signal?: AbortSignal): Promise<RelayEntry | undefined>;
24
+ getRelays(signal?: AbortSignal): AsyncIterable<RelayEntry>;
25
+ }
26
+ /** Use OS-backed protection in the application adapter; never persist unprotected device secrets. */
27
+ export interface SecretProtector {
28
+ protect(plaintext: Uint8Array, purpose: string, signal?: AbortSignal): Promise<Uint8Array>;
29
+ unprotect(protectedData: Uint8Array, purpose: string, signal?: AbortSignal): Promise<Uint8Array>;
30
+ }
31
+ //# sourceMappingURL=interactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,yGAAyG;AACzG,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACtE;AAED,mEAAmE;AACnE,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;IACrD,2FAA2F;IAC3F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IACjF,SAAS,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;CAC9D;AAED,qGAAqG;AACrG,MAAM,WAAW,eAAe;IAC5B,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3F,SAAS,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACpG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import type { MessageManager } from '../components/message.js';
2
+ import type { JsonObject } from '../protocol/json.js';
3
+ import type { MessageEffects } from './repository.js';
4
+ type AccountSender = (payload: JsonObject, devices: readonly string[] | undefined, signal?: AbortSignal, effects?: MessageEffects) => Promise<void>;
5
+ /** Internal capability: managers can enqueue only recognized self-account group payloads. */
6
+ export declare function registerAccountSender(manager: MessageManager, sender: AccountSender): void;
7
+ export declare function sendGroupAccountPayload(manager: MessageManager, source: JsonObject, devices?: readonly string[], signal?: AbortSignal, effects?: MessageEffects): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=account-sender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-sender.d.ts","sourceRoot":"","sources":["../../src/messages/account-sender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,KAAK,aAAa,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAGpJ,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAAkC;AAC7H,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB/K"}
@@ -0,0 +1,46 @@
1
+ import { ProtocolError } from '../errors.js';
2
+ import { accountGroupHistorySecretSyncCodec, accountGroupPrivateStateRequestCodec, accountGroupPrivateStateSyncCodec, validateAccountGroupHistorySecretSync, validateAccountGroupPrivateStateRequest, validateAccountGroupPrivateStateSync } from '../models/groups.js';
3
+ const senders = new WeakMap();
4
+ /** Internal capability: managers can enqueue only recognized self-account group payloads. */
5
+ export function registerAccountSender(manager, sender) { senders.set(manager, sender); }
6
+ export function sendGroupAccountPayload(manager, source, devices, signal, effects) {
7
+ const sender = senders.get(manager);
8
+ if (!sender)
9
+ throw new ProtocolError('not_initialized', 'Message manager has no account sender.');
10
+ let payload;
11
+ switch (source['$type']) {
12
+ case 'meshline.account.group.state.request': {
13
+ const value = accountGroupPrivateStateRequestCodec.decode(source);
14
+ validateAccountGroupPrivateStateRequest(value);
15
+ payload = accountGroupPrivateStateRequestCodec.encode(value);
16
+ break;
17
+ }
18
+ case 'meshline.account.group.state.sync': {
19
+ const value = accountGroupPrivateStateSyncCodec.decode(source);
20
+ try {
21
+ validateAccountGroupPrivateStateSync(value);
22
+ payload = accountGroupPrivateStateSyncCodec.encode(value);
23
+ }
24
+ finally {
25
+ for (const item of value.states)
26
+ item.memberEncryptionPrivateKey.fill(0);
27
+ }
28
+ break;
29
+ }
30
+ case 'meshline.account.group.history_secret.sync': {
31
+ const value = accountGroupHistorySecretSyncCodec.decode(source);
32
+ try {
33
+ validateAccountGroupHistorySecretSync(value);
34
+ payload = accountGroupHistorySecretSyncCodec.encode(value);
35
+ }
36
+ finally {
37
+ for (const item of value.secrets)
38
+ item.applicationSecret.fill(0);
39
+ }
40
+ break;
41
+ }
42
+ default: throw new ProtocolError('invalid_payload', 'Unsupported group account payload.');
43
+ }
44
+ return sender(payload, devices && [...devices], signal, effects);
45
+ }
46
+ //# sourceMappingURL=account-sender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-sender.js","sourceRoot":"","sources":["../../src/messages/account-sender.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,kCAAkC,EAAE,oCAAoC,EAAE,iCAAiC,EAChH,qCAAqC,EAAE,uCAAuC,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAKtJ,MAAM,OAAO,GAAG,IAAI,OAAO,EAAiC,CAAC;AAE7D,6FAA6F;AAC7F,MAAM,UAAU,qBAAqB,CAAC,OAAuB,EAAE,MAAqB,IAAU,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7H,MAAM,UAAU,uBAAuB,CAAC,OAAuB,EAAE,MAAkB,EAAE,OAA2B,EAAE,MAAoB,EAAE,OAAwB;IAC5J,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAAC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,wCAAwC,CAAC,CAAC;IACvI,IAAI,OAAmB,CAAC;IACxB,QAAQ,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACtB,KAAK,sCAAsC,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,oCAAoC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAAC,uCAAuC,CAAC,KAAK,CAAC,CAAC;YAAC,OAAO,GAAG,oCAAoC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,MAAM;QAC3L,CAAC;QACD,KAAK,mCAAmC,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,iCAAiC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/D,IAAI,CAAC;gBAAC,oCAAoC,CAAC,KAAK,CAAC,CAAC;gBAAC,OAAO,GAAG,iCAAiC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;oBACvG,CAAC;gBAAC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM;oBAAE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM;QAChG,CAAC;QACD,KAAK,4CAA4C,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,kCAAkC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChE,IAAI,CAAC;gBAAC,qCAAqC,CAAC,KAAK,CAAC,CAAC;gBAAC,OAAO,GAAG,kCAAkC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;oBACzG,CAAC;gBAAC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO;oBAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM;QACxF,CAAC;QACD,SAAS,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,oCAAoC,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC"}