nostr-double-ratchet 0.0.28 → 0.0.29
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 +1 -1
- package/dist/Invite.d.ts +6 -5
- package/dist/Invite.d.ts.map +1 -1
- package/dist/Session.d.ts +3 -3
- package/dist/SessionManager.d.ts +22 -7
- package/dist/SessionManager.d.ts.map +1 -1
- package/dist/StorageAdapter.d.ts +18 -0
- package/dist/StorageAdapter.d.ts.map +1 -0
- package/dist/UserRecord.d.ts +6 -15
- package/dist/UserRecord.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/nostr-double-ratchet.es.js +764 -729
- package/dist/nostr-double-ratchet.umd.js +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/Invite.ts +23 -18
- package/src/Session.ts +3 -3
- package/src/SessionManager.ts +195 -32
- package/src/StorageAdapter.ts +43 -0
- package/src/UserRecord.ts +31 -32
- package/src/index.ts +3 -2
- package/src/types.ts +2 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Invites for securely exchanging session keys
|
|
5
5
|
* Breaking changes are likely
|
|
6
6
|
* Stable version on [NPM](https://www.npmjs.com/package/nostr-double-ratchet)
|
|
7
|
-
* check out [tests](
|
|
7
|
+
* check out [tests](https://github.com/mmalmi/nostr-double-ratchet/tree/master/tests) for usage
|
|
8
8
|
* [Documentation](https://nostr-double-ratchet.iris.to/)
|
|
9
9
|
* [Source code](https://github.com/mmalmi/nostr-double-ratchet)
|
|
10
10
|
|
package/dist/Invite.d.ts
CHANGED
|
@@ -16,11 +16,11 @@ export declare class Invite {
|
|
|
16
16
|
sharedSecret: string;
|
|
17
17
|
inviter: string;
|
|
18
18
|
inviterEphemeralPrivateKey?: Uint8Array | undefined;
|
|
19
|
-
|
|
19
|
+
deviceId?: string | undefined;
|
|
20
20
|
maxUses?: number | undefined;
|
|
21
21
|
usedBy: string[];
|
|
22
|
-
constructor(inviterEphemeralPublicKey: string, sharedSecret: string, inviter: string, inviterEphemeralPrivateKey?: Uint8Array | undefined,
|
|
23
|
-
static createNew(inviter: string,
|
|
22
|
+
constructor(inviterEphemeralPublicKey: string, sharedSecret: string, inviter: string, inviterEphemeralPrivateKey?: Uint8Array | undefined, deviceId?: string | undefined, maxUses?: number | undefined, usedBy?: string[]);
|
|
23
|
+
static createNew(inviter: string, deviceId?: string, maxUses?: number): Invite;
|
|
24
24
|
static fromUrl(url: string): Invite;
|
|
25
25
|
static deserialize(json: string): Invite;
|
|
26
26
|
static fromEvent(event: VerifiedEvent): Invite;
|
|
@@ -33,12 +33,13 @@ export declare class Invite {
|
|
|
33
33
|
* Invite parameters are in the URL's hash so they are not sent to the server.
|
|
34
34
|
*/
|
|
35
35
|
getUrl(root?: string): string;
|
|
36
|
-
getEvent(
|
|
36
|
+
getEvent(): UnsignedEvent;
|
|
37
37
|
/**
|
|
38
38
|
* Called by the invitee. Accepts the invite and creates a new session with the inviter.
|
|
39
39
|
*
|
|
40
|
-
* @param inviteeSecretKey - The invitee's secret key or a signing function
|
|
41
40
|
* @param nostrSubscribe - A function to subscribe to Nostr events
|
|
41
|
+
* @param inviteePublicKey - The invitee's public key
|
|
42
|
+
* @param encryptor - The invitee's secret key or a signing/encrypt function
|
|
42
43
|
* @returns An object containing the new session and an event to be published
|
|
43
44
|
*
|
|
44
45
|
* 1. Inner event: No signature, content encrypted with DH(inviter, invitee).
|
package/dist/Invite.d.ts.map
CHANGED
|
@@ -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,
|
|
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;gBANhB,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;IAIhC,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;IAaxC,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;IAoB1G;;OAEG;IACH,SAAS,IAAI,MAAM;IAYnB;;OAEG;IACH,MAAM,CAAC,IAAI,SAAoB;IAW/B,QAAQ,IAAI,aAAa;IAkBzB;;;;;;;;;;;;;;;OAeG;IACG,MAAM,CACR,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,UAAU,GAAG,eAAe,GACxC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,aAAa,CAAA;KAAE,CAAC;IAsCtD,MAAM,CAAC,SAAS,EAAE,UAAU,GAAG,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;CA0C3J"}
|
package/dist/Session.d.ts
CHANGED
|
@@ -18,9 +18,9 @@ export declare class Session {
|
|
|
18
18
|
constructor(nostrSubscribe: NostrSubscribe, state: SessionState);
|
|
19
19
|
/**
|
|
20
20
|
* Initializes a new secure communication session
|
|
21
|
-
* @param nostrSubscribe Function to subscribe to Nostr events. Make sure it deduplicates events (
|
|
22
|
-
* @param
|
|
23
|
-
* @param
|
|
21
|
+
* @param nostrSubscribe Function to subscribe to Nostr events. Make sure it deduplicates events (doesn't return the same event twice), otherwise you'll see decryption errors!
|
|
22
|
+
* @param theirEphemeralNostrPublicKey The ephemeral public key of the other party for the initial handshake
|
|
23
|
+
* @param ourEphemeralNostrPrivateKey Our ephemeral private key for the initial handshake
|
|
24
24
|
* @param isInitiator Whether we are initiating the conversation (true) or responding (false)
|
|
25
25
|
* @param sharedSecret Initial shared secret for securing the first message chain
|
|
26
26
|
* @param name Optional name for the session (for debugging)
|
package/dist/SessionManager.d.ts
CHANGED
|
@@ -1,23 +1,38 @@
|
|
|
1
1
|
import { NostrPublish, NostrSubscribe, Rumor } from "./types";
|
|
2
2
|
import { Invite } from "./Invite";
|
|
3
|
+
import { StorageAdapter } from "./StorageAdapter";
|
|
3
4
|
export default class SessionManager {
|
|
4
5
|
private userRecords;
|
|
5
6
|
private nostrSubscribe;
|
|
6
7
|
private nostrPublish;
|
|
7
8
|
private ourIdentityKey;
|
|
8
9
|
private inviteUnsubscribes;
|
|
9
|
-
private
|
|
10
|
-
|
|
10
|
+
private deviceId;
|
|
11
|
+
private invite?;
|
|
12
|
+
private storage;
|
|
13
|
+
constructor(ourIdentityKey: Uint8Array, deviceId: string, nostrSubscribe: NostrSubscribe, nostrPublish: NostrPublish, storage?: StorageAdapter);
|
|
14
|
+
private _initialised;
|
|
15
|
+
/**
|
|
16
|
+
* Perform asynchronous initialisation steps: create (or load) our invite,
|
|
17
|
+
* publish it, hydrate sessions from storage and subscribe to new invites.
|
|
18
|
+
* Can be awaited by callers that need deterministic readiness.
|
|
19
|
+
*/
|
|
20
|
+
init(): Promise<void>;
|
|
21
|
+
private loadSessions;
|
|
22
|
+
private saveSession;
|
|
23
|
+
getDeviceId(): string;
|
|
24
|
+
getInvite(): Invite;
|
|
11
25
|
sendText(recipientIdentityKey: string, text: string): Promise<import("nostr-tools").VerifiedEvent[]>;
|
|
12
26
|
sendEvent(recipientIdentityKey: string, event: Partial<Rumor>): Promise<import("nostr-tools").VerifiedEvent[]>;
|
|
13
27
|
listenToUser(userPubkey: string): void;
|
|
14
28
|
stopListeningToUser(userPubkey: string): void;
|
|
15
29
|
private internalSubscriptions;
|
|
16
|
-
onEvent(callback: (
|
|
30
|
+
onEvent(callback: (event: Rumor) => void): () => void;
|
|
17
31
|
close(): void;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Accept an invite as our own device, persist the session, and publish the acceptance event.
|
|
34
|
+
* Used for multi-device flows where a user adds a new device.
|
|
35
|
+
*/
|
|
36
|
+
acceptOwnInvite(invite: Invite): Promise<void>;
|
|
22
37
|
}
|
|
23
38
|
//# 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;
|
|
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,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;gBAG3B,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;YA2FpB,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;IA+BnE,YAAY,CAAC,UAAU,EAAE,MAAM;IAoC/B,mBAAmB,CAAC,UAAU,EAAE,MAAM;IAStC,OAAO,CAAC,qBAAqB,CAAyC;IAEtE,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;IAkBxC,KAAK;IAiBL;;;OAGG;IACU,eAAe,CAAC,MAAM,EAAE,MAAM;CAgB9C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface StorageAdapter {
|
|
2
|
+
/** Retrieve a value by key. */
|
|
3
|
+
get<T = unknown>(key: string): Promise<T | undefined>;
|
|
4
|
+
/** Store a value by key. */
|
|
5
|
+
put<T = unknown>(key: string, value: T): Promise<void>;
|
|
6
|
+
/** Delete a stored value by key. */
|
|
7
|
+
del(key: string): Promise<void>;
|
|
8
|
+
/** List all keys that start with the given prefix. */
|
|
9
|
+
list(prefix?: string): Promise<string[]>;
|
|
10
|
+
}
|
|
11
|
+
export declare class InMemoryStorageAdapter implements StorageAdapter {
|
|
12
|
+
private store;
|
|
13
|
+
get<T = unknown>(key: string): Promise<T | undefined>;
|
|
14
|
+
put<T = unknown>(key: string, value: T): Promise<void>;
|
|
15
|
+
del(key: string): Promise<void>;
|
|
16
|
+
list(prefix?: string): Promise<string[]>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=StorageAdapter.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/UserRecord.d.ts
CHANGED
|
@@ -10,15 +10,6 @@ export declare class UserRecord {
|
|
|
10
10
|
private deviceRecords;
|
|
11
11
|
private isStale;
|
|
12
12
|
private staleTimestamp?;
|
|
13
|
-
/**
|
|
14
|
-
* Temporary store for sessions when the corresponding deviceId is unknown.
|
|
15
|
-
*
|
|
16
|
-
* SessionManager currently operates at a per-user granularity (it is not
|
|
17
|
-
* yet aware of individual devices). Until full Sesame device handling is
|
|
18
|
-
* implemented we keep sessions in this simple list so that
|
|
19
|
-
* SessionManager.getActiveSessions / getAllSessions work as expected.
|
|
20
|
-
*/
|
|
21
|
-
private extraSessions;
|
|
22
13
|
constructor(_userId: string, _nostrSubscribe: NostrSubscribe);
|
|
23
14
|
/**
|
|
24
15
|
* Adds or updates a device record for this user
|
|
@@ -56,12 +47,6 @@ export declare class UserRecord {
|
|
|
56
47
|
* Cleanup when destroying the user record
|
|
57
48
|
*/
|
|
58
49
|
close(): void;
|
|
59
|
-
/**
|
|
60
|
-
* Add a session without associating it with a specific device.
|
|
61
|
-
* This is mainly used by SessionManager which does not yet keep track of
|
|
62
|
-
* device identifiers. The session will be considered active.
|
|
63
|
-
*/
|
|
64
|
-
addSession(session: Session): void;
|
|
65
50
|
/**
|
|
66
51
|
* Return all sessions that are currently considered *active*.
|
|
67
52
|
* For now this means any session in a non-stale device record as well as
|
|
@@ -74,5 +59,11 @@ export declare class UserRecord {
|
|
|
74
59
|
* listeners to existing sessions.
|
|
75
60
|
*/
|
|
76
61
|
getAllSessions(): Session[];
|
|
62
|
+
/**
|
|
63
|
+
* Unified helper that either associates the session with a device record
|
|
64
|
+
* (if deviceId provided **and** the record exists) or falls back to the
|
|
65
|
+
* legacy extraSessions list.
|
|
66
|
+
*/
|
|
67
|
+
upsertSession(deviceId: string | undefined, session: Session): void;
|
|
77
68
|
}
|
|
78
69
|
//# sourceMappingURL=UserRecord.d.ts.map
|
package/dist/UserRecord.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserRecord.d.ts","sourceRoot":"","sources":["../src/UserRecord.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAUzC;;;GAGG;AACH,qBAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"UserRecord.d.ts","sourceRoot":"","sources":["../src/UserRecord.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAUzC;;;GAGG;AACH,qBAAa,UAAU;IAMZ,OAAO,EAAE,MAAM;IACtB,OAAO,CAAC,eAAe;IANzB,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,cAAc,CAAC,CAAS;gBAGvB,OAAO,EAAE,MAAM,EACd,eAAe,EAAE,cAAc;IAIzC;;OAEG;IACI,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAanE;;OAEG;IACI,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAI9D;;OAEG;IACI,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAuBhE;;OAEG;IACI,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ9C;;OAEG;IACI,aAAa,IAAI,IAAI;IAK5B;;OAEG;IACI,gBAAgB,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAQnD;;OAEG;IACI,aAAa,CAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,UAAU,EACxB,oBAAoB,EAAE,UAAU,EAChC,WAAW,EAAE,OAAO,EACpB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO;IAmBV;;OAEG;IACI,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAyBlD;;OAEG;IACI,KAAK,IAAI,IAAI;IAYpB;;;;OAIG;IACI,iBAAiB,IAAI,OAAO,EAAE;IAYrC;;;;OAIG;IACI,cAAc,IAAI,OAAO,EAAE;IAalC;;;;OAIG;IACI,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO;CAsBpE"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
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"}
|