nostr-double-ratchet 0.0.38 → 0.0.48

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 CHANGED
@@ -1,19 +1,56 @@
1
- [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/mmalmi/nostr-double-ratchet)
2
-
3
- * Double ratchet on nostr
4
- - [x] 1-on-1 channel
5
- - [ ] group channel
6
- * Invites for securely exchanging session keys
7
- * Breaking changes are likely
8
- * Stable version on [NPM](https://www.npmjs.com/package/nostr-double-ratchet)
9
- * check out [tests](https://github.com/mmalmi/nostr-double-ratchet/tree/main/tests) for usage
10
- * [Documentation](https://mmalmi.github.io/nostr-double-ratchet/)
11
- * [Source code](https://github.com/mmalmi/nostr-double-ratchet)
1
+ # nostr-double-ratchet
2
+
3
+ End-to-end encrypted messaging for Nostr using the Double Ratchet algorithm.
12
4
 
13
5
  ## Installation
14
6
 
15
7
  ```bash
16
- npm install nostr-double-ratchet
17
- # or
18
- yarn add nostr-double-ratchet
19
- ```
8
+ pnpm add nostr-double-ratchet
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { AppKeysManager, DelegateManager } from "nostr-double-ratchet"
15
+
16
+ // 1. Create device identity
17
+ const delegate = new DelegateManager({ nostrSubscribe, nostrPublish, storage })
18
+ await delegate.init()
19
+
20
+ // 2. Register device (only on devices with main nsec)
21
+ const appKeysManager = new AppKeysManager({ nostrPublish, storage })
22
+ await appKeysManager.init()
23
+ appKeysManager.addDevice(delegate.getRegistrationPayload())
24
+ await appKeysManager.publish()
25
+
26
+ // 3. Activate and create session manager
27
+ await delegate.activate(ownerPublicKey)
28
+ const sessionManager = delegate.createSessionManager()
29
+ await sessionManager.init()
30
+
31
+ // 4. Send and receive messages
32
+ sessionManager.onEvent((event, from) => console.log(`${from}: ${event.content}`))
33
+ await sessionManager.sendMessage(recipientPubkey, "Hello!")
34
+ ```
35
+
36
+ ## Multi-Device
37
+
38
+ - **Main device** (has nsec): Uses both `DelegateManager` and `AppKeysManager`
39
+ - **Delegate device** (no nsec): Uses only `DelegateManager`, waits for activation
40
+
41
+ ```typescript
42
+ // Delegate device flow
43
+ const delegate = new DelegateManager({ nostrSubscribe, nostrPublish, storage })
44
+ await delegate.init()
45
+ // Transfer delegate.getRegistrationPayload().identityPubkey to main device
46
+ const ownerPublicKey = await delegate.waitForActivation(60000)
47
+ const sessionManager = delegate.createSessionManager()
48
+ ```
49
+
50
+ ## Event Types
51
+
52
+ | Event | Kind | Purpose |
53
+ |-------|------|---------|
54
+ | AppKeys | 30078 | Lists authorized devices for a user |
55
+ | Invite | 30078 | Per-device keys for session establishment |
56
+ | Invite Response | 1059 | Encrypted session handshake |
@@ -0,0 +1,52 @@
1
+ import { VerifiedEvent, UnsignedEvent } from "nostr-tools";
2
+ import { NostrSubscribe, Unsubscribe } from "./types";
3
+ /**
4
+ * Device identity entry - contains only identity information.
5
+ * identityPubkey serves as the device identifier.
6
+ * Invite crypto material (ephemeral keys, shared secret) is in separate Invite events.
7
+ */
8
+ export interface DeviceEntry {
9
+ /** Identity public key - also serves as device identifier */
10
+ identityPubkey: string;
11
+ createdAt: number;
12
+ }
13
+ /**
14
+ * Manages a consolidated list of device invites (kind 30078, d-tag "double-ratchet/app-keys").
15
+ * Single atomic event containing all device invites for a user.
16
+ * Uses union merge strategy for conflict resolution.
17
+ *
18
+ * Note: ownerPublicKey is not stored - it's passed to getEvent() when publishing,
19
+ * and NDK's signer sets the correct pubkey during signing anyway.
20
+ */
21
+ export declare class AppKeys {
22
+ private devices;
23
+ constructor(devices?: DeviceEntry[]);
24
+ /**
25
+ * Creates a new device identity entry.
26
+ * Note: This only creates the identity entry. The device must separately
27
+ * create and publish its own Invite event with ephemeral keys.
28
+ */
29
+ createDeviceEntry(identityPubkey: string): DeviceEntry;
30
+ addDevice(device: DeviceEntry): void;
31
+ removeDevice(identityPubkey: string): void;
32
+ getDevice(identityPubkey: string): DeviceEntry | undefined;
33
+ getAllDevices(): DeviceEntry[];
34
+ getEvent(): UnsignedEvent;
35
+ static fromEvent(event: VerifiedEvent): AppKeys;
36
+ serialize(): string;
37
+ static deserialize(json: string): AppKeys;
38
+ merge(other: AppKeys): AppKeys;
39
+ /**
40
+ * Subscribe to AppKeys events from a user.
41
+ * Similar to Invite.fromUser pattern.
42
+ */
43
+ static fromUser(user: string, subscribe: NostrSubscribe, onAppKeysList: (appKeys: AppKeys) => void): Unsubscribe;
44
+ /**
45
+ * Wait for AppKeys from a user with timeout.
46
+ * Returns the most recent AppKeys received within the timeout, or null.
47
+ * Note: Uses the most recent event by created_at, not merging, since
48
+ * device revocation is determined by absence from the list.
49
+ */
50
+ static waitFor(user: string, subscribe: NostrSubscribe, timeoutMs?: number): Promise<AppKeys | null>;
51
+ }
52
+ //# sourceMappingURL=AppKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppKeys.d.ts","sourceRoot":"","sources":["../src/AppKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAe,MAAM,aAAa,CAAA;AACvE,OAAO,EAAuB,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAiB1E;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;GAOG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,OAAO,CAAsC;gBAEzC,OAAO,GAAE,WAAW,EAAO;IAIvC;;;;OAIG;IACH,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAOtD,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMpC,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAI1C,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1D,aAAa,IAAI,WAAW,EAAE;IAI9B,QAAQ,IAAI,aAAa;IAoBzB,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO;IAoB/C,SAAS,IAAI,MAAM;IAMnB,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOzC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAc9B;;;OAGG;IACH,MAAM,CAAC,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,cAAc,EACzB,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GACxC,WAAW;IAmBd;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,cAAc,EACzB,SAAS,SAAM,GACd,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;CA+B3B"}
@@ -0,0 +1,136 @@
1
+ import { AppKeys, DeviceEntry } from "./AppKeys";
2
+ import { Invite } from "./Invite";
3
+ import { NostrSubscribe, NostrPublish } from "./types";
4
+ import { StorageAdapter } from "./StorageAdapter";
5
+ import { SessionManager } from "./SessionManager";
6
+ export interface DelegatePayload {
7
+ identityPubkey: string;
8
+ }
9
+ /**
10
+ * Options for AppKeysManager (authority for AppKeys)
11
+ */
12
+ export interface AppKeysManagerOptions {
13
+ nostrPublish: NostrPublish;
14
+ storage?: StorageAdapter;
15
+ }
16
+ /**
17
+ * Options for DelegateManager (device identity)
18
+ */
19
+ export interface DelegateManagerOptions {
20
+ nostrSubscribe: NostrSubscribe;
21
+ nostrPublish: NostrPublish;
22
+ storage?: StorageAdapter;
23
+ }
24
+ /**
25
+ * AppKeysManager - Authority for AppKeys.
26
+ * Manages local AppKeys and publishes to relays.
27
+ * Does NOT have device identity (no Invite, no SessionManager creation).
28
+ */
29
+ export declare class AppKeysManager {
30
+ private readonly nostrPublish;
31
+ private readonly storage;
32
+ private appKeys;
33
+ private initialized;
34
+ private readonly storageVersion;
35
+ private get versionPrefix();
36
+ constructor(options: AppKeysManagerOptions);
37
+ init(): Promise<void>;
38
+ getAppKeys(): AppKeys | null;
39
+ getOwnDevices(): DeviceEntry[];
40
+ /**
41
+ * Add a device to the AppKeys.
42
+ * Only adds identity info - the device publishes its own Invite separately.
43
+ * This is a local-only operation - call publish() to publish to relays.
44
+ */
45
+ addDevice(payload: DelegatePayload): void;
46
+ /**
47
+ * Revoke a device from the AppKeys.
48
+ * This is a local-only operation - call publish() to publish to relays.
49
+ */
50
+ revokeDevice(identityPubkey: string): void;
51
+ /**
52
+ * Publish the current AppKeys to relays.
53
+ * This is the only way to publish - addDevice/revokeDevice are local-only.
54
+ */
55
+ publish(): Promise<void>;
56
+ /**
57
+ * Replace the local AppKeys with the given list and save to storage.
58
+ * Used for authority transfer - receive list from another device, then call publish().
59
+ */
60
+ setAppKeys(list: AppKeys): Promise<void>;
61
+ /**
62
+ * Cleanup resources. Currently a no-op but kept for API consistency.
63
+ */
64
+ close(): void;
65
+ private appKeysKey;
66
+ private loadAppKeys;
67
+ private saveAppKeys;
68
+ }
69
+ /**
70
+ * DelegateManager - Device identity manager.
71
+ * ALL devices (including main) use this for their device identity.
72
+ * Publishes own Invite events, used for SessionManager DH encryption.
73
+ */
74
+ export declare class DelegateManager {
75
+ private readonly nostrSubscribe;
76
+ private readonly nostrPublish;
77
+ private readonly storage;
78
+ private devicePublicKey;
79
+ private devicePrivateKey;
80
+ private invite;
81
+ private ownerPubkeyFromActivation?;
82
+ private initialized;
83
+ private subscriptions;
84
+ private readonly storageVersion;
85
+ private get versionPrefix();
86
+ constructor(options: DelegateManagerOptions);
87
+ init(): Promise<void>;
88
+ /**
89
+ * Get the registration payload for adding this device to an AppKeysManager.
90
+ * Must be called after init().
91
+ */
92
+ getRegistrationPayload(): DelegatePayload;
93
+ getIdentityPublicKey(): string;
94
+ getIdentityKey(): Uint8Array;
95
+ getInvite(): Invite | null;
96
+ getOwnerPublicKey(): string | null;
97
+ /**
98
+ * Rotate this device's invite - generates new ephemeral keys and shared secret.
99
+ */
100
+ rotateInvite(): Promise<void>;
101
+ /**
102
+ * Activate this device with a known owner.
103
+ * Use this when you know the device has been added (e.g., main device adding itself).
104
+ * Skips fetching from relay - just stores the owner pubkey.
105
+ */
106
+ activate(ownerPublicKey: string): Promise<void>;
107
+ /**
108
+ * Wait for this device to be activated (added to an AppKeys).
109
+ * Returns the owner's public key once activated.
110
+ * For delegate devices that don't know the owner ahead of time.
111
+ */
112
+ waitForActivation(timeoutMs?: number): Promise<string>;
113
+ /**
114
+ * Check if this device has been revoked from the owner's AppKeys.
115
+ * @param options.timeoutMs - Timeout for each attempt (default 2000ms)
116
+ * @param options.retries - Number of retry attempts (default 2)
117
+ */
118
+ isRevoked(options?: {
119
+ timeoutMs?: number;
120
+ retries?: number;
121
+ }): Promise<boolean>;
122
+ close(): void;
123
+ /**
124
+ * Create a SessionManager for this device.
125
+ */
126
+ createSessionManager(sessionStorage?: StorageAdapter): SessionManager;
127
+ private ownerPubkeyKey;
128
+ private inviteKey;
129
+ private loadInvite;
130
+ private saveInvite;
131
+ private identityPublicKeyKey;
132
+ private identityPrivateKeyKey;
133
+ }
134
+ export { AppKeysManager as ApplicationManager };
135
+ export type { AppKeysManagerOptions as ApplicationManagerOptions };
136
+ //# sourceMappingURL=AppKeysManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppKeysManager.d.ts","sourceRoot":"","sources":["../src/AppKeysManager.ts"],"names":[],"mappings":"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"}
package/dist/Invite.d.ts CHANGED
@@ -38,30 +38,29 @@ export declare class Invite {
38
38
  /**
39
39
  * Creates a tombstone event that replaces the invite, signaling device revocation.
40
40
  * The tombstone has the same d-tag but no keys, making it invalid as an invite.
41
- * Used during migration to InviteList or when revoking a device.
42
41
  */
43
42
  getDeletionEvent(): UnsignedEvent;
44
43
  /**
45
44
  * Called by the invitee. Accepts the invite and creates a new session with the inviter.
46
45
  *
47
46
  * @param nostrSubscribe - A function to subscribe to Nostr events
48
- * @param inviteePublicKey - The invitee's public key
47
+ * @param inviteePublicKey - The invitee's identity public key (also serves as device ID)
49
48
  * @param encryptor - The invitee's secret key or a signing/encrypt function
50
- * @param deviceId - Optional device ID to identify the invitee's device
49
+ * @param ownerPublicKey - The invitee's owner/Nostr identity public key (optional for single-device users)
51
50
  * @returns An object containing the new session and an event to be published
52
51
  *
53
52
  * 1. Inner event: No signature, content encrypted with DH(inviter, invitee).
54
- * Purpose: Authenticate invitee. Contains invitee session key and deviceId.
53
+ * Purpose: Authenticate invitee. Contains invitee session key and ownerPublicKey.
55
54
  * 2. Envelope: No signature, content encrypted with DH(inviter, random key).
56
55
  * Purpose: Contains inner event. Hides invitee from others who might have the shared Nostr key.
57
56
 
58
57
  * Note: You need to publish the returned event on Nostr using NDK or another Nostr system of your choice,
59
58
  * so the inviter can create the session on their side.
60
59
  */
61
- accept(nostrSubscribe: NostrSubscribe, inviteePublicKey: string, encryptor: Uint8Array | EncryptFunction, deviceId?: string): Promise<{
60
+ accept(nostrSubscribe: NostrSubscribe, inviteePublicKey: string, encryptor: Uint8Array | EncryptFunction, ownerPublicKey?: string): Promise<{
62
61
  session: Session;
63
62
  event: VerifiedEvent;
64
63
  }>;
65
- listen(decryptor: Uint8Array | DecryptFunction, nostrSubscribe: NostrSubscribe, onSession: (_session: Session, _identity: string, _deviceId?: string) => void): Unsubscribe;
64
+ listen(decryptor: Uint8Array | DecryptFunction, nostrSubscribe: NostrSubscribe, onSession: (_session: Session, _identity: string) => void): Unsubscribe;
66
65
  }
67
66
  //# sourceMappingURL=Invite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Invite.d.ts","sourceRoot":"","sources":["../src/Invite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAqB,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAwB,MAAM,SAAS,CAAC;AACjI,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWvC;;;;;;;;;GASG;AACH,qBAAa,MAAM;IAEJ,yBAAyB,EAAE,MAAM;IACjC,YAAY,EAAE,MAAM;IACpB,OAAO,EAAE,MAAM;IACf,0BAA0B,CAAC,EAAE,UAAU;IACvC,QAAQ,CAAC,EAAE,MAAM;IACjB,OAAO,CAAC,EAAE,MAAM;IAChB,MAAM,EAAE,MAAM,EAAE;IAChB,SAAS,EAAE,MAAM;gBAPjB,yBAAyB,EAAE,MAAM,EACjC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,0BAA0B,CAAC,EAAE,UAAU,YAAA,EACvC,QAAQ,CAAC,EAAE,MAAM,YAAA,EACjB,OAAO,CAAC,EAAE,MAAM,YAAA,EAChB,MAAM,GAAE,MAAM,EAAO,EACrB,SAAS,GAAE,MAAc;IAIpC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAgB9E,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IA2BnC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAcxC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;IAkC9C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;IAwB1G;;OAEG;IACH,SAAS,IAAI,MAAM;IAanB;;OAEG;IACH,MAAM,CAAC,IAAI,SAAoB;IAW/B,QAAQ,IAAI,aAAa;IAkBzB;;;;OAIG;IACH,gBAAgB,IAAI,aAAa;IAgBjC;;;;;;;;;;;;;;;;OAgBG;IACG,MAAM,CACR,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,UAAU,GAAG,eAAe,EACvC,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,aAAa,CAAA;KAAE,CAAC;IA6BtD,MAAM,CAAC,SAAS,EAAE,UAAU,GAAG,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;CA4C9K"}
1
+ {"version":3,"file":"Invite.d.ts","sourceRoot":"","sources":["../src/Invite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAqB,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAwB,MAAM,SAAS,CAAC;AACjI,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWvC;;;;;;;;;GASG;AACH,qBAAa,MAAM;IAEJ,yBAAyB,EAAE,MAAM;IACjC,YAAY,EAAE,MAAM;IACpB,OAAO,EAAE,MAAM;IACf,0BAA0B,CAAC,EAAE,UAAU;IACvC,QAAQ,CAAC,EAAE,MAAM;IACjB,OAAO,CAAC,EAAE,MAAM;IAChB,MAAM,EAAE,MAAM,EAAE;IAChB,SAAS,EAAE,MAAM;gBAPjB,yBAAyB,EAAE,MAAM,EACjC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,0BAA0B,CAAC,EAAE,UAAU,YAAA,EACvC,QAAQ,CAAC,EAAE,MAAM,YAAA,EACjB,OAAO,CAAC,EAAE,MAAM,YAAA,EAChB,MAAM,GAAE,MAAM,EAAO,EACrB,SAAS,GAAE,MAAc;IAIpC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAgB9E,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IA2BnC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAcxC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;IAkC9C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;IAwB1G;;OAEG;IACH,SAAS,IAAI,MAAM;IAanB;;OAEG;IACH,MAAM,CAAC,IAAI,SAAoB;IAW/B,QAAQ,IAAI,aAAa;IAkBzB;;;OAGG;IACH,gBAAgB,IAAI,aAAa;IAgBjC;;;;;;;;;;;;;;;;OAgBG;IACG,MAAM,CACR,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,UAAU,GAAG,eAAe,EACvC,cAAc,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,aAAa,CAAA;KAAE,CAAC;IA6BtD,MAAM,CAAC,SAAS,EAAE,UAAU,GAAG,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;CA8C1J"}
package/dist/Session.d.ts CHANGED
@@ -38,6 +38,35 @@ export declare class Session {
38
38
  event: VerifiedEvent;
39
39
  innerEvent: Rumor;
40
40
  };
41
+ /**
42
+ * Sends a reaction to a message through the encrypted session.
43
+ * @param messageId The ID of the message being reacted to
44
+ * @param emoji The emoji or reaction content (e.g., "👍", "❤️", "+1")
45
+ * @returns A verified Nostr event containing the encrypted reaction. You need to publish this event to the Nostr network.
46
+ * @throws Error if we are not the initiator and trying to send the first message
47
+ */
48
+ sendReaction(messageId: string, emoji: string): {
49
+ event: VerifiedEvent;
50
+ innerEvent: Rumor;
51
+ };
52
+ /**
53
+ * Sends a typing indicator through the encrypted session.
54
+ * @returns A verified Nostr event containing the encrypted typing indicator. You need to publish this event to the Nostr network.
55
+ */
56
+ sendTyping(): {
57
+ event: VerifiedEvent;
58
+ innerEvent: Rumor;
59
+ };
60
+ /**
61
+ * Sends a delivery/read receipt through the encrypted session.
62
+ * @param receiptType Either "delivered" or "seen"
63
+ * @param messageIds The IDs of the messages being acknowledged
64
+ * @returns A verified Nostr event containing the encrypted receipt. You need to publish this event to the Nostr network.
65
+ */
66
+ sendReceipt(receiptType: 'delivered' | 'seen', messageIds: string[]): {
67
+ event: VerifiedEvent;
68
+ innerEvent: Rumor;
69
+ };
41
70
  /**
42
71
  * Send a partial Nostr event through the encrypted session.
43
72
  * In addition to chat messages, it could be files, webrtc negotiation or many other types of messages.
@@ -1 +1 @@
1
- {"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../src/Session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,aAAa,EAAE,aAAa,EAA+B,MAAM,aAAa,CAAC;AAE/I,OAAO,EACL,YAAY,EAEZ,WAAW,EACX,cAAc,EACd,aAAa,EAEb,KAAK,EAEN,MAAM,SAAS,CAAC;AAQjB;;;;;GAKG;AACH,qBAAa,OAAO;IASN,OAAO,CAAC,cAAc;IAAyB,KAAK,EAAE,YAAY;IAR9E,OAAO,CAAC,mBAAmB,CAAC,CAAc;IAC1C,OAAO,CAAC,gBAAgB,CAAC,CAAc;IACvC,OAAO,CAAC,oBAAoB,CAAC,CAAc;IAC3C,OAAO,CAAC,qBAAqB,CAAoC;IACjE,OAAO,CAAC,6BAA6B,CAAK;IACnC,IAAI,EAAE,MAAM,CAAC;gBAGA,cAAc,EAAE,cAAc,EAAS,KAAK,EAAE,YAAY;IAI9E;;;;;;;;;OASG;IACH,MAAM,CAAC,IAAI,CACT,cAAc,EAAE,cAAc,EAC9B,4BAA4B,EAAE,MAAM,EACpC,2BAA2B,EAAE,UAAU,EACvC,WAAW,EAAE,OAAO,EACpB,YAAY,EAAE,UAAU,EACxB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO;IA8CV;;;;;;OAMG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,KAAK,CAAA;KAAC;IAO7D;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,KAAK,CAAA;KAAC;IAyCnF;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW;IAO7C;;OAEG;IACH,KAAK;IAQL,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,eAAe;IAkCvB,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,gBAAgB;IA8DxB,OAAO,CAAC,sBAAsB;CAsB/B"}
1
+ {"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../src/Session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,aAAa,EAAE,aAAa,EAA+B,MAAM,aAAa,CAAC;AAE/I,OAAO,EACL,YAAY,EAEZ,WAAW,EACX,cAAc,EACd,aAAa,EAEb,KAAK,EAKN,MAAM,SAAS,CAAC;AAQjB;;;;;GAKG;AACH,qBAAa,OAAO;IASN,OAAO,CAAC,cAAc;IAAyB,KAAK,EAAE,YAAY;IAR9E,OAAO,CAAC,mBAAmB,CAAC,CAAc;IAC1C,OAAO,CAAC,gBAAgB,CAAC,CAAc;IACvC,OAAO,CAAC,oBAAoB,CAAC,CAAc;IAC3C,OAAO,CAAC,qBAAqB,CAAoC;IACjE,OAAO,CAAC,6BAA6B,CAAK;IACnC,IAAI,EAAE,MAAM,CAAC;gBAGA,cAAc,EAAE,cAAc,EAAS,KAAK,EAAE,YAAY;IAI9E;;;;;;;;;OASG;IACH,MAAM,CAAC,IAAI,CACT,cAAc,EAAE,cAAc,EAC9B,4BAA4B,EAAE,MAAM,EACpC,2BAA2B,EAAE,UAAU,EACvC,WAAW,EAAE,OAAO,EACpB,YAAY,EAAE,UAAU,EACxB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO;IA8CV;;;;;;OAMG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,KAAK,CAAA;KAAC;IAO7D;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,KAAK,CAAA;KAAC;IAQzF;;;OAGG;IACH,UAAU,IAAI;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,KAAK,CAAA;KAAC;IAOvD;;;;;OAKG;IACH,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,KAAK,CAAA;KAAC;IAQ/G;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,KAAK,CAAA;KAAC;IAyCnF;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW;IAO7C;;OAEG;IACH,KAAK;IAQL,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,eAAe;IAkCvB,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,gBAAgB;IA8DxB,OAAO,CAAC,sBAAsB;CAsB/B"}
@@ -12,17 +12,17 @@ export interface InviteCredentials {
12
12
  };
13
13
  sharedSecret: string;
14
14
  }
15
- interface DeviceRecord {
15
+ export interface DeviceRecord {
16
16
  deviceId: string;
17
17
  activeSession?: Session;
18
18
  inactiveSessions: Session[];
19
19
  createdAt: number;
20
- staleAt?: number;
21
- hasResponderSession?: boolean;
22
20
  }
23
- interface UserRecord {
21
+ export interface UserRecord {
24
22
  publicKey: string;
25
23
  devices: Map<string, DeviceRecord>;
24
+ /** Device identity pubkeys from AppKeys - used to rebuild delegateToOwner on load */
25
+ knownDeviceIdentities: string[];
26
26
  }
27
27
  export declare class SessionManager {
28
28
  private readonly storageVersion;
@@ -38,6 +38,7 @@ export declare class SessionManager {
38
38
  private userRecords;
39
39
  private messageHistory;
40
40
  private delegateToOwner;
41
+ private processedInviteResponses;
41
42
  private ourInviteResponseSubscription;
42
43
  private inviteSubscriptions;
43
44
  private sessionSubscriptions;
@@ -50,6 +51,11 @@ export declare class SessionManager {
50
51
  * This is used by devices to receive session establishment responses.
51
52
  */
52
53
  private startInviteResponseListener;
54
+ /**
55
+ * Fetch a user's AppKeys from relays.
56
+ * Returns null if not found within timeout.
57
+ */
58
+ private fetchAppKeys;
53
59
  private getOrCreateUserRecord;
54
60
  private upsertDeviceRecord;
55
61
  private sessionKey;
@@ -63,13 +69,15 @@ export declare class SessionManager {
63
69
  */
64
70
  private resolveToOwner;
65
71
  /**
66
- * Update the delegate-to-owner mapping from an InviteList.
72
+ * Update the delegate-to-owner mapping from an AppKeys.
67
73
  * Extracts delegate device pubkeys and maps them to the owner.
74
+ * Persists the mapping in the user record for restart recovery.
68
75
  */
69
76
  private updateDelegateMapping;
70
- private subscribeToUserInviteList;
77
+ private subscribeToUserAppKeys;
78
+ private static MAX_INACTIVE_SESSIONS;
71
79
  private attachSessionSubscription;
72
- private attachInviteListSubscription;
80
+ private attachAppKeysSubscription;
73
81
  setupUser(userPubkey: string): void;
74
82
  onEvent(callback: OnEventCallback): () => void;
75
83
  getDeviceId(): string;
@@ -92,5 +100,4 @@ export declare class SessionManager {
92
100
  private loadAllUserRecords;
93
101
  private runMigrations;
94
102
  }
95
- export {};
96
103
  //# sourceMappingURL=SessionManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../src/SessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,cAAc,EACd,YAAY,EACZ,KAAK,EAIN,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,cAAc,EAA0B,MAAM,kBAAkB,CAAA;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;AAElE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,CAAA;IAC/D,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,EAAE,OAAO,EAAE,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAGhB,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CACnC;AAkBD,qBAAa,cAAc;IAEzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAM;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IAGtC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,cAAc,CAAQ;IAG9B,OAAO,CAAC,UAAU,CAAmB;IAGrC,OAAO,CAAC,WAAW,CAAqC;IACxD,OAAO,CAAC,cAAc,CAAkC;IAExD,OAAO,CAAC,eAAe,CAAiC;IAGxD,OAAO,CAAC,6BAA6B,CAA2B;IAChE,OAAO,CAAC,mBAAmB,CAAsC;IACjE,OAAO,CAAC,oBAAoB,CAAsC;IAGlE,OAAO,CAAC,qBAAqB,CAAkC;IAG/D,OAAO,CAAC,WAAW,CAAiB;gBAGlC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,iBAAiB,EAC7B,OAAO,CAAC,EAAE,cAAc;IAcpB,IAAI;IAyBV;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAkFnC,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IAG3B,OAAO,CAAC,UAAU;IAIlB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAItB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,yBAAyB;IAuBjC,OAAO,CAAC,yBAAyB;IA4DjC,OAAO,CAAC,4BAA4B;IAiBpC,SAAS,CAAC,UAAU,EAAE,MAAM;IA0C5B,OAAO,CAAC,QAAQ,EAAE,eAAe;IAQjC,WAAW,IAAI,MAAM;IAIrB,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAIzC,KAAK;IAYL,yBAAyB,CAAC,SAAS,EAAE,MAAM;IAYrC,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCnD,OAAO,CAAC,yBAAyB;YAanB,6BAA6B;YAM7B,kBAAkB;IA0B1B,SAAS,CACb,oBAAoB,EAAE,MAAM,EAC5B,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GACpB,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IA4DvB,WAAW,CACf,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAA;KAAO,GACjD,OAAO,CAAC,KAAK,CAAC;YA4BH,aAAa;IAsB3B,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,cAAc;IAoEtB,OAAO,CAAC,kBAAkB;YAYZ,aAAa;CA2C5B"}
1
+ {"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../src/SessionManager.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  export * from "./Session";
2
2
  export * from "./Invite";
3
- export * from "./InviteList";
3
+ export * from "./AppKeys";
4
4
  export * from "./inviteUtils";
5
5
  export * from "./types";
6
6
  export * from "./utils";
7
7
  export * from "./SessionManager";
8
- export * from "./DeviceManager";
8
+ export * from "./AppKeysManager";
9
9
  export * from "./StorageAdapter";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
@@ -33,7 +33,7 @@ export declare function generateDeviceId(): string;
33
33
  export interface EncryptInviteResponseParams {
34
34
  /** The invitee's session public key */
35
35
  inviteeSessionPublicKey: string;
36
- /** The invitee's identity public key */
36
+ /** The invitee's identity public key (also serves as device ID) */
37
37
  inviteePublicKey: string;
38
38
  /** The invitee's identity private key (optional if encrypt function provided) */
39
39
  inviteePrivateKey?: Uint8Array;
@@ -43,8 +43,8 @@ export interface EncryptInviteResponseParams {
43
43
  inviterEphemeralPublicKey: string;
44
44
  /** The shared secret for the invite */
45
45
  sharedSecret: string;
46
- /** Optional device ID for the invitee's device */
47
- deviceId?: string;
46
+ /** The invitee's owner/Nostr identity public key (optional for single-device users) */
47
+ ownerPublicKey?: string;
48
48
  /** Optional custom encrypt function */
49
49
  encrypt?: EncryptFunction;
50
50
  }
@@ -90,12 +90,12 @@ export interface DecryptInviteResponseParams {
90
90
  decrypt?: DecryptFunction;
91
91
  }
92
92
  export interface DecryptedInviteResponse {
93
- /** The invitee's identity public key */
93
+ /** The invitee's identity public key (also serves as device ID) */
94
94
  inviteeIdentity: string;
95
95
  /** The invitee's session public key */
96
96
  inviteeSessionPublicKey: string;
97
- /** Optional device ID for the invitee's device */
98
- deviceId?: string;
97
+ /** The invitee's owner/Nostr identity public key (optional for backward compat) */
98
+ ownerPublicKey?: string;
99
99
  }
100
100
  /**
101
101
  * Decrypts an invite response.
@@ -1 +1 @@
1
- {"version":3,"file":"inviteUtils.d.ts","sourceRoot":"","sources":["../src/inviteUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inviteUtils.d.ts","sourceRoot":"","sources":["../src/inviteUtils.ts"],"names":[],"mappings":"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"}