@affectively/aeon 1.0.0 → 1.2.0
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/README.md +10 -0
- package/dist/compression/index.cjs +580 -0
- package/dist/compression/index.cjs.map +1 -0
- package/dist/compression/index.d.cts +189 -0
- package/dist/compression/index.d.ts +189 -0
- package/dist/compression/index.js +573 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/core/index.d.cts +70 -5
- package/dist/core/index.d.ts +70 -5
- package/dist/crypto/index.cjs +100 -0
- package/dist/crypto/index.cjs.map +1 -0
- package/dist/crypto/index.d.cts +407 -0
- package/dist/crypto/index.d.ts +407 -0
- package/dist/crypto/index.js +96 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/distributed/index.cjs +420 -23
- package/dist/distributed/index.cjs.map +1 -1
- package/dist/distributed/index.d.cts +901 -2
- package/dist/distributed/index.d.ts +901 -2
- package/dist/distributed/index.js +420 -23
- package/dist/distributed/index.js.map +1 -1
- package/dist/index.cjs +1222 -55
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -811
- package/dist/index.d.ts +11 -811
- package/dist/index.js +1221 -56
- package/dist/index.js.map +1 -1
- package/dist/offline/index.cjs +419 -0
- package/dist/offline/index.cjs.map +1 -0
- package/dist/offline/index.d.cts +148 -0
- package/dist/offline/index.d.ts +148 -0
- package/dist/offline/index.js +415 -0
- package/dist/offline/index.js.map +1 -0
- package/dist/optimization/index.cjs +797 -0
- package/dist/optimization/index.cjs.map +1 -0
- package/dist/optimization/index.d.cts +347 -0
- package/dist/optimization/index.d.ts +347 -0
- package/dist/optimization/index.js +787 -0
- package/dist/optimization/index.js.map +1 -0
- package/dist/persistence/index.cjs +145 -0
- package/dist/persistence/index.cjs.map +1 -0
- package/dist/persistence/index.d.cts +63 -0
- package/dist/persistence/index.d.ts +63 -0
- package/dist/persistence/index.js +142 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/presence/index.cjs +489 -0
- package/dist/presence/index.cjs.map +1 -0
- package/dist/presence/index.d.cts +283 -0
- package/dist/presence/index.d.ts +283 -0
- package/dist/presence/index.js +485 -0
- package/dist/presence/index.js.map +1 -0
- package/dist/types-CMxO7QF0.d.cts +33 -0
- package/dist/types-CMxO7QF0.d.ts +33 -0
- package/dist/versioning/index.cjs +296 -14
- package/dist/versioning/index.cjs.map +1 -1
- package/dist/versioning/index.d.cts +66 -1
- package/dist/versioning/index.d.ts +66 -1
- package/dist/versioning/index.js +296 -14
- package/dist/versioning/index.js.map +1 -1
- package/package.json +51 -1
- package/dist/index-C_4CMV5c.d.cts +0 -1207
- package/dist/index-C_4CMV5c.d.ts +0 -1207
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aeon Crypto Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for cryptographic operations in Aeon.
|
|
5
|
+
* These are compatible with @affectively/ucan and @affectively/zk-encryption.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Decentralized Identifier (DID)
|
|
9
|
+
* Format: did:method:identifier
|
|
10
|
+
*/
|
|
11
|
+
type DID = `did:${string}:${string}`;
|
|
12
|
+
/**
|
|
13
|
+
* Supported signing algorithms
|
|
14
|
+
*/
|
|
15
|
+
type SigningAlgorithm = 'ES256' | 'Ed25519' | 'ES384' | 'ES512';
|
|
16
|
+
/**
|
|
17
|
+
* Key pair for signing and verification
|
|
18
|
+
*/
|
|
19
|
+
interface KeyPair {
|
|
20
|
+
algorithm: SigningAlgorithm;
|
|
21
|
+
publicKey: JsonWebKey;
|
|
22
|
+
privateKey?: JsonWebKey;
|
|
23
|
+
fingerprint: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Identity representing a user or node
|
|
27
|
+
*/
|
|
28
|
+
interface Identity {
|
|
29
|
+
did: DID;
|
|
30
|
+
signingKey: KeyPair;
|
|
31
|
+
encryptionKey?: KeyPair;
|
|
32
|
+
createdAt: number;
|
|
33
|
+
displayName?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* UCAN Capability structure
|
|
37
|
+
*/
|
|
38
|
+
interface Capability {
|
|
39
|
+
can: string;
|
|
40
|
+
with: string;
|
|
41
|
+
constraints?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* UCAN Token payload
|
|
45
|
+
*/
|
|
46
|
+
interface UCANPayload {
|
|
47
|
+
iss: DID;
|
|
48
|
+
aud: DID;
|
|
49
|
+
exp: number;
|
|
50
|
+
nbf?: number;
|
|
51
|
+
iat?: number;
|
|
52
|
+
nonce?: string;
|
|
53
|
+
jti?: string;
|
|
54
|
+
att: Capability[];
|
|
55
|
+
prf?: string[];
|
|
56
|
+
fct?: Record<string, unknown>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Parsed UCAN Token
|
|
60
|
+
*/
|
|
61
|
+
interface UCANToken {
|
|
62
|
+
payload: UCANPayload;
|
|
63
|
+
raw: string;
|
|
64
|
+
signature: Uint8Array;
|
|
65
|
+
algorithm: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* UCAN verification result
|
|
69
|
+
*/
|
|
70
|
+
interface VerificationResult {
|
|
71
|
+
valid: boolean;
|
|
72
|
+
payload?: UCANPayload;
|
|
73
|
+
error?: string;
|
|
74
|
+
expired?: boolean;
|
|
75
|
+
shouldRotate?: boolean;
|
|
76
|
+
expiresIn?: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Encryption algorithms supported
|
|
80
|
+
*/
|
|
81
|
+
type EncryptionAlgorithm = 'ECIES-P256' | 'AES-256-GCM';
|
|
82
|
+
/**
|
|
83
|
+
* HKDF domain separator categories
|
|
84
|
+
*/
|
|
85
|
+
type DomainCategory = 'default' | 'sync' | 'message' | 'api-key' | 'personal-data' | string;
|
|
86
|
+
/**
|
|
87
|
+
* EC Key pair for ECDH operations
|
|
88
|
+
*/
|
|
89
|
+
interface ECKeyPair {
|
|
90
|
+
publicKey: JsonWebKey;
|
|
91
|
+
privateKey: JsonWebKey;
|
|
92
|
+
keyId: string;
|
|
93
|
+
createdAt: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Encrypted data envelope
|
|
97
|
+
*/
|
|
98
|
+
interface EncryptedPayload {
|
|
99
|
+
alg: EncryptionAlgorithm;
|
|
100
|
+
ct: string;
|
|
101
|
+
iv: string;
|
|
102
|
+
tag: string;
|
|
103
|
+
epk?: JsonWebKey;
|
|
104
|
+
category?: DomainCategory;
|
|
105
|
+
nonce?: string;
|
|
106
|
+
encryptedAt: number;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Decryption result
|
|
110
|
+
*/
|
|
111
|
+
interface DecryptionResult {
|
|
112
|
+
plaintext: Uint8Array;
|
|
113
|
+
category?: DomainCategory;
|
|
114
|
+
encryptedAt: number;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Aeon encryption mode
|
|
118
|
+
*/
|
|
119
|
+
type AeonEncryptionMode = 'none' | 'transport' | 'at-rest' | 'end-to-end';
|
|
120
|
+
/**
|
|
121
|
+
* Aeon sync capability namespace
|
|
122
|
+
*/
|
|
123
|
+
declare const AEON_CAPABILITIES: {
|
|
124
|
+
readonly SYNC_READ: "aeon:sync:read";
|
|
125
|
+
readonly SYNC_WRITE: "aeon:sync:write";
|
|
126
|
+
readonly SYNC_ADMIN: "aeon:sync:admin";
|
|
127
|
+
readonly NODE_REGISTER: "aeon:node:register";
|
|
128
|
+
readonly NODE_HEARTBEAT: "aeon:node:heartbeat";
|
|
129
|
+
readonly REPLICATE_READ: "aeon:replicate:read";
|
|
130
|
+
readonly REPLICATE_WRITE: "aeon:replicate:write";
|
|
131
|
+
readonly STATE_READ: "aeon:state:read";
|
|
132
|
+
readonly STATE_WRITE: "aeon:state:write";
|
|
133
|
+
readonly STATE_RECONCILE: "aeon:state:reconcile";
|
|
134
|
+
};
|
|
135
|
+
type AeonCapability = (typeof AEON_CAPABILITIES)[keyof typeof AEON_CAPABILITIES];
|
|
136
|
+
/**
|
|
137
|
+
* Crypto configuration for Aeon
|
|
138
|
+
*/
|
|
139
|
+
interface AeonCryptoConfig {
|
|
140
|
+
/** Default encryption mode for sync messages */
|
|
141
|
+
defaultEncryptionMode: AeonEncryptionMode;
|
|
142
|
+
/** Require all messages to be signed */
|
|
143
|
+
requireSignatures: boolean;
|
|
144
|
+
/** Require UCAN capability verification */
|
|
145
|
+
requireCapabilities: boolean;
|
|
146
|
+
/** Allowed signature algorithms */
|
|
147
|
+
allowedSignatureAlgorithms: string[];
|
|
148
|
+
/** Allowed encryption algorithms */
|
|
149
|
+
allowedEncryptionAlgorithms: string[];
|
|
150
|
+
/** UCAN audience DID for verification */
|
|
151
|
+
ucanAudience?: string;
|
|
152
|
+
/** Session key expiration (ms) */
|
|
153
|
+
sessionKeyExpiration?: number;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Default crypto configuration
|
|
157
|
+
*/
|
|
158
|
+
declare const DEFAULT_CRYPTO_CONFIG: AeonCryptoConfig;
|
|
159
|
+
/**
|
|
160
|
+
* Authenticated sync message fields
|
|
161
|
+
*/
|
|
162
|
+
interface AuthenticatedMessageFields {
|
|
163
|
+
/** Sender DID */
|
|
164
|
+
senderDID?: string;
|
|
165
|
+
/** Receiver DID */
|
|
166
|
+
receiverDID?: string;
|
|
167
|
+
/** UCAN token for capability verification */
|
|
168
|
+
ucan?: string;
|
|
169
|
+
/** Message signature (base64url) */
|
|
170
|
+
signature?: string;
|
|
171
|
+
/** Whether payload is encrypted */
|
|
172
|
+
encrypted?: boolean;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Secure sync session
|
|
176
|
+
*/
|
|
177
|
+
interface SecureSyncSession {
|
|
178
|
+
id: string;
|
|
179
|
+
initiator: string;
|
|
180
|
+
participants: string[];
|
|
181
|
+
sessionKey?: Uint8Array;
|
|
182
|
+
encryptionMode: AeonEncryptionMode;
|
|
183
|
+
requiredCapabilities: string[];
|
|
184
|
+
status: 'pending' | 'active' | 'completed' | 'failed';
|
|
185
|
+
startTime: string;
|
|
186
|
+
endTime?: string;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Node with identity information
|
|
190
|
+
*/
|
|
191
|
+
interface SecureNodeInfo {
|
|
192
|
+
id: string;
|
|
193
|
+
did?: string;
|
|
194
|
+
publicSigningKey?: JsonWebKey;
|
|
195
|
+
publicEncryptionKey?: JsonWebKey;
|
|
196
|
+
capabilities?: string[];
|
|
197
|
+
lastSeen?: number;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Capability verification result
|
|
201
|
+
*/
|
|
202
|
+
interface AeonCapabilityResult {
|
|
203
|
+
authorized: boolean;
|
|
204
|
+
error?: string;
|
|
205
|
+
issuer?: string;
|
|
206
|
+
grantedCapabilities?: Array<{
|
|
207
|
+
can: string;
|
|
208
|
+
with: string;
|
|
209
|
+
}>;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Signed data envelope for sync operations
|
|
213
|
+
*/
|
|
214
|
+
interface SignedSyncData<T = unknown> {
|
|
215
|
+
payload: T;
|
|
216
|
+
signature: string;
|
|
217
|
+
signer: string;
|
|
218
|
+
algorithm: string;
|
|
219
|
+
signedAt: number;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Aeon Crypto Provider Interface
|
|
224
|
+
*
|
|
225
|
+
* Abstract interface for cryptographic operations.
|
|
226
|
+
* Aeon core remains zero-dependency - crypto is injected through this interface.
|
|
227
|
+
*/
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Abstract crypto provider interface
|
|
231
|
+
*
|
|
232
|
+
* Implementations use @affectively/ucan and @affectively/zk-encryption
|
|
233
|
+
* or other compatible libraries.
|
|
234
|
+
*/
|
|
235
|
+
interface ICryptoProvider {
|
|
236
|
+
/**
|
|
237
|
+
* Generate a new identity with DID and key pairs
|
|
238
|
+
*/
|
|
239
|
+
generateIdentity(displayName?: string): Promise<{
|
|
240
|
+
did: string;
|
|
241
|
+
publicSigningKey: JsonWebKey;
|
|
242
|
+
publicEncryptionKey?: JsonWebKey;
|
|
243
|
+
}>;
|
|
244
|
+
/**
|
|
245
|
+
* Get the local identity's DID
|
|
246
|
+
*/
|
|
247
|
+
getLocalDID(): string | null;
|
|
248
|
+
/**
|
|
249
|
+
* Export local identity's public info for sharing
|
|
250
|
+
*/
|
|
251
|
+
exportPublicIdentity(): Promise<SecureNodeInfo | null>;
|
|
252
|
+
/**
|
|
253
|
+
* Register a known remote node's public keys
|
|
254
|
+
*/
|
|
255
|
+
registerRemoteNode(node: SecureNodeInfo): Promise<void>;
|
|
256
|
+
/**
|
|
257
|
+
* Get a remote node's public key
|
|
258
|
+
*/
|
|
259
|
+
getRemotePublicKey(did: string): Promise<JsonWebKey | null>;
|
|
260
|
+
/**
|
|
261
|
+
* Sign data with local identity's private key
|
|
262
|
+
*/
|
|
263
|
+
sign(data: Uint8Array): Promise<Uint8Array>;
|
|
264
|
+
/**
|
|
265
|
+
* Sign structured data and wrap in SignedSyncData envelope
|
|
266
|
+
*/
|
|
267
|
+
signData<T>(data: T): Promise<SignedSyncData<T>>;
|
|
268
|
+
/**
|
|
269
|
+
* Verify a signature from a remote node
|
|
270
|
+
*/
|
|
271
|
+
verify(did: string, signature: Uint8Array, data: Uint8Array): Promise<boolean>;
|
|
272
|
+
/**
|
|
273
|
+
* Verify a SignedSyncData envelope
|
|
274
|
+
*/
|
|
275
|
+
verifySignedData<T>(signedData: SignedSyncData<T>): Promise<boolean>;
|
|
276
|
+
/**
|
|
277
|
+
* Encrypt data for a recipient
|
|
278
|
+
*/
|
|
279
|
+
encrypt(plaintext: Uint8Array, recipientDID: string): Promise<{
|
|
280
|
+
alg: string;
|
|
281
|
+
ct: string;
|
|
282
|
+
iv: string;
|
|
283
|
+
tag: string;
|
|
284
|
+
epk?: JsonWebKey;
|
|
285
|
+
encryptedAt: number;
|
|
286
|
+
}>;
|
|
287
|
+
/**
|
|
288
|
+
* Decrypt data
|
|
289
|
+
*/
|
|
290
|
+
decrypt(encrypted: {
|
|
291
|
+
alg: string;
|
|
292
|
+
ct: string;
|
|
293
|
+
iv: string;
|
|
294
|
+
tag: string;
|
|
295
|
+
epk?: JsonWebKey;
|
|
296
|
+
}, senderDID?: string): Promise<Uint8Array>;
|
|
297
|
+
/**
|
|
298
|
+
* Derive or get a session key for communication with a peer
|
|
299
|
+
*/
|
|
300
|
+
getSessionKey(peerDID: string): Promise<Uint8Array>;
|
|
301
|
+
/**
|
|
302
|
+
* Encrypt with a session key
|
|
303
|
+
*/
|
|
304
|
+
encryptWithSessionKey(plaintext: Uint8Array, sessionKey: Uint8Array): Promise<{
|
|
305
|
+
alg: string;
|
|
306
|
+
ct: string;
|
|
307
|
+
iv: string;
|
|
308
|
+
tag: string;
|
|
309
|
+
encryptedAt: number;
|
|
310
|
+
}>;
|
|
311
|
+
/**
|
|
312
|
+
* Decrypt with a session key
|
|
313
|
+
*/
|
|
314
|
+
decryptWithSessionKey(encrypted: {
|
|
315
|
+
ct: string;
|
|
316
|
+
iv: string;
|
|
317
|
+
tag: string;
|
|
318
|
+
}, sessionKey: Uint8Array): Promise<Uint8Array>;
|
|
319
|
+
/**
|
|
320
|
+
* Create a UCAN token
|
|
321
|
+
*/
|
|
322
|
+
createUCAN(audience: string, capabilities: Array<{
|
|
323
|
+
can: string;
|
|
324
|
+
with: string;
|
|
325
|
+
}>, options?: {
|
|
326
|
+
expirationSeconds?: number;
|
|
327
|
+
proofs?: string[];
|
|
328
|
+
}): Promise<string>;
|
|
329
|
+
/**
|
|
330
|
+
* Verify a UCAN token
|
|
331
|
+
*/
|
|
332
|
+
verifyUCAN(token: string, options?: {
|
|
333
|
+
expectedAudience?: string;
|
|
334
|
+
requiredCapabilities?: Array<{
|
|
335
|
+
can: string;
|
|
336
|
+
with: string;
|
|
337
|
+
}>;
|
|
338
|
+
}): Promise<AeonCapabilityResult>;
|
|
339
|
+
/**
|
|
340
|
+
* Delegate capabilities
|
|
341
|
+
*/
|
|
342
|
+
delegateCapabilities(parentToken: string, audience: string, capabilities: Array<{
|
|
343
|
+
can: string;
|
|
344
|
+
with: string;
|
|
345
|
+
}>, options?: {
|
|
346
|
+
expirationSeconds?: number;
|
|
347
|
+
}): Promise<string>;
|
|
348
|
+
/**
|
|
349
|
+
* Compute hash of data
|
|
350
|
+
*/
|
|
351
|
+
hash(data: Uint8Array): Promise<Uint8Array>;
|
|
352
|
+
/**
|
|
353
|
+
* Generate random bytes
|
|
354
|
+
*/
|
|
355
|
+
randomBytes(length: number): Uint8Array;
|
|
356
|
+
/**
|
|
357
|
+
* Check if crypto is properly initialized
|
|
358
|
+
*/
|
|
359
|
+
isInitialized(): boolean;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Null crypto provider for when crypto is disabled
|
|
363
|
+
*
|
|
364
|
+
* All operations either throw or return permissive defaults.
|
|
365
|
+
*/
|
|
366
|
+
declare class NullCryptoProvider implements ICryptoProvider {
|
|
367
|
+
private notConfiguredError;
|
|
368
|
+
generateIdentity(): Promise<{
|
|
369
|
+
did: string;
|
|
370
|
+
publicSigningKey: JsonWebKey;
|
|
371
|
+
publicEncryptionKey?: JsonWebKey;
|
|
372
|
+
}>;
|
|
373
|
+
getLocalDID(): string | null;
|
|
374
|
+
exportPublicIdentity(): Promise<SecureNodeInfo | null>;
|
|
375
|
+
registerRemoteNode(): Promise<void>;
|
|
376
|
+
getRemotePublicKey(): Promise<JsonWebKey | null>;
|
|
377
|
+
sign(): Promise<Uint8Array>;
|
|
378
|
+
signData<T>(_data: T): Promise<SignedSyncData<T>>;
|
|
379
|
+
verify(): Promise<boolean>;
|
|
380
|
+
verifySignedData(): Promise<boolean>;
|
|
381
|
+
encrypt(): Promise<{
|
|
382
|
+
alg: string;
|
|
383
|
+
ct: string;
|
|
384
|
+
iv: string;
|
|
385
|
+
tag: string;
|
|
386
|
+
epk?: JsonWebKey;
|
|
387
|
+
encryptedAt: number;
|
|
388
|
+
}>;
|
|
389
|
+
decrypt(): Promise<Uint8Array>;
|
|
390
|
+
getSessionKey(): Promise<Uint8Array>;
|
|
391
|
+
encryptWithSessionKey(): Promise<{
|
|
392
|
+
alg: string;
|
|
393
|
+
ct: string;
|
|
394
|
+
iv: string;
|
|
395
|
+
tag: string;
|
|
396
|
+
encryptedAt: number;
|
|
397
|
+
}>;
|
|
398
|
+
decryptWithSessionKey(): Promise<Uint8Array>;
|
|
399
|
+
createUCAN(): Promise<string>;
|
|
400
|
+
verifyUCAN(): Promise<AeonCapabilityResult>;
|
|
401
|
+
delegateCapabilities(): Promise<string>;
|
|
402
|
+
hash(): Promise<Uint8Array>;
|
|
403
|
+
randomBytes(length: number): Uint8Array;
|
|
404
|
+
isInitialized(): boolean;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
export { AEON_CAPABILITIES, type AeonCapability, type AeonCapabilityResult, type AeonCryptoConfig, type AeonEncryptionMode, type AuthenticatedMessageFields, type Capability, DEFAULT_CRYPTO_CONFIG, type DID, type DecryptionResult, type DomainCategory, type ECKeyPair, type EncryptedPayload, type EncryptionAlgorithm, type ICryptoProvider, type Identity, type KeyPair, NullCryptoProvider, type SecureNodeInfo, type SecureSyncSession, type SignedSyncData, type SigningAlgorithm, type UCANPayload, type UCANToken, type VerificationResult };
|