@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.
- package/LICENSE +21 -0
- package/README.md +43 -2
- package/dist/channels/repository.d.ts +73 -0
- package/dist/channels/repository.d.ts.map +1 -0
- package/dist/channels/repository.js +367 -0
- package/dist/channels/repository.js.map +1 -0
- package/dist/client/account-operations.d.ts +41 -0
- package/dist/client/account-operations.d.ts.map +1 -0
- package/dist/client/account-operations.js +304 -0
- package/dist/client/account-operations.js.map +1 -0
- package/dist/client/conversations.d.ts +36 -0
- package/dist/client/conversations.d.ts.map +1 -0
- package/dist/client/conversations.js +144 -0
- package/dist/client/conversations.js.map +1 -0
- package/dist/client.d.ts +53 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +162 -0
- package/dist/client.js.map +1 -0
- package/dist/components/account.d.ts +38 -0
- package/dist/components/account.d.ts.map +1 -0
- package/dist/components/account.js +243 -0
- package/dist/components/account.js.map +1 -0
- package/dist/components/channel.d.ts +78 -0
- package/dist/components/channel.d.ts.map +1 -0
- package/dist/components/channel.js +475 -0
- package/dist/components/channel.js.map +1 -0
- package/dist/components/component.d.ts +49 -0
- package/dist/components/component.d.ts.map +1 -0
- package/dist/components/component.js +194 -0
- package/dist/components/component.js.map +1 -0
- package/dist/components/device.d.ts +60 -0
- package/dist/components/device.d.ts.map +1 -0
- package/dist/components/device.js +648 -0
- package/dist/components/device.js.map +1 -0
- package/dist/components/group.d.ts +141 -0
- package/dist/components/group.d.ts.map +1 -0
- package/dist/components/group.js +933 -0
- package/dist/components/group.js.map +1 -0
- package/dist/components/message.d.ts +63 -0
- package/dist/components/message.d.ts.map +1 -0
- package/dist/components/message.js +439 -0
- package/dist/components/message.js.map +1 -0
- package/dist/components/profile.d.ts +37 -0
- package/dist/components/profile.d.ts.map +1 -0
- package/dist/components/profile.js +232 -0
- package/dist/components/profile.js.map +1 -0
- package/dist/crypto/groups.d.ts +56 -0
- package/dist/crypto/groups.d.ts.map +1 -0
- package/dist/crypto/groups.js +163 -0
- package/dist/crypto/groups.js.map +1 -0
- package/dist/crypto/messages.d.ts +52 -0
- package/dist/crypto/messages.d.ts.map +1 -0
- package/dist/crypto/messages.js +180 -0
- package/dist/crypto/messages.js.map +1 -0
- package/dist/crypto/primitives.d.ts +30 -0
- package/dist/crypto/primitives.d.ts.map +1 -0
- package/dist/crypto/primitives.js +102 -0
- package/dist/crypto/primitives.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -0
- package/dist/groups/account-sync.d.ts +28 -0
- package/dist/groups/account-sync.d.ts.map +1 -0
- package/dist/groups/account-sync.js +235 -0
- package/dist/groups/account-sync.js.map +1 -0
- package/dist/groups/messages.d.ts +39 -0
- package/dist/groups/messages.d.ts.map +1 -0
- package/dist/groups/messages.js +141 -0
- package/dist/groups/messages.js.map +1 -0
- package/dist/groups/operations.d.ts +57 -0
- package/dist/groups/operations.d.ts.map +1 -0
- package/dist/groups/operations.js +225 -0
- package/dist/groups/operations.js.map +1 -0
- package/dist/groups/repository.d.ts +56 -0
- package/dist/groups/repository.d.ts.map +1 -0
- package/dist/groups/repository.js +254 -0
- package/dist/groups/repository.js.map +1 -0
- package/dist/groups/secrets.d.ts +67 -0
- package/dist/groups/secrets.d.ts.map +1 -0
- package/dist/groups/secrets.js +452 -0
- package/dist/groups/secrets.js.map +1 -0
- package/dist/groups/state.d.ts +39 -0
- package/dist/groups/state.d.ts.map +1 -0
- package/dist/groups/state.js +201 -0
- package/dist/groups/state.js.map +1 -0
- package/dist/identity/identifiers.d.ts +9 -0
- package/dist/identity/identifiers.d.ts.map +1 -0
- package/dist/identity/identifiers.js +37 -0
- package/dist/identity/identifiers.js.map +1 -0
- package/dist/identity/neo.d.ts +11 -0
- package/dist/identity/neo.d.ts.map +1 -0
- package/dist/identity/neo.js +77 -0
- package/dist/identity/neo.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/interactions.d.ts +31 -0
- package/dist/interactions.d.ts.map +1 -0
- package/dist/interactions.js +2 -0
- package/dist/interactions.js.map +1 -0
- package/dist/messages/account-sender.d.ts +9 -0
- package/dist/messages/account-sender.d.ts.map +1 -0
- package/dist/messages/account-sender.js +46 -0
- package/dist/messages/account-sender.js.map +1 -0
- package/dist/messages/contacts.d.ts +103 -0
- package/dist/messages/contacts.d.ts.map +1 -0
- package/dist/messages/contacts.js +525 -0
- package/dist/messages/contacts.js.map +1 -0
- package/dist/messages/outbox.d.ts +66 -0
- package/dist/messages/outbox.d.ts.map +1 -0
- package/dist/messages/outbox.js +167 -0
- package/dist/messages/outbox.js.map +1 -0
- package/dist/messages/receiver.d.ts +35 -0
- package/dist/messages/receiver.d.ts.map +1 -0
- package/dist/messages/receiver.js +113 -0
- package/dist/messages/receiver.js.map +1 -0
- package/dist/messages/repository.d.ts +89 -0
- package/dist/messages/repository.d.ts.map +1 -0
- package/dist/messages/repository.js +295 -0
- package/dist/messages/repository.js.map +1 -0
- package/dist/models/authentication.d.ts +37 -0
- package/dist/models/authentication.d.ts.map +1 -0
- package/dist/models/authentication.js +53 -0
- package/dist/models/authentication.js.map +1 -0
- package/dist/models/channels.d.ts +141 -0
- package/dist/models/channels.d.ts.map +1 -0
- package/dist/models/channels.js +258 -0
- package/dist/models/channels.js.map +1 -0
- package/dist/models/contacts.d.ts +68 -0
- package/dist/models/contacts.d.ts.map +1 -0
- package/dist/models/contacts.js +186 -0
- package/dist/models/contacts.js.map +1 -0
- package/dist/models/content.d.ts +37 -0
- package/dist/models/content.d.ts.map +1 -0
- package/dist/models/content.js +137 -0
- package/dist/models/content.js.map +1 -0
- package/dist/models/device-state.d.ts +8 -0
- package/dist/models/device-state.d.ts.map +1 -0
- package/dist/models/device-state.js +22 -0
- package/dist/models/device-state.js.map +1 -0
- package/dist/models/group-admission.d.ts +111 -0
- package/dist/models/group-admission.d.ts.map +1 -0
- package/dist/models/group-admission.js +153 -0
- package/dist/models/group-admission.js.map +1 -0
- package/dist/models/group-keys.d.ts +30 -0
- package/dist/models/group-keys.d.ts.map +1 -0
- package/dist/models/group-keys.js +52 -0
- package/dist/models/group-keys.js.map +1 -0
- package/dist/models/group-management.d.ts +190 -0
- package/dist/models/group-management.d.ts.map +1 -0
- package/dist/models/group-management.js +263 -0
- package/dist/models/group-management.js.map +1 -0
- package/dist/models/groups.d.ts +81 -0
- package/dist/models/groups.d.ts.map +1 -0
- package/dist/models/groups.js +127 -0
- package/dist/models/groups.js.map +1 -0
- package/dist/models/identity.d.ts +47 -0
- package/dist/models/identity.d.ts.map +1 -0
- package/dist/models/identity.js +136 -0
- package/dist/models/identity.js.map +1 -0
- package/dist/models/messages.d.ts +104 -0
- package/dist/models/messages.d.ts.map +1 -0
- package/dist/models/messages.js +168 -0
- package/dist/models/messages.js.map +1 -0
- package/dist/models/profile.d.ts +24 -0
- package/dist/models/profile.d.ts.map +1 -0
- package/dist/models/profile.js +47 -0
- package/dist/models/profile.js.map +1 -0
- package/dist/models/relay.d.ts +39 -0
- package/dist/models/relay.d.ts.map +1 -0
- package/dist/models/relay.js +160 -0
- package/dist/models/relay.js.map +1 -0
- package/dist/protocol/codec.d.ts +36 -0
- package/dist/protocol/codec.d.ts.map +1 -0
- package/dist/protocol/codec.js +144 -0
- package/dist/protocol/codec.js.map +1 -0
- package/dist/protocol/context.d.ts +14 -0
- package/dist/protocol/context.d.ts.map +1 -0
- package/dist/protocol/context.js +43 -0
- package/dist/protocol/context.js.map +1 -0
- package/dist/protocol/encoding.d.ts +15 -0
- package/dist/protocol/encoding.d.ts.map +1 -0
- package/dist/protocol/encoding.js +133 -0
- package/dist/protocol/encoding.js.map +1 -0
- package/dist/protocol/json.d.ts +16 -0
- package/dist/protocol/json.d.ts.map +1 -0
- package/dist/protocol/json.js +172 -0
- package/dist/protocol/json.js.map +1 -0
- package/dist/protocol/validation.d.ts +4 -0
- package/dist/protocol/validation.d.ts.map +1 -0
- package/dist/protocol/validation.js +18 -0
- package/dist/protocol/validation.js.map +1 -0
- package/dist/runtime/abort.d.ts +6 -0
- package/dist/runtime/abort.d.ts.map +1 -0
- package/dist/runtime/abort.js +32 -0
- package/dist/runtime/abort.js.map +1 -0
- package/dist/runtime/async-gate.d.ts +6 -0
- package/dist/runtime/async-gate.d.ts.map +1 -0
- package/dist/runtime/async-gate.js +15 -0
- package/dist/runtime/async-gate.js.map +1 -0
- package/dist/runtime/async-pulse.d.ts +7 -0
- package/dist/runtime/async-pulse.d.ts.map +1 -0
- package/dist/runtime/async-pulse.js +23 -0
- package/dist/runtime/async-pulse.js.map +1 -0
- package/dist/runtime/clock.d.ts +16 -0
- package/dist/runtime/clock.d.ts.map +1 -0
- package/dist/runtime/clock.js +62 -0
- package/dist/runtime/clock.js.map +1 -0
- package/dist/runtime/events.d.ts +11 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +45 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/url.d.ts +3 -0
- package/dist/runtime/url.d.ts.map +1 -0
- package/dist/runtime/url.js +23 -0
- package/dist/runtime/url.js.map +1 -0
- package/dist/storage/signed-request.d.ts +14 -0
- package/dist/storage/signed-request.d.ts.map +1 -0
- package/dist/storage/signed-request.js +26 -0
- package/dist/storage/signed-request.js.map +1 -0
- package/dist/storage/store.d.ts +58 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/store.js +52 -0
- package/dist/storage/store.js.map +1 -0
- package/dist/storage/transaction.d.ts +7 -0
- package/dist/storage/transaction.d.ts.map +1 -0
- package/dist/storage/transaction.js +22 -0
- package/dist/storage/transaction.js.map +1 -0
- package/dist/transport/client.d.ts +61 -0
- package/dist/transport/client.d.ts.map +1 -0
- package/dist/transport/client.js +392 -0
- package/dist/transport/client.js.map +1 -0
- package/dist/transport/discovery.d.ts +19 -0
- package/dist/transport/discovery.d.ts.map +1 -0
- package/dist/transport/discovery.js +75 -0
- package/dist/transport/discovery.js.map +1 -0
- package/dist/transport/endpoint.d.ts +6 -0
- package/dist/transport/endpoint.d.ts.map +1 -0
- package/dist/transport/endpoint.js +35 -0
- package/dist/transport/endpoint.js.map +1 -0
- package/dist/transport/http.d.ts +52 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +128 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/pool.d.ts +31 -0
- package/dist/transport/pool.d.ts.map +1 -0
- package/dist/transport/pool.js +137 -0
- package/dist/transport/pool.js.map +1 -0
- package/dist/transport/relay-error.d.ts +23 -0
- package/dist/transport/relay-error.d.ts.map +1 -0
- package/dist/transport/relay-error.js +47 -0
- package/dist/transport/relay-error.js.map +1 -0
- package/dist/transport/rpc.d.ts +31 -0
- package/dist/transport/rpc.d.ts.map +1 -0
- package/dist/transport/rpc.js +56 -0
- package/dist/transport/rpc.js.map +1 -0
- package/dist/transport/session.d.ts +49 -0
- package/dist/transport/session.d.ts.map +1 -0
- package/dist/transport/session.js +169 -0
- package/dist/transport/session.js.map +1 -0
- package/dist/transport/socket.d.ts +55 -0
- package/dist/transport/socket.d.ts.map +1 -0
- package/dist/transport/socket.js +266 -0
- package/dist/transport/socket.js.map +1 -0
- package/dist/transport/subscription.d.ts +36 -0
- package/dist/transport/subscription.d.ts.map +1 -0
- package/dist/transport/subscription.js +169 -0
- package/dist/transport/subscription.js.map +1 -0
- package/package.json +35 -4
- package/src/channels/repository.ts +244 -0
- package/src/client/account-operations.ts +183 -0
- package/src/client/conversations.ts +95 -0
- package/src/client.ts +108 -0
- package/src/components/account.ts +206 -0
- package/src/components/channel.ts +253 -0
- package/src/components/component.ts +151 -0
- package/src/components/device.ts +455 -0
- package/src/components/group.ts +546 -0
- package/src/components/message.ts +253 -0
- package/src/components/profile.ts +179 -0
- package/src/crypto/groups.ts +107 -0
- package/src/crypto/messages.ts +129 -0
- package/src/crypto/primitives.ts +103 -0
- package/src/errors.ts +13 -0
- package/src/groups/account-sync.ts +144 -0
- package/src/groups/messages.ts +89 -0
- package/src/groups/operations.ts +145 -0
- package/src/groups/repository.ts +161 -0
- package/src/groups/secrets.ts +256 -0
- package/src/groups/state.ts +138 -0
- package/src/identity/identifiers.ts +41 -0
- package/src/identity/neo.ts +72 -0
- package/src/index.ts +52 -0
- package/src/interactions.ts +35 -0
- package/src/messages/account-sender.ts +33 -0
- package/src/messages/contacts.ts +379 -0
- package/src/messages/outbox.ts +152 -0
- package/src/messages/receiver.ts +86 -0
- package/src/messages/repository.ts +230 -0
- package/src/models/authentication.ts +63 -0
- package/src/models/channels.ts +155 -0
- package/src/models/contacts.ts +141 -0
- package/src/models/content.ts +105 -0
- package/src/models/device-state.ts +18 -0
- package/src/models/group-admission.ts +110 -0
- package/src/models/group-keys.ts +34 -0
- package/src/models/group-management.ts +182 -0
- package/src/models/groups.ts +100 -0
- package/src/models/identity.ts +164 -0
- package/src/models/messages.ts +139 -0
- package/src/models/profile.ts +46 -0
- package/src/models/relay.ts +151 -0
- package/src/protocol/codec.ts +144 -0
- package/src/protocol/context.ts +39 -0
- package/src/protocol/encoding.ts +106 -0
- package/src/protocol/json.ts +140 -0
- package/src/protocol/validation.ts +13 -0
- package/src/runtime/abort.ts +27 -0
- package/src/runtime/async-gate.ts +16 -0
- package/src/runtime/async-pulse.ts +20 -0
- package/src/runtime/clock.ts +63 -0
- package/src/runtime/events.ts +31 -0
- package/src/runtime/url.ts +17 -0
- package/src/storage/signed-request.ts +26 -0
- package/src/storage/store.ts +90 -0
- package/src/storage/transaction.ts +17 -0
- package/src/transport/client.ts +328 -0
- package/src/transport/discovery.ts +64 -0
- package/src/transport/endpoint.ts +32 -0
- package/src/transport/http.ts +129 -0
- package/src/transport/pool.ts +115 -0
- package/src/transport/relay-error.ts +46 -0
- package/src/transport/rpc.ts +56 -0
- package/src/transport/session.ts +154 -0
- package/src/transport/socket.ts +248 -0
- 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|