@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,80 @@
1
+ /** Unified frame byte namespace for the full NPS suite (NPS-0 §9). */
2
+ export declare enum FrameType {
3
+ ANCHOR = 1,
4
+ DIFF = 2,
5
+ STREAM = 3,
6
+ CAPS = 4,
7
+ ALIGN = 5,// deprecated — use AlignStream (0x43)
8
+ QUERY = 16,
9
+ ACTION = 17,
10
+ IDENT = 32,
11
+ TRUST = 33,
12
+ REVOKE = 34,
13
+ ANNOUNCE = 48,
14
+ RESOLVE = 49,
15
+ GRAPH = 50,
16
+ TASK = 64,
17
+ DELEGATE = 65,
18
+ SYNC = 66,
19
+ ALIGN_STREAM = 67,
20
+ ERROR = 254
21
+ }
22
+ /**
23
+ * Wire encoding tier, stored in the lower 2 bits of the flags byte (NPS-1 §3.2).
24
+ * 0x00 = Tier-1 JSON — human-readable; development / compatibility.
25
+ * 0x01 = Tier-2 MsgPack — binary, ~60 % smaller; production default.
26
+ */
27
+ export declare enum EncodingTier {
28
+ JSON = 0,
29
+ MSGPACK = 1
30
+ }
31
+ /**
32
+ * Flags byte in the NPS frame header (NPS-1 §3.2).
33
+ * Bit layout (LSB = bit 0):
34
+ * Bits 0–1 (T0,T1) : Encoding tier
35
+ * Bit 2 (FINAL) : Last chunk of a StreamFrame; non-stream frames MUST set this
36
+ * Bit 3 (ENC) : Payload encrypted
37
+ * Bits 4–6 (RSV) : Reserved — sender MUST write 0
38
+ * Bit 7 (EXT) : Extended 8-byte header
39
+ */
40
+ export declare const FrameFlags: {
41
+ readonly NONE: 0;
42
+ readonly TIER1_JSON: 0;
43
+ readonly TIER2_MSGPACK: 1;
44
+ readonly FINAL: 4;
45
+ readonly ENCRYPTED: 8;
46
+ readonly EXT: 128;
47
+ };
48
+ export declare const DEFAULT_HEADER_SIZE = 4;
49
+ export declare const EXTENDED_HEADER_SIZE = 8;
50
+ export declare const DEFAULT_MAX_PAYLOAD = 65535;
51
+ export declare const EXTENDED_MAX_PAYLOAD = 4294967295;
52
+ /**
53
+ * NPS frame header, present at the start of every wire message (NPS-1 §3.1).
54
+ *
55
+ * Default (4 bytes, EXT=0):
56
+ * Byte 0 : FrameType
57
+ * Byte 1 : Flags
58
+ * Byte 2–3 : PayloadLength (big-endian uint16)
59
+ *
60
+ * Extended (8 bytes, EXT=1):
61
+ * Byte 0 : FrameType
62
+ * Byte 1 : Flags (bit 7 = 1)
63
+ * Byte 2–3 : Reserved (must be 0)
64
+ * Byte 4–7 : PayloadLength (big-endian uint32)
65
+ */
66
+ export declare class FrameHeader {
67
+ readonly frameType: FrameType;
68
+ readonly flags: number;
69
+ readonly payloadLength: number;
70
+ constructor(frameType: FrameType, flags: number, payloadLength: number);
71
+ get isExtended(): boolean;
72
+ get headerSize(): number;
73
+ get encodingTier(): EncodingTier;
74
+ get isFinal(): boolean;
75
+ get isEncrypted(): boolean;
76
+ static parse(buf: Uint8Array): FrameHeader;
77
+ toBytes(): Uint8Array;
78
+ toString(): string;
79
+ }
80
+ //# sourceMappingURL=frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../src/core/frames.ts"],"names":[],"mappings":"AAWA,sEAAsE;AACtE,oBAAY,SAAS;IAEnB,MAAM,IAAa;IACnB,IAAI,IAAe;IACnB,MAAM,IAAa;IACnB,IAAI,IAAe;IACnB,KAAK,IAAc,CAAE,sCAAsC;IAG3D,KAAK,KAAc;IACnB,MAAM,KAAa;IAGnB,KAAK,KAAc;IACnB,KAAK,KAAc;IACnB,MAAM,KAAa;IAGnB,QAAQ,KAAW;IACnB,OAAO,KAAY;IACnB,KAAK,KAAc;IAGnB,IAAI,KAAe;IACnB,QAAQ,KAAW;IACnB,IAAI,KAAe;IACnB,YAAY,KAAO;IAGnB,KAAK,MAAc;CACpB;AAID;;;;GAIG;AACH,oBAAY,YAAY;IACtB,IAAI,IAAU;IACd,OAAO,IAAO;CACf;AAID;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU;;;;;;;CAOb,CAAC;AAIX,eAAO,MAAM,mBAAmB,IAAK,CAAC;AACtC,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,mBAAmB,QAAU,CAAC;AAC3C,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAI/C;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAW;aAEJ,SAAS,EAAE,SAAS;aACpB,KAAK,EAAE,MAAM;aACb,aAAa,EAAE,MAAM;gBAFrB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM;IAGvC,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAID,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW;IAiC1C,OAAO,IAAI,UAAU;IAkBrB,QAAQ,IAAI,MAAM;CAGnB"}
@@ -0,0 +1,153 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * NPS wire-level frame primitives: FrameType, FrameFlags, EncodingTier, FrameHeader.
5
+ */
6
+ import { NpsFrameError } from "./exceptions.js";
7
+ // ── FrameType ────────────────────────────────────────────────────────────────
8
+ /** Unified frame byte namespace for the full NPS suite (NPS-0 §9). */
9
+ export var FrameType;
10
+ (function (FrameType) {
11
+ // NCP 0x01–0x0F
12
+ FrameType[FrameType["ANCHOR"] = 1] = "ANCHOR";
13
+ FrameType[FrameType["DIFF"] = 2] = "DIFF";
14
+ FrameType[FrameType["STREAM"] = 3] = "STREAM";
15
+ FrameType[FrameType["CAPS"] = 4] = "CAPS";
16
+ FrameType[FrameType["ALIGN"] = 5] = "ALIGN";
17
+ // NWP 0x10–0x1F
18
+ FrameType[FrameType["QUERY"] = 16] = "QUERY";
19
+ FrameType[FrameType["ACTION"] = 17] = "ACTION";
20
+ // NIP 0x20–0x2F
21
+ FrameType[FrameType["IDENT"] = 32] = "IDENT";
22
+ FrameType[FrameType["TRUST"] = 33] = "TRUST";
23
+ FrameType[FrameType["REVOKE"] = 34] = "REVOKE";
24
+ // NDP 0x30–0x3F
25
+ FrameType[FrameType["ANNOUNCE"] = 48] = "ANNOUNCE";
26
+ FrameType[FrameType["RESOLVE"] = 49] = "RESOLVE";
27
+ FrameType[FrameType["GRAPH"] = 50] = "GRAPH";
28
+ // NOP 0x40–0x4F
29
+ FrameType[FrameType["TASK"] = 64] = "TASK";
30
+ FrameType[FrameType["DELEGATE"] = 65] = "DELEGATE";
31
+ FrameType[FrameType["SYNC"] = 66] = "SYNC";
32
+ FrameType[FrameType["ALIGN_STREAM"] = 67] = "ALIGN_STREAM";
33
+ // Reserved / System 0xF0–0xFF
34
+ FrameType[FrameType["ERROR"] = 254] = "ERROR";
35
+ })(FrameType || (FrameType = {}));
36
+ // ── EncodingTier ─────────────────────────────────────────────────────────────
37
+ /**
38
+ * Wire encoding tier, stored in the lower 2 bits of the flags byte (NPS-1 §3.2).
39
+ * 0x00 = Tier-1 JSON — human-readable; development / compatibility.
40
+ * 0x01 = Tier-2 MsgPack — binary, ~60 % smaller; production default.
41
+ */
42
+ export var EncodingTier;
43
+ (function (EncodingTier) {
44
+ EncodingTier[EncodingTier["JSON"] = 0] = "JSON";
45
+ EncodingTier[EncodingTier["MSGPACK"] = 1] = "MSGPACK";
46
+ })(EncodingTier || (EncodingTier = {}));
47
+ // ── FrameFlags ───────────────────────────────────────────────────────────────
48
+ /**
49
+ * Flags byte in the NPS frame header (NPS-1 §3.2).
50
+ * Bit layout (LSB = bit 0):
51
+ * Bits 0–1 (T0,T1) : Encoding tier
52
+ * Bit 2 (FINAL) : Last chunk of a StreamFrame; non-stream frames MUST set this
53
+ * Bit 3 (ENC) : Payload encrypted
54
+ * Bits 4–6 (RSV) : Reserved — sender MUST write 0
55
+ * Bit 7 (EXT) : Extended 8-byte header
56
+ */
57
+ export const FrameFlags = {
58
+ NONE: 0x00,
59
+ TIER1_JSON: 0x00,
60
+ TIER2_MSGPACK: 0x01,
61
+ FINAL: 0x04,
62
+ ENCRYPTED: 0x08,
63
+ EXT: 0x80,
64
+ };
65
+ // ── Constants ─────────────────────────────────────────────────────────────────
66
+ export const DEFAULT_HEADER_SIZE = 4;
67
+ export const EXTENDED_HEADER_SIZE = 8;
68
+ export const DEFAULT_MAX_PAYLOAD = 0xffff; // 65 535 bytes
69
+ export const EXTENDED_MAX_PAYLOAD = 0xffffffff; // 4 GiB - 1
70
+ // ── FrameHeader ──────────────────────────────────────────────────────────────
71
+ /**
72
+ * NPS frame header, present at the start of every wire message (NPS-1 §3.1).
73
+ *
74
+ * Default (4 bytes, EXT=0):
75
+ * Byte 0 : FrameType
76
+ * Byte 1 : Flags
77
+ * Byte 2–3 : PayloadLength (big-endian uint16)
78
+ *
79
+ * Extended (8 bytes, EXT=1):
80
+ * Byte 0 : FrameType
81
+ * Byte 1 : Flags (bit 7 = 1)
82
+ * Byte 2–3 : Reserved (must be 0)
83
+ * Byte 4–7 : PayloadLength (big-endian uint32)
84
+ */
85
+ export class FrameHeader {
86
+ frameType;
87
+ flags;
88
+ payloadLength;
89
+ constructor(frameType, flags, payloadLength) {
90
+ this.frameType = frameType;
91
+ this.flags = flags;
92
+ this.payloadLength = payloadLength;
93
+ }
94
+ get isExtended() {
95
+ return (this.flags & FrameFlags.EXT) !== 0;
96
+ }
97
+ get headerSize() {
98
+ return this.isExtended ? EXTENDED_HEADER_SIZE : DEFAULT_HEADER_SIZE;
99
+ }
100
+ get encodingTier() {
101
+ return (this.flags & 0x03);
102
+ }
103
+ get isFinal() {
104
+ return (this.flags & 0x04) !== 0;
105
+ }
106
+ get isEncrypted() {
107
+ return (this.flags & 0x08) !== 0;
108
+ }
109
+ // ── Parsing ───────────────────────────────────────────────────────────────
110
+ static parse(buf) {
111
+ if (buf.length < 2) {
112
+ throw new NpsFrameError(`Buffer too small to read frame type and flags: need >= 2 bytes, got ${buf.length}.`);
113
+ }
114
+ const flags = buf[1];
115
+ const ext = (flags & FrameFlags.EXT) !== 0;
116
+ if (ext) {
117
+ if (buf.length < EXTENDED_HEADER_SIZE) {
118
+ throw new NpsFrameError(`Buffer too small for extended frame header: need ${EXTENDED_HEADER_SIZE} bytes, got ${buf.length}.`);
119
+ }
120
+ const view = new DataView(buf.buffer, buf.byteOffset);
121
+ const payloadLength = view.getUint32(4, false); // big-endian
122
+ return new FrameHeader(buf[0], flags, payloadLength);
123
+ }
124
+ if (buf.length < DEFAULT_HEADER_SIZE) {
125
+ throw new NpsFrameError(`Buffer too small for frame header: need ${DEFAULT_HEADER_SIZE} bytes, got ${buf.length}.`);
126
+ }
127
+ const view = new DataView(buf.buffer, buf.byteOffset);
128
+ const payloadLength = view.getUint16(2, false); // big-endian
129
+ return new FrameHeader(buf[0], flags, payloadLength);
130
+ }
131
+ // ── Serialisation ─────────────────────────────────────────────────────────
132
+ toBytes() {
133
+ if (this.isExtended) {
134
+ const buf = new Uint8Array(EXTENDED_HEADER_SIZE);
135
+ const view = new DataView(buf.buffer);
136
+ view.setUint8(0, this.frameType);
137
+ view.setUint8(1, this.flags);
138
+ view.setUint16(2, 0, false); // reserved
139
+ view.setUint32(4, this.payloadLength, false);
140
+ return buf;
141
+ }
142
+ const buf = new Uint8Array(DEFAULT_HEADER_SIZE);
143
+ const view = new DataView(buf.buffer);
144
+ view.setUint8(0, this.frameType);
145
+ view.setUint8(1, this.flags);
146
+ view.setUint16(2, this.payloadLength, false);
147
+ return buf;
148
+ }
149
+ toString() {
150
+ return `FrameHeader(frameType=0x${this.frameType.toString(16).padStart(2, "0")}, flags=0x${this.flags.toString(16).padStart(2, "0")}, payloadLength=${this.payloadLength})`;
151
+ }
152
+ }
153
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/core/frames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,371 @@
1
+ 'use strict';
2
+
3
+ var msgpack = require('@msgpack/msgpack');
4
+ var crypto = require('crypto');
5
+
6
+ function _interopNamespace(e) {
7
+ if (e && e.__esModule) return e;
8
+ var n = Object.create(null);
9
+ if (e) {
10
+ Object.keys(e).forEach(function (k) {
11
+ if (k !== 'default') {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () { return e[k]; }
16
+ });
17
+ }
18
+ });
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+
24
+ var msgpack__namespace = /*#__PURE__*/_interopNamespace(msgpack);
25
+
26
+ // src/core/exceptions.ts
27
+ var NpsError = class extends Error {
28
+ constructor(message) {
29
+ super(message);
30
+ this.name = new.target.name;
31
+ }
32
+ };
33
+ var NpsFrameError = class extends NpsError {
34
+ };
35
+ var NpsCodecError = class extends NpsError {
36
+ };
37
+ var NpsAnchorNotFoundError = class extends NpsError {
38
+ constructor(anchorId) {
39
+ super(`AnchorFrame not found in cache: ${anchorId}`);
40
+ this.anchorId = anchorId;
41
+ }
42
+ anchorId;
43
+ };
44
+ var NpsAnchorPoisonError = class extends NpsError {
45
+ constructor(anchorId) {
46
+ super(
47
+ `Anchor poisoning detected: anchor_id ${anchorId} already exists with a different schema.`
48
+ );
49
+ this.anchorId = anchorId;
50
+ }
51
+ anchorId;
52
+ };
53
+
54
+ // src/core/frames.ts
55
+ var FrameType = /* @__PURE__ */ ((FrameType3) => {
56
+ FrameType3[FrameType3["ANCHOR"] = 1] = "ANCHOR";
57
+ FrameType3[FrameType3["DIFF"] = 2] = "DIFF";
58
+ FrameType3[FrameType3["STREAM"] = 3] = "STREAM";
59
+ FrameType3[FrameType3["CAPS"] = 4] = "CAPS";
60
+ FrameType3[FrameType3["ALIGN"] = 5] = "ALIGN";
61
+ FrameType3[FrameType3["QUERY"] = 16] = "QUERY";
62
+ FrameType3[FrameType3["ACTION"] = 17] = "ACTION";
63
+ FrameType3[FrameType3["IDENT"] = 32] = "IDENT";
64
+ FrameType3[FrameType3["TRUST"] = 33] = "TRUST";
65
+ FrameType3[FrameType3["REVOKE"] = 34] = "REVOKE";
66
+ FrameType3[FrameType3["ANNOUNCE"] = 48] = "ANNOUNCE";
67
+ FrameType3[FrameType3["RESOLVE"] = 49] = "RESOLVE";
68
+ FrameType3[FrameType3["GRAPH"] = 50] = "GRAPH";
69
+ FrameType3[FrameType3["TASK"] = 64] = "TASK";
70
+ FrameType3[FrameType3["DELEGATE"] = 65] = "DELEGATE";
71
+ FrameType3[FrameType3["SYNC"] = 66] = "SYNC";
72
+ FrameType3[FrameType3["ALIGN_STREAM"] = 67] = "ALIGN_STREAM";
73
+ FrameType3[FrameType3["ERROR"] = 254] = "ERROR";
74
+ return FrameType3;
75
+ })(FrameType || {});
76
+ var EncodingTier = /* @__PURE__ */ ((EncodingTier2) => {
77
+ EncodingTier2[EncodingTier2["JSON"] = 0] = "JSON";
78
+ EncodingTier2[EncodingTier2["MSGPACK"] = 1] = "MSGPACK";
79
+ return EncodingTier2;
80
+ })(EncodingTier || {});
81
+ var FrameFlags = {
82
+ NONE: 0,
83
+ TIER1_JSON: 0,
84
+ TIER2_MSGPACK: 1,
85
+ FINAL: 4,
86
+ ENCRYPTED: 8,
87
+ EXT: 128
88
+ };
89
+ var DEFAULT_HEADER_SIZE = 4;
90
+ var EXTENDED_HEADER_SIZE = 8;
91
+ var DEFAULT_MAX_PAYLOAD = 65535;
92
+ var EXTENDED_MAX_PAYLOAD = 4294967295;
93
+ var FrameHeader = class _FrameHeader {
94
+ constructor(frameType, flags, payloadLength) {
95
+ this.frameType = frameType;
96
+ this.flags = flags;
97
+ this.payloadLength = payloadLength;
98
+ }
99
+ frameType;
100
+ flags;
101
+ payloadLength;
102
+ get isExtended() {
103
+ return (this.flags & FrameFlags.EXT) !== 0;
104
+ }
105
+ get headerSize() {
106
+ return this.isExtended ? EXTENDED_HEADER_SIZE : DEFAULT_HEADER_SIZE;
107
+ }
108
+ get encodingTier() {
109
+ return this.flags & 3;
110
+ }
111
+ get isFinal() {
112
+ return (this.flags & 4) !== 0;
113
+ }
114
+ get isEncrypted() {
115
+ return (this.flags & 8) !== 0;
116
+ }
117
+ // ── Parsing ───────────────────────────────────────────────────────────────
118
+ static parse(buf) {
119
+ if (buf.length < 2) {
120
+ throw new NpsFrameError(
121
+ `Buffer too small to read frame type and flags: need >= 2 bytes, got ${buf.length}.`
122
+ );
123
+ }
124
+ const flags = buf[1];
125
+ const ext = (flags & FrameFlags.EXT) !== 0;
126
+ if (ext) {
127
+ if (buf.length < EXTENDED_HEADER_SIZE) {
128
+ throw new NpsFrameError(
129
+ `Buffer too small for extended frame header: need ${EXTENDED_HEADER_SIZE} bytes, got ${buf.length}.`
130
+ );
131
+ }
132
+ const view2 = new DataView(buf.buffer, buf.byteOffset);
133
+ const payloadLength2 = view2.getUint32(4, false);
134
+ return new _FrameHeader(buf[0], flags, payloadLength2);
135
+ }
136
+ if (buf.length < DEFAULT_HEADER_SIZE) {
137
+ throw new NpsFrameError(
138
+ `Buffer too small for frame header: need ${DEFAULT_HEADER_SIZE} bytes, got ${buf.length}.`
139
+ );
140
+ }
141
+ const view = new DataView(buf.buffer, buf.byteOffset);
142
+ const payloadLength = view.getUint16(2, false);
143
+ return new _FrameHeader(buf[0], flags, payloadLength);
144
+ }
145
+ // ── Serialisation ─────────────────────────────────────────────────────────
146
+ toBytes() {
147
+ if (this.isExtended) {
148
+ const buf2 = new Uint8Array(EXTENDED_HEADER_SIZE);
149
+ const view2 = new DataView(buf2.buffer);
150
+ view2.setUint8(0, this.frameType);
151
+ view2.setUint8(1, this.flags);
152
+ view2.setUint16(2, 0, false);
153
+ view2.setUint32(4, this.payloadLength, false);
154
+ return buf2;
155
+ }
156
+ const buf = new Uint8Array(DEFAULT_HEADER_SIZE);
157
+ const view = new DataView(buf.buffer);
158
+ view.setUint8(0, this.frameType);
159
+ view.setUint8(1, this.flags);
160
+ view.setUint16(2, this.payloadLength, false);
161
+ return buf;
162
+ }
163
+ toString() {
164
+ return `FrameHeader(frameType=0x${this.frameType.toString(16).padStart(2, "0")}, flags=0x${this.flags.toString(16).padStart(2, "0")}, payloadLength=${this.payloadLength})`;
165
+ }
166
+ };
167
+ var Tier1JsonCodec = class {
168
+ encode(frame) {
169
+ try {
170
+ const json = JSON.stringify(frame.toDict());
171
+ return new TextEncoder().encode(json);
172
+ } catch (err) {
173
+ throw new NpsCodecError(
174
+ `Tier-1 JSON encode failed for 0x${frame.frameType.toString(16).padStart(2, "0")}: ${String(err)}`
175
+ );
176
+ }
177
+ }
178
+ decode(frameType, payload, registry) {
179
+ const cls = registry.resolve(frameType);
180
+ try {
181
+ const text = new TextDecoder().decode(payload);
182
+ const data = JSON.parse(text);
183
+ return cls.fromDict(data);
184
+ } catch (err) {
185
+ throw new NpsCodecError(
186
+ `Tier-1 JSON decode failed for 0x${frameType.toString(16).padStart(2, "0")}: ${String(err)}`
187
+ );
188
+ }
189
+ }
190
+ };
191
+ var Tier2MsgPackCodec = class {
192
+ encode(frame) {
193
+ try {
194
+ return msgpack__namespace.encode(frame.toDict());
195
+ } catch (err) {
196
+ throw new NpsCodecError(
197
+ `Tier-2 MsgPack encode failed for 0x${frame.frameType.toString(16).padStart(2, "0")}: ${String(err)}`
198
+ );
199
+ }
200
+ }
201
+ decode(frameType, payload, registry) {
202
+ const cls = registry.resolve(frameType);
203
+ try {
204
+ const data = msgpack__namespace.decode(payload);
205
+ return cls.fromDict(data);
206
+ } catch (err) {
207
+ throw new NpsCodecError(
208
+ `Tier-2 MsgPack decode failed for 0x${frameType.toString(16).padStart(2, "0")}: ${String(err)}`
209
+ );
210
+ }
211
+ }
212
+ };
213
+ var NpsFrameCodec = class {
214
+ _registry;
215
+ _maxPayload;
216
+ _json = new Tier1JsonCodec();
217
+ _msgpack = new Tier2MsgPackCodec();
218
+ constructor(registry, options = {}) {
219
+ this._registry = registry;
220
+ this._maxPayload = options.maxPayload ?? DEFAULT_MAX_PAYLOAD;
221
+ }
222
+ // ── Encode ────────────────────────────────────────────────────────────────
223
+ encode(frame, options = {}) {
224
+ const tier = options.overrideTier ?? frame.preferredTier;
225
+ const tierCodec = this._selectCodec(tier);
226
+ let payload;
227
+ try {
228
+ payload = tierCodec.encode(frame);
229
+ } catch (err) {
230
+ if (err instanceof NpsCodecError) throw err;
231
+ throw new NpsCodecError(`Encode failed for 0x${frame.frameType.toString(16)}.`);
232
+ }
233
+ if (payload.length > this._maxPayload) {
234
+ throw new NpsCodecError(
235
+ `Encoded payload for 0x${frame.frameType.toString(16).padStart(2, "0")} exceeds max_frame_payload (${payload.length} bytes > ${this._maxPayload}). Use StreamFrame (0x03) for large payloads.`
236
+ );
237
+ }
238
+ const useExt = payload.length > DEFAULT_MAX_PAYLOAD;
239
+ let flags = this._buildFlags(frame, tier);
240
+ if (useExt) flags |= FrameFlags.EXT;
241
+ const header = new FrameHeader(frame.frameType, flags, payload.length);
242
+ const headerBytes = header.toBytes();
243
+ const wire = new Uint8Array(headerBytes.length + payload.length);
244
+ wire.set(headerBytes, 0);
245
+ wire.set(payload, headerBytes.length);
246
+ return wire;
247
+ }
248
+ // ── Decode ────────────────────────────────────────────────────────────────
249
+ decode(wire) {
250
+ const header = FrameHeader.parse(wire);
251
+ const payload = wire.slice(header.headerSize, header.headerSize + header.payloadLength);
252
+ const codec = this._selectCodec(header.encodingTier);
253
+ return codec.decode(header.frameType, payload, this._registry);
254
+ }
255
+ static peekHeader(wire) {
256
+ return FrameHeader.parse(wire);
257
+ }
258
+ // ── Private ───────────────────────────────────────────────────────────────
259
+ _buildFlags(frame, tier) {
260
+ let flags = tier === 0 /* JSON */ ? FrameFlags.TIER1_JSON : FrameFlags.TIER2_MSGPACK;
261
+ const isStreamFrame = "isLast" in frame;
262
+ const isFinal = !isStreamFrame || frame.isLast;
263
+ if (isFinal) flags |= FrameFlags.FINAL;
264
+ return flags;
265
+ }
266
+ _selectCodec(tier) {
267
+ if (tier === 0 /* JSON */) return this._json;
268
+ if (tier === 1 /* MSGPACK */) return this._msgpack;
269
+ throw new NpsCodecError(`Unsupported encoding tier: 0x${tier.toString(16).padStart(2, "0")}.`);
270
+ }
271
+ };
272
+
273
+ // src/core/registry.ts
274
+ var FrameRegistry = class {
275
+ _map = /* @__PURE__ */ new Map();
276
+ register(frameType, cls) {
277
+ this._map.set(frameType, cls);
278
+ }
279
+ resolve(frameType) {
280
+ const cls = this._map.get(frameType);
281
+ if (cls === void 0) {
282
+ throw new NpsFrameError(
283
+ `No frame class registered for type 0x${frameType.toString(16).padStart(2, "0")}.`
284
+ );
285
+ }
286
+ return cls;
287
+ }
288
+ };
289
+ var AnchorFrameCache = class _AnchorFrameCache {
290
+ _store = /* @__PURE__ */ new Map();
291
+ // Allow clock injection for testing
292
+ clock = () => Date.now();
293
+ // ── Public API ────────────────────────────────────────────────────────────
294
+ set(frame) {
295
+ const anchorId = frame.anchorId.startsWith("sha256:") ? frame.anchorId : _AnchorFrameCache.computeAnchorId(frame.schema);
296
+ const existing = this._store.get(anchorId);
297
+ if (existing !== void 0 && this.clock() < existing.expiresAt) {
298
+ if (!_AnchorFrameCache._schemasEqual(existing.frame.schema, frame.schema)) {
299
+ throw new NpsAnchorPoisonError(anchorId);
300
+ }
301
+ }
302
+ const ttlMs = (frame.ttl ?? 3600) * 1e3;
303
+ const expiresAt = this.clock() + ttlMs;
304
+ this._store.set(anchorId, { frame, expiresAt });
305
+ return anchorId;
306
+ }
307
+ get(anchorId) {
308
+ const entry = this._store.get(anchorId);
309
+ if (entry === void 0) return void 0;
310
+ if (this.clock() > entry.expiresAt) {
311
+ this._store.delete(anchorId);
312
+ return void 0;
313
+ }
314
+ return entry.frame;
315
+ }
316
+ getRequired(anchorId) {
317
+ const frame = this.get(anchorId);
318
+ if (frame === void 0) throw new NpsAnchorNotFoundError(anchorId);
319
+ return frame;
320
+ }
321
+ invalidate(anchorId) {
322
+ this._store.delete(anchorId);
323
+ }
324
+ get size() {
325
+ this._evictExpired();
326
+ return this._store.size;
327
+ }
328
+ // ── Static helpers ────────────────────────────────────────────────────────
329
+ static computeAnchorId(schema) {
330
+ const sorted = [...schema.fields].map((f) => {
331
+ const obj = { name: f.name, type: f.type };
332
+ if (f.semantic !== void 0) obj["semantic"] = f.semantic;
333
+ if (f.nullable !== void 0) obj["nullable"] = f.nullable;
334
+ return obj;
335
+ }).sort((a, b) => String(a["name"]).localeCompare(String(b["name"])));
336
+ const canonical = JSON.stringify(sorted);
337
+ const digest = crypto.createHash("sha256").update(canonical, "utf8").digest("hex");
338
+ return `sha256:${digest}`;
339
+ }
340
+ // ── Private ───────────────────────────────────────────────────────────────
341
+ _evictExpired() {
342
+ const now = this.clock();
343
+ for (const [k, entry] of this._store) {
344
+ if (now > entry.expiresAt) this._store.delete(k);
345
+ }
346
+ }
347
+ static _schemasEqual(a, b) {
348
+ return _AnchorFrameCache.computeAnchorId(a) === _AnchorFrameCache.computeAnchorId(b);
349
+ }
350
+ };
351
+
352
+ exports.AnchorFrameCache = AnchorFrameCache;
353
+ exports.DEFAULT_HEADER_SIZE = DEFAULT_HEADER_SIZE;
354
+ exports.DEFAULT_MAX_PAYLOAD = DEFAULT_MAX_PAYLOAD;
355
+ exports.EXTENDED_HEADER_SIZE = EXTENDED_HEADER_SIZE;
356
+ exports.EXTENDED_MAX_PAYLOAD = EXTENDED_MAX_PAYLOAD;
357
+ exports.EncodingTier = EncodingTier;
358
+ exports.FrameFlags = FrameFlags;
359
+ exports.FrameHeader = FrameHeader;
360
+ exports.FrameRegistry = FrameRegistry;
361
+ exports.FrameType = FrameType;
362
+ exports.NpsAnchorNotFoundError = NpsAnchorNotFoundError;
363
+ exports.NpsAnchorPoisonError = NpsAnchorPoisonError;
364
+ exports.NpsCodecError = NpsCodecError;
365
+ exports.NpsError = NpsError;
366
+ exports.NpsFrameCodec = NpsFrameCodec;
367
+ exports.NpsFrameError = NpsFrameError;
368
+ exports.Tier1JsonCodec = Tier1JsonCodec;
369
+ exports.Tier2MsgPackCodec = Tier2MsgPackCodec;
370
+ //# sourceMappingURL=index.cjs.map
371
+ //# sourceMappingURL=index.cjs.map