@labacacia/nps-sdk 1.0.0-alpha.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 (311) hide show
  1. package/CONTRIBUTING.md +33 -0
  2. package/LICENSE +170 -0
  3. package/NOTICE +7 -0
  4. package/README.md +153 -0
  5. package/dist/codec-CmHeovTV.d.cts +120 -0
  6. package/dist/codec-CmHeovTV.d.ts +120 -0
  7. package/dist/core/anchor-cache.d.ts +42 -0
  8. package/dist/core/anchor-cache.d.ts.map +1 -0
  9. package/dist/core/anchor-cache.js +104 -0
  10. package/dist/core/anchor-cache.js.map +1 -0
  11. package/dist/core/cache.d.ts +14 -0
  12. package/dist/core/cache.d.ts.map +1 -0
  13. package/dist/core/cache.js +80 -0
  14. package/dist/core/cache.js.map +1 -0
  15. package/dist/core/canonical-json.d.ts +12 -0
  16. package/dist/core/canonical-json.d.ts.map +1 -0
  17. package/dist/core/canonical-json.js +44 -0
  18. package/dist/core/canonical-json.js.map +1 -0
  19. package/dist/core/codec.d.ts +32 -0
  20. package/dist/core/codec.d.ts.map +1 -0
  21. package/dist/core/codec.js +119 -0
  22. package/dist/core/codec.js.map +1 -0
  23. package/dist/core/codecs/index.d.ts +4 -0
  24. package/dist/core/codecs/index.d.ts.map +1 -0
  25. package/dist/core/codecs/index.js +6 -0
  26. package/dist/core/codecs/index.js.map +1 -0
  27. package/dist/core/codecs/ncp-codec.d.ts +39 -0
  28. package/dist/core/codecs/ncp-codec.d.ts.map +1 -0
  29. package/dist/core/codecs/ncp-codec.js +93 -0
  30. package/dist/core/codecs/ncp-codec.js.map +1 -0
  31. package/dist/core/codecs/tier1-json-codec.d.ts +10 -0
  32. package/dist/core/codecs/tier1-json-codec.d.ts.map +1 -0
  33. package/dist/core/codecs/tier1-json-codec.js +28 -0
  34. package/dist/core/codecs/tier1-json-codec.js.map +1 -0
  35. package/dist/core/codecs/tier2-msgpack-codec.d.ts +10 -0
  36. package/dist/core/codecs/tier2-msgpack-codec.d.ts.map +1 -0
  37. package/dist/core/codecs/tier2-msgpack-codec.js +26 -0
  38. package/dist/core/codecs/tier2-msgpack-codec.js.map +1 -0
  39. package/dist/core/crypto-provider.d.ts +31 -0
  40. package/dist/core/crypto-provider.d.ts.map +1 -0
  41. package/dist/core/crypto-provider.js +10 -0
  42. package/dist/core/crypto-provider.js.map +1 -0
  43. package/dist/core/exceptions.d.ts +27 -0
  44. package/dist/core/exceptions.d.ts.map +1 -0
  45. package/dist/core/exceptions.js +52 -0
  46. package/dist/core/exceptions.js.map +1 -0
  47. package/dist/core/frame-header.d.ts +87 -0
  48. package/dist/core/frame-header.d.ts.map +1 -0
  49. package/dist/core/frame-header.js +185 -0
  50. package/dist/core/frame-header.js.map +1 -0
  51. package/dist/core/frame-registry.d.ts +35 -0
  52. package/dist/core/frame-registry.d.ts.map +1 -0
  53. package/dist/core/frame-registry.js +63 -0
  54. package/dist/core/frame-registry.js.map +1 -0
  55. package/dist/core/frames.d.ts +80 -0
  56. package/dist/core/frames.d.ts.map +1 -0
  57. package/dist/core/frames.js +153 -0
  58. package/dist/core/frames.js.map +1 -0
  59. package/dist/core/index.cjs +371 -0
  60. package/dist/core/index.cjs.map +1 -0
  61. package/dist/core/index.d.cts +41 -0
  62. package/dist/core/index.d.ts +9 -0
  63. package/dist/core/index.d.ts.map +1 -0
  64. package/dist/core/index.js +10 -0
  65. package/dist/core/index.js.map +1 -0
  66. package/dist/core/registry.d.ts +11 -0
  67. package/dist/core/registry.d.ts.map +1 -0
  68. package/dist/core/registry.js +17 -0
  69. package/dist/core/registry.js.map +1 -0
  70. package/dist/core/status-codes.d.ts +28 -0
  71. package/dist/core/status-codes.d.ts.map +1 -0
  72. package/dist/core/status-codes.js +38 -0
  73. package/dist/core/status-codes.js.map +1 -0
  74. package/dist/frames-B3qLdl_g.d.cts +77 -0
  75. package/dist/frames-Ff7-ZPUl.d.ts +77 -0
  76. package/dist/index.cjs +1556 -0
  77. package/dist/index.cjs.map +1 -0
  78. package/dist/index.d.cts +21 -0
  79. package/dist/index.d.ts +2 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +10 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/ncp/frames/anchor-frame.d.ts +29 -0
  84. package/dist/ncp/frames/anchor-frame.d.ts.map +1 -0
  85. package/dist/ncp/frames/anchor-frame.js +54 -0
  86. package/dist/ncp/frames/anchor-frame.js.map +1 -0
  87. package/dist/ncp/frames/caps-frame.d.ts +29 -0
  88. package/dist/ncp/frames/caps-frame.d.ts.map +1 -0
  89. package/dist/ncp/frames/caps-frame.js +29 -0
  90. package/dist/ncp/frames/caps-frame.js.map +1 -0
  91. package/dist/ncp/frames/diff-frame.d.ts +32 -0
  92. package/dist/ncp/frames/diff-frame.d.ts.map +1 -0
  93. package/dist/ncp/frames/diff-frame.js +37 -0
  94. package/dist/ncp/frames/diff-frame.js.map +1 -0
  95. package/dist/ncp/frames/error-frame.d.ts +16 -0
  96. package/dist/ncp/frames/error-frame.d.ts.map +1 -0
  97. package/dist/ncp/frames/error-frame.js +13 -0
  98. package/dist/ncp/frames/error-frame.js.map +1 -0
  99. package/dist/ncp/frames/hello-frame.d.ts +21 -0
  100. package/dist/ncp/frames/hello-frame.d.ts.map +1 -0
  101. package/dist/ncp/frames/hello-frame.js +25 -0
  102. package/dist/ncp/frames/hello-frame.js.map +1 -0
  103. package/dist/ncp/frames/stream-frame.d.ts +16 -0
  104. package/dist/ncp/frames/stream-frame.d.ts.map +1 -0
  105. package/dist/ncp/frames/stream-frame.js +18 -0
  106. package/dist/ncp/frames/stream-frame.js.map +1 -0
  107. package/dist/ncp/frames.d.ts +76 -0
  108. package/dist/ncp/frames.d.ts.map +1 -0
  109. package/dist/ncp/frames.js +147 -0
  110. package/dist/ncp/frames.js.map +1 -0
  111. package/dist/ncp/handshake.d.ts +30 -0
  112. package/dist/ncp/handshake.d.ts.map +1 -0
  113. package/dist/ncp/handshake.js +80 -0
  114. package/dist/ncp/handshake.js.map +1 -0
  115. package/dist/ncp/index.cjs +188 -0
  116. package/dist/ncp/index.cjs.map +1 -0
  117. package/dist/ncp/index.d.cts +6 -0
  118. package/dist/ncp/index.d.ts +11 -0
  119. package/dist/ncp/index.d.ts.map +1 -0
  120. package/dist/ncp/index.js +13 -0
  121. package/dist/ncp/index.js.map +1 -0
  122. package/dist/ncp/ncp-error-codes.d.ts +22 -0
  123. package/dist/ncp/ncp-error-codes.d.ts.map +1 -0
  124. package/dist/ncp/ncp-error-codes.js +32 -0
  125. package/dist/ncp/ncp-error-codes.js.map +1 -0
  126. package/dist/ncp/ncp-patch-format.d.ts +7 -0
  127. package/dist/ncp/ncp-patch-format.d.ts.map +1 -0
  128. package/dist/ncp/ncp-patch-format.js +13 -0
  129. package/dist/ncp/ncp-patch-format.js.map +1 -0
  130. package/dist/ncp/registry.d.ts +3 -0
  131. package/dist/ncp/registry.d.ts.map +1 -0
  132. package/dist/ncp/registry.js +12 -0
  133. package/dist/ncp/registry.js.map +1 -0
  134. package/dist/ncp/stream-manager.d.ts +57 -0
  135. package/dist/ncp/stream-manager.d.ts.map +1 -0
  136. package/dist/ncp/stream-manager.js +163 -0
  137. package/dist/ncp/stream-manager.js.map +1 -0
  138. package/dist/ndp/frames.d.ts +56 -0
  139. package/dist/ndp/frames.d.ts.map +1 -0
  140. package/dist/ndp/frames.js +87 -0
  141. package/dist/ndp/frames.js.map +1 -0
  142. package/dist/ndp/index.cjs +252 -0
  143. package/dist/ndp/index.cjs.map +1 -0
  144. package/dist/ndp/index.d.cts +86 -0
  145. package/dist/ndp/index.d.ts +5 -0
  146. package/dist/ndp/index.d.ts.map +1 -0
  147. package/dist/ndp/index.js +7 -0
  148. package/dist/ndp/index.js.map +1 -0
  149. package/dist/ndp/ndp-registry.d.ts +11 -0
  150. package/dist/ndp/ndp-registry.d.ts.map +1 -0
  151. package/dist/ndp/ndp-registry.js +79 -0
  152. package/dist/ndp/ndp-registry.js.map +1 -0
  153. package/dist/ndp/registry.d.ts +3 -0
  154. package/dist/ndp/registry.d.ts.map +1 -0
  155. package/dist/ndp/registry.js +10 -0
  156. package/dist/ndp/registry.js.map +1 -0
  157. package/dist/ndp/validator.d.ts +18 -0
  158. package/dist/ndp/validator.d.ts.map +1 -0
  159. package/dist/ndp/validator.js +48 -0
  160. package/dist/ndp/validator.js.map +1 -0
  161. package/dist/nip/frames.d.ts +44 -0
  162. package/dist/nip/frames.d.ts.map +1 -0
  163. package/dist/nip/frames.js +81 -0
  164. package/dist/nip/frames.js.map +1 -0
  165. package/dist/nip/identity.d.ts +18 -0
  166. package/dist/nip/identity.d.ts.map +1 -0
  167. package/dist/nip/identity.js +94 -0
  168. package/dist/nip/identity.js.map +1 -0
  169. package/dist/nip/index.cjs +214 -0
  170. package/dist/nip/index.cjs.map +1 -0
  171. package/dist/nip/index.d.cts +65 -0
  172. package/dist/nip/index.d.ts +4 -0
  173. package/dist/nip/index.d.ts.map +1 -0
  174. package/dist/nip/index.js +6 -0
  175. package/dist/nip/index.js.map +1 -0
  176. package/dist/nip/registry.d.ts +3 -0
  177. package/dist/nip/registry.d.ts.map +1 -0
  178. package/dist/nip/registry.js +10 -0
  179. package/dist/nip/registry.js.map +1 -0
  180. package/dist/nop/client.d.ts +34 -0
  181. package/dist/nop/client.d.ts.map +1 -0
  182. package/dist/nop/client.js +90 -0
  183. package/dist/nop/client.js.map +1 -0
  184. package/dist/nop/frames.d.ts +65 -0
  185. package/dist/nop/frames.d.ts.map +1 -0
  186. package/dist/nop/frames.js +148 -0
  187. package/dist/nop/frames.js.map +1 -0
  188. package/dist/nop/index.cjs +762 -0
  189. package/dist/nop/index.cjs.map +1 -0
  190. package/dist/nop/index.d.cts +155 -0
  191. package/dist/nop/index.d.ts +5 -0
  192. package/dist/nop/index.d.ts.map +1 -0
  193. package/dist/nop/index.js +7 -0
  194. package/dist/nop/index.js.map +1 -0
  195. package/dist/nop/models.d.ts +58 -0
  196. package/dist/nop/models.d.ts.map +1 -0
  197. package/dist/nop/models.js +50 -0
  198. package/dist/nop/models.js.map +1 -0
  199. package/dist/nop/nop-types.d.ts +136 -0
  200. package/dist/nop/nop-types.d.ts.map +1 -0
  201. package/dist/nop/nop-types.js +44 -0
  202. package/dist/nop/nop-types.js.map +1 -0
  203. package/dist/nop/registry.d.ts +3 -0
  204. package/dist/nop/registry.d.ts.map +1 -0
  205. package/dist/nop/registry.js +11 -0
  206. package/dist/nop/registry.js.map +1 -0
  207. package/dist/nwp/client.d.ts +22 -0
  208. package/dist/nwp/client.d.ts.map +1 -0
  209. package/dist/nwp/client.js +101 -0
  210. package/dist/nwp/client.js.map +1 -0
  211. package/dist/nwp/frames.d.ts +46 -0
  212. package/dist/nwp/frames.d.ts.map +1 -0
  213. package/dist/nwp/frames.js +81 -0
  214. package/dist/nwp/frames.js.map +1 -0
  215. package/dist/nwp/index.cjs +658 -0
  216. package/dist/nwp/index.cjs.map +1 -0
  217. package/dist/nwp/index.d.cts +65 -0
  218. package/dist/nwp/index.d.ts +4 -0
  219. package/dist/nwp/index.d.ts.map +1 -0
  220. package/dist/nwp/index.js +6 -0
  221. package/dist/nwp/index.js.map +1 -0
  222. package/dist/nwp/registry.d.ts +3 -0
  223. package/dist/nwp/registry.d.ts.map +1 -0
  224. package/dist/nwp/registry.js +9 -0
  225. package/dist/nwp/registry.js.map +1 -0
  226. package/dist/setup.d.ts +10 -0
  227. package/dist/setup.d.ts.map +1 -0
  228. package/dist/setup.js +29 -0
  229. package/dist/setup.js.map +1 -0
  230. package/nip-ca-server/Dockerfile +27 -0
  231. package/nip-ca-server/README.md +45 -0
  232. package/nip-ca-server/db/001_init.sql +25 -0
  233. package/nip-ca-server/docker-compose.yml +29 -0
  234. package/nip-ca-server/package.json +23 -0
  235. package/nip-ca-server/src/ca.ts +155 -0
  236. package/nip-ca-server/src/db.ts +104 -0
  237. package/nip-ca-server/src/index.ts +157 -0
  238. package/nip-ca-server/tsconfig.json +13 -0
  239. package/package.json +47 -0
  240. package/src/core/anchor-cache.ts +129 -0
  241. package/src/core/cache.ts +93 -0
  242. package/src/core/canonical-json.ts +50 -0
  243. package/src/core/codec.ts +158 -0
  244. package/src/core/codecs/index.ts +5 -0
  245. package/src/core/codecs/ncp-codec.ts +170 -0
  246. package/src/core/codecs/tier1-json-codec.ts +33 -0
  247. package/src/core/codecs/tier2-msgpack-codec.ts +30 -0
  248. package/src/core/crypto-provider.ts +47 -0
  249. package/src/core/exceptions.ts +57 -0
  250. package/src/core/frame-header.ts +282 -0
  251. package/src/core/frame-registry.ts +91 -0
  252. package/src/core/frames.ts +183 -0
  253. package/src/core/index.ts +10 -0
  254. package/src/core/registry.ts +28 -0
  255. package/src/core/status-codes.ts +46 -0
  256. package/src/index.ts +10 -0
  257. package/src/ncp/frames/anchor-frame.ts +87 -0
  258. package/src/ncp/frames/caps-frame.ts +59 -0
  259. package/src/ncp/frames/diff-frame.ts +69 -0
  260. package/src/ncp/frames/error-frame.ts +26 -0
  261. package/src/ncp/frames/hello-frame.ts +50 -0
  262. package/src/ncp/frames/stream-frame.ts +35 -0
  263. package/src/ncp/frames.ts +199 -0
  264. package/src/ncp/handshake.ts +95 -0
  265. package/src/ncp/index.ts +12 -0
  266. package/src/ncp/ncp-error-codes.ts +34 -0
  267. package/src/ncp/ncp-patch-format.ts +16 -0
  268. package/src/ncp/registry.ts +14 -0
  269. package/src/ncp/stream-manager.ts +212 -0
  270. package/src/ndp/frames.ts +124 -0
  271. package/src/ndp/index.ts +7 -0
  272. package/src/ndp/ndp-registry.ts +82 -0
  273. package/src/ndp/registry.ts +12 -0
  274. package/src/ndp/validator.ts +64 -0
  275. package/src/nip/frames.ts +106 -0
  276. package/src/nip/identity.ts +113 -0
  277. package/src/nip/index.ts +6 -0
  278. package/src/nip/registry.ts +12 -0
  279. package/src/nop/client.ts +103 -0
  280. package/src/nop/frames.ts +181 -0
  281. package/src/nop/index.ts +7 -0
  282. package/src/nop/models.ts +79 -0
  283. package/src/nop/nop-types.ts +208 -0
  284. package/src/nop/registry.ts +13 -0
  285. package/src/nwp/client.ts +114 -0
  286. package/src/nwp/frames.ts +116 -0
  287. package/src/nwp/index.ts +6 -0
  288. package/src/nwp/registry.ts +11 -0
  289. package/src/setup.ts +32 -0
  290. package/tests/core/anchor-cache.test.ts +242 -0
  291. package/tests/core/codec.test.ts +205 -0
  292. package/tests/core/frame-registry.test.ts +46 -0
  293. package/tests/core.test.ts +327 -0
  294. package/tests/ncp/diff-binary-bitset.test.ts +107 -0
  295. package/tests/ncp/e2e-enc-reject.test.ts +93 -0
  296. package/tests/ncp/err-error-frame.test.ts +152 -0
  297. package/tests/ncp/frames.test.ts +359 -0
  298. package/tests/ncp/framing.test.ts +233 -0
  299. package/tests/ncp/hello-frame.test.ts +122 -0
  300. package/tests/ncp/inline-anchor.test.ts +88 -0
  301. package/tests/ncp/security.test.ts +184 -0
  302. package/tests/ncp/stream-window.test.ts +167 -0
  303. package/tests/ncp/stream.test.ts +242 -0
  304. package/tests/ncp/version-negotiation.test.ts +123 -0
  305. package/tests/ndp.test.ts +271 -0
  306. package/tests/nip.test.ts +184 -0
  307. package/tests/nop.test.ts +344 -0
  308. package/tests/nwp.test.ts +237 -0
  309. package/tsconfig.json +20 -0
  310. package/tsup.config.ts +20 -0
  311. package/vitest.config.ts +10 -0
@@ -0,0 +1,81 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { EncodingTier, FrameType } from "../core/frames.js";
4
+ export class IdentFrame {
5
+ nid;
6
+ pubKey;
7
+ metadata;
8
+ signature;
9
+ frameType = FrameType.IDENT;
10
+ preferredTier = EncodingTier.MSGPACK;
11
+ constructor(nid, pubKey, metadata, signature) {
12
+ this.nid = nid;
13
+ this.pubKey = pubKey;
14
+ this.metadata = metadata;
15
+ this.signature = signature;
16
+ }
17
+ unsignedDict() {
18
+ return {
19
+ nid: this.nid,
20
+ pub_key: this.pubKey,
21
+ metadata: this.metadata,
22
+ };
23
+ }
24
+ toDict() {
25
+ return { ...this.unsignedDict(), signature: this.signature };
26
+ }
27
+ static fromDict(data) {
28
+ return new IdentFrame(data["nid"], data["pub_key"], data["metadata"], data["signature"]);
29
+ }
30
+ }
31
+ export class TrustFrame {
32
+ issuerNid;
33
+ subjectNid;
34
+ scopes;
35
+ expiresAt;
36
+ signature;
37
+ frameType = FrameType.TRUST;
38
+ preferredTier = EncodingTier.MSGPACK;
39
+ constructor(issuerNid, subjectNid, scopes, expiresAt, signature) {
40
+ this.issuerNid = issuerNid;
41
+ this.subjectNid = subjectNid;
42
+ this.scopes = scopes;
43
+ this.expiresAt = expiresAt;
44
+ this.signature = signature;
45
+ }
46
+ toDict() {
47
+ return {
48
+ issuer_nid: this.issuerNid,
49
+ subject_nid: this.subjectNid,
50
+ scopes: this.scopes,
51
+ expires_at: this.expiresAt,
52
+ signature: this.signature,
53
+ };
54
+ }
55
+ static fromDict(data) {
56
+ return new TrustFrame(data["issuer_nid"], data["subject_nid"], data["scopes"], data["expires_at"], data["signature"]);
57
+ }
58
+ }
59
+ export class RevokeFrame {
60
+ nid;
61
+ reason;
62
+ revokedAt;
63
+ frameType = FrameType.REVOKE;
64
+ preferredTier = EncodingTier.MSGPACK;
65
+ constructor(nid, reason, revokedAt) {
66
+ this.nid = nid;
67
+ this.reason = reason;
68
+ this.revokedAt = revokedAt;
69
+ }
70
+ toDict() {
71
+ return {
72
+ nid: this.nid,
73
+ reason: this.reason ?? null,
74
+ revoked_at: this.revokedAt ?? null,
75
+ };
76
+ }
77
+ static fromDict(data) {
78
+ return new RevokeFrame(data["nid"], data["reason"] ?? undefined, data["revoked_at"] ?? undefined);
79
+ }
80
+ }
81
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/nip/frames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare class NipIdentity {
2
+ private readonly _privKey;
3
+ readonly pubKey: Uint8Array;
4
+ private constructor();
5
+ static generate(): NipIdentity;
6
+ static fromPrivateKey(privKey: Uint8Array): NipIdentity;
7
+ /** Load from an AES-256-GCM encrypted key file. */
8
+ static load(path: string, passphrase: string): NipIdentity;
9
+ /** Save to an AES-256-GCM encrypted key file. */
10
+ save(path: string, passphrase: string): void;
11
+ /** Sign a dict payload. Returns `ed25519:<base64url>`. */
12
+ sign(payload: Record<string, unknown>): string;
13
+ /** Verify a signature string against a dict payload. */
14
+ verify(payload: Record<string, unknown>, signature: string): boolean;
15
+ /** Public key as `ed25519:<hex>` string. */
16
+ get pubKeyString(): string;
17
+ }
18
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/nip/identity.ts"],"names":[],"mappings":"AA8BA,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;aACR,MAAM,EAAI,UAAU;IAFvC,OAAO;IAOP,MAAM,CAAC,QAAQ,IAAI,WAAW;IAM9B,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,WAAW;IAKvD,mDAAmD;IACnD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW;IAgB1D,iDAAiD;IACjD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAoB5C,0DAA0D;IAC1D,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAO9C,wDAAwD;IACxD,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAYpE,4CAA4C;IAC5C,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF"}
@@ -0,0 +1,94 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * NipIdentity — Ed25519 key management and signing for NPS NID identity.
5
+ * Uses @noble/ed25519 for signing; node:crypto for key storage encryption.
6
+ */
7
+ import * as ed25519 from "@noble/ed25519";
8
+ import { sha512 } from "@noble/hashes/sha512";
9
+ import { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes } from "node:crypto";
10
+ import { readFileSync, writeFileSync } from "node:fs";
11
+ // noble/ed25519 requires sha512 to be set explicitly in Node environments
12
+ ed25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));
13
+ const KEY_FILE_VERSION = 1;
14
+ const PBKDF2_ITERS = 600_000;
15
+ const SALT_BYTES = 16;
16
+ const IV_BYTES = 12;
17
+ const KEY_BYTES = 32;
18
+ export class NipIdentity {
19
+ _privKey;
20
+ pubKey;
21
+ constructor(_privKey, pubKey) {
22
+ this._privKey = _privKey;
23
+ this.pubKey = pubKey;
24
+ }
25
+ // ── Factory ───────────────────────────────────────────────────────────────
26
+ static generate() {
27
+ const priv = ed25519.utils.randomPrivateKey();
28
+ const pub = ed25519.getPublicKey(priv);
29
+ return new NipIdentity(priv, pub);
30
+ }
31
+ static fromPrivateKey(privKey) {
32
+ const pub = ed25519.getPublicKey(privKey);
33
+ return new NipIdentity(privKey, pub);
34
+ }
35
+ /** Load from an AES-256-GCM encrypted key file. */
36
+ static load(path, passphrase) {
37
+ const envelope = JSON.parse(readFileSync(path, "utf8"));
38
+ const salt = Buffer.from(envelope.salt, "hex");
39
+ const iv = Buffer.from(envelope.iv, "hex");
40
+ const ct = Buffer.from(envelope.ciphertext, "hex");
41
+ const dk = pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, "sha256");
42
+ const decipher = createDecipheriv("aes-256-gcm", dk, iv);
43
+ // Last 16 bytes of ciphertext are the GCM auth tag
44
+ const authTag = ct.slice(ct.length - 16);
45
+ const body = ct.slice(0, ct.length - 16);
46
+ decipher.setAuthTag(authTag);
47
+ const priv = Buffer.concat([decipher.update(body), decipher.final()]);
48
+ return NipIdentity.fromPrivateKey(new Uint8Array(priv));
49
+ }
50
+ /** Save to an AES-256-GCM encrypted key file. */
51
+ save(path, passphrase) {
52
+ const salt = randomBytes(SALT_BYTES);
53
+ const iv = randomBytes(IV_BYTES);
54
+ const dk = pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, "sha256");
55
+ const cipher = createCipheriv("aes-256-gcm", dk, iv);
56
+ const body = Buffer.concat([cipher.update(Buffer.from(this._privKey)), cipher.final()]);
57
+ const tag = cipher.getAuthTag();
58
+ const envelope = {
59
+ version: KEY_FILE_VERSION,
60
+ salt: salt.toString("hex"),
61
+ iv: iv.toString("hex"),
62
+ ciphertext: Buffer.concat([body, tag]).toString("hex"),
63
+ pubKey: Buffer.from(this.pubKey).toString("hex"),
64
+ };
65
+ writeFileSync(path, JSON.stringify(envelope, null, 2), "utf8");
66
+ }
67
+ // ── Signing ───────────────────────────────────────────────────────────────
68
+ /** Sign a dict payload. Returns `ed25519:<base64url>`. */
69
+ sign(payload) {
70
+ const canonical = JSON.stringify(payload, Object.keys(payload).sort());
71
+ const bytes = new TextEncoder().encode(canonical);
72
+ const sig = ed25519.sign(bytes, this._privKey);
73
+ return `ed25519:${Buffer.from(sig).toString("base64")}`;
74
+ }
75
+ /** Verify a signature string against a dict payload. */
76
+ verify(payload, signature) {
77
+ if (!signature.startsWith("ed25519:"))
78
+ return false;
79
+ try {
80
+ const canonical = JSON.stringify(payload, Object.keys(payload).sort());
81
+ const bytes = new TextEncoder().encode(canonical);
82
+ const sigBytes = Buffer.from(signature.slice("ed25519:".length), "base64");
83
+ return ed25519.verify(sigBytes, bytes, this.pubKey);
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ /** Public key as `ed25519:<hex>` string. */
90
+ get pubKeyString() {
91
+ return `ed25519:${Buffer.from(this.pubKey).toString("hex")}`;
92
+ }
93
+ }
94
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/nip/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,214 @@
1
+ 'use strict';
2
+
3
+ var ed25519 = require('@noble/ed25519');
4
+ var sha512 = require('@noble/hashes/sha512');
5
+ var crypto = require('crypto');
6
+ var fs = require('fs');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var ed25519__namespace = /*#__PURE__*/_interopNamespace(ed25519);
27
+
28
+ // src/nip/frames.ts
29
+ var IdentFrame = class _IdentFrame {
30
+ constructor(nid, pubKey, metadata, signature) {
31
+ this.nid = nid;
32
+ this.pubKey = pubKey;
33
+ this.metadata = metadata;
34
+ this.signature = signature;
35
+ }
36
+ nid;
37
+ pubKey;
38
+ metadata;
39
+ signature;
40
+ frameType = 32 /* IDENT */;
41
+ preferredTier = 1 /* MSGPACK */;
42
+ unsignedDict() {
43
+ return {
44
+ nid: this.nid,
45
+ pub_key: this.pubKey,
46
+ metadata: this.metadata
47
+ };
48
+ }
49
+ toDict() {
50
+ return { ...this.unsignedDict(), signature: this.signature };
51
+ }
52
+ static fromDict(data) {
53
+ return new _IdentFrame(
54
+ data["nid"],
55
+ data["pub_key"],
56
+ data["metadata"],
57
+ data["signature"]
58
+ );
59
+ }
60
+ };
61
+ var TrustFrame = class _TrustFrame {
62
+ constructor(issuerNid, subjectNid, scopes, expiresAt, signature) {
63
+ this.issuerNid = issuerNid;
64
+ this.subjectNid = subjectNid;
65
+ this.scopes = scopes;
66
+ this.expiresAt = expiresAt;
67
+ this.signature = signature;
68
+ }
69
+ issuerNid;
70
+ subjectNid;
71
+ scopes;
72
+ expiresAt;
73
+ signature;
74
+ frameType = 33 /* TRUST */;
75
+ preferredTier = 1 /* MSGPACK */;
76
+ toDict() {
77
+ return {
78
+ issuer_nid: this.issuerNid,
79
+ subject_nid: this.subjectNid,
80
+ scopes: this.scopes,
81
+ expires_at: this.expiresAt,
82
+ signature: this.signature
83
+ };
84
+ }
85
+ static fromDict(data) {
86
+ return new _TrustFrame(
87
+ data["issuer_nid"],
88
+ data["subject_nid"],
89
+ data["scopes"],
90
+ data["expires_at"],
91
+ data["signature"]
92
+ );
93
+ }
94
+ };
95
+ var RevokeFrame = class _RevokeFrame {
96
+ constructor(nid, reason, revokedAt) {
97
+ this.nid = nid;
98
+ this.reason = reason;
99
+ this.revokedAt = revokedAt;
100
+ }
101
+ nid;
102
+ reason;
103
+ revokedAt;
104
+ frameType = 34 /* REVOKE */;
105
+ preferredTier = 1 /* MSGPACK */;
106
+ toDict() {
107
+ return {
108
+ nid: this.nid,
109
+ reason: this.reason ?? null,
110
+ revoked_at: this.revokedAt ?? null
111
+ };
112
+ }
113
+ static fromDict(data) {
114
+ return new _RevokeFrame(
115
+ data["nid"],
116
+ data["reason"] ?? void 0,
117
+ data["revoked_at"] ?? void 0
118
+ );
119
+ }
120
+ };
121
+ ed25519__namespace.etc.sha512Sync = (...m) => sha512.sha512(ed25519__namespace.etc.concatBytes(...m));
122
+ var KEY_FILE_VERSION = 1;
123
+ var PBKDF2_ITERS = 6e5;
124
+ var SALT_BYTES = 16;
125
+ var IV_BYTES = 12;
126
+ var KEY_BYTES = 32;
127
+ var NipIdentity = class _NipIdentity {
128
+ constructor(_privKey, pubKey) {
129
+ this._privKey = _privKey;
130
+ this.pubKey = pubKey;
131
+ }
132
+ _privKey;
133
+ pubKey;
134
+ // ── Factory ───────────────────────────────────────────────────────────────
135
+ static generate() {
136
+ const priv = ed25519__namespace.utils.randomPrivateKey();
137
+ const pub = ed25519__namespace.getPublicKey(priv);
138
+ return new _NipIdentity(priv, pub);
139
+ }
140
+ static fromPrivateKey(privKey) {
141
+ const pub = ed25519__namespace.getPublicKey(privKey);
142
+ return new _NipIdentity(privKey, pub);
143
+ }
144
+ /** Load from an AES-256-GCM encrypted key file. */
145
+ static load(path, passphrase) {
146
+ const envelope = JSON.parse(fs.readFileSync(path, "utf8"));
147
+ const salt = Buffer.from(envelope.salt, "hex");
148
+ const iv = Buffer.from(envelope.iv, "hex");
149
+ const ct = Buffer.from(envelope.ciphertext, "hex");
150
+ const dk = crypto.pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, "sha256");
151
+ const decipher = crypto.createDecipheriv("aes-256-gcm", dk, iv);
152
+ const authTag = ct.slice(ct.length - 16);
153
+ const body = ct.slice(0, ct.length - 16);
154
+ decipher.setAuthTag(authTag);
155
+ const priv = Buffer.concat([decipher.update(body), decipher.final()]);
156
+ return _NipIdentity.fromPrivateKey(new Uint8Array(priv));
157
+ }
158
+ /** Save to an AES-256-GCM encrypted key file. */
159
+ save(path, passphrase) {
160
+ const salt = crypto.randomBytes(SALT_BYTES);
161
+ const iv = crypto.randomBytes(IV_BYTES);
162
+ const dk = crypto.pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, "sha256");
163
+ const cipher = crypto.createCipheriv("aes-256-gcm", dk, iv);
164
+ const body = Buffer.concat([cipher.update(Buffer.from(this._privKey)), cipher.final()]);
165
+ const tag = cipher.getAuthTag();
166
+ const envelope = {
167
+ version: KEY_FILE_VERSION,
168
+ salt: salt.toString("hex"),
169
+ iv: iv.toString("hex"),
170
+ ciphertext: Buffer.concat([body, tag]).toString("hex"),
171
+ pubKey: Buffer.from(this.pubKey).toString("hex")
172
+ };
173
+ fs.writeFileSync(path, JSON.stringify(envelope, null, 2), "utf8");
174
+ }
175
+ // ── Signing ───────────────────────────────────────────────────────────────
176
+ /** Sign a dict payload. Returns `ed25519:<base64url>`. */
177
+ sign(payload) {
178
+ const canonical = JSON.stringify(payload, Object.keys(payload).sort());
179
+ const bytes = new TextEncoder().encode(canonical);
180
+ const sig = ed25519__namespace.sign(bytes, this._privKey);
181
+ return `ed25519:${Buffer.from(sig).toString("base64")}`;
182
+ }
183
+ /** Verify a signature string against a dict payload. */
184
+ verify(payload, signature) {
185
+ if (!signature.startsWith("ed25519:")) return false;
186
+ try {
187
+ const canonical = JSON.stringify(payload, Object.keys(payload).sort());
188
+ const bytes = new TextEncoder().encode(canonical);
189
+ const sigBytes = Buffer.from(signature.slice("ed25519:".length), "base64");
190
+ return ed25519__namespace.verify(sigBytes, bytes, this.pubKey);
191
+ } catch {
192
+ return false;
193
+ }
194
+ }
195
+ /** Public key as `ed25519:<hex>` string. */
196
+ get pubKeyString() {
197
+ return `ed25519:${Buffer.from(this.pubKey).toString("hex")}`;
198
+ }
199
+ };
200
+
201
+ // src/nip/registry.ts
202
+ function registerNipFrames(registry) {
203
+ registry.register(32 /* IDENT */, IdentFrame);
204
+ registry.register(33 /* TRUST */, TrustFrame);
205
+ registry.register(34 /* REVOKE */, RevokeFrame);
206
+ }
207
+
208
+ exports.IdentFrame = IdentFrame;
209
+ exports.NipIdentity = NipIdentity;
210
+ exports.RevokeFrame = RevokeFrame;
211
+ exports.TrustFrame = TrustFrame;
212
+ exports.registerNipFrames = registerNipFrames;
213
+ //# sourceMappingURL=index.cjs.map
214
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/nip/frames.ts","../../src/nip/identity.ts","../../src/nip/registry.ts"],"names":["ed25519","sha512","readFileSync","pbkdf2Sync","createDecipheriv","randomBytes","createCipheriv","writeFileSync"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright 2026 INNO LOTUS PTY LTD\n// SPDX-License-Identifier: Apache-2.0\n\nimport { EncodingTier, FrameType } from \"../core/frames.js\";\nimport type { NpsFrame } from \"../core/codec.js\";\n\nexport interface IdentMetadata {\n issuer: string;\n issuedAt: string;\n expiresAt?: string;\n capabilities?: readonly string[];\n scopes?: readonly string[];\n}\n\nexport class IdentFrame implements NpsFrame {\n readonly frameType = FrameType.IDENT;\n readonly preferredTier = EncodingTier.MSGPACK;\n\n constructor(\n public readonly nid: string,\n public readonly pubKey: string,\n public readonly metadata: IdentMetadata,\n public readonly signature: string,\n ) {}\n\n unsignedDict(): Record<string, unknown> {\n return {\n nid: this.nid,\n pub_key: this.pubKey,\n metadata: this.metadata,\n };\n }\n\n toDict(): Record<string, unknown> {\n return { ...this.unsignedDict(), signature: this.signature };\n }\n\n static fromDict(data: Record<string, unknown>): IdentFrame {\n return new IdentFrame(\n data[\"nid\"] as string,\n data[\"pub_key\"] as string,\n data[\"metadata\"] as IdentMetadata,\n data[\"signature\"] as string,\n );\n }\n}\n\nexport class TrustFrame implements NpsFrame {\n readonly frameType = FrameType.TRUST;\n readonly preferredTier = EncodingTier.MSGPACK;\n\n constructor(\n public readonly issuerNid: string,\n public readonly subjectNid: string,\n public readonly scopes: readonly string[],\n public readonly expiresAt: string,\n public readonly signature: string,\n ) {}\n\n toDict(): Record<string, unknown> {\n return {\n issuer_nid: this.issuerNid,\n subject_nid: this.subjectNid,\n scopes: this.scopes,\n expires_at: this.expiresAt,\n signature: this.signature,\n };\n }\n\n static fromDict(data: Record<string, unknown>): TrustFrame {\n return new TrustFrame(\n data[\"issuer_nid\"] as string,\n data[\"subject_nid\"] as string,\n data[\"scopes\"] as string[],\n data[\"expires_at\"] as string,\n data[\"signature\"] as string,\n );\n }\n}\n\nexport class RevokeFrame implements NpsFrame {\n readonly frameType = FrameType.REVOKE;\n readonly preferredTier = EncodingTier.MSGPACK;\n\n constructor(\n public readonly nid: string,\n public readonly reason?: string,\n public readonly revokedAt?: string,\n ) {}\n\n toDict(): Record<string, unknown> {\n return {\n nid: this.nid,\n reason: this.reason ?? null,\n revoked_at: this.revokedAt ?? null,\n };\n }\n\n static fromDict(data: Record<string, unknown>): RevokeFrame {\n return new RevokeFrame(\n data[\"nid\"] as string,\n (data[\"reason\"] as string | null) ?? undefined,\n (data[\"revoked_at\"] as string | null) ?? undefined,\n );\n }\n}\n","// Copyright 2026 INNO LOTUS PTY LTD\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * NipIdentity — Ed25519 key management and signing for NPS NID identity.\n * Uses @noble/ed25519 for signing; node:crypto for key storage encryption.\n */\n\nimport * as ed25519 from \"@noble/ed25519\";\nimport { sha512 } from \"@noble/hashes/sha512\";\nimport { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes } from \"node:crypto\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\n\n// noble/ed25519 requires sha512 to be set explicitly in Node environments\ned25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));\n\nconst KEY_FILE_VERSION = 1;\nconst PBKDF2_ITERS = 600_000;\nconst SALT_BYTES = 16;\nconst IV_BYTES = 12;\nconst KEY_BYTES = 32;\n\ninterface KeyFileEnvelope {\n version: number;\n salt: string; // hex\n iv: string; // hex\n ciphertext: string; // hex\n pubKey: string; // hex\n}\n\nexport class NipIdentity {\n private constructor(\n private readonly _privKey: Uint8Array,\n public readonly pubKey: Uint8Array,\n ) {}\n\n // ── Factory ───────────────────────────────────────────────────────────────\n\n static generate(): NipIdentity {\n const priv = ed25519.utils.randomPrivateKey();\n const pub = ed25519.getPublicKey(priv);\n return new NipIdentity(priv, pub);\n }\n\n static fromPrivateKey(privKey: Uint8Array): NipIdentity {\n const pub = ed25519.getPublicKey(privKey);\n return new NipIdentity(privKey, pub);\n }\n\n /** Load from an AES-256-GCM encrypted key file. */\n static load(path: string, passphrase: string): NipIdentity {\n const envelope = JSON.parse(readFileSync(path, \"utf8\")) as KeyFileEnvelope;\n const salt = Buffer.from(envelope.salt, \"hex\");\n const iv = Buffer.from(envelope.iv, \"hex\");\n const ct = Buffer.from(envelope.ciphertext, \"hex\");\n\n const dk = pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, \"sha256\");\n const decipher = createDecipheriv(\"aes-256-gcm\", dk, iv);\n // Last 16 bytes of ciphertext are the GCM auth tag\n const authTag = ct.slice(ct.length - 16);\n const body = ct.slice(0, ct.length - 16);\n (decipher as ReturnType<typeof createDecipheriv> & { setAuthTag(tag: Buffer): void }).setAuthTag(authTag);\n const priv = Buffer.concat([decipher.update(body), decipher.final()]);\n return NipIdentity.fromPrivateKey(new Uint8Array(priv));\n }\n\n /** Save to an AES-256-GCM encrypted key file. */\n save(path: string, passphrase: string): void {\n const salt = randomBytes(SALT_BYTES);\n const iv = randomBytes(IV_BYTES);\n const dk = pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, \"sha256\");\n const cipher = createCipheriv(\"aes-256-gcm\", dk, iv);\n const body = Buffer.concat([cipher.update(Buffer.from(this._privKey)), cipher.final()]);\n const tag = (cipher as ReturnType<typeof createCipheriv> & { getAuthTag(): Buffer }).getAuthTag();\n\n const envelope: KeyFileEnvelope = {\n version: KEY_FILE_VERSION,\n salt: salt.toString(\"hex\"),\n iv: iv.toString(\"hex\"),\n ciphertext: Buffer.concat([body, tag]).toString(\"hex\"),\n pubKey: Buffer.from(this.pubKey).toString(\"hex\"),\n };\n writeFileSync(path, JSON.stringify(envelope, null, 2), \"utf8\");\n }\n\n // ── Signing ───────────────────────────────────────────────────────────────\n\n /** Sign a dict payload. Returns `ed25519:<base64url>`. */\n sign(payload: Record<string, unknown>): string {\n const canonical = JSON.stringify(payload, Object.keys(payload).sort());\n const bytes = new TextEncoder().encode(canonical);\n const sig = ed25519.sign(bytes, this._privKey);\n return `ed25519:${Buffer.from(sig).toString(\"base64\")}`;\n }\n\n /** Verify a signature string against a dict payload. */\n verify(payload: Record<string, unknown>, signature: string): boolean {\n if (!signature.startsWith(\"ed25519:\")) return false;\n try {\n const canonical = JSON.stringify(payload, Object.keys(payload).sort());\n const bytes = new TextEncoder().encode(canonical);\n const sigBytes = Buffer.from(signature.slice(\"ed25519:\".length), \"base64\");\n return ed25519.verify(sigBytes, bytes, this.pubKey);\n } catch {\n return false;\n }\n }\n\n /** Public key as `ed25519:<hex>` string. */\n get pubKeyString(): string {\n return `ed25519:${Buffer.from(this.pubKey).toString(\"hex\")}`;\n }\n}\n","// Copyright 2026 INNO LOTUS PTY LTD\n// SPDX-License-Identifier: Apache-2.0\n\nimport { FrameRegistry } from \"../core/registry.js\";\nimport { FrameType } from \"../core/frames.js\";\nimport { IdentFrame, TrustFrame, RevokeFrame } from \"./frames.js\";\n\nexport function registerNipFrames(registry: FrameRegistry): void {\n registry.register(FrameType.IDENT, IdentFrame);\n registry.register(FrameType.TRUST, TrustFrame);\n registry.register(FrameType.REVOKE, RevokeFrame);\n}\n"]}
@@ -0,0 +1,65 @@
1
+ import { N as NpsFrame, g as FrameType, c as EncodingTier, F as FrameRegistry } from '../codec-CmHeovTV.cjs';
2
+
3
+ interface IdentMetadata {
4
+ issuer: string;
5
+ issuedAt: string;
6
+ expiresAt?: string;
7
+ capabilities?: readonly string[];
8
+ scopes?: readonly string[];
9
+ }
10
+ declare class IdentFrame implements NpsFrame {
11
+ readonly nid: string;
12
+ readonly pubKey: string;
13
+ readonly metadata: IdentMetadata;
14
+ readonly signature: string;
15
+ readonly frameType = FrameType.IDENT;
16
+ readonly preferredTier = EncodingTier.MSGPACK;
17
+ constructor(nid: string, pubKey: string, metadata: IdentMetadata, signature: string);
18
+ unsignedDict(): Record<string, unknown>;
19
+ toDict(): Record<string, unknown>;
20
+ static fromDict(data: Record<string, unknown>): IdentFrame;
21
+ }
22
+ declare class TrustFrame implements NpsFrame {
23
+ readonly issuerNid: string;
24
+ readonly subjectNid: string;
25
+ readonly scopes: readonly string[];
26
+ readonly expiresAt: string;
27
+ readonly signature: string;
28
+ readonly frameType = FrameType.TRUST;
29
+ readonly preferredTier = EncodingTier.MSGPACK;
30
+ constructor(issuerNid: string, subjectNid: string, scopes: readonly string[], expiresAt: string, signature: string);
31
+ toDict(): Record<string, unknown>;
32
+ static fromDict(data: Record<string, unknown>): TrustFrame;
33
+ }
34
+ declare class RevokeFrame implements NpsFrame {
35
+ readonly nid: string;
36
+ readonly reason?: string | undefined;
37
+ readonly revokedAt?: string | undefined;
38
+ readonly frameType = FrameType.REVOKE;
39
+ readonly preferredTier = EncodingTier.MSGPACK;
40
+ constructor(nid: string, reason?: string | undefined, revokedAt?: string | undefined);
41
+ toDict(): Record<string, unknown>;
42
+ static fromDict(data: Record<string, unknown>): RevokeFrame;
43
+ }
44
+
45
+ declare class NipIdentity {
46
+ private readonly _privKey;
47
+ readonly pubKey: Uint8Array;
48
+ private constructor();
49
+ static generate(): NipIdentity;
50
+ static fromPrivateKey(privKey: Uint8Array): NipIdentity;
51
+ /** Load from an AES-256-GCM encrypted key file. */
52
+ static load(path: string, passphrase: string): NipIdentity;
53
+ /** Save to an AES-256-GCM encrypted key file. */
54
+ save(path: string, passphrase: string): void;
55
+ /** Sign a dict payload. Returns `ed25519:<base64url>`. */
56
+ sign(payload: Record<string, unknown>): string;
57
+ /** Verify a signature string against a dict payload. */
58
+ verify(payload: Record<string, unknown>, signature: string): boolean;
59
+ /** Public key as `ed25519:<hex>` string. */
60
+ get pubKeyString(): string;
61
+ }
62
+
63
+ declare function registerNipFrames(registry: FrameRegistry): void;
64
+
65
+ export { IdentFrame, type IdentMetadata, NipIdentity, RevokeFrame, TrustFrame, registerNipFrames };
@@ -0,0 +1,4 @@
1
+ export * from "./frames.js";
2
+ export * from "./identity.js";
3
+ export { registerNipFrames } from "./registry.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nip/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export * from "./frames.js";
4
+ export * from "./identity.js";
5
+ export { registerNipFrames } from "./registry.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nip/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { FrameRegistry } from "../core/registry.js";
2
+ export declare function registerNipFrames(registry: FrameRegistry): void;
3
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/nip/registry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAI/D"}
@@ -0,0 +1,10 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { FrameType } from "../core/frames.js";
4
+ import { IdentFrame, TrustFrame, RevokeFrame } from "./frames.js";
5
+ export function registerNipFrames(registry) {
6
+ registry.register(FrameType.IDENT, IdentFrame);
7
+ registry.register(FrameType.TRUST, TrustFrame);
8
+ registry.register(FrameType.REVOKE, RevokeFrame);
9
+ }
10
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/nip/registry.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAGtC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAAC,QAAuB;IACvD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAG,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAG,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { EncodingTier } from "../core/frames.js";
2
+ import { FrameRegistry } from "../core/registry.js";
3
+ import { TaskState } from "./models.js";
4
+ import type { TaskFrame } from "./frames.js";
5
+ export declare class NopTaskStatus {
6
+ private readonly _raw;
7
+ constructor(_raw: Record<string, unknown>);
8
+ get taskId(): string;
9
+ get state(): TaskState;
10
+ get isTerminal(): boolean;
11
+ get aggregatedResult(): unknown;
12
+ get errorCode(): string | undefined;
13
+ get errorMessage(): string | undefined;
14
+ get nodeResults(): Record<string, unknown>;
15
+ get raw(): Record<string, unknown>;
16
+ toString(): string;
17
+ }
18
+ export declare class NopClient {
19
+ private readonly _baseUrl;
20
+ private readonly _codec;
21
+ private readonly _tier;
22
+ constructor(baseUrl: string, options?: {
23
+ defaultTier?: EncodingTier;
24
+ registry?: FrameRegistry;
25
+ });
26
+ submit(frame: TaskFrame): Promise<string>;
27
+ getStatus(taskId: string): Promise<NopTaskStatus>;
28
+ cancel(taskId: string): Promise<void>;
29
+ wait(taskId: string, options?: {
30
+ pollIntervalMs?: number;
31
+ timeoutMs?: number;
32
+ }): Promise<NopTaskStatus>;
33
+ }
34
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/nop/client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQ7C,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE1D,IAAI,MAAM,IAAc,MAAM,CAAyD;IACvF,IAAI,KAAK,IAAe,SAAS,CAAsD;IACvF,IAAI,UAAU,IAAU,OAAO,CAA6E;IAC5G,IAAI,gBAAgB,IAAI,OAAO,CAAuD;IACtF,IAAI,SAAS,IAAW,MAAM,GAAG,SAAS,CAAwE;IAClH,IAAI,YAAY,IAAQ,MAAM,GAAG,SAAS,CAAwE;IAClH,IAAI,WAAW,IAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAqF;IACpI,IAAI,GAAG,IAAiB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAsB;IAErE,QAAQ,IAAI,MAAM;CAGnB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;gBAGtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,YAAY,CAAC;QAAC,QAAQ,CAAC,EAAE,aAAa,CAAA;KAAO;IAclE,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAYzC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAQjD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrC,IAAI,CACR,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAC5D,OAAO,CAAC,aAAa,CAAC;CAgB1B"}