@labacacia/nps-sdk 1.0.0-alpha.1 → 1.0.0-alpha.13

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 (452) hide show
  1. package/CHANGELOG.cn.md +181 -0
  2. package/CHANGELOG.md +234 -0
  3. package/LICENSE +0 -0
  4. package/NOTICE +0 -0
  5. package/README.cn.md +163 -0
  6. package/README.md +16 -6
  7. package/dist/core/anchor-cache.d.ts +0 -0
  8. package/dist/core/anchor-cache.d.ts.map +0 -0
  9. package/dist/core/anchor-cache.js +0 -0
  10. package/dist/core/anchor-cache.js.map +0 -0
  11. package/dist/core/cache.d.ts +0 -0
  12. package/dist/core/cache.d.ts.map +0 -0
  13. package/dist/core/cache.js +0 -0
  14. package/dist/core/cache.js.map +0 -0
  15. package/dist/core/canonical-json.d.ts +0 -0
  16. package/dist/core/canonical-json.d.ts.map +0 -0
  17. package/dist/core/canonical-json.js +0 -0
  18. package/dist/core/canonical-json.js.map +0 -0
  19. package/dist/core/codec.d.ts +0 -0
  20. package/dist/core/codec.d.ts.map +0 -0
  21. package/dist/core/codec.js +0 -0
  22. package/dist/core/codec.js.map +0 -0
  23. package/dist/core/codecs/index.d.ts +0 -0
  24. package/dist/core/codecs/index.d.ts.map +0 -0
  25. package/dist/core/codecs/index.js +0 -0
  26. package/dist/core/codecs/index.js.map +0 -0
  27. package/dist/core/codecs/ncp-codec.d.ts +0 -0
  28. package/dist/core/codecs/ncp-codec.d.ts.map +0 -0
  29. package/dist/core/codecs/ncp-codec.js +0 -0
  30. package/dist/core/codecs/ncp-codec.js.map +0 -0
  31. package/dist/core/codecs/tier1-json-codec.d.ts +0 -0
  32. package/dist/core/codecs/tier1-json-codec.d.ts.map +0 -0
  33. package/dist/core/codecs/tier1-json-codec.js +0 -0
  34. package/dist/core/codecs/tier1-json-codec.js.map +0 -0
  35. package/dist/core/codecs/tier2-msgpack-codec.d.ts +0 -0
  36. package/dist/core/codecs/tier2-msgpack-codec.d.ts.map +0 -0
  37. package/dist/core/codecs/tier2-msgpack-codec.js +0 -0
  38. package/dist/core/codecs/tier2-msgpack-codec.js.map +0 -0
  39. package/dist/core/crypto-provider.d.ts +0 -0
  40. package/dist/core/crypto-provider.d.ts.map +0 -0
  41. package/dist/core/crypto-provider.js +0 -0
  42. package/dist/core/crypto-provider.js.map +0 -0
  43. package/dist/core/exceptions.d.ts +0 -0
  44. package/dist/core/exceptions.d.ts.map +0 -0
  45. package/dist/core/exceptions.js +0 -0
  46. package/dist/core/exceptions.js.map +0 -0
  47. package/dist/core/frame-header.d.ts +1 -0
  48. package/dist/core/frame-header.d.ts.map +1 -1
  49. package/dist/core/frame-header.js +1 -0
  50. package/dist/core/frame-header.js.map +1 -1
  51. package/dist/core/frame-registry.d.ts +0 -0
  52. package/dist/core/frame-registry.d.ts.map +1 -1
  53. package/dist/core/frame-registry.js +1 -0
  54. package/dist/core/frame-registry.js.map +1 -1
  55. package/dist/core/frames.d.ts +3 -0
  56. package/dist/core/frames.d.ts.map +1 -1
  57. package/dist/core/frames.js +3 -0
  58. package/dist/core/frames.js.map +1 -1
  59. package/dist/core/index.d.ts +6 -4
  60. package/dist/core/index.d.ts.map +1 -1
  61. package/dist/core/index.js +17 -5
  62. package/dist/core/index.js.map +1 -1
  63. package/dist/core/registry.d.ts +0 -0
  64. package/dist/core/registry.d.ts.map +0 -0
  65. package/dist/core/registry.js +0 -0
  66. package/dist/core/registry.js.map +0 -0
  67. package/dist/core/status-codes.d.ts +20 -0
  68. package/dist/core/status-codes.d.ts.map +1 -1
  69. package/dist/core/status-codes.js +51 -0
  70. package/dist/core/status-codes.js.map +1 -1
  71. package/dist/index.d.ts +1 -1
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +1 -1
  74. package/dist/index.js.map +1 -1
  75. package/dist/ncp/frames/anchor-frame.d.ts +0 -0
  76. package/dist/ncp/frames/anchor-frame.d.ts.map +0 -0
  77. package/dist/ncp/frames/anchor-frame.js +0 -0
  78. package/dist/ncp/frames/anchor-frame.js.map +0 -0
  79. package/dist/ncp/frames/caps-frame.d.ts +0 -0
  80. package/dist/ncp/frames/caps-frame.d.ts.map +0 -0
  81. package/dist/ncp/frames/caps-frame.js +0 -0
  82. package/dist/ncp/frames/caps-frame.js.map +0 -0
  83. package/dist/ncp/frames/diff-frame.d.ts +0 -0
  84. package/dist/ncp/frames/diff-frame.d.ts.map +0 -0
  85. package/dist/ncp/frames/diff-frame.js +0 -0
  86. package/dist/ncp/frames/diff-frame.js.map +0 -0
  87. package/dist/ncp/frames/error-frame.d.ts +0 -0
  88. package/dist/ncp/frames/error-frame.d.ts.map +0 -0
  89. package/dist/ncp/frames/error-frame.js +0 -0
  90. package/dist/ncp/frames/error-frame.js.map +0 -0
  91. package/dist/ncp/frames/hello-frame.d.ts +0 -0
  92. package/dist/ncp/frames/hello-frame.d.ts.map +0 -0
  93. package/dist/ncp/frames/hello-frame.js +0 -0
  94. package/dist/ncp/frames/hello-frame.js.map +0 -0
  95. package/dist/ncp/frames/stream-frame.d.ts +0 -0
  96. package/dist/ncp/frames/stream-frame.d.ts.map +0 -0
  97. package/dist/ncp/frames/stream-frame.js +0 -0
  98. package/dist/ncp/frames/stream-frame.js.map +0 -0
  99. package/dist/ncp/frames.d.ts +25 -0
  100. package/dist/ncp/frames.d.ts.map +1 -1
  101. package/dist/ncp/frames.js +61 -0
  102. package/dist/ncp/frames.js.map +1 -1
  103. package/dist/ncp/handshake.d.ts +0 -0
  104. package/dist/ncp/handshake.d.ts.map +0 -0
  105. package/dist/ncp/handshake.js +0 -0
  106. package/dist/ncp/handshake.js.map +0 -0
  107. package/dist/ncp/index.d.ts +1 -0
  108. package/dist/ncp/index.d.ts.map +1 -1
  109. package/dist/ncp/index.js +1 -0
  110. package/dist/ncp/index.js.map +1 -1
  111. package/dist/ncp/ncp-error-codes.d.ts +5 -0
  112. package/dist/ncp/ncp-error-codes.d.ts.map +1 -1
  113. package/dist/ncp/ncp-error-codes.js +27 -0
  114. package/dist/ncp/ncp-error-codes.js.map +1 -1
  115. package/dist/ncp/ncp-patch-format.d.ts +0 -0
  116. package/dist/ncp/ncp-patch-format.d.ts.map +0 -0
  117. package/dist/ncp/ncp-patch-format.js +0 -0
  118. package/dist/ncp/ncp-patch-format.js.map +0 -0
  119. package/dist/ncp/preamble.d.ts +47 -0
  120. package/dist/ncp/preamble.d.ts.map +1 -0
  121. package/dist/ncp/preamble.js +74 -0
  122. package/dist/ncp/preamble.js.map +1 -0
  123. package/dist/ncp/registry.d.ts +0 -0
  124. package/dist/ncp/registry.d.ts.map +1 -1
  125. package/dist/ncp/registry.js +2 -1
  126. package/dist/ncp/registry.js.map +1 -1
  127. package/dist/ncp/stream-manager.d.ts +0 -0
  128. package/dist/ncp/stream-manager.d.ts.map +0 -0
  129. package/dist/ncp/stream-manager.js +0 -0
  130. package/dist/ncp/stream-manager.js.map +0 -0
  131. package/dist/ndp/dns-txt.d.ts +35 -0
  132. package/dist/ndp/dns-txt.d.ts.map +1 -0
  133. package/dist/ndp/dns-txt.js +67 -0
  134. package/dist/ndp/dns-txt.js.map +1 -0
  135. package/dist/ndp/frames.d.ts +34 -9
  136. package/dist/ndp/frames.d.ts.map +1 -1
  137. package/dist/ndp/frames.js +54 -15
  138. package/dist/ndp/frames.js.map +1 -1
  139. package/dist/ndp/index.d.ts +3 -0
  140. package/dist/ndp/index.d.ts.map +1 -1
  141. package/dist/ndp/index.js +3 -0
  142. package/dist/ndp/index.js.map +1 -1
  143. package/dist/ndp/ndp-error-codes.d.ts +25 -0
  144. package/dist/ndp/ndp-error-codes.d.ts.map +1 -0
  145. package/dist/ndp/ndp-error-codes.js +48 -0
  146. package/dist/ndp/ndp-error-codes.js.map +1 -0
  147. package/dist/ndp/ndp-registry.d.ts +2 -0
  148. package/dist/ndp/ndp-registry.d.ts.map +1 -1
  149. package/dist/ndp/ndp-registry.js +25 -0
  150. package/dist/ndp/ndp-registry.js.map +1 -1
  151. package/dist/ndp/registry.d.ts +0 -0
  152. package/dist/ndp/registry.d.ts.map +0 -0
  153. package/dist/ndp/registry.js +0 -0
  154. package/dist/ndp/registry.js.map +0 -0
  155. package/dist/ndp/security.d.ts +8 -0
  156. package/dist/ndp/security.d.ts.map +1 -0
  157. package/dist/ndp/security.js +9 -0
  158. package/dist/ndp/security.js.map +1 -0
  159. package/dist/ndp/validator.d.ts +0 -0
  160. package/dist/ndp/validator.d.ts.map +0 -0
  161. package/dist/ndp/validator.js +0 -0
  162. package/dist/ndp/validator.js.map +0 -0
  163. package/dist/nip/acme/client.d.ts +31 -0
  164. package/dist/nip/acme/client.d.ts.map +1 -0
  165. package/dist/nip/acme/client.js +136 -0
  166. package/dist/nip/acme/client.js.map +1 -0
  167. package/dist/nip/acme/index.d.ts +6 -0
  168. package/dist/nip/acme/index.d.ts.map +1 -0
  169. package/dist/nip/acme/index.js +8 -0
  170. package/dist/nip/acme/index.js.map +1 -0
  171. package/dist/nip/acme/jws.d.ts +31 -0
  172. package/dist/nip/acme/jws.d.ts.map +1 -0
  173. package/dist/nip/acme/jws.js +76 -0
  174. package/dist/nip/acme/jws.js.map +1 -0
  175. package/dist/nip/acme/messages.d.ts +71 -0
  176. package/dist/nip/acme/messages.d.ts.map +1 -0
  177. package/dist/nip/acme/messages.js +4 -0
  178. package/dist/nip/acme/messages.js.map +1 -0
  179. package/dist/nip/acme/server.d.ts +41 -0
  180. package/dist/nip/acme/server.d.ts.map +1 -0
  181. package/dist/nip/acme/server.js +458 -0
  182. package/dist/nip/acme/server.js.map +1 -0
  183. package/dist/nip/acme/wire.d.ts +19 -0
  184. package/dist/nip/acme/wire.d.ts.map +1 -0
  185. package/dist/nip/acme/wire.js +21 -0
  186. package/dist/nip/acme/wire.js.map +1 -0
  187. package/dist/nip/assurance-level.d.ts +19 -0
  188. package/dist/nip/assurance-level.d.ts.map +1 -0
  189. package/dist/nip/assurance-level.js +38 -0
  190. package/dist/nip/assurance-level.js.map +1 -0
  191. package/dist/nip/cert-format.d.ts +5 -0
  192. package/dist/nip/cert-format.d.ts.map +1 -0
  193. package/dist/nip/cert-format.js +6 -0
  194. package/dist/nip/cert-format.js.map +1 -0
  195. package/dist/nip/error-codes.d.ts +44 -0
  196. package/dist/nip/error-codes.d.ts.map +1 -0
  197. package/dist/nip/error-codes.js +97 -0
  198. package/dist/nip/error-codes.js.map +1 -0
  199. package/dist/nip/frames.d.ts +19 -1
  200. package/dist/nip/frames.d.ts.map +1 -1
  201. package/dist/nip/frames.js +39 -4
  202. package/dist/nip/frames.js.map +1 -1
  203. package/dist/nip/identity.d.ts +0 -0
  204. package/dist/nip/identity.d.ts.map +0 -0
  205. package/dist/nip/identity.js +0 -0
  206. package/dist/nip/identity.js.map +0 -0
  207. package/dist/nip/index.d.ts +7 -0
  208. package/dist/nip/index.d.ts.map +1 -1
  209. package/dist/nip/index.js +9 -0
  210. package/dist/nip/index.js.map +1 -1
  211. package/dist/nip/registry.d.ts +0 -0
  212. package/dist/nip/registry.d.ts.map +0 -0
  213. package/dist/nip/registry.js +0 -0
  214. package/dist/nip/registry.js.map +0 -0
  215. package/dist/nip/reputation-client.d.ts +116 -0
  216. package/dist/nip/reputation-client.d.ts.map +1 -0
  217. package/dist/nip/reputation-client.js +261 -0
  218. package/dist/nip/reputation-client.js.map +1 -0
  219. package/dist/nip/verifier.d.ts +23 -0
  220. package/dist/nip/verifier.d.ts.map +1 -0
  221. package/dist/nip/verifier.js +90 -0
  222. package/dist/nip/verifier.js.map +1 -0
  223. package/dist/nip/x509/builder.d.ts +35 -0
  224. package/dist/nip/x509/builder.d.ts.map +1 -0
  225. package/dist/nip/x509/builder.js +59 -0
  226. package/dist/nip/x509/builder.js.map +1 -0
  227. package/dist/nip/x509/index.d.ts +4 -0
  228. package/dist/nip/x509/index.d.ts.map +1 -0
  229. package/dist/nip/x509/index.js +6 -0
  230. package/dist/nip/x509/index.js.map +1 -0
  231. package/dist/nip/x509/oids.d.ts +16 -0
  232. package/dist/nip/x509/oids.d.ts.map +1 -0
  233. package/dist/nip/x509/oids.js +22 -0
  234. package/dist/nip/x509/oids.js.map +1 -0
  235. package/dist/nip/x509/verifier.d.ts +26 -0
  236. package/dist/nip/x509/verifier.d.ts.map +1 -0
  237. package/dist/nip/x509/verifier.js +171 -0
  238. package/dist/nip/x509/verifier.js.map +1 -0
  239. package/dist/nop/client.d.ts +0 -0
  240. package/dist/nop/client.d.ts.map +0 -0
  241. package/dist/nop/client.js +0 -0
  242. package/dist/nop/client.js.map +1 -1
  243. package/dist/nop/dag-validator.d.ts +15 -0
  244. package/dist/nop/dag-validator.d.ts.map +1 -0
  245. package/dist/nop/dag-validator.js +91 -0
  246. package/dist/nop/dag-validator.js.map +1 -0
  247. package/dist/nop/frames.d.ts +8 -3
  248. package/dist/nop/frames.d.ts.map +1 -1
  249. package/dist/nop/frames.js +21 -6
  250. package/dist/nop/frames.js.map +1 -1
  251. package/dist/nop/index.d.ts +3 -0
  252. package/dist/nop/index.d.ts.map +1 -1
  253. package/dist/nop/index.js +3 -0
  254. package/dist/nop/index.js.map +1 -1
  255. package/dist/nop/models.d.ts +13 -2
  256. package/dist/nop/models.d.ts.map +1 -1
  257. package/dist/nop/models.js +9 -0
  258. package/dist/nop/models.js.map +1 -1
  259. package/dist/nop/nop-error-codes.d.ts +31 -0
  260. package/dist/nop/nop-error-codes.d.ts.map +1 -0
  261. package/dist/nop/nop-error-codes.js +61 -0
  262. package/dist/nop/nop-error-codes.js.map +1 -0
  263. package/dist/nop/nop-types.d.ts +0 -0
  264. package/dist/nop/nop-types.d.ts.map +0 -0
  265. package/dist/nop/nop-types.js +0 -0
  266. package/dist/nop/nop-types.js.map +0 -0
  267. package/dist/nop/orchestrator.d.ts +66 -0
  268. package/dist/nop/orchestrator.d.ts.map +1 -0
  269. package/dist/nop/orchestrator.js +229 -0
  270. package/dist/nop/orchestrator.js.map +1 -0
  271. package/dist/nop/registry.d.ts +0 -0
  272. package/dist/nop/registry.d.ts.map +0 -0
  273. package/dist/nop/registry.js +0 -0
  274. package/dist/nop/registry.js.map +0 -0
  275. package/dist/nwp/anchor-client.d.ts +109 -0
  276. package/dist/nwp/anchor-client.d.ts.map +1 -0
  277. package/dist/nwp/anchor-client.js +279 -0
  278. package/dist/nwp/anchor-client.js.map +1 -0
  279. package/dist/nwp/anchor-server.d.ts +127 -0
  280. package/dist/nwp/anchor-server.d.ts.map +1 -0
  281. package/dist/nwp/anchor-server.js +649 -0
  282. package/dist/nwp/anchor-server.js.map +1 -0
  283. package/dist/nwp/bridge.d.ts +24 -0
  284. package/dist/nwp/bridge.d.ts.map +1 -0
  285. package/dist/nwp/bridge.js +26 -0
  286. package/dist/nwp/bridge.js.map +1 -0
  287. package/dist/nwp/cgn.d.ts +19 -0
  288. package/dist/nwp/cgn.d.ts.map +1 -0
  289. package/dist/nwp/cgn.js +29 -0
  290. package/dist/nwp/cgn.js.map +1 -0
  291. package/dist/nwp/client.d.ts +10 -3
  292. package/dist/nwp/client.d.ts.map +1 -1
  293. package/dist/nwp/client.js +58 -7
  294. package/dist/nwp/client.js.map +1 -1
  295. package/dist/nwp/frames.d.ts +56 -2
  296. package/dist/nwp/frames.d.ts.map +1 -1
  297. package/dist/nwp/frames.js +86 -4
  298. package/dist/nwp/frames.js.map +1 -1
  299. package/dist/nwp/http-headers.d.ts +24 -0
  300. package/dist/nwp/http-headers.d.ts.map +1 -0
  301. package/dist/nwp/http-headers.js +29 -0
  302. package/dist/nwp/http-headers.js.map +1 -0
  303. package/dist/nwp/index.d.ts +9 -0
  304. package/dist/nwp/index.d.ts.map +1 -1
  305. package/dist/nwp/index.js +9 -0
  306. package/dist/nwp/index.js.map +1 -1
  307. package/dist/nwp/manifest.d.ts +75 -0
  308. package/dist/nwp/manifest.d.ts.map +1 -0
  309. package/dist/nwp/manifest.js +5 -0
  310. package/dist/nwp/manifest.js.map +1 -0
  311. package/dist/nwp/memory-node-server.d.ts +70 -0
  312. package/dist/nwp/memory-node-server.d.ts.map +1 -0
  313. package/dist/nwp/memory-node-server.js +315 -0
  314. package/dist/nwp/memory-node-server.js.map +1 -0
  315. package/dist/nwp/nwp-error-codes.d.ts +48 -0
  316. package/dist/nwp/nwp-error-codes.d.ts.map +1 -0
  317. package/dist/nwp/nwp-error-codes.js +108 -0
  318. package/dist/nwp/nwp-error-codes.js.map +1 -0
  319. package/dist/nwp/registry.d.ts +0 -0
  320. package/dist/nwp/registry.d.ts.map +0 -0
  321. package/dist/nwp/registry.js +0 -0
  322. package/dist/nwp/registry.js.map +0 -0
  323. package/dist/nwp/reputation.d.ts +37 -0
  324. package/dist/nwp/reputation.d.ts.map +1 -0
  325. package/dist/nwp/reputation.js +118 -0
  326. package/dist/nwp/reputation.js.map +1 -0
  327. package/dist/setup.d.ts +0 -0
  328. package/dist/setup.d.ts.map +0 -0
  329. package/dist/setup.js +0 -0
  330. package/dist/setup.js.map +0 -0
  331. package/doc/nps-sdk.core.cn.md +321 -0
  332. package/doc/nps-sdk.core.md +326 -0
  333. package/doc/nps-sdk.ncp.cn.md +270 -0
  334. package/doc/nps-sdk.ncp.md +276 -0
  335. package/doc/nps-sdk.ndp.cn.md +267 -0
  336. package/doc/nps-sdk.ndp.md +273 -0
  337. package/doc/nps-sdk.nip.cn.md +265 -0
  338. package/doc/nps-sdk.nip.md +272 -0
  339. package/doc/nps-sdk.nop.cn.md +329 -0
  340. package/doc/nps-sdk.nop.md +332 -0
  341. package/doc/nps-sdk.nwp.cn.md +288 -0
  342. package/doc/nps-sdk.nwp.md +295 -0
  343. package/doc/overview.cn.md +149 -0
  344. package/doc/overview.md +153 -0
  345. package/package.json +33 -4
  346. package/CONTRIBUTING.md +0 -33
  347. package/dist/codec-CmHeovTV.d.cts +0 -120
  348. package/dist/codec-CmHeovTV.d.ts +0 -120
  349. package/dist/core/index.cjs +0 -371
  350. package/dist/core/index.cjs.map +0 -1
  351. package/dist/core/index.d.cts +0 -41
  352. package/dist/frames-B3qLdl_g.d.cts +0 -77
  353. package/dist/frames-Ff7-ZPUl.d.ts +0 -77
  354. package/dist/index.cjs +0 -1556
  355. package/dist/index.cjs.map +0 -1
  356. package/dist/index.d.cts +0 -21
  357. package/dist/ncp/index.cjs +0 -188
  358. package/dist/ncp/index.cjs.map +0 -1
  359. package/dist/ncp/index.d.cts +0 -6
  360. package/dist/ndp/index.cjs +0 -252
  361. package/dist/ndp/index.cjs.map +0 -1
  362. package/dist/ndp/index.d.cts +0 -86
  363. package/dist/nip/index.cjs +0 -214
  364. package/dist/nip/index.cjs.map +0 -1
  365. package/dist/nip/index.d.cts +0 -65
  366. package/dist/nop/index.cjs +0 -762
  367. package/dist/nop/index.cjs.map +0 -1
  368. package/dist/nop/index.d.cts +0 -155
  369. package/dist/nwp/index.cjs +0 -658
  370. package/dist/nwp/index.cjs.map +0 -1
  371. package/dist/nwp/index.d.cts +0 -65
  372. package/nip-ca-server/Dockerfile +0 -27
  373. package/nip-ca-server/README.md +0 -45
  374. package/nip-ca-server/db/001_init.sql +0 -25
  375. package/nip-ca-server/docker-compose.yml +0 -29
  376. package/nip-ca-server/package.json +0 -23
  377. package/nip-ca-server/src/ca.ts +0 -155
  378. package/nip-ca-server/src/db.ts +0 -104
  379. package/nip-ca-server/src/index.ts +0 -157
  380. package/nip-ca-server/tsconfig.json +0 -13
  381. package/src/core/anchor-cache.ts +0 -129
  382. package/src/core/cache.ts +0 -93
  383. package/src/core/canonical-json.ts +0 -50
  384. package/src/core/codec.ts +0 -158
  385. package/src/core/codecs/index.ts +0 -5
  386. package/src/core/codecs/ncp-codec.ts +0 -170
  387. package/src/core/codecs/tier1-json-codec.ts +0 -33
  388. package/src/core/codecs/tier2-msgpack-codec.ts +0 -30
  389. package/src/core/crypto-provider.ts +0 -47
  390. package/src/core/exceptions.ts +0 -57
  391. package/src/core/frame-header.ts +0 -282
  392. package/src/core/frame-registry.ts +0 -91
  393. package/src/core/frames.ts +0 -183
  394. package/src/core/index.ts +0 -10
  395. package/src/core/registry.ts +0 -28
  396. package/src/core/status-codes.ts +0 -46
  397. package/src/index.ts +0 -10
  398. package/src/ncp/frames/anchor-frame.ts +0 -87
  399. package/src/ncp/frames/caps-frame.ts +0 -59
  400. package/src/ncp/frames/diff-frame.ts +0 -69
  401. package/src/ncp/frames/error-frame.ts +0 -26
  402. package/src/ncp/frames/hello-frame.ts +0 -50
  403. package/src/ncp/frames/stream-frame.ts +0 -35
  404. package/src/ncp/frames.ts +0 -199
  405. package/src/ncp/handshake.ts +0 -95
  406. package/src/ncp/index.ts +0 -12
  407. package/src/ncp/ncp-error-codes.ts +0 -34
  408. package/src/ncp/ncp-patch-format.ts +0 -16
  409. package/src/ncp/registry.ts +0 -14
  410. package/src/ncp/stream-manager.ts +0 -212
  411. package/src/ndp/frames.ts +0 -124
  412. package/src/ndp/index.ts +0 -7
  413. package/src/ndp/ndp-registry.ts +0 -82
  414. package/src/ndp/registry.ts +0 -12
  415. package/src/ndp/validator.ts +0 -64
  416. package/src/nip/frames.ts +0 -106
  417. package/src/nip/identity.ts +0 -113
  418. package/src/nip/index.ts +0 -6
  419. package/src/nip/registry.ts +0 -12
  420. package/src/nop/client.ts +0 -103
  421. package/src/nop/frames.ts +0 -181
  422. package/src/nop/index.ts +0 -7
  423. package/src/nop/models.ts +0 -79
  424. package/src/nop/nop-types.ts +0 -208
  425. package/src/nop/registry.ts +0 -13
  426. package/src/nwp/client.ts +0 -114
  427. package/src/nwp/frames.ts +0 -116
  428. package/src/nwp/index.ts +0 -6
  429. package/src/nwp/registry.ts +0 -11
  430. package/src/setup.ts +0 -32
  431. package/tests/core/anchor-cache.test.ts +0 -242
  432. package/tests/core/codec.test.ts +0 -205
  433. package/tests/core/frame-registry.test.ts +0 -46
  434. package/tests/core.test.ts +0 -327
  435. package/tests/ncp/diff-binary-bitset.test.ts +0 -107
  436. package/tests/ncp/e2e-enc-reject.test.ts +0 -93
  437. package/tests/ncp/err-error-frame.test.ts +0 -152
  438. package/tests/ncp/frames.test.ts +0 -359
  439. package/tests/ncp/framing.test.ts +0 -233
  440. package/tests/ncp/hello-frame.test.ts +0 -122
  441. package/tests/ncp/inline-anchor.test.ts +0 -88
  442. package/tests/ncp/security.test.ts +0 -184
  443. package/tests/ncp/stream-window.test.ts +0 -167
  444. package/tests/ncp/stream.test.ts +0 -242
  445. package/tests/ncp/version-negotiation.test.ts +0 -123
  446. package/tests/ndp.test.ts +0 -271
  447. package/tests/nip.test.ts +0 -184
  448. package/tests/nop.test.ts +0 -344
  449. package/tests/nwp.test.ts +0 -237
  450. package/tsconfig.json +0 -20
  451. package/tsup.config.ts +0 -20
  452. package/vitest.config.ts +0 -10
@@ -1,157 +0,0 @@
1
- // Copyright 2026 INNO LOTUS PTY LTD
2
- // SPDX-License-Identifier: Apache-2.0
3
- import * as crypto from "node:crypto";
4
- import * as fs from "node:fs";
5
- import Fastify from "fastify";
6
- import { CaDb } from "./db.js";
7
- import * as ca from "./ca.js";
8
-
9
- // ── Config ────────────────────────────────────────────────────────────────────
10
- const CA_NID = process.env["NIP_CA_NID"]!;
11
- const CA_PASSPHRASE = process.env["NIP_CA_PASSPHRASE"]!;
12
- const CA_BASE_URL = (process.env["NIP_CA_BASE_URL"] ?? "").replace(/\/$/, "");
13
- const KEY_FILE = process.env["NIP_CA_KEY_FILE"] ?? "/data/ca.key.enc";
14
- const DB_PATH = process.env["NIP_CA_DB_PATH"] ?? "/data/ca.db";
15
- const DISPLAY_NAME = process.env["NIP_CA_DISPLAY_NAME"] ?? "NPS CA";
16
- const AGENT_DAYS = parseInt(process.env["NIP_CA_AGENT_VALIDITY_DAYS"] ?? "30");
17
- const NODE_DAYS = parseInt(process.env["NIP_CA_NODE_VALIDITY_DAYS"] ?? "90");
18
- const RENEWAL_DAYS = parseInt(process.env["NIP_CA_RENEWAL_WINDOW_DAYS"] ?? "7");
19
- const PORT = parseInt(process.env["PORT"] ?? "17440");
20
-
21
- for (const k of ["NIP_CA_NID", "NIP_CA_PASSPHRASE", "NIP_CA_BASE_URL"]) {
22
- if (!process.env[k]) throw new Error(`${k} is required`);
23
- }
24
-
25
- const CA_DOMAIN = CA_NID.split(":").slice(-2)[0] ?? "ca.local";
26
-
27
- // ── Bootstrap ─────────────────────────────────────────────────────────────────
28
- let caPriv: crypto.KeyObject;
29
- let caPubStr: string;
30
-
31
- if (!fs.existsSync(KEY_FILE)) {
32
- caPriv = ca.generateKey();
33
- ca.saveKey(caPriv, KEY_FILE, CA_PASSPHRASE);
34
- } else {
35
- caPriv = ca.loadKey(KEY_FILE, CA_PASSPHRASE);
36
- }
37
- caPubStr = ca.pubKeyString(crypto.createPublicKey(caPriv));
38
-
39
- const db = new CaDb(DB_PATH);
40
-
41
- // ── Server ─────────────────────────────────────────────────────────────────────
42
- const app = Fastify({ logger: true });
43
-
44
- // ── Helpers ────────────────────────────────────────────────────────────────────
45
- function register(
46
- body: { nid?: string; pub_key: string; capabilities?: string[]; scope?: object; metadata?: object },
47
- entityType: string,
48
- validityDays: number,
49
- reply: any,
50
- ): void {
51
- const nid = body.nid ?? ca.generateNid(CA_DOMAIN, entityType);
52
- if (db.getActive(nid)) {
53
- reply.code(409).send({ error_code: "NIP-CA-NID-ALREADY-EXISTS",
54
- message: `${nid} already has an active certificate` });
55
- return;
56
- }
57
- const serial = db.nextSerial();
58
- const cert = ca.issueCert(caPriv, CA_NID, nid, body.pub_key,
59
- body.capabilities ?? [], body.scope as any ?? {}, validityDays, serial,
60
- (body as any).metadata ?? null);
61
- db.insert({ nid, entity_type: entityType, serial, pub_key: body.pub_key,
62
- capabilities: body.capabilities ?? [], scope: body.scope as any ?? {},
63
- issued_by: CA_NID, issued_at: cert.issued_at, expires_at: cert.expires_at,
64
- metadata: (body as any).metadata ?? null });
65
- reply.code(201).send({ nid, serial, issued_at: cert.issued_at,
66
- expires_at: cert.expires_at, ident_frame: cert });
67
- }
68
-
69
- // ── Routes ─────────────────────────────────────────────────────────────────────
70
- app.post("/v1/agents/register", async (req, reply) => {
71
- register(req.body as any, "agent", AGENT_DAYS, reply);
72
- });
73
-
74
- app.post("/v1/nodes/register", async (req, reply) => {
75
- register(req.body as any, "node", NODE_DAYS, reply);
76
- });
77
-
78
- app.post<{ Params: { "*": string } }>("/v1/agents/*", async (req, reply) => {
79
- const parts = (req.params["*"] as string).split("/");
80
- const action = parts.pop();
81
- const nid = parts.join("/");
82
-
83
- if (action === "renew") {
84
- const rec = db.getActive(nid);
85
- if (!rec) return reply.code(404).send({ error_code: "NIP-CA-NID-NOT-FOUND", message: `${nid} not found` });
86
- const expMs = new Date(rec.expires_at).getTime();
87
- const daysLeft = Math.floor((expMs - Date.now()) / 86400_000);
88
- if (daysLeft > RENEWAL_DAYS)
89
- return reply.code(400).send({ error_code: "NIP-CA-RENEWAL-TOO-EARLY",
90
- message: `Renewal window opens in ${daysLeft - RENEWAL_DAYS} days` });
91
- const serial = db.nextSerial();
92
- const days = rec.entity_type === "agent" ? AGENT_DAYS : NODE_DAYS;
93
- const cert = ca.issueCert(caPriv, CA_NID, nid, rec.pub_key,
94
- rec.capabilities, rec.scope, days, serial, rec.metadata);
95
- db.insert({ nid, entity_type: rec.entity_type, serial, pub_key: rec.pub_key,
96
- capabilities: rec.capabilities, scope: rec.scope,
97
- issued_by: CA_NID, issued_at: cert.issued_at, expires_at: cert.expires_at,
98
- metadata: rec.metadata });
99
- return reply.send({ nid, serial, issued_at: cert.issued_at,
100
- expires_at: cert.expires_at, ident_frame: cert });
101
- }
102
-
103
- if (action === "revoke") {
104
- const body = req.body as any;
105
- if (!db.revoke(nid, body?.reason ?? "cessation_of_operation"))
106
- return reply.code(404).send({ error_code: "NIP-CA-NID-NOT-FOUND",
107
- message: `${nid} not found or already revoked` });
108
- return reply.send({ nid, revoked_at: new Date().toISOString().replace(/\.\d{3}Z$/, "Z"),
109
- reason: body?.reason ?? "cessation_of_operation" });
110
- }
111
-
112
- reply.code(404).send({ message: "Not found" });
113
- });
114
-
115
- app.get<{ Params: { "*": string } }>("/v1/agents/*", async (req, reply) => {
116
- const parts = (req.params["*"] as string).split("/");
117
- const action = parts.pop();
118
- const nid = parts.join("/");
119
-
120
- if (action === "verify") {
121
- const rec = db.getActive(nid);
122
- if (!rec) return reply.code(404).send({ error_code: "NIP-CA-NID-NOT-FOUND", message: `${nid} not found` });
123
- const valid = new Date(rec.expires_at).getTime() > Date.now();
124
- return reply.send({ valid, nid, entity_type: rec.entity_type, pub_key: rec.pub_key,
125
- capabilities: rec.capabilities, issued_by: rec.issued_by,
126
- issued_at: rec.issued_at, expires_at: rec.expires_at, serial: rec.serial,
127
- error_code: valid ? null : "NIP-CERT-EXPIRED" });
128
- }
129
- reply.code(404).send({ message: "Not found" });
130
- });
131
-
132
- app.get("/v1/ca/cert", async (_req, reply) =>
133
- reply.send({ nid: CA_NID, display_name: DISPLAY_NAME, pub_key: caPubStr, algorithm: "ed25519" }));
134
-
135
- app.get("/v1/crl", async (_req, reply) =>
136
- reply.send({ revoked: db.crl() }));
137
-
138
- app.get("/.well-known/nps-ca", async (_req, reply) =>
139
- reply.send({
140
- nps_ca: "0.1", issuer: CA_NID, display_name: DISPLAY_NAME, public_key: caPubStr,
141
- algorithms: ["ed25519"],
142
- endpoints: {
143
- register: `${CA_BASE_URL}/v1/agents/register`,
144
- verify: `${CA_BASE_URL}/v1/agents/{nid}/verify`,
145
- ocsp: `${CA_BASE_URL}/v1/agents/{nid}/verify`,
146
- crl: `${CA_BASE_URL}/v1/crl`,
147
- },
148
- capabilities: ["agent", "node"],
149
- max_cert_validity_days: Math.max(AGENT_DAYS, NODE_DAYS),
150
- }));
151
-
152
- app.get("/health", async (_req, reply) => reply.send({ status: "ok" }));
153
-
154
- app.listen({ port: PORT, host: "0.0.0.0" }, (err) => {
155
- if (err) { console.error(err); process.exit(1); }
156
- console.log(`NIP CA Server listening on :${PORT}`);
157
- });
@@ -1,13 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "outDir": "dist",
7
- "rootDir": "src",
8
- "strict": true,
9
- "esModuleInterop": true,
10
- "skipLibCheck": true
11
- },
12
- "include": ["src"]
13
- }
@@ -1,129 +0,0 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- // Copyright (c) 2026 LabAcacia / INNO LOTUS PTY LTD
3
- //
4
- // AnchorCache — Schema cache with TTL, LRU eviction, poison detection
5
- // NPS-1 §5.3, §7.2, §9
6
-
7
- import { NcpError } from "./frame-header.js";
8
- import type { AnchorFrame } from "../ncp/frames/anchor-frame.js";
9
-
10
- interface CacheEntry {
11
- frame: AnchorFrame;
12
- expiresAt: number; // epoch ms
13
- lastAccessed: number; // epoch ms
14
- }
15
-
16
- /**
17
- * AnchorFrame cache with:
18
- * - TTL-based expiry (NPS-1 §5.3)
19
- * - LRU eviction at maxSize (NPS-1 §9, default 1000)
20
- * - Anchor poisoning detection (NPS-1 §7.2)
21
- */
22
- export class AnchorCache {
23
- private readonly cache = new Map<string, CacheEntry>();
24
- private readonly maxSize: number;
25
- private readonly getNow: () => number;
26
-
27
- constructor(options?: { maxSize?: number; getNow?: () => number }) {
28
- this.maxSize = options?.maxSize ?? 1000;
29
- this.getNow = options?.getNow ?? (() => Date.now());
30
- }
31
-
32
- /**
33
- * Cache an AnchorFrame.
34
- *
35
- * - ttl=0: frame is valid but not cached (NPS-1 §4.1)
36
- * - Same anchor_id + same schema: idempotent (no-op)
37
- * - Same anchor_id + different schema: NCP-ANCHOR-ID-MISMATCH (poison detection)
38
- *
39
- * @throws {NcpError} NCP-ANCHOR-ID-MISMATCH on anchor poisoning.
40
- */
41
- set(frame: AnchorFrame): void {
42
- // ttl=0 means use once, don't cache
43
- if (frame.ttl === 0) return;
44
-
45
- const existing = this.cache.get(frame.anchor_id);
46
- if (existing) {
47
- // Poison detection: same ID, different schema
48
- const existingJson = JSON.stringify(existing.frame.schema);
49
- const newJson = JSON.stringify(frame.schema);
50
- if (existingJson !== newJson) {
51
- throw new NcpError(
52
- "NCP-ANCHOR-ID-MISMATCH",
53
- `Anchor poisoning detected: anchor_id ${frame.anchor_id} received with different schema`,
54
- );
55
- }
56
- // Same schema — idempotent, update access time
57
- existing.lastAccessed = this.getNow();
58
- return;
59
- }
60
-
61
- // LRU eviction if at capacity
62
- if (this.cache.size >= this.maxSize) {
63
- this.evictLru();
64
- }
65
-
66
- const ttlMs = (frame.ttl ?? 3600) * 1000;
67
- this.cache.set(frame.anchor_id, {
68
- frame,
69
- expiresAt: this.getNow() + ttlMs,
70
- lastAccessed: this.getNow(),
71
- });
72
- }
73
-
74
- /**
75
- * Get a cached AnchorFrame by anchor_id.
76
- *
77
- * @returns The cached frame, or null if not found or expired.
78
- */
79
- get(anchorId: string): AnchorFrame | null {
80
- const entry = this.cache.get(anchorId);
81
- if (!entry) return null;
82
-
83
- // Check TTL expiry
84
- if (this.getNow() >= entry.expiresAt) {
85
- this.cache.delete(anchorId);
86
- return null;
87
- }
88
-
89
- entry.lastAccessed = this.getNow();
90
- return entry.frame;
91
- }
92
-
93
- /**
94
- * Get a cached AnchorFrame, throwing if not found.
95
- * @throws {NcpError} NCP-ANCHOR-NOT-FOUND if not in cache or expired.
96
- */
97
- getRequired(anchorId: string): AnchorFrame {
98
- const frame = this.get(anchorId);
99
- if (!frame) {
100
- throw new NcpError(
101
- "NCP-ANCHOR-NOT-FOUND",
102
- `Schema anchor ${anchorId} not found in cache`,
103
- );
104
- }
105
- return frame;
106
- }
107
-
108
- /** Current cache size. */
109
- get size(): number {
110
- return this.cache.size;
111
- }
112
-
113
- /** Evict the least recently accessed entry. */
114
- private evictLru(): void {
115
- let oldestKey: string | undefined;
116
- let oldestTime = Infinity;
117
-
118
- for (const [key, entry] of this.cache) {
119
- if (entry.lastAccessed < oldestTime) {
120
- oldestTime = entry.lastAccessed;
121
- oldestKey = key;
122
- }
123
- }
124
-
125
- if (oldestKey) {
126
- this.cache.delete(oldestKey);
127
- }
128
- }
129
- }
package/src/core/cache.ts DELETED
@@ -1,93 +0,0 @@
1
- // Copyright 2026 INNO LOTUS PTY LTD
2
- // SPDX-License-Identifier: Apache-2.0
3
-
4
- /**
5
- * AnchorFrameCache — in-process cache for AnchorFrame instances (NPS-1 §4.1).
6
- */
7
-
8
- import { createHash } from "node:crypto";
9
- import { NpsAnchorNotFoundError, NpsAnchorPoisonError } from "./exceptions.js";
10
- import type { AnchorFrame, FrameSchema } from "../ncp/frames.js";
11
-
12
- export class AnchorFrameCache {
13
- private readonly _store = new Map<string, { frame: AnchorFrame; expiresAt: number }>();
14
-
15
- // Allow clock injection for testing
16
- clock: () => number = () => Date.now();
17
-
18
- // ── Public API ────────────────────────────────────────────────────────────
19
-
20
- set(frame: AnchorFrame): string {
21
- const anchorId = frame.anchorId.startsWith("sha256:")
22
- ? frame.anchorId
23
- : AnchorFrameCache.computeAnchorId(frame.schema);
24
-
25
- const existing = this._store.get(anchorId);
26
- if (existing !== undefined && this.clock() < existing.expiresAt) {
27
- if (!AnchorFrameCache._schemasEqual(existing.frame.schema, frame.schema)) {
28
- throw new NpsAnchorPoisonError(anchorId);
29
- }
30
- // Same schema — idempotent; refresh TTL below
31
- }
32
-
33
- const ttlMs = (frame.ttl ?? 3600) * 1000;
34
- const expiresAt = this.clock() + ttlMs;
35
- this._store.set(anchorId, { frame, expiresAt });
36
- return anchorId;
37
- }
38
-
39
- get(anchorId: string): AnchorFrame | undefined {
40
- const entry = this._store.get(anchorId);
41
- if (entry === undefined) return undefined;
42
- if (this.clock() > entry.expiresAt) {
43
- this._store.delete(anchorId);
44
- return undefined;
45
- }
46
- return entry.frame;
47
- }
48
-
49
- getRequired(anchorId: string): AnchorFrame {
50
- const frame = this.get(anchorId);
51
- if (frame === undefined) throw new NpsAnchorNotFoundError(anchorId);
52
- return frame;
53
- }
54
-
55
- invalidate(anchorId: string): void {
56
- this._store.delete(anchorId);
57
- }
58
-
59
- get size(): number {
60
- this._evictExpired();
61
- return this._store.size;
62
- }
63
-
64
- // ── Static helpers ────────────────────────────────────────────────────────
65
-
66
- static computeAnchorId(schema: FrameSchema): string {
67
- const sorted = [...schema.fields]
68
- .map((f) => {
69
- const obj: Record<string, unknown> = { name: f.name, type: f.type };
70
- if (f.semantic !== undefined) obj["semantic"] = f.semantic;
71
- if (f.nullable !== undefined) obj["nullable"] = f.nullable;
72
- return obj;
73
- })
74
- .sort((a, b) => String(a["name"]).localeCompare(String(b["name"])));
75
-
76
- const canonical = JSON.stringify(sorted);
77
- const digest = createHash("sha256").update(canonical, "utf8").digest("hex");
78
- return `sha256:${digest}`;
79
- }
80
-
81
- // ── Private ───────────────────────────────────────────────────────────────
82
-
83
- private _evictExpired(): void {
84
- const now = this.clock();
85
- for (const [k, entry] of this._store) {
86
- if (now > entry.expiresAt) this._store.delete(k);
87
- }
88
- }
89
-
90
- private static _schemasEqual(a: FrameSchema, b: FrameSchema): boolean {
91
- return AnchorFrameCache.computeAnchorId(a) === AnchorFrameCache.computeAnchorId(b);
92
- }
93
- }
@@ -1,50 +0,0 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- // Copyright (c) 2026 LabAcacia / INNO LOTUS PTY LTD
3
- //
4
- // Canonical JSON helpers — two distinct serialisation paths used in NPS.
5
- //
6
- // AnchorFrame uses JCS (RFC 8785) for anchor_id hashing → jcsStringify.
7
- // NIP signing uses Python-compatible sorted-key JSON → sortKeysStringify.
8
-
9
- import canonicalizeImport from "canonicalize";
10
-
11
- // `canonicalize` is a CJS module whose default export resolves to a namespace
12
- // under NodeNext. Cast once to the call signature its .d.ts promises.
13
- const canonicalize = canonicalizeImport as unknown as (
14
- input: unknown,
15
- ) => string | undefined;
16
-
17
- /**
18
- * JCS (RFC 8785) canonical JSON stringify.
19
- * Used for AnchorFrame anchor_id computation.
20
- */
21
- export function jcsStringify(obj: unknown): string {
22
- const result = canonicalize(obj);
23
- if (result === undefined) {
24
- throw new Error("canonicalize returned undefined for input");
25
- }
26
- return result;
27
- }
28
-
29
- /**
30
- * Sorted-key JSON stringify — matches Python's
31
- * `json.dumps(obj, sort_keys=True, separators=(",",":"))`.
32
- * Used for NIP signing.
33
- */
34
- export function sortKeysStringify(obj: unknown): string {
35
- return JSON.stringify(sortKeys(obj));
36
- }
37
-
38
- function sortKeys(value: unknown): unknown {
39
- if (Array.isArray(value)) {
40
- return value.map(sortKeys);
41
- }
42
- if (value !== null && typeof value === "object") {
43
- const sorted: Record<string, unknown> = {};
44
- for (const key of Object.keys(value as object).sort()) {
45
- sorted[key] = sortKeys((value as Record<string, unknown>)[key]);
46
- }
47
- return sorted;
48
- }
49
- return value;
50
- }
package/src/core/codec.ts DELETED
@@ -1,158 +0,0 @@
1
- // Copyright 2026 INNO LOTUS PTY LTD
2
- // SPDX-License-Identifier: Apache-2.0
3
-
4
- /**
5
- * NPS frame codec: Tier-1 (JSON) and Tier-2 (MsgPack) encode/decode,
6
- * plus the top-level NpsFrameCodec dispatcher.
7
- */
8
-
9
- import * as msgpack from "@msgpack/msgpack";
10
- import { NpsCodecError } from "./exceptions.js";
11
- import {
12
- DEFAULT_MAX_PAYLOAD,
13
- EncodingTier,
14
- FrameFlags,
15
- FrameHeader,
16
- FrameType,
17
- } from "./frames.js";
18
- import type { FrameRegistry } from "./registry.js";
19
-
20
- // ── NpsFrame interface ────────────────────────────────────────────────────────
21
-
22
- export interface NpsFrame {
23
- readonly frameType: FrameType;
24
- readonly preferredTier: EncodingTier;
25
- toDict(): Record<string, unknown>;
26
- }
27
-
28
- // ── Tier-1 JSON codec ─────────────────────────────────────────────────────────
29
-
30
- export class Tier1JsonCodec {
31
- encode(frame: NpsFrame): Uint8Array {
32
- try {
33
- const json = JSON.stringify(frame.toDict());
34
- return new TextEncoder().encode(json);
35
- } catch (err) {
36
- throw new NpsCodecError(
37
- `Tier-1 JSON encode failed for 0x${frame.frameType.toString(16).padStart(2, "0")}: ${String(err)}`,
38
- );
39
- }
40
- }
41
-
42
- decode(frameType: FrameType, payload: Uint8Array, registry: FrameRegistry): NpsFrame {
43
- const cls = registry.resolve(frameType);
44
- try {
45
- const text = new TextDecoder().decode(payload);
46
- const data = JSON.parse(text) as Record<string, unknown>;
47
- return cls.fromDict(data);
48
- } catch (err) {
49
- throw new NpsCodecError(
50
- `Tier-1 JSON decode failed for 0x${frameType.toString(16).padStart(2, "0")}: ${String(err)}`,
51
- );
52
- }
53
- }
54
- }
55
-
56
- // ── Tier-2 MsgPack codec ──────────────────────────────────────────────────────
57
-
58
- export class Tier2MsgPackCodec {
59
- encode(frame: NpsFrame): Uint8Array {
60
- try {
61
- return msgpack.encode(frame.toDict());
62
- } catch (err) {
63
- throw new NpsCodecError(
64
- `Tier-2 MsgPack encode failed for 0x${frame.frameType.toString(16).padStart(2, "0")}: ${String(err)}`,
65
- );
66
- }
67
- }
68
-
69
- decode(frameType: FrameType, payload: Uint8Array, registry: FrameRegistry): NpsFrame {
70
- const cls = registry.resolve(frameType);
71
- try {
72
- const data = msgpack.decode(payload) as Record<string, unknown>;
73
- return cls.fromDict(data);
74
- } catch (err) {
75
- throw new NpsCodecError(
76
- `Tier-2 MsgPack decode failed for 0x${frameType.toString(16).padStart(2, "0")}: ${String(err)}`,
77
- );
78
- }
79
- }
80
- }
81
-
82
- // ── NpsFrameCodec (dispatcher) ────────────────────────────────────────────────
83
-
84
- export class NpsFrameCodec {
85
- private readonly _registry: FrameRegistry;
86
- private readonly _maxPayload: number;
87
- private readonly _json = new Tier1JsonCodec();
88
- private readonly _msgpack = new Tier2MsgPackCodec();
89
-
90
- constructor(registry: FrameRegistry, options: { maxPayload?: number } = {}) {
91
- this._registry = registry;
92
- this._maxPayload = options.maxPayload ?? DEFAULT_MAX_PAYLOAD;
93
- }
94
-
95
- // ── Encode ────────────────────────────────────────────────────────────────
96
-
97
- encode(frame: NpsFrame, options: { overrideTier?: EncodingTier } = {}): Uint8Array {
98
- const tier = options.overrideTier ?? frame.preferredTier;
99
- const tierCodec = this._selectCodec(tier);
100
-
101
- let payload: Uint8Array;
102
- try {
103
- payload = tierCodec.encode(frame);
104
- } catch (err) {
105
- if (err instanceof NpsCodecError) throw err;
106
- throw new NpsCodecError(`Encode failed for 0x${frame.frameType.toString(16)}.`);
107
- }
108
-
109
- if (payload.length > this._maxPayload) {
110
- throw new NpsCodecError(
111
- `Encoded payload for 0x${frame.frameType.toString(16).padStart(2, "0")} exceeds max_frame_payload` +
112
- ` (${payload.length} bytes > ${this._maxPayload}). Use StreamFrame (0x03) for large payloads.`,
113
- );
114
- }
115
-
116
- const useExt = payload.length > DEFAULT_MAX_PAYLOAD;
117
- let flags = this._buildFlags(frame, tier);
118
- if (useExt) flags |= FrameFlags.EXT;
119
-
120
- const header = new FrameHeader(frame.frameType, flags, payload.length);
121
- const headerBytes = header.toBytes();
122
- const wire = new Uint8Array(headerBytes.length + payload.length);
123
- wire.set(headerBytes, 0);
124
- wire.set(payload, headerBytes.length);
125
- return wire;
126
- }
127
-
128
- // ── Decode ────────────────────────────────────────────────────────────────
129
-
130
- decode(wire: Uint8Array): NpsFrame {
131
- const header = FrameHeader.parse(wire);
132
- const payload = wire.slice(header.headerSize, header.headerSize + header.payloadLength);
133
- const codec = this._selectCodec(header.encodingTier);
134
- return codec.decode(header.frameType, payload, this._registry);
135
- }
136
-
137
- static peekHeader(wire: Uint8Array): FrameHeader {
138
- return FrameHeader.parse(wire);
139
- }
140
-
141
- // ── Private ───────────────────────────────────────────────────────────────
142
-
143
- private _buildFlags(frame: NpsFrame, tier: EncodingTier): number {
144
- let flags = tier === EncodingTier.JSON ? FrameFlags.TIER1_JSON : FrameFlags.TIER2_MSGPACK;
145
-
146
- const isStreamFrame = "isLast" in frame;
147
- const isFinal = !isStreamFrame || (frame as { isLast: boolean }).isLast;
148
- if (isFinal) flags |= FrameFlags.FINAL;
149
-
150
- return flags;
151
- }
152
-
153
- private _selectCodec(tier: EncodingTier): Tier1JsonCodec | Tier2MsgPackCodec {
154
- if (tier === EncodingTier.JSON) return this._json;
155
- if (tier === EncodingTier.MSGPACK) return this._msgpack;
156
- throw new NpsCodecError(`Unsupported encoding tier: 0x${(tier as number).toString(16).padStart(2, "0")}.`);
157
- }
158
- }
@@ -1,5 +0,0 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- // Copyright (c) 2026 LabAcacia / INNO LOTUS PTY LTD
3
- export * from "./ncp-codec.js";
4
- export { encodeJson, decodeJson } from "./tier1-json-codec.js";
5
- export { encodeMsgPack, decodeMsgPack } from "./tier2-msgpack-codec.js";