@unicitylabs/nostr-js-sdk 0.0.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.
Files changed (124) hide show
  1. package/README.md +290 -0
  2. package/dist/browser/index.js +8444 -0
  3. package/dist/browser/index.js.map +1 -0
  4. package/dist/browser/index.min.js +12 -0
  5. package/dist/browser/index.min.js.map +1 -0
  6. package/dist/browser/index.umd.js +8524 -0
  7. package/dist/browser/index.umd.js.map +1 -0
  8. package/dist/browser/index.umd.min.js +12 -0
  9. package/dist/browser/index.umd.min.js.map +1 -0
  10. package/dist/cjs/NostrKeyManager.js +265 -0
  11. package/dist/cjs/NostrKeyManager.js.map +1 -0
  12. package/dist/cjs/client/NostrClient.js +518 -0
  13. package/dist/cjs/client/NostrClient.js.map +1 -0
  14. package/dist/cjs/client/NostrEventListener.js +31 -0
  15. package/dist/cjs/client/NostrEventListener.js.map +1 -0
  16. package/dist/cjs/client/WebSocketAdapter.js +90 -0
  17. package/dist/cjs/client/WebSocketAdapter.js.map +1 -0
  18. package/dist/cjs/client/index.js +18 -0
  19. package/dist/cjs/client/index.js.map +1 -0
  20. package/dist/cjs/crypto/bech32.js +201 -0
  21. package/dist/cjs/crypto/bech32.js.map +1 -0
  22. package/dist/cjs/crypto/index.js +49 -0
  23. package/dist/cjs/crypto/index.js.map +1 -0
  24. package/dist/cjs/crypto/nip04.js +327 -0
  25. package/dist/cjs/crypto/nip04.js.map +1 -0
  26. package/dist/cjs/crypto/schnorr.js +101 -0
  27. package/dist/cjs/crypto/schnorr.js.map +1 -0
  28. package/dist/cjs/index.js +57 -0
  29. package/dist/cjs/index.js.map +1 -0
  30. package/dist/cjs/nametag/NametagBinding.js +196 -0
  31. package/dist/cjs/nametag/NametagBinding.js.map +1 -0
  32. package/dist/cjs/nametag/NametagUtils.js +156 -0
  33. package/dist/cjs/nametag/NametagUtils.js.map +1 -0
  34. package/dist/cjs/nametag/index.js +47 -0
  35. package/dist/cjs/nametag/index.js.map +1 -0
  36. package/dist/cjs/protocol/Event.js +209 -0
  37. package/dist/cjs/protocol/Event.js.map +1 -0
  38. package/dist/cjs/protocol/EventKinds.js +126 -0
  39. package/dist/cjs/protocol/EventKinds.js.map +1 -0
  40. package/dist/cjs/protocol/Filter.js +202 -0
  41. package/dist/cjs/protocol/Filter.js.map +1 -0
  42. package/dist/cjs/protocol/index.js +50 -0
  43. package/dist/cjs/protocol/index.js.map +1 -0
  44. package/dist/cjs/token/TokenTransferProtocol.js +196 -0
  45. package/dist/cjs/token/TokenTransferProtocol.js.map +1 -0
  46. package/dist/cjs/token/index.js +45 -0
  47. package/dist/cjs/token/index.js.map +1 -0
  48. package/dist/esm/NostrKeyManager.js +228 -0
  49. package/dist/esm/NostrKeyManager.js.map +1 -0
  50. package/dist/esm/client/NostrClient.js +481 -0
  51. package/dist/esm/client/NostrClient.js.map +1 -0
  52. package/dist/esm/client/NostrEventListener.js +27 -0
  53. package/dist/esm/client/NostrEventListener.js.map +1 -0
  54. package/dist/esm/client/WebSocketAdapter.js +52 -0
  55. package/dist/esm/client/WebSocketAdapter.js.map +1 -0
  56. package/dist/esm/client/index.js +7 -0
  57. package/dist/esm/client/index.js.map +1 -0
  58. package/dist/esm/crypto/bech32.js +193 -0
  59. package/dist/esm/crypto/bech32.js.map +1 -0
  60. package/dist/esm/crypto/index.js +10 -0
  61. package/dist/esm/crypto/index.js.map +1 -0
  62. package/dist/esm/crypto/nip04.js +286 -0
  63. package/dist/esm/crypto/nip04.js.map +1 -0
  64. package/dist/esm/crypto/schnorr.js +93 -0
  65. package/dist/esm/crypto/schnorr.js.map +1 -0
  66. package/dist/esm/index.js +32 -0
  67. package/dist/esm/index.js.map +1 -0
  68. package/dist/esm/nametag/NametagBinding.js +155 -0
  69. package/dist/esm/nametag/NametagBinding.js.map +1 -0
  70. package/dist/esm/nametag/NametagUtils.js +149 -0
  71. package/dist/esm/nametag/NametagUtils.js.map +1 -0
  72. package/dist/esm/nametag/index.js +8 -0
  73. package/dist/esm/nametag/index.js.map +1 -0
  74. package/dist/esm/protocol/Event.js +172 -0
  75. package/dist/esm/protocol/Event.js.map +1 -0
  76. package/dist/esm/protocol/EventKinds.js +119 -0
  77. package/dist/esm/protocol/EventKinds.js.map +1 -0
  78. package/dist/esm/protocol/Filter.js +197 -0
  79. package/dist/esm/protocol/Filter.js.map +1 -0
  80. package/dist/esm/protocol/index.js +8 -0
  81. package/dist/esm/protocol/index.js.map +1 -0
  82. package/dist/esm/token/TokenTransferProtocol.js +154 -0
  83. package/dist/esm/token/TokenTransferProtocol.js.map +1 -0
  84. package/dist/esm/token/index.js +6 -0
  85. package/dist/esm/token/index.js.map +1 -0
  86. package/dist/types/NostrKeyManager.d.ts +150 -0
  87. package/dist/types/NostrKeyManager.d.ts.map +1 -0
  88. package/dist/types/client/NostrClient.d.ts +154 -0
  89. package/dist/types/client/NostrClient.d.ts.map +1 -0
  90. package/dist/types/client/NostrEventListener.d.ts +40 -0
  91. package/dist/types/client/NostrEventListener.d.ts.map +1 -0
  92. package/dist/types/client/WebSocketAdapter.d.ts +55 -0
  93. package/dist/types/client/WebSocketAdapter.d.ts.map +1 -0
  94. package/dist/types/client/index.d.ts +9 -0
  95. package/dist/types/client/index.d.ts.map +1 -0
  96. package/dist/types/crypto/bech32.d.ts +51 -0
  97. package/dist/types/crypto/bech32.d.ts.map +1 -0
  98. package/dist/types/crypto/index.d.ts +10 -0
  99. package/dist/types/crypto/index.d.ts.map +1 -0
  100. package/dist/types/crypto/nip04.d.ts +56 -0
  101. package/dist/types/crypto/nip04.d.ts.map +1 -0
  102. package/dist/types/crypto/schnorr.d.ts +47 -0
  103. package/dist/types/crypto/schnorr.d.ts.map +1 -0
  104. package/dist/types/index.d.ts +31 -0
  105. package/dist/types/index.d.ts.map +1 -0
  106. package/dist/types/nametag/NametagBinding.d.ts +68 -0
  107. package/dist/types/nametag/NametagBinding.d.ts.map +1 -0
  108. package/dist/types/nametag/NametagUtils.d.ts +44 -0
  109. package/dist/types/nametag/NametagUtils.d.ts.map +1 -0
  110. package/dist/types/nametag/index.d.ts +8 -0
  111. package/dist/types/nametag/index.d.ts.map +1 -0
  112. package/dist/types/protocol/Event.d.ts +112 -0
  113. package/dist/types/protocol/Event.d.ts.map +1 -0
  114. package/dist/types/protocol/EventKinds.d.ts +62 -0
  115. package/dist/types/protocol/EventKinds.d.ts.map +1 -0
  116. package/dist/types/protocol/Filter.d.ts +146 -0
  117. package/dist/types/protocol/Filter.d.ts.map +1 -0
  118. package/dist/types/protocol/index.d.ts +10 -0
  119. package/dist/types/protocol/index.d.ts.map +1 -0
  120. package/dist/types/token/TokenTransferProtocol.d.ts +67 -0
  121. package/dist/types/token/TokenTransferProtocol.d.ts.map +1 -0
  122. package/dist/types/token/index.d.ts +6 -0
  123. package/dist/types/token/index.d.ts.map +1 -0
  124. package/package.json +89 -0
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /**
3
+ * Client module - Nostr relay client
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CLOSED = exports.CLOSING = exports.OPEN = exports.CONNECTING = exports.extractMessageData = exports.createWebSocket = exports.CallbackEventListener = exports.NostrClient = void 0;
7
+ var NostrClient_js_1 = require("./NostrClient.js");
8
+ Object.defineProperty(exports, "NostrClient", { enumerable: true, get: function () { return NostrClient_js_1.NostrClient; } });
9
+ var NostrEventListener_js_1 = require("./NostrEventListener.js");
10
+ Object.defineProperty(exports, "CallbackEventListener", { enumerable: true, get: function () { return NostrEventListener_js_1.CallbackEventListener; } });
11
+ var WebSocketAdapter_js_1 = require("./WebSocketAdapter.js");
12
+ Object.defineProperty(exports, "createWebSocket", { enumerable: true, get: function () { return WebSocketAdapter_js_1.createWebSocket; } });
13
+ Object.defineProperty(exports, "extractMessageData", { enumerable: true, get: function () { return WebSocketAdapter_js_1.extractMessageData; } });
14
+ Object.defineProperty(exports, "CONNECTING", { enumerable: true, get: function () { return WebSocketAdapter_js_1.CONNECTING; } });
15
+ Object.defineProperty(exports, "OPEN", { enumerable: true, get: function () { return WebSocketAdapter_js_1.OPEN; } });
16
+ Object.defineProperty(exports, "CLOSING", { enumerable: true, get: function () { return WebSocketAdapter_js_1.CLOSING; } });
17
+ Object.defineProperty(exports, "CLOSED", { enumerable: true, get: function () { return WebSocketAdapter_js_1.CLOSED; } });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,mDAA+C;AAAtC,6GAAA,WAAW,OAAA;AACpB,iEAAgE;AAAvD,8HAAA,qBAAqB,OAAA;AAE9B,6DAO+B;AAN7B,sHAAA,eAAe,OAAA;AACf,yHAAA,kBAAkB,OAAA;AAClB,iHAAA,UAAU,OAAA;AACV,2GAAA,IAAI,OAAA;AACJ,8GAAA,OAAO,OAAA;AACP,6GAAA,MAAM,OAAA"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ /**
3
+ * Bech32 encoding/decoding for NIP-19 key formats (npub, nsec).
4
+ * Implements the Bech32 specification for Nostr key encoding.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.encode = encode;
8
+ exports.decode = decode;
9
+ exports.encodeNpub = encodeNpub;
10
+ exports.decodeNpub = decodeNpub;
11
+ exports.encodeNsec = encodeNsec;
12
+ exports.decodeNsec = decodeNsec;
13
+ const CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';
14
+ const GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];
15
+ /**
16
+ * Compute the Bech32 polymod checksum
17
+ */
18
+ function polymod(values) {
19
+ let chk = 1;
20
+ for (const v of values) {
21
+ const top = chk >> 25;
22
+ chk = ((chk & 0x1ffffff) << 5) ^ v;
23
+ for (let i = 0; i < 5; i++) {
24
+ if ((top >> i) & 1) {
25
+ chk ^= GENERATOR[i];
26
+ }
27
+ }
28
+ }
29
+ return chk;
30
+ }
31
+ /**
32
+ * Expand the human-readable part for checksum computation
33
+ */
34
+ function hrpExpand(hrp) {
35
+ const result = [];
36
+ for (let i = 0; i < hrp.length; i++) {
37
+ result.push(hrp.charCodeAt(i) >> 5);
38
+ }
39
+ result.push(0);
40
+ for (let i = 0; i < hrp.length; i++) {
41
+ result.push(hrp.charCodeAt(i) & 31);
42
+ }
43
+ return result;
44
+ }
45
+ /**
46
+ * Verify the Bech32 checksum
47
+ */
48
+ function verifyChecksum(hrp, data) {
49
+ return polymod(hrpExpand(hrp).concat(data)) === 1;
50
+ }
51
+ /**
52
+ * Create the Bech32 checksum
53
+ */
54
+ function createChecksum(hrp, data) {
55
+ const values = hrpExpand(hrp).concat(data).concat([0, 0, 0, 0, 0, 0]);
56
+ const mod = polymod(values) ^ 1;
57
+ const result = [];
58
+ for (let i = 0; i < 6; i++) {
59
+ result.push((mod >> (5 * (5 - i))) & 31);
60
+ }
61
+ return result;
62
+ }
63
+ /**
64
+ * Convert bits between different widths
65
+ */
66
+ function convertBits(data, fromBits, toBits, pad) {
67
+ let acc = 0;
68
+ let bits = 0;
69
+ const result = [];
70
+ const maxv = (1 << toBits) - 1;
71
+ for (const value of data) {
72
+ if (value < 0 || value >> fromBits !== 0) {
73
+ return null;
74
+ }
75
+ acc = (acc << fromBits) | value;
76
+ bits += fromBits;
77
+ while (bits >= toBits) {
78
+ bits -= toBits;
79
+ result.push((acc >> bits) & maxv);
80
+ }
81
+ }
82
+ if (pad) {
83
+ if (bits > 0) {
84
+ result.push((acc << (toBits - bits)) & maxv);
85
+ }
86
+ }
87
+ else if (bits >= fromBits || ((acc << (toBits - bits)) & maxv) !== 0) {
88
+ return null;
89
+ }
90
+ return result;
91
+ }
92
+ /**
93
+ * Encode data with Bech32 checksum
94
+ * @param hrp Human-readable part (e.g., "npub", "nsec")
95
+ * @param data Data bytes to encode
96
+ * @returns Bech32-encoded string
97
+ */
98
+ function encode(hrp, data) {
99
+ const values = convertBits(Array.from(data), 8, 5, true);
100
+ if (values === null) {
101
+ throw new Error('Failed to convert bits for Bech32 encoding');
102
+ }
103
+ const checksum = createChecksum(hrp, values);
104
+ const combined = values.concat(checksum);
105
+ let result = hrp + '1';
106
+ for (const v of combined) {
107
+ result += CHARSET.charAt(v);
108
+ }
109
+ return result;
110
+ }
111
+ /**
112
+ * Decode a Bech32-encoded string
113
+ * @param bech32String The Bech32 string to decode
114
+ * @returns Decoded data with human-readable part
115
+ */
116
+ function decode(bech32String) {
117
+ const str = bech32String.toLowerCase();
118
+ // Find separator
119
+ const pos = str.lastIndexOf('1');
120
+ if (pos < 1 || pos + 7 > str.length || str.length > 90) {
121
+ throw new Error('Invalid Bech32 string');
122
+ }
123
+ const hrp = str.slice(0, pos);
124
+ const dataChars = str.slice(pos + 1);
125
+ // Decode data characters
126
+ const data = [];
127
+ for (const char of dataChars) {
128
+ const idx = CHARSET.indexOf(char);
129
+ if (idx === -1) {
130
+ throw new Error(`Invalid character '${char}' in Bech32 string`);
131
+ }
132
+ data.push(idx);
133
+ }
134
+ // Verify checksum
135
+ if (!verifyChecksum(hrp, data)) {
136
+ throw new Error('Invalid Bech32 checksum');
137
+ }
138
+ // Remove checksum and convert bits
139
+ const dataWithoutChecksum = data.slice(0, -6);
140
+ const converted = convertBits(dataWithoutChecksum, 5, 8, false);
141
+ if (converted === null) {
142
+ throw new Error('Failed to convert bits in Bech32 decoding');
143
+ }
144
+ return {
145
+ hrp,
146
+ data: new Uint8Array(converted),
147
+ };
148
+ }
149
+ /**
150
+ * Encode a public key as npub
151
+ * @param publicKey 32-byte public key
152
+ * @returns npub-encoded string
153
+ */
154
+ function encodeNpub(publicKey) {
155
+ if (publicKey.length !== 32) {
156
+ throw new Error('Public key must be 32 bytes');
157
+ }
158
+ return encode('npub', publicKey);
159
+ }
160
+ /**
161
+ * Decode an npub string to public key bytes
162
+ * @param npub npub-encoded string
163
+ * @returns 32-byte public key
164
+ */
165
+ function decodeNpub(npub) {
166
+ const decoded = decode(npub);
167
+ if (decoded.hrp !== 'npub') {
168
+ throw new Error(`Expected 'npub' prefix, got '${decoded.hrp}'`);
169
+ }
170
+ if (decoded.data.length !== 32) {
171
+ throw new Error(`Expected 32 bytes, got ${decoded.data.length}`);
172
+ }
173
+ return decoded.data;
174
+ }
175
+ /**
176
+ * Encode a private key as nsec
177
+ * @param privateKey 32-byte private key
178
+ * @returns nsec-encoded string
179
+ */
180
+ function encodeNsec(privateKey) {
181
+ if (privateKey.length !== 32) {
182
+ throw new Error('Private key must be 32 bytes');
183
+ }
184
+ return encode('nsec', privateKey);
185
+ }
186
+ /**
187
+ * Decode an nsec string to private key bytes
188
+ * @param nsec nsec-encoded string
189
+ * @returns 32-byte private key
190
+ */
191
+ function decodeNsec(nsec) {
192
+ const decoded = decode(nsec);
193
+ if (decoded.hrp !== 'nsec') {
194
+ throw new Error(`Expected 'nsec' prefix, got '${decoded.hrp}'`);
195
+ }
196
+ if (decoded.data.length !== 32) {
197
+ throw new Error(`Expected 32 bytes, got ${decoded.data.length}`);
198
+ }
199
+ return decoded.data;
200
+ }
201
+ //# sourceMappingURL=bech32.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bech32.js","sourceRoot":"","sources":["../../../src/crypto/bech32.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * Crypto module - Cryptographic utilities for Nostr protocol
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
22
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.NIP04 = exports.SchnorrSigner = exports.Bech32 = void 0;
43
+ __exportStar(require("./bech32.js"), exports);
44
+ exports.Bech32 = __importStar(require("./bech32.js"));
45
+ __exportStar(require("./schnorr.js"), exports);
46
+ exports.SchnorrSigner = __importStar(require("./schnorr.js"));
47
+ __exportStar(require("./nip04.js"), exports);
48
+ exports.NIP04 = __importStar(require("./nip04.js"));
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/crypto/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,8CAA4B;AAC5B,sDAAsC;AACtC,+CAA6B;AAC7B,8DAA8C;AAC9C,6CAA2B;AAC3B,oDAAoC"}
@@ -0,0 +1,327 @@
1
+ "use strict";
2
+ /**
3
+ * NIP-04 Encryption implementation.
4
+ * AES-256-CBC encryption with ECDH key agreement and optional GZIP compression.
5
+ * Works in both Node.js and browser environments.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.deriveSharedSecret = deriveSharedSecret;
42
+ exports.deriveSharedSecretHex = deriveSharedSecretHex;
43
+ exports.encrypt = encrypt;
44
+ exports.encryptHex = encryptHex;
45
+ exports.decrypt = decrypt;
46
+ exports.decryptHex = decryptHex;
47
+ const secp256k1_1 = require("@noble/curves/secp256k1");
48
+ const sha256_1 = require("@noble/hashes/sha256");
49
+ const utils_1 = require("@noble/hashes/utils");
50
+ /** Compression threshold in bytes */
51
+ const COMPRESSION_THRESHOLD = 1024;
52
+ /** Prefix for compressed messages */
53
+ const COMPRESSION_PREFIX = 'gz:';
54
+ /**
55
+ * Convert a Uint8Array to base64 string (browser and Node.js compatible)
56
+ */
57
+ function toBase64(bytes) {
58
+ if (typeof Buffer !== 'undefined') {
59
+ return Buffer.from(bytes).toString('base64');
60
+ }
61
+ // Browser environment
62
+ let binary = '';
63
+ for (let i = 0; i < bytes.length; i++) {
64
+ binary += String.fromCharCode(bytes[i]);
65
+ }
66
+ return btoa(binary);
67
+ }
68
+ /**
69
+ * Convert a base64 string to Uint8Array (browser and Node.js compatible)
70
+ */
71
+ function fromBase64(base64) {
72
+ if (typeof Buffer !== 'undefined') {
73
+ return new Uint8Array(Buffer.from(base64, 'base64'));
74
+ }
75
+ // Browser environment
76
+ const binary = atob(base64);
77
+ const bytes = new Uint8Array(binary.length);
78
+ for (let i = 0; i < binary.length; i++) {
79
+ bytes[i] = binary.charCodeAt(i);
80
+ }
81
+ return bytes;
82
+ }
83
+ /**
84
+ * Convert Uint8Array to a standard ArrayBuffer view for Web Crypto API compatibility
85
+ */
86
+ function toBufferSource(data) {
87
+ // Create a new ArrayBuffer to ensure compatibility with Web Crypto API
88
+ const buffer = new ArrayBuffer(data.length);
89
+ new Uint8Array(buffer).set(data);
90
+ return buffer;
91
+ }
92
+ /**
93
+ * GZIP compress data (browser and Node.js compatible)
94
+ */
95
+ async function compress(data) {
96
+ // Check for Node.js environment first
97
+ if (typeof process !== 'undefined' && process.versions?.node) {
98
+ // Node.js environment - use native zlib
99
+ const { gzipSync } = await Promise.resolve().then(() => __importStar(require('zlib')));
100
+ return new Uint8Array(gzipSync(Buffer.from(data)));
101
+ }
102
+ else if (typeof CompressionStream !== 'undefined') {
103
+ // Browser with Compression Streams API
104
+ const stream = new CompressionStream('gzip');
105
+ const writer = stream.writable.getWriter();
106
+ writer.write(toBufferSource(data));
107
+ writer.close();
108
+ const chunks = [];
109
+ const reader = stream.readable.getReader();
110
+ while (true) {
111
+ const { done, value } = await reader.read();
112
+ if (done)
113
+ break;
114
+ chunks.push(value);
115
+ }
116
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
117
+ const result = new Uint8Array(totalLength);
118
+ let offset = 0;
119
+ for (const chunk of chunks) {
120
+ result.set(chunk, offset);
121
+ offset += chunk.length;
122
+ }
123
+ return result;
124
+ }
125
+ throw new Error('GZIP compression not supported in this environment');
126
+ }
127
+ /**
128
+ * GZIP decompress data (browser and Node.js compatible)
129
+ */
130
+ async function decompress(data) {
131
+ // Check for Node.js environment first
132
+ if (typeof process !== 'undefined' && process.versions?.node) {
133
+ // Node.js environment - use native zlib
134
+ const { gunzipSync } = await Promise.resolve().then(() => __importStar(require('zlib')));
135
+ return new Uint8Array(gunzipSync(Buffer.from(data)));
136
+ }
137
+ else if (typeof DecompressionStream !== 'undefined') {
138
+ // Browser with Compression Streams API
139
+ const stream = new DecompressionStream('gzip');
140
+ const writer = stream.writable.getWriter();
141
+ writer.write(toBufferSource(data));
142
+ writer.close();
143
+ const chunks = [];
144
+ const reader = stream.readable.getReader();
145
+ while (true) {
146
+ const { done, value } = await reader.read();
147
+ if (done)
148
+ break;
149
+ chunks.push(value);
150
+ }
151
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
152
+ const result = new Uint8Array(totalLength);
153
+ let offset = 0;
154
+ for (const chunk of chunks) {
155
+ result.set(chunk, offset);
156
+ offset += chunk.length;
157
+ }
158
+ return result;
159
+ }
160
+ throw new Error('GZIP decompression not supported in this environment');
161
+ }
162
+ /**
163
+ * Import an AES-256-CBC key for encryption/decryption
164
+ */
165
+ async function importKey(keyBytes) {
166
+ const crypto = globalThis.crypto;
167
+ return crypto.subtle.importKey('raw', toBufferSource(keyBytes), { name: 'AES-CBC' }, false, [
168
+ 'encrypt',
169
+ 'decrypt',
170
+ ]);
171
+ }
172
+ /**
173
+ * AES-256-CBC encrypt
174
+ */
175
+ async function aesEncrypt(plaintext, key, iv) {
176
+ const crypto = globalThis.crypto;
177
+ const cryptoKey = await importKey(key);
178
+ const ciphertext = await crypto.subtle.encrypt({ name: 'AES-CBC', iv: toBufferSource(iv) }, cryptoKey, toBufferSource(plaintext));
179
+ return new Uint8Array(ciphertext);
180
+ }
181
+ /**
182
+ * AES-256-CBC decrypt
183
+ */
184
+ async function aesDecrypt(ciphertext, key, iv) {
185
+ const crypto = globalThis.crypto;
186
+ const cryptoKey = await importKey(key);
187
+ const plaintext = await crypto.subtle.decrypt({ name: 'AES-CBC', iv: toBufferSource(iv) }, cryptoKey, toBufferSource(ciphertext));
188
+ return new Uint8Array(plaintext);
189
+ }
190
+ /**
191
+ * Derive a shared secret using ECDH (NIP-04 compatible).
192
+ * Returns SHA-256(sharedPoint.x) as the shared secret.
193
+ * @param myPrivateKey 32-byte private key
194
+ * @param theirPublicKey 32-byte x-only public key
195
+ * @returns 32-byte shared secret
196
+ */
197
+ function deriveSharedSecret(myPrivateKey, theirPublicKey) {
198
+ if (myPrivateKey.length !== 32) {
199
+ throw new Error('Private key must be 32 bytes');
200
+ }
201
+ if (theirPublicKey.length !== 32) {
202
+ throw new Error('Public key must be 32 bytes');
203
+ }
204
+ // Reconstruct the full public key point from x-coordinate (assume even y)
205
+ // For secp256k1, we need to prefix with 02 for even y
206
+ const fullPublicKey = new Uint8Array(33);
207
+ fullPublicKey[0] = 0x02;
208
+ fullPublicKey.set(theirPublicKey, 1);
209
+ // Compute ECDH shared point
210
+ const sharedPoint = secp256k1_1.secp256k1.getSharedSecret(myPrivateKey, fullPublicKey);
211
+ // Extract x-coordinate (skip the 0x04 prefix byte, take next 32 bytes)
212
+ const sharedX = sharedPoint.slice(1, 33);
213
+ // Return SHA-256 of the x-coordinate
214
+ return (0, sha256_1.sha256)(sharedX);
215
+ }
216
+ /**
217
+ * Derive a shared secret from hex-encoded keys
218
+ * @param myPrivateKeyHex Hex-encoded private key
219
+ * @param theirPublicKeyHex Hex-encoded public key
220
+ * @returns Hex-encoded shared secret
221
+ */
222
+ function deriveSharedSecretHex(myPrivateKeyHex, theirPublicKeyHex) {
223
+ const myPrivateKey = (0, utils_1.hexToBytes)(myPrivateKeyHex);
224
+ const theirPublicKey = (0, utils_1.hexToBytes)(theirPublicKeyHex);
225
+ return (0, utils_1.bytesToHex)(deriveSharedSecret(myPrivateKey, theirPublicKey));
226
+ }
227
+ /**
228
+ * Encrypt a message using NIP-04 encryption.
229
+ * Format: "base64(ciphertext)?iv=base64(iv)"
230
+ * If message > 1KB, automatically compresses with GZIP: "gz:base64(compressed)?iv=base64(iv)"
231
+ * @param message Message to encrypt
232
+ * @param myPrivateKey 32-byte private key
233
+ * @param theirPublicKey 32-byte x-only public key
234
+ * @returns Encrypted content string
235
+ */
236
+ async function encrypt(message, myPrivateKey, theirPublicKey) {
237
+ const encoder = new TextEncoder();
238
+ let plaintext = encoder.encode(message);
239
+ // Check if compression is needed
240
+ let useCompression = false;
241
+ let plaintextToEncrypt = plaintext;
242
+ if (plaintext.length > COMPRESSION_THRESHOLD) {
243
+ const compressed = await compress(plaintext);
244
+ // Only use compression if it actually reduces size
245
+ if (compressed.length < plaintext.length) {
246
+ plaintextToEncrypt = new Uint8Array(compressed);
247
+ useCompression = true;
248
+ }
249
+ }
250
+ // Derive shared secret
251
+ const sharedSecret = deriveSharedSecret(myPrivateKey, theirPublicKey);
252
+ // Generate random IV
253
+ const iv = (0, utils_1.randomBytes)(16);
254
+ // Encrypt
255
+ const ciphertext = await aesEncrypt(plaintextToEncrypt, sharedSecret, iv);
256
+ // Format output
257
+ const ciphertextBase64 = toBase64(ciphertext);
258
+ const ivBase64 = toBase64(iv);
259
+ if (useCompression) {
260
+ return `${COMPRESSION_PREFIX}${ciphertextBase64}?iv=${ivBase64}`;
261
+ }
262
+ return `${ciphertextBase64}?iv=${ivBase64}`;
263
+ }
264
+ /**
265
+ * Encrypt a message using hex-encoded keys
266
+ * @param message Message to encrypt
267
+ * @param myPrivateKeyHex Hex-encoded private key
268
+ * @param theirPublicKeyHex Hex-encoded public key
269
+ * @returns Encrypted content string
270
+ */
271
+ async function encryptHex(message, myPrivateKeyHex, theirPublicKeyHex) {
272
+ const myPrivateKey = (0, utils_1.hexToBytes)(myPrivateKeyHex);
273
+ const theirPublicKey = (0, utils_1.hexToBytes)(theirPublicKeyHex);
274
+ return encrypt(message, myPrivateKey, theirPublicKey);
275
+ }
276
+ /**
277
+ * Decrypt a NIP-04 encrypted message.
278
+ * Automatically decompresses if the message was compressed.
279
+ * @param encryptedContent Encrypted content string
280
+ * @param myPrivateKey 32-byte private key
281
+ * @param theirPublicKey 32-byte x-only public key
282
+ * @returns Decrypted message
283
+ */
284
+ async function decrypt(encryptedContent, myPrivateKey, theirPublicKey) {
285
+ // Check for compression prefix
286
+ let content = encryptedContent;
287
+ let isCompressed = false;
288
+ if (content.startsWith(COMPRESSION_PREFIX)) {
289
+ content = content.slice(COMPRESSION_PREFIX.length);
290
+ isCompressed = true;
291
+ }
292
+ // Parse format: "base64(ciphertext)?iv=base64(iv)"
293
+ const parts = content.split('?iv=');
294
+ if (parts.length !== 2) {
295
+ throw new Error('Invalid encrypted content format');
296
+ }
297
+ const ciphertextBase64 = parts[0];
298
+ const ivBase64 = parts[1];
299
+ const ciphertext = fromBase64(ciphertextBase64);
300
+ const iv = fromBase64(ivBase64);
301
+ if (iv.length !== 16) {
302
+ throw new Error('Invalid IV length');
303
+ }
304
+ // Derive shared secret
305
+ const sharedSecret = deriveSharedSecret(myPrivateKey, theirPublicKey);
306
+ // Decrypt
307
+ let plaintext = await aesDecrypt(ciphertext, sharedSecret, iv);
308
+ // Decompress if needed
309
+ if (isCompressed) {
310
+ plaintext = await decompress(plaintext);
311
+ }
312
+ const decoder = new TextDecoder();
313
+ return decoder.decode(plaintext);
314
+ }
315
+ /**
316
+ * Decrypt a message using hex-encoded keys
317
+ * @param encryptedContent Encrypted content string
318
+ * @param myPrivateKeyHex Hex-encoded private key
319
+ * @param theirPublicKeyHex Hex-encoded public key
320
+ * @returns Decrypted message
321
+ */
322
+ async function decryptHex(encryptedContent, myPrivateKeyHex, theirPublicKeyHex) {
323
+ const myPrivateKey = (0, utils_1.hexToBytes)(myPrivateKeyHex);
324
+ const theirPublicKey = (0, utils_1.hexToBytes)(theirPublicKeyHex);
325
+ return decrypt(encryptedContent, myPrivateKey, theirPublicKey);
326
+ }
327
+ //# sourceMappingURL=nip04.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nip04.js","sourceRoot":"","sources":["../../../src/crypto/nip04.ts"],"names":[],"mappings":"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"}