nostr-double-ratchet 0.0.36 → 0.0.38

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.
@@ -0,0 +1,127 @@
1
+ import { InviteList, DeviceEntry } from "./InviteList";
2
+ import { DevicePayload } from "./inviteUtils";
3
+ import { NostrSubscribe, NostrPublish, IdentityKey } from "./types";
4
+ import { StorageAdapter } from "./StorageAdapter";
5
+ import { SessionManager } from "./SessionManager";
6
+ export interface OwnerDeviceOptions {
7
+ ownerPublicKey: string;
8
+ identityKey: IdentityKey;
9
+ deviceId: string;
10
+ deviceLabel: string;
11
+ nostrSubscribe: NostrSubscribe;
12
+ nostrPublish: NostrPublish;
13
+ storage?: StorageAdapter;
14
+ }
15
+ export interface DelegateDeviceOptions {
16
+ deviceId: string;
17
+ deviceLabel: string;
18
+ nostrSubscribe: NostrSubscribe;
19
+ nostrPublish: NostrPublish;
20
+ storage?: StorageAdapter;
21
+ }
22
+ export interface RestoreDelegateOptions {
23
+ deviceId: string;
24
+ devicePublicKey: string;
25
+ devicePrivateKey: Uint8Array;
26
+ ephemeralPublicKey: string;
27
+ ephemeralPrivateKey: Uint8Array;
28
+ sharedSecret: string;
29
+ nostrSubscribe: NostrSubscribe;
30
+ nostrPublish: NostrPublish;
31
+ storage?: StorageAdapter;
32
+ }
33
+ export interface CreateDelegateResult {
34
+ manager: DelegateDeviceManager;
35
+ payload: DevicePayload;
36
+ }
37
+ export interface IDeviceManager {
38
+ init(): Promise<void>;
39
+ getDeviceId(): string;
40
+ getIdentityPublicKey(): string;
41
+ getIdentityKey(): IdentityKey;
42
+ getEphemeralKeypair(): {
43
+ publicKey: string;
44
+ privateKey: Uint8Array;
45
+ } | null;
46
+ getSharedSecret(): string | null;
47
+ getOwnerPublicKey(): string | null;
48
+ close(): void;
49
+ createSessionManager(sessionStorage?: StorageAdapter): SessionManager;
50
+ }
51
+ /** Owner's main device. Has identity key and can manage InviteList. */
52
+ export declare class OwnerDeviceManager implements IDeviceManager {
53
+ private readonly deviceId;
54
+ private readonly deviceLabel;
55
+ private readonly nostrSubscribe;
56
+ private readonly nostrPublish;
57
+ private readonly storage;
58
+ private readonly ownerPublicKey;
59
+ private readonly identityKey;
60
+ private inviteList;
61
+ private initialized;
62
+ private subscriptions;
63
+ private readonly storageVersion;
64
+ private get versionPrefix();
65
+ constructor(options: OwnerDeviceOptions);
66
+ init(): Promise<void>;
67
+ getDeviceId(): string;
68
+ getIdentityPublicKey(): string;
69
+ getIdentityKey(): IdentityKey;
70
+ getEphemeralKeypair(): {
71
+ publicKey: string;
72
+ privateKey: Uint8Array;
73
+ } | null;
74
+ getSharedSecret(): string | null;
75
+ getOwnerPublicKey(): string;
76
+ getInviteList(): InviteList | null;
77
+ getOwnDevices(): DeviceEntry[];
78
+ addDevice(payload: DevicePayload): Promise<void>;
79
+ revokeDevice(deviceId: string): Promise<void>;
80
+ updateDeviceLabel(deviceId: string, label: string): Promise<void>;
81
+ close(): void;
82
+ createSessionManager(sessionStorage?: StorageAdapter): SessionManager;
83
+ private inviteListKey;
84
+ private loadInviteList;
85
+ private saveInviteList;
86
+ private fetchInviteList;
87
+ private mergeInviteLists;
88
+ private modifyInviteList;
89
+ private subscribeToOwnInviteList;
90
+ }
91
+ /** Delegate device. Has own identity key, waits for activation, checks revocation. */
92
+ export declare class DelegateDeviceManager implements IDeviceManager {
93
+ private readonly deviceId;
94
+ private readonly nostrSubscribe;
95
+ private readonly nostrPublish;
96
+ private readonly storage;
97
+ private readonly devicePublicKey;
98
+ private readonly devicePrivateKey;
99
+ private readonly ephemeralPublicKey;
100
+ private readonly ephemeralPrivateKey;
101
+ private readonly sharedSecret;
102
+ private ownerPubkeyFromActivation?;
103
+ private initialized;
104
+ private subscriptions;
105
+ private readonly storageVersion;
106
+ private get versionPrefix();
107
+ private constructor();
108
+ static create(options: DelegateDeviceOptions): CreateDelegateResult;
109
+ static restore(options: RestoreDelegateOptions): DelegateDeviceManager;
110
+ init(): Promise<void>;
111
+ getDeviceId(): string;
112
+ getIdentityPublicKey(): string;
113
+ getIdentityKey(): Uint8Array;
114
+ getEphemeralKeypair(): {
115
+ publicKey: string;
116
+ privateKey: Uint8Array;
117
+ };
118
+ getSharedSecret(): string;
119
+ getOwnerPublicKey(): string | null;
120
+ waitForActivation(timeoutMs?: number): Promise<string>;
121
+ isRevoked(): Promise<boolean>;
122
+ close(): void;
123
+ createSessionManager(sessionStorage?: StorageAdapter): SessionManager;
124
+ private ownerPubkeyKey;
125
+ private fetchInviteList;
126
+ }
127
+ //# sourceMappingURL=DeviceManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceManager.d.ts","sourceRoot":"","sources":["../src/DeviceManager.ts"],"names":[],"mappings":"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"}
package/dist/Invite.d.ts CHANGED
@@ -36,8 +36,9 @@ export declare class Invite {
36
36
  getUrl(root?: string): string;
37
37
  getEvent(): UnsignedEvent;
38
38
  /**
39
- * Creates an "invite tombstone" event that clears the original content and removes the list tag.
40
- * Used when the inviter logs out and wants to make the invite invisible to other devices.
39
+ * Creates a tombstone event that replaces the invite, signaling device revocation.
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.
41
42
  */
42
43
  getDeletionEvent(): UnsignedEvent;
43
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Invite.d.ts","sourceRoot":"","sources":["../src/Invite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,aAAa,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AACvI,OAAO,EAAqB,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAwB,MAAM,SAAS,CAAC;AAEjI,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQvC;;;;;;;;;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;IAiB9E,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;IAiBjC;;;;;;;;;;;;;;;;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;IA0CtD,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;CAqD9K"}
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"}
@@ -0,0 +1,43 @@
1
+ import { VerifiedEvent, UnsignedEvent } from "nostr-tools";
2
+ import { NostrSubscribe, Unsubscribe, EncryptFunction, DecryptFunction } from "./types";
3
+ import { Session } from "./Session";
4
+ export interface DeviceEntry {
5
+ ephemeralPublicKey: string;
6
+ /** Only stored locally, not published */
7
+ ephemeralPrivateKey?: Uint8Array;
8
+ sharedSecret: string;
9
+ deviceId: string;
10
+ deviceLabel: string;
11
+ createdAt: number;
12
+ /** Owner's pubkey for owner devices, delegate's own pubkey for delegate devices */
13
+ identityPubkey: string;
14
+ }
15
+ /**
16
+ * Manages a consolidated list of device invites (kind 10078).
17
+ * Single atomic event containing all device invites for a user.
18
+ * Uses union merge strategy for conflict resolution.
19
+ */
20
+ export declare class InviteList {
21
+ readonly ownerPublicKey: string;
22
+ private devices;
23
+ private removedDeviceIds;
24
+ constructor(ownerPublicKey: string, devices?: DeviceEntry[], removedDeviceIds?: string[]);
25
+ createDevice(label: string, deviceId?: string): DeviceEntry;
26
+ addDevice(device: DeviceEntry): void;
27
+ removeDevice(deviceId: string): void;
28
+ getDevice(deviceId: string): DeviceEntry | undefined;
29
+ getAllDevices(): DeviceEntry[];
30
+ getRemovedDeviceIds(): string[];
31
+ updateDeviceLabel(deviceId: string, newLabel: string): void;
32
+ getEvent(): UnsignedEvent;
33
+ static fromEvent(event: VerifiedEvent): InviteList;
34
+ serialize(): string;
35
+ static deserialize(json: string): InviteList;
36
+ merge(other: InviteList): InviteList;
37
+ accept(deviceId: string, nostrSubscribe: NostrSubscribe, inviteePublicKey: string, encryptor: Uint8Array | EncryptFunction, inviteeDeviceId?: string): Promise<{
38
+ session: Session;
39
+ event: VerifiedEvent;
40
+ }>;
41
+ listen(decryptor: Uint8Array | DecryptFunction, nostrSubscribe: NostrSubscribe, onSession: (session: Session, identity: string, deviceId?: string, ourDeviceId?: string) => void): Unsubscribe;
42
+ }
43
+ //# sourceMappingURL=InviteList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InviteList.d.ts","sourceRoot":"","sources":["../src/InviteList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAE,aAAa,EAAe,MAAM,aAAa,CAAA;AACtF,OAAO,EACL,cAAc,EACd,WAAW,EACX,eAAe,EACf,eAAe,EAGhB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAiCnC,MAAM,WAAW,WAAW;IAC1B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,yCAAyC;IACzC,mBAAmB,CAAC,EAAE,UAAU,CAAA;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAA;CACvB;AAMD;;;;GAIG;AACH,qBAAa,UAAU;aAKH,cAAc,EAAE,MAAM;IAJxC,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,gBAAgB,CAAyB;gBAG/B,cAAc,EAAE,MAAM,EACtC,OAAO,GAAE,WAAW,EAAO,EAC3B,gBAAgB,GAAE,MAAM,EAAO;IAQjC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW;IAa3D,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IASpC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKpC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIpD,aAAa,IAAI,WAAW,EAAE;IAI9B,mBAAmB,IAAI,MAAM,EAAE;IAI/B,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAO3D,QAAQ,IAAI,aAAa;IA6BzB,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU;IA0BlD,SAAS,IAAI,MAAM;IAenB,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAY5C,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;IA0B9B,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,UAAU,GAAG,eAAe,EACvC,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,aAAa,CAAA;KAAE,CAAC;IAoCtD,MAAM,CACJ,SAAS,EAAE,UAAU,GAAG,eAAe,EACvC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,CACT,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,KACjB,IAAI,GACR,WAAW;CAiDf"}
@@ -1,40 +1,96 @@
1
- import { NostrPublish, NostrSubscribe, Rumor } from "./types";
2
- import { Invite } from "./Invite";
1
+ import { IdentityKey, NostrSubscribe, NostrPublish, Rumor } from "./types";
3
2
  import { StorageAdapter } from "./StorageAdapter";
3
+ import { Session } from "./Session";
4
4
  export type OnEventCallback = (event: Rumor, from: string) => void;
5
- export default class SessionManager {
6
- private userRecords;
7
- private nostrSubscribe;
8
- private nostrPublish;
9
- private ourIdentityKey;
10
- private inviteUnsubscribes;
5
+ /**
6
+ * Credentials for the invite handshake - used to listen for and decrypt invite responses
7
+ */
8
+ export interface InviteCredentials {
9
+ ephemeralKeypair: {
10
+ publicKey: string;
11
+ privateKey: Uint8Array;
12
+ };
13
+ sharedSecret: string;
14
+ }
15
+ interface DeviceRecord {
16
+ deviceId: string;
17
+ activeSession?: Session;
18
+ inactiveSessions: Session[];
19
+ createdAt: number;
20
+ staleAt?: number;
21
+ hasResponderSession?: boolean;
22
+ }
23
+ interface UserRecord {
24
+ publicKey: string;
25
+ devices: Map<string, DeviceRecord>;
26
+ }
27
+ export declare class SessionManager {
28
+ private readonly storageVersion;
29
+ private readonly versionPrefix;
11
30
  private deviceId;
12
- private invite?;
13
31
  private storage;
14
- private messageQueue;
15
- constructor(ourIdentityKey: Uint8Array, deviceId: string, nostrSubscribe: NostrSubscribe, nostrPublish: NostrPublish, storage?: StorageAdapter);
16
- private _initialised;
32
+ private nostrSubscribe;
33
+ private nostrPublish;
34
+ private identityKey;
35
+ private ourPublicKey;
36
+ private ownerPublicKey;
37
+ private inviteKeys;
38
+ private userRecords;
39
+ private messageHistory;
40
+ private delegateToOwner;
41
+ private ourInviteResponseSubscription;
42
+ private inviteSubscriptions;
43
+ private sessionSubscriptions;
44
+ private internalSubscriptions;
45
+ private initialized;
46
+ constructor(ourPublicKey: string, identityKey: IdentityKey, deviceId: string, nostrSubscribe: NostrSubscribe, nostrPublish: NostrPublish, ownerPublicKey: string, inviteKeys: InviteCredentials, storage?: StorageAdapter);
47
+ init(): Promise<void>;
17
48
  /**
18
- * Perform asynchronous initialisation steps: create (or load) our invite,
19
- * publish it, hydrate sessions from storage and subscribe to new invites.
20
- * Can be awaited by callers that need deterministic readiness.
49
+ * Start listening for invite responses on our ephemeral key.
50
+ * This is used by devices to receive session establishment responses.
21
51
  */
22
- init(): Promise<void>;
23
- private loadSessions;
24
- private saveSession;
25
- getDeviceId(): string;
26
- getInvite(): Invite;
27
- sendText(recipientIdentityKey: string, text: string): Promise<any[]>;
28
- sendEvent(recipientIdentityKey: string, event: Partial<Rumor>): Promise<any[]>;
29
- listenToUser(userPubkey: string): void;
30
- stopListeningToUser(userPubkey: string): void;
31
- private internalSubscriptions;
32
- onEvent(callback: OnEventCallback): () => void;
33
- close(): void;
52
+ private startInviteResponseListener;
53
+ private getOrCreateUserRecord;
54
+ private upsertDeviceRecord;
55
+ private sessionKey;
56
+ private sessionKeyPrefix;
57
+ private userRecordKey;
58
+ private userRecordKeyPrefix;
59
+ private versionKey;
34
60
  /**
35
- * Accept an invite as our own device, persist the session, and publish the acceptance event.
36
- * Used for multi-device flows where a user adds a new device.
61
+ * Resolve a pubkey to its owner if it's a known delegate device.
62
+ * Returns the input pubkey if not a known delegate.
37
63
  */
38
- acceptOwnInvite(invite: Invite): Promise<void>;
64
+ private resolveToOwner;
65
+ /**
66
+ * Update the delegate-to-owner mapping from an InviteList.
67
+ * Extracts delegate device pubkeys and maps them to the owner.
68
+ */
69
+ private updateDelegateMapping;
70
+ private subscribeToUserInviteList;
71
+ private attachSessionSubscription;
72
+ private attachInviteListSubscription;
73
+ setupUser(userPubkey: string): void;
74
+ onEvent(callback: OnEventCallback): () => void;
75
+ getDeviceId(): string;
76
+ getUserRecords(): Map<string, UserRecord>;
77
+ close(): void;
78
+ deactivateCurrentSessions(publicKey: string): void;
79
+ deleteUser(userPubkey: string): Promise<void>;
80
+ private removeSessionSubscription;
81
+ private deleteUserSessionsFromStorage;
82
+ private sendMessageHistory;
83
+ sendEvent(recipientIdentityKey: string, event: Partial<Rumor>): Promise<Rumor | undefined>;
84
+ sendMessage(recipientPublicKey: string, content: string, options?: {
85
+ kind?: number;
86
+ tags?: string[][];
87
+ }): Promise<Rumor>;
88
+ private cleanupDevice;
89
+ private buildMessageTags;
90
+ private storeUserRecord;
91
+ private loadUserRecord;
92
+ private loadAllUserRecords;
93
+ private runMigrations;
39
94
  }
95
+ export {};
40
96
  //# sourceMappingURL=SessionManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../src/SessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,YAAY,EAAE,cAAc,EAAE,KAAK,EAAe,MAAM,SAAS,CAAA;AAE7F,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,EAAE,cAAc,EAA0B,MAAM,kBAAkB,CAAA;AAIzE,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;AAElE,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,OAAO,CAAC,WAAW,CAAqC;IACxD,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAY;IAClC,OAAO,CAAC,kBAAkB,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAA4F;gBAG5G,cAAc,EAAE,UAAU,EAC1B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,cAA6C;IAc1D,OAAO,CAAC,YAAY,CAAQ;IAE5B;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAwGpB,YAAY;YAiCZ,WAAW;IAOzB,WAAW,IAAI,MAAM;IAIrB,SAAS,IAAI,MAAM;IAOb,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAQnD,SAAS,CAAC,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;IA4DnE,YAAY,CAAC,UAAU,EAAE,MAAM;IA8D/B,mBAAmB,CAAC,UAAU,EAAE,MAAM;IAStC,OAAO,CAAC,qBAAqB,CAAkC;IAE/D,OAAO,CAAC,QAAQ,EAAE,eAAe;IAkBjC,KAAK;IAiBL;;;OAGG;IACU,eAAe,CAAC,MAAM,EAAE,MAAM;CAgB9C"}
1
+ {"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../src/SessionManager.ts"],"names":[],"mappings":"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"}
@@ -15,4 +15,13 @@ export declare class InMemoryStorageAdapter implements StorageAdapter {
15
15
  del(key: string): Promise<void>;
16
16
  list(prefix?: string): Promise<string[]>;
17
17
  }
18
+ export declare class LocalStorageAdapter implements StorageAdapter {
19
+ private keyPrefix;
20
+ constructor(keyPrefix?: string);
21
+ private getFullKey;
22
+ get<T = unknown>(key: string): Promise<T | undefined>;
23
+ put<T = unknown>(key: string, value: T): Promise<void>;
24
+ del(key: string): Promise<void>;
25
+ list(prefix?: string): Promise<string[]>;
26
+ }
18
27
  //# sourceMappingURL=StorageAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StorageAdapter.d.ts","sourceRoot":"","sources":["../src/StorageAdapter.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IACrD,4BAA4B;IAC5B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,oCAAoC;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,sDAAsD;IACtD,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CACzC;AAED,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,KAAK,CAA6B;IAEpC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAIrD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,IAAI,CAAC,MAAM,SAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAO3C"}
1
+ {"version":3,"file":"StorageAdapter.d.ts","sourceRoot":"","sources":["../src/StorageAdapter.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IACrD,4BAA4B;IAC5B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,oCAAoC;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,sDAAsD;IACtD,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CACzC;AAED,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,KAAK,CAA6B;IAEpC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAIrD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,IAAI,CAAC,MAAM,SAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAQ3C;AAED,qBAAa,mBAAoB,YAAW,cAAc;IACxD,OAAO,CAAC,SAAS,CAAQ;gBAEb,SAAS,SAAa;IAIlC,OAAO,CAAC,UAAU;IAIZ,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IASrD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/B,IAAI,CAAC,MAAM,SAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAkB3C"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  export * from "./Session";
2
2
  export * from "./Invite";
3
+ export * from "./InviteList";
4
+ export * from "./inviteUtils";
3
5
  export * from "./types";
4
6
  export * from "./utils";
5
7
  export * from "./SessionManager";
8
+ export * from "./DeviceManager";
9
+ export * from "./StorageAdapter";
6
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,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,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,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"}
@@ -0,0 +1,122 @@
1
+ import { Session } from './Session';
2
+ import { NostrSubscribe, EncryptFunction, DecryptFunction, KeyPair } from './types';
3
+ /**
4
+ * Device payload for QR code / text code sharing.
5
+ */
6
+ export interface DevicePayload {
7
+ /** Ephemeral public key (64 hex chars) */
8
+ ephemeralPubkey: string;
9
+ /** Shared secret (64 hex chars) */
10
+ sharedSecret: string;
11
+ /** Device ID (16 hex chars) */
12
+ deviceId: string;
13
+ /** Human-readable device label */
14
+ deviceLabel: string;
15
+ /** Identity public key for this device (64 hex chars) */
16
+ identityPubkey: string;
17
+ }
18
+ /**
19
+ * Generates a new ephemeral keypair for invites.
20
+ * @returns A keypair with publicKey (hex string) and privateKey (Uint8Array)
21
+ */
22
+ export declare function generateEphemeralKeypair(): KeyPair;
23
+ /**
24
+ * Generates a new shared secret for invite handshakes.
25
+ * @returns A 64-character hex string (32 bytes)
26
+ */
27
+ export declare function generateSharedSecret(): string;
28
+ /**
29
+ * Generates a unique device ID.
30
+ * @returns A random device ID string
31
+ */
32
+ export declare function generateDeviceId(): string;
33
+ export interface EncryptInviteResponseParams {
34
+ /** The invitee's session public key */
35
+ inviteeSessionPublicKey: string;
36
+ /** The invitee's identity public key */
37
+ inviteePublicKey: string;
38
+ /** The invitee's identity private key (optional if encrypt function provided) */
39
+ inviteePrivateKey?: Uint8Array;
40
+ /** The inviter's identity public key */
41
+ inviterPublicKey: string;
42
+ /** The inviter's ephemeral public key */
43
+ inviterEphemeralPublicKey: string;
44
+ /** The shared secret for the invite */
45
+ sharedSecret: string;
46
+ /** Optional device ID for the invitee's device */
47
+ deviceId?: string;
48
+ /** Optional custom encrypt function */
49
+ encrypt?: EncryptFunction;
50
+ }
51
+ export interface EncryptedInviteResponse {
52
+ /** The inner event containing the encrypted payload */
53
+ innerEvent: {
54
+ pubkey: string;
55
+ content: string;
56
+ created_at: number;
57
+ };
58
+ /** The outer envelope event */
59
+ envelope: {
60
+ kind: number;
61
+ pubkey: string;
62
+ content: string;
63
+ created_at: number;
64
+ tags: string[][];
65
+ };
66
+ /** The random sender's public key used for the envelope */
67
+ randomSenderPublicKey: string;
68
+ /** The random sender's private key used for the envelope */
69
+ randomSenderPrivateKey: Uint8Array;
70
+ }
71
+ /**
72
+ * Encrypts an invite response with two-layer encryption.
73
+ *
74
+ * Layer 1 (inner): Payload encrypted with DH key, then encrypted with shared secret.
75
+ * Layer 2 (outer): Envelope encrypted with random key -> inviter ephemeral key.
76
+ */
77
+ export declare function encryptInviteResponse(params: EncryptInviteResponseParams): Promise<EncryptedInviteResponse>;
78
+ export interface DecryptInviteResponseParams {
79
+ /** The encrypted envelope content */
80
+ envelopeContent: string;
81
+ /** The envelope sender's public key */
82
+ envelopeSenderPubkey: string;
83
+ /** The inviter's ephemeral private key */
84
+ inviterEphemeralPrivateKey: Uint8Array;
85
+ /** The inviter's identity private key (optional if decrypt function provided) */
86
+ inviterPrivateKey?: Uint8Array;
87
+ /** The shared secret for the invite */
88
+ sharedSecret: string;
89
+ /** Optional custom decrypt function */
90
+ decrypt?: DecryptFunction;
91
+ }
92
+ export interface DecryptedInviteResponse {
93
+ /** The invitee's identity public key */
94
+ inviteeIdentity: string;
95
+ /** The invitee's session public key */
96
+ inviteeSessionPublicKey: string;
97
+ /** Optional device ID for the invitee's device */
98
+ deviceId?: string;
99
+ }
100
+ /**
101
+ * Decrypts an invite response.
102
+ */
103
+ export declare function decryptInviteResponse(params: DecryptInviteResponseParams): Promise<DecryptedInviteResponse>;
104
+ export interface CreateSessionFromAcceptParams {
105
+ /** Nostr subscription function */
106
+ nostrSubscribe: NostrSubscribe;
107
+ /** The other party's public key */
108
+ theirPublicKey: string;
109
+ /** Our session private key */
110
+ ourSessionPrivateKey: Uint8Array;
111
+ /** The shared secret (hex string) */
112
+ sharedSecret: string;
113
+ /** Whether we are the sender (initiator) */
114
+ isSender: boolean;
115
+ /** Optional session name */
116
+ name?: string;
117
+ }
118
+ /**
119
+ * Creates a Session from invite acceptance parameters.
120
+ */
121
+ export declare function createSessionFromAccept(params: CreateSessionFromAcceptParams): Session;
122
+ //# sourceMappingURL=inviteUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inviteUtils.d.ts","sourceRoot":"","sources":["../src/inviteUtils.ts"],"names":[],"mappings":"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"}