@mindpeeker/entropy 0.1.0

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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +496 -0
  3. package/dist/errors.d.ts +14 -0
  4. package/dist/errors.d.ts.map +1 -0
  5. package/dist/errors.js +13 -0
  6. package/dist/errors.js.map +1 -0
  7. package/dist/index.d.ts +13 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +10 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/internal/bits.d.ts +9 -0
  12. package/dist/internal/bits.d.ts.map +1 -0
  13. package/dist/internal/bits.js +29 -0
  14. package/dist/internal/bits.js.map +1 -0
  15. package/dist/internal/byte-source.d.ts +16 -0
  16. package/dist/internal/byte-source.d.ts.map +1 -0
  17. package/dist/internal/byte-source.js +96 -0
  18. package/dist/internal/byte-source.js.map +1 -0
  19. package/dist/internal/bytes.d.ts +5 -0
  20. package/dist/internal/bytes.d.ts.map +1 -0
  21. package/dist/internal/bytes.js +56 -0
  22. package/dist/internal/bytes.js.map +1 -0
  23. package/dist/internal/composite.d.ts +15 -0
  24. package/dist/internal/composite.d.ts.map +1 -0
  25. package/dist/internal/composite.js +36 -0
  26. package/dist/internal/composite.js.map +1 -0
  27. package/dist/internal/condition.d.ts +38 -0
  28. package/dist/internal/condition.d.ts.map +1 -0
  29. package/dist/internal/condition.js +49 -0
  30. package/dist/internal/condition.js.map +1 -0
  31. package/dist/internal/encoding.d.ts +14 -0
  32. package/dist/internal/encoding.d.ts.map +1 -0
  33. package/dist/internal/encoding.js +91 -0
  34. package/dist/internal/encoding.js.map +1 -0
  35. package/dist/internal/health.d.ts +25 -0
  36. package/dist/internal/health.d.ts.map +1 -0
  37. package/dist/internal/health.js +84 -0
  38. package/dist/internal/health.js.map +1 -0
  39. package/dist/internal/http.d.ts +25 -0
  40. package/dist/internal/http.d.ts.map +1 -0
  41. package/dist/internal/http.js +76 -0
  42. package/dist/internal/http.js.map +1 -0
  43. package/dist/internal/nist-pulse.d.ts +31 -0
  44. package/dist/internal/nist-pulse.d.ts.map +1 -0
  45. package/dist/internal/nist-pulse.js +62 -0
  46. package/dist/internal/nist-pulse.js.map +1 -0
  47. package/dist/internal/provider.d.ts +19 -0
  48. package/dist/internal/provider.d.ts.map +1 -0
  49. package/dist/internal/provider.js +62 -0
  50. package/dist/internal/provider.js.map +1 -0
  51. package/dist/internal/rate-limit.d.ts +15 -0
  52. package/dist/internal/rate-limit.d.ts.map +1 -0
  53. package/dist/internal/rate-limit.js +47 -0
  54. package/dist/internal/rate-limit.js.map +1 -0
  55. package/dist/internal/sampled.d.ts +25 -0
  56. package/dist/internal/sampled.d.ts.map +1 -0
  57. package/dist/internal/sampled.js +49 -0
  58. package/dist/internal/sampled.js.map +1 -0
  59. package/dist/internal/stream.d.ts +29 -0
  60. package/dist/internal/stream.d.ts.map +1 -0
  61. package/dist/internal/stream.js +78 -0
  62. package/dist/internal/stream.js.map +1 -0
  63. package/dist/internal/validate.d.ts +5 -0
  64. package/dist/internal/validate.d.ts.map +1 -0
  65. package/dist/internal/validate.js +39 -0
  66. package/dist/internal/validate.js.map +1 -0
  67. package/dist/node/ffmpeg-frames.d.ts +27 -0
  68. package/dist/node/ffmpeg-frames.d.ts.map +1 -0
  69. package/dist/node/ffmpeg-frames.js +102 -0
  70. package/dist/node/ffmpeg-frames.js.map +1 -0
  71. package/dist/node/ffmpeg-samples.d.ts +21 -0
  72. package/dist/node/ffmpeg-samples.d.ts.map +1 -0
  73. package/dist/node/ffmpeg-samples.js +81 -0
  74. package/dist/node/ffmpeg-samples.js.map +1 -0
  75. package/dist/node/hwrng.d.ts +12 -0
  76. package/dist/node/hwrng.d.ts.map +1 -0
  77. package/dist/node/hwrng.js +43 -0
  78. package/dist/node/hwrng.js.map +1 -0
  79. package/dist/node/index.d.ts +9 -0
  80. package/dist/node/index.d.ts.map +1 -0
  81. package/dist/node/index.js +7 -0
  82. package/dist/node/index.js.map +1 -0
  83. package/dist/node/rtl-sdr.d.ts +31 -0
  84. package/dist/node/rtl-sdr.d.ts.map +1 -0
  85. package/dist/node/rtl-sdr.js +63 -0
  86. package/dist/node/rtl-sdr.js.map +1 -0
  87. package/dist/node/serial-source.d.ts +22 -0
  88. package/dist/node/serial-source.d.ts.map +1 -0
  89. package/dist/node/serial-source.js +63 -0
  90. package/dist/node/serial-source.js.map +1 -0
  91. package/dist/providers/anu-legacy.d.ts +17 -0
  92. package/dist/providers/anu-legacy.d.ts.map +1 -0
  93. package/dist/providers/anu-legacy.js +56 -0
  94. package/dist/providers/anu-legacy.js.map +1 -0
  95. package/dist/providers/anu.d.ts +14 -0
  96. package/dist/providers/anu.d.ts.map +1 -0
  97. package/dist/providers/anu.js +42 -0
  98. package/dist/providers/anu.js.map +1 -0
  99. package/dist/providers/bitcoin.d.ts +14 -0
  100. package/dist/providers/bitcoin.d.ts.map +1 -0
  101. package/dist/providers/bitcoin.js +95 -0
  102. package/dist/providers/bitcoin.js.map +1 -0
  103. package/dist/providers/camera.d.ts +49 -0
  104. package/dist/providers/camera.d.ts.map +1 -0
  105. package/dist/providers/camera.js +123 -0
  106. package/dist/providers/camera.js.map +1 -0
  107. package/dist/providers/crypto.d.ts +8 -0
  108. package/dist/providers/crypto.d.ts.map +1 -0
  109. package/dist/providers/crypto.js +26 -0
  110. package/dist/providers/crypto.js.map +1 -0
  111. package/dist/providers/curby.d.ts +17 -0
  112. package/dist/providers/curby.d.ts.map +1 -0
  113. package/dist/providers/curby.js +113 -0
  114. package/dist/providers/curby.js.map +1 -0
  115. package/dist/providers/drand.d.ts +19 -0
  116. package/dist/providers/drand.d.ts.map +1 -0
  117. package/dist/providers/drand.js +87 -0
  118. package/dist/providers/drand.js.map +1 -0
  119. package/dist/providers/flow.d.ts +15 -0
  120. package/dist/providers/flow.d.ts.map +1 -0
  121. package/dist/providers/flow.js +82 -0
  122. package/dist/providers/flow.js.map +1 -0
  123. package/dist/providers/index.d.ts +56 -0
  124. package/dist/providers/index.d.ts.map +1 -0
  125. package/dist/providers/index.js +32 -0
  126. package/dist/providers/index.js.map +1 -0
  127. package/dist/providers/inmetro.d.ts +17 -0
  128. package/dist/providers/inmetro.d.ts.map +1 -0
  129. package/dist/providers/inmetro.js +25 -0
  130. package/dist/providers/inmetro.js.map +1 -0
  131. package/dist/providers/jitter.d.ts +33 -0
  132. package/dist/providers/jitter.d.ts.map +1 -0
  133. package/dist/providers/jitter.js +81 -0
  134. package/dist/providers/jitter.js.map +1 -0
  135. package/dist/providers/lfdr.d.ts +11 -0
  136. package/dist/providers/lfdr.d.ts.map +1 -0
  137. package/dist/providers/lfdr.js +34 -0
  138. package/dist/providers/lfdr.js.map +1 -0
  139. package/dist/providers/microphone.d.ts +26 -0
  140. package/dist/providers/microphone.d.ts.map +1 -0
  141. package/dist/providers/microphone.js +120 -0
  142. package/dist/providers/microphone.js.map +1 -0
  143. package/dist/providers/nist-beacon.d.ts +11 -0
  144. package/dist/providers/nist-beacon.d.ts.map +1 -0
  145. package/dist/providers/nist-beacon.js +20 -0
  146. package/dist/providers/nist-beacon.js.map +1 -0
  147. package/dist/providers/nqsn.d.ts +11 -0
  148. package/dist/providers/nqsn.d.ts.map +1 -0
  149. package/dist/providers/nqsn.js +16 -0
  150. package/dist/providers/nqsn.js.map +1 -0
  151. package/dist/providers/outshift.d.ts +14 -0
  152. package/dist/providers/outshift.d.ts.map +1 -0
  153. package/dist/providers/outshift.js +52 -0
  154. package/dist/providers/outshift.js.map +1 -0
  155. package/dist/providers/padova.d.ts +12 -0
  156. package/dist/providers/padova.d.ts.map +1 -0
  157. package/dist/providers/padova.js +56 -0
  158. package/dist/providers/padova.js.map +1 -0
  159. package/dist/providers/qbck.d.ts +13 -0
  160. package/dist/providers/qbck.d.ts.map +1 -0
  161. package/dist/providers/qbck.js +62 -0
  162. package/dist/providers/qbck.js.map +1 -0
  163. package/dist/providers/qci.d.ts +14 -0
  164. package/dist/providers/qci.d.ts.map +1 -0
  165. package/dist/providers/qci.js +91 -0
  166. package/dist/providers/qci.js.map +1 -0
  167. package/dist/providers/qrandom.d.ts +12 -0
  168. package/dist/providers/qrandom.d.ts.map +1 -0
  169. package/dist/providers/qrandom.js +39 -0
  170. package/dist/providers/qrandom.js.map +1 -0
  171. package/dist/providers/randao.d.ts +14 -0
  172. package/dist/providers/randao.d.ts.map +1 -0
  173. package/dist/providers/randao.js +81 -0
  174. package/dist/providers/randao.js.map +1 -0
  175. package/dist/providers/random-org.d.ts +13 -0
  176. package/dist/providers/random-org.d.ts.map +1 -0
  177. package/dist/providers/random-org.js +89 -0
  178. package/dist/providers/random-org.js.map +1 -0
  179. package/dist/providers/sdr.d.ts +21 -0
  180. package/dist/providers/sdr.d.ts.map +1 -0
  181. package/dist/providers/sdr.js +63 -0
  182. package/dist/providers/sdr.js.map +1 -0
  183. package/dist/providers/sensor.d.ts +24 -0
  184. package/dist/providers/sensor.d.ts.map +1 -0
  185. package/dist/providers/sensor.js +119 -0
  186. package/dist/providers/sensor.js.map +1 -0
  187. package/dist/providers/serial.d.ts +35 -0
  188. package/dist/providers/serial.d.ts.map +1 -0
  189. package/dist/providers/serial.js +78 -0
  190. package/dist/providers/serial.js.map +1 -0
  191. package/dist/providers/solana.d.ts +13 -0
  192. package/dist/providers/solana.d.ts.map +1 -0
  193. package/dist/providers/solana.js +83 -0
  194. package/dist/providers/solana.js.map +1 -0
  195. package/dist/providers/superrand.d.ts +35 -0
  196. package/dist/providers/superrand.d.ts.map +1 -0
  197. package/dist/providers/superrand.js +215 -0
  198. package/dist/providers/superrand.js.map +1 -0
  199. package/dist/providers/tezos.d.ts +13 -0
  200. package/dist/providers/tezos.d.ts.map +1 -0
  201. package/dist/providers/tezos.js +92 -0
  202. package/dist/providers/tezos.js.map +1 -0
  203. package/dist/providers/uchile.d.ts +11 -0
  204. package/dist/providers/uchile.d.ts.map +1 -0
  205. package/dist/providers/uchile.js +22 -0
  206. package/dist/providers/uchile.js.map +1 -0
  207. package/dist/strategies/fallback.d.ts +12 -0
  208. package/dist/strategies/fallback.d.ts.map +1 -0
  209. package/dist/strategies/fallback.js +45 -0
  210. package/dist/strategies/fallback.js.map +1 -0
  211. package/dist/strategies/race.d.ts +7 -0
  212. package/dist/strategies/race.d.ts.map +1 -0
  213. package/dist/strategies/race.js +41 -0
  214. package/dist/strategies/race.js.map +1 -0
  215. package/dist/strategies/xor.d.ts +9 -0
  216. package/dist/strategies/xor.d.ts.map +1 -0
  217. package/dist/strategies/xor.js +56 -0
  218. package/dist/strategies/xor.js.map +1 -0
  219. package/dist/types.d.ts +36 -0
  220. package/dist/types.d.ts.map +1 -0
  221. package/dist/types.js +2 -0
  222. package/dist/types.js.map +1 -0
  223. package/package.json +52 -0
@@ -0,0 +1,16 @@
1
+ /** Any pull-able byte producer a local provider can consume. */
2
+ export type ByteSource = AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>;
3
+ /**
4
+ * Share one underlying byte iterator across many short-lived consumer views.
5
+ * A view's early termination or abort never closes the shared source — its
6
+ * lifetime belongs to whoever created it. Used for injected sources that
7
+ * must survive repeated getBytes sessions.
8
+ */
9
+ export declare function persistentBytes(source: ByteSource): (signal?: AbortSignal) => AsyncGenerator<Uint8Array>;
10
+ /**
11
+ * Uniform pull adapter over both ByteSource shapes. Skips empty chunks,
12
+ * releases the ReadableStream reader (or calls the inner iterator's
13
+ * return()) on early termination, and rejects promptly on signal abort.
14
+ */
15
+ export declare function iterateBytes(source: ByteSource, signal?: AbortSignal): AsyncGenerator<Uint8Array>;
16
+ //# sourceMappingURL=byte-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byte-source.d.ts","sourceRoot":"","sources":["../../src/internal/byte-source.ts"],"names":[],"mappings":"AAEA,gEAAgE;AAChE,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;AAgC/E;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,GACjB,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,cAAc,CAAC,UAAU,CAAC,CAUtD;AAED;;;;GAIG;AACH,wBAAuB,YAAY,CACjC,MAAM,EAAE,UAAU,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,UAAU,CAAC,CAiC5B"}
@@ -0,0 +1,96 @@
1
+ import { sleep } from './rate-limit.js';
2
+ /**
3
+ * How long an abort waits for generator cleanup. return() on an async
4
+ * generator only takes effect at a yield point — a source stuck in awaits
5
+ * without yielding would otherwise block cleanup forever.
6
+ */
7
+ const ABORT_CLEANUP_GRACE_MS = 100;
8
+ function abortError(signal) {
9
+ return signal.reason ?? new DOMException('The operation was aborted.', 'AbortError');
10
+ }
11
+ /** Race a pending read against signal abort, cleaning the listener up either way. */
12
+ function abortable(promise, signal) {
13
+ if (!signal)
14
+ return promise;
15
+ return new Promise((resolve, reject) => {
16
+ const onAbort = () => reject(abortError(signal));
17
+ signal.addEventListener('abort', onAbort, { once: true });
18
+ promise.then((value) => {
19
+ signal.removeEventListener('abort', onAbort);
20
+ resolve(value);
21
+ }, (error) => {
22
+ signal.removeEventListener('abort', onAbort);
23
+ reject(error);
24
+ });
25
+ });
26
+ }
27
+ /**
28
+ * Share one underlying byte iterator across many short-lived consumer views.
29
+ * A view's early termination or abort never closes the shared source — its
30
+ * lifetime belongs to whoever created it. Used for injected sources that
31
+ * must survive repeated getBytes sessions.
32
+ */
33
+ export function persistentBytes(source) {
34
+ const shared = iterateBytes(source)[Symbol.asyncIterator]();
35
+ return async function* view(signal) {
36
+ while (true) {
37
+ if (signal?.aborted)
38
+ throw abortError(signal);
39
+ const { done, value } = await abortable(shared.next(), signal);
40
+ if (done)
41
+ return;
42
+ yield value;
43
+ }
44
+ };
45
+ }
46
+ /**
47
+ * Uniform pull adapter over both ByteSource shapes. Skips empty chunks,
48
+ * releases the ReadableStream reader (or calls the inner iterator's
49
+ * return()) on early termination, and rejects promptly on signal abort.
50
+ */
51
+ export async function* iterateBytes(source, signal) {
52
+ if (typeof source.getReader === 'function') {
53
+ const reader = source.getReader();
54
+ try {
55
+ while (true) {
56
+ if (signal?.aborted)
57
+ throw abortError(signal);
58
+ const { done, value } = await abortable(reader.read(), signal);
59
+ if (done)
60
+ return;
61
+ if (value && value.length > 0)
62
+ yield value;
63
+ }
64
+ }
65
+ finally {
66
+ reader.cancel().catch(() => { });
67
+ reader.releaseLock();
68
+ }
69
+ }
70
+ else {
71
+ const iterator = source[Symbol.asyncIterator]();
72
+ try {
73
+ while (true) {
74
+ if (signal?.aborted)
75
+ throw abortError(signal);
76
+ const { done, value } = await abortable(iterator.next(), signal);
77
+ if (done)
78
+ return;
79
+ if (value && value.length > 0)
80
+ yield value;
81
+ }
82
+ }
83
+ finally {
84
+ const cleanup = iterator.return?.().catch(() => { });
85
+ if (cleanup) {
86
+ // On abort, wait only briefly — a source that never yields would
87
+ // block return() forever. Normal termination waits for full cleanup.
88
+ if (signal?.aborted)
89
+ await Promise.race([cleanup, sleep(ABORT_CLEANUP_GRACE_MS)]);
90
+ else
91
+ await cleanup;
92
+ }
93
+ }
94
+ }
95
+ }
96
+ //# sourceMappingURL=byte-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byte-source.js","sourceRoot":"","sources":["../../src/internal/byte-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function hexToBytes(hex: string): Uint8Array<ArrayBuffer>;
2
+ export declare function base64ToBytes(b64: string): Uint8Array<ArrayBuffer>;
3
+ export declare function concatBytes(chunks: readonly Uint8Array[]): Uint8Array<ArrayBuffer>;
4
+ export declare function xorBytes(inputs: readonly Uint8Array[]): Uint8Array<ArrayBuffer>;
5
+ //# sourceMappingURL=bytes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/internal/bytes.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAS/D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAYlE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAUlF;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAgB/E"}
@@ -0,0 +1,56 @@
1
+ const HEX_RE = /^[0-9a-fA-F]*$/;
2
+ export function hexToBytes(hex) {
3
+ if (hex.length % 2 !== 0 || !HEX_RE.test(hex)) {
4
+ throw new TypeError(`invalid hex string of length ${hex.length}`);
5
+ }
6
+ const out = new Uint8Array(hex.length / 2);
7
+ for (let i = 0; i < out.length; i++) {
8
+ out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
9
+ }
10
+ return out;
11
+ }
12
+ export function base64ToBytes(b64) {
13
+ let binary;
14
+ try {
15
+ binary = atob(b64);
16
+ }
17
+ catch (error) {
18
+ throw new TypeError(`invalid base64 string: ${error.message}`);
19
+ }
20
+ const out = new Uint8Array(binary.length);
21
+ for (let i = 0; i < out.length; i++) {
22
+ out[i] = binary.charCodeAt(i);
23
+ }
24
+ return out;
25
+ }
26
+ export function concatBytes(chunks) {
27
+ let total = 0;
28
+ for (const chunk of chunks)
29
+ total += chunk.length;
30
+ const out = new Uint8Array(total);
31
+ let offset = 0;
32
+ for (const chunk of chunks) {
33
+ out.set(chunk, offset);
34
+ offset += chunk.length;
35
+ }
36
+ return out;
37
+ }
38
+ export function xorBytes(inputs) {
39
+ const first = inputs[0];
40
+ if (!first)
41
+ throw new TypeError('xorBytes needs at least one input');
42
+ for (const input of inputs) {
43
+ if (input.length !== first.length) {
44
+ throw new TypeError(`xorBytes length mismatch: ${input.length} !== ${first.length}`);
45
+ }
46
+ }
47
+ const out = new Uint8Array(first);
48
+ for (let i = 1; i < inputs.length; i++) {
49
+ const input = inputs[i];
50
+ for (let j = 0; j < out.length; j++) {
51
+ out[j] = out[j] ^ input[j];
52
+ }
53
+ }
54
+ return out;
55
+ }
56
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/internal/bytes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { EntropyError } from '../errors.js';
2
+ import type { EntropyKind, EntropyPrivacy, EntropyProvider } from '../types.js';
3
+ export declare function requireProviders(providers: readonly EntropyProvider[], strategy: string): void;
4
+ export declare function compositeName(strategy: string, providers: readonly EntropyProvider[]): string;
5
+ export declare function commonKind(providers: readonly EntropyProvider[]): EntropyKind;
6
+ /** For fallback/race: any member might serve, so one public member taints the whole. */
7
+ export declare function pessimisticPrivacy(providers: readonly EntropyProvider[]): EntropyPrivacy;
8
+ /**
9
+ * For xorMix: XOR with at least one independent private input yields a private
10
+ * output — public beacons mixed in add auditability without exposing the result.
11
+ */
12
+ export declare function anyPrivatePrivacy(providers: readonly EntropyProvider[]): EntropyPrivacy;
13
+ export declare function toEntropyError(error: unknown, provider: string): EntropyError;
14
+ export declare function abortedError(provider: string): EntropyError;
15
+ //# sourceMappingURL=composite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite.d.ts","sourceRoot":"","sources":["../../src/internal/composite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE/E,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAI9F;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAE7F;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,GAAG,WAAW,CAG7E;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,GAAG,cAAc,CAExF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,GAAG,cAAc,CAEvF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAM7E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAE3D"}
@@ -0,0 +1,36 @@
1
+ import { EntropyError } from '../errors.js';
2
+ export function requireProviders(providers, strategy) {
3
+ if (providers.length === 0) {
4
+ throw new TypeError(`${strategy} requires at least one provider`);
5
+ }
6
+ }
7
+ export function compositeName(strategy, providers) {
8
+ return `${strategy}(${providers.map((p) => p.name).join(',')})`;
9
+ }
10
+ export function commonKind(providers) {
11
+ const first = providers[0]?.kind ?? 'mixed';
12
+ return providers.every((p) => p.kind === first) ? first : 'mixed';
13
+ }
14
+ /** For fallback/race: any member might serve, so one public member taints the whole. */
15
+ export function pessimisticPrivacy(providers) {
16
+ return providers.every((p) => p.privacy === 'private') ? 'private' : 'public';
17
+ }
18
+ /**
19
+ * For xorMix: XOR with at least one independent private input yields a private
20
+ * output — public beacons mixed in add auditability without exposing the result.
21
+ */
22
+ export function anyPrivatePrivacy(providers) {
23
+ return providers.some((p) => p.privacy === 'private') ? 'private' : 'public';
24
+ }
25
+ export function toEntropyError(error, provider) {
26
+ if (error instanceof EntropyError)
27
+ return error;
28
+ return new EntropyError('network', `unexpected provider error: ${String(error)}`, {
29
+ provider,
30
+ cause: error,
31
+ });
32
+ }
33
+ export function abortedError(provider) {
34
+ return new EntropyError('aborted', 'request aborted', { provider });
35
+ }
36
+ //# sourceMappingURL=composite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite.js","sourceRoot":"","sources":["../../src/internal/composite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG3C,MAAM,UAAU,gBAAgB,CAAC,SAAqC,EAAE,QAAgB;IACtF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,SAAS,CAAC,GAAG,QAAQ,iCAAiC,CAAC,CAAA;IACnE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,SAAqC;IACnF,OAAO,GAAG,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAqC;IAC9D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,OAAO,CAAA;IAC3C,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAA;AACnE,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,kBAAkB,CAAC,SAAqC;IACtE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAqC;IACrE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;AAC9E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,QAAgB;IAC7D,IAAI,KAAK,YAAY,YAAY;QAAE,OAAO,KAAK,CAAA;IAC/C,OAAO,IAAI,YAAY,CAAC,SAAS,EAAE,8BAA8B,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;QAChF,QAAQ;QACR,KAAK,EAAE,KAAK;KACb,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,IAAI,YAAY,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;AACrE,CAAC"}
@@ -0,0 +1,38 @@
1
+ export type ConditioningMode = 'conditioned' | 'raw';
2
+ /** Shared option surface every local (physical-noise) provider extends. */
3
+ export interface ConditioningOptions {
4
+ /**
5
+ * 'conditioned' (default): SHA-256 extraction with entropy-credit
6
+ * accounting. 'raw': health-tested samples pass through unwhitened —
7
+ * for uses where the unprocessed physical noise is the point.
8
+ */
9
+ conditioning?: ConditioningMode;
10
+ /** Override the source's assessed min-entropy (bits per raw sample byte). */
11
+ minEntropyPerSample?: number;
12
+ /** Pool safetyFactor × 256 credited bits before emitting each 32-byte block. */
13
+ safetyFactor?: number;
14
+ }
15
+ export interface ConditionerConfig {
16
+ provider: string;
17
+ minEntropyPerSample: number;
18
+ safetyFactor: number;
19
+ mode: ConditioningMode;
20
+ windowSize?: 512 | 1024;
21
+ /**
22
+ * Run the health tests at a stricter assessed H than what is credited.
23
+ * At very low credited H the APT cutoff exceeds its window (test disabled)
24
+ * and the RCT cutoff balloons — a frozen-but-patterned source would pass.
25
+ * Default: same as minEntropyPerSample.
26
+ */
27
+ healthMinEntropyPerSample?: number;
28
+ }
29
+ /**
30
+ * Raw sample chunks in → output chunks out. Health tests (RCT + APT) always
31
+ * run on the raw side, in both modes. Conditioned mode pools raw bytes until
32
+ * the credited min-entropy reaches safetyFactor × 256 bits, then emits
33
+ * SHA-256(pool) and resets the pool.
34
+ */
35
+ export declare function condition(raw: AsyncIterable<Uint8Array>, config: ConditionerConfig): AsyncGenerator<Uint8Array>;
36
+ /** Drain a stream into exactly `n` bytes or throw insufficient_entropy. */
37
+ export declare function collectBytes(stream: AsyncIterable<Uint8Array>, n: number, provider: string): Promise<Uint8Array>;
38
+ //# sourceMappingURL=condition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../src/internal/condition.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,KAAK,CAAA;AAEpD,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,CAAA;IAC/B,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,gBAAgB,CAAA;IACtB,UAAU,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;IACvB;;;;;OAKG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;CACnC;AAID;;;;;GAKG;AACH,wBAAuB,SAAS,CAC9B,GAAG,EAAE,aAAa,CAAC,UAAU,CAAC,EAC9B,MAAM,EAAE,iBAAiB,GACxB,cAAc,CAAC,UAAU,CAAC,CA2B5B;AAED,2EAA2E;AAC3E,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EACjC,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAWrB"}
@@ -0,0 +1,49 @@
1
+ import { EntropyError } from '../errors.js';
2
+ import { concatBytes } from './bytes.js';
3
+ import { HealthTests } from './health.js';
4
+ const BLOCK_BITS = 256;
5
+ /**
6
+ * Raw sample chunks in → output chunks out. Health tests (RCT + APT) always
7
+ * run on the raw side, in both modes. Conditioned mode pools raw bytes until
8
+ * the credited min-entropy reaches safetyFactor × 256 bits, then emits
9
+ * SHA-256(pool) and resets the pool.
10
+ */
11
+ export async function* condition(raw, config) {
12
+ const { provider, minEntropyPerSample, safetyFactor, mode, windowSize } = config;
13
+ const health = new HealthTests({ minEntropyPerSample: config.healthMinEntropyPerSample ?? minEntropyPerSample, windowSize }, provider);
14
+ const bytesPerBlock = Math.ceil((safetyFactor * BLOCK_BITS) / minEntropyPerSample);
15
+ let pool = [];
16
+ let pooled = 0;
17
+ for await (const chunk of raw) {
18
+ health.test(chunk);
19
+ if (mode === 'raw') {
20
+ yield chunk;
21
+ continue;
22
+ }
23
+ pool.push(chunk);
24
+ pooled += chunk.length;
25
+ while (pooled >= bytesPerBlock) {
26
+ const all = concatBytes(pool);
27
+ const block = all.slice(0, bytesPerBlock);
28
+ const rest = all.slice(bytesPerBlock);
29
+ pool = rest.length > 0 ? [rest] : [];
30
+ pooled = rest.length;
31
+ yield new Uint8Array(await crypto.subtle.digest('SHA-256', block));
32
+ }
33
+ }
34
+ }
35
+ /** Drain a stream into exactly `n` bytes or throw insufficient_entropy. */
36
+ export async function collectBytes(stream, n, provider) {
37
+ const chunks = [];
38
+ let total = 0;
39
+ for await (const chunk of stream) {
40
+ chunks.push(chunk);
41
+ total += chunk.length;
42
+ if (total >= n)
43
+ return concatBytes(chunks).slice(0, n);
44
+ }
45
+ throw new EntropyError('insufficient_entropy', `source ended after ${total}/${n} bytes`, {
46
+ provider,
47
+ });
48
+ }
49
+ //# sourceMappingURL=condition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition.js","sourceRoot":"","sources":["../../src/internal/condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAiCzC,MAAM,UAAU,GAAG,GAAG,CAAA;AAEtB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,SAAS,CAC9B,GAA8B,EAC9B,MAAyB;IAEzB,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAChF,MAAM,MAAM,GAAG,IAAI,WAAW,CAC5B,EAAE,mBAAmB,EAAE,MAAM,CAAC,yBAAyB,IAAI,mBAAmB,EAAE,UAAU,EAAE,EAC5F,QAAQ,CACT,CAAA;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,mBAAmB,CAAC,CAAA;IAElF,IAAI,IAAI,GAAiB,EAAE,CAAA;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,KAAK,CAAA;YACX,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAA;QACtB,OAAO,MAAM,IAAI,aAAa,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;YAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YACzC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;YACrC,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YACpC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACpB,MAAM,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAiC,EACjC,CAAS,EACT,QAAgB;IAEhB,MAAM,MAAM,GAAiB,EAAE,CAAA;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,KAAK,IAAI,KAAK,CAAC,MAAM,CAAA;QACrB,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACxD,CAAC;IACD,MAAM,IAAI,YAAY,CAAC,sBAAsB,EAAE,sBAAsB,KAAK,IAAI,CAAC,QAAQ,EAAE;QACvF,QAAQ;KACT,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /** Zero-dep decoders for blockchain hashes (base58) and IPLD CIDs (base32/varint). */
2
+ /** Decode base58btc (Bitcoin/Solana alphabet). Leading '1's become 0x00 bytes. */
3
+ export declare function base58Decode(input: string): Uint8Array;
4
+ /** Decode RFC 4648 base32, lowercase and unpadded (the CIDv1 default encoding). */
5
+ export declare function base32Decode(input: string): Uint8Array;
6
+ /** Read an unsigned LEB128 varint. Returns [value, nextOffset]. */
7
+ export declare function readVarint(bytes: Uint8Array, offset: number): [number, number];
8
+ /**
9
+ * Extract the multihash digest bytes from a base32 CIDv1 string (e.g. a CURBy
10
+ * twine block CID). The digest of the block's content hash is CURBy's defined
11
+ * per-pulse randomness.
12
+ */
13
+ export declare function cidDigest(cid: string): Uint8Array;
14
+ //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/internal/encoding.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAKtF,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAoBtD;AAKD,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAetD;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAc9E;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAejD"}
@@ -0,0 +1,91 @@
1
+ /** Zero-dep decoders for blockchain hashes (base58) and IPLD CIDs (base32/varint). */
2
+ const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
3
+ const BASE58_MAP = new Map([...BASE58_ALPHABET].map((c, i) => [c, i]));
4
+ /** Decode base58btc (Bitcoin/Solana alphabet). Leading '1's become 0x00 bytes. */
5
+ export function base58Decode(input) {
6
+ const bytes = [];
7
+ for (const char of input) {
8
+ const value = BASE58_MAP.get(char);
9
+ if (value === undefined)
10
+ throw new TypeError(`invalid base58 character '${char}'`);
11
+ // long multiplication: bytes = bytes * 58 + value
12
+ let carry = value;
13
+ for (let i = bytes.length - 1; i >= 0; i--) {
14
+ const acc = bytes[i] * 58 + carry;
15
+ bytes[i] = acc & 0xff;
16
+ carry = acc >> 8;
17
+ }
18
+ while (carry > 0) {
19
+ bytes.unshift(carry & 0xff);
20
+ carry >>= 8;
21
+ }
22
+ }
23
+ let leadingZeros = 0;
24
+ while (leadingZeros < input.length && input[leadingZeros] === '1')
25
+ leadingZeros++;
26
+ return new Uint8Array([...new Array(leadingZeros).fill(0), ...bytes]);
27
+ }
28
+ const BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
29
+ const BASE32_MAP = new Map([...BASE32_ALPHABET].map((c, i) => [c, i]));
30
+ /** Decode RFC 4648 base32, lowercase and unpadded (the CIDv1 default encoding). */
31
+ export function base32Decode(input) {
32
+ const out = [];
33
+ let buffer = 0;
34
+ let bits = 0;
35
+ for (const char of input) {
36
+ const value = BASE32_MAP.get(char);
37
+ if (value === undefined)
38
+ throw new TypeError(`invalid base32 character '${char}'`);
39
+ buffer = (buffer << 5) | value;
40
+ bits += 5;
41
+ if (bits >= 8) {
42
+ bits -= 8;
43
+ out.push((buffer >> bits) & 0xff);
44
+ }
45
+ }
46
+ return new Uint8Array(out);
47
+ }
48
+ /** Read an unsigned LEB128 varint. Returns [value, nextOffset]. */
49
+ export function readVarint(bytes, offset) {
50
+ let value = 0;
51
+ let shift = 0;
52
+ let position = offset;
53
+ while (true) {
54
+ if (position >= bytes.length)
55
+ throw new TypeError('truncated varint');
56
+ const byte = bytes[position];
57
+ position++;
58
+ value += (byte & 0x7f) * 2 ** shift;
59
+ if ((byte & 0x80) === 0)
60
+ break;
61
+ shift += 7;
62
+ if (shift > 49)
63
+ throw new TypeError('varint too large');
64
+ }
65
+ return [value, position];
66
+ }
67
+ /**
68
+ * Extract the multihash digest bytes from a base32 CIDv1 string (e.g. a CURBy
69
+ * twine block CID). The digest of the block's content hash is CURBy's defined
70
+ * per-pulse randomness.
71
+ */
72
+ export function cidDigest(cid) {
73
+ if (!cid.startsWith('b')) {
74
+ throw new TypeError(`expected a base32 CIDv1 (multibase prefix 'b'), got '${cid.slice(0, 4)}…'`);
75
+ }
76
+ const bytes = base32Decode(cid.slice(1));
77
+ let offset = 0;
78
+ let version;
79
+ [version, offset] = readVarint(bytes, offset);
80
+ if (version !== 1)
81
+ throw new TypeError(`unsupported CID version ${version}`);
82
+ [, offset] = readVarint(bytes, offset) // content codec — irrelevant here
83
+ ;
84
+ [, offset] = readVarint(bytes, offset); // multihash function code — irrelevant here
85
+ let digestLength;
86
+ [digestLength, offset] = readVarint(bytes, offset);
87
+ if (offset + digestLength > bytes.length)
88
+ throw new TypeError('truncated multihash digest');
89
+ return bytes.slice(offset, offset + digestLength);
90
+ }
91
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/internal/encoding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface HealthConfig {
2
+ /** Assessed min-entropy H in bits per raw sample byte. May be fractional. */
3
+ minEntropyPerSample: number;
4
+ /** APT window: 512 (default, non-binary samples) or 1024 (binary sources). */
5
+ windowSize?: 512 | 1024;
6
+ }
7
+ /** SP 800-90B §4.4.1 Repetition Count Test cutoff: C = 1 + ceil(20 / H) at alpha 2^-20. */
8
+ export declare function rctCutoff(h: number): number;
9
+ /**
10
+ * SP 800-90B §4.4.2 Adaptive Proportion Test cutoff:
11
+ * 1 + smallest k with P(Binomial(W, 2^-H) <= k) >= 1 - 2^-20,
12
+ * computed via the iterative pmf recurrence (exact enough for W <= 1024).
13
+ */
14
+ export declare function aptCutoff(h: number, windowSize: number): number;
15
+ /**
16
+ * Continuous health tests over RAW samples (run in both conditioning modes).
17
+ * Throws EntropyError('health_test') the moment either test fails — a failing
18
+ * source must never silently degrade to pseudo-randomness.
19
+ */
20
+ export declare class HealthTests {
21
+ #private;
22
+ constructor(config: HealthConfig, provider: string);
23
+ test(samples: Uint8Array): void;
24
+ }
25
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/internal/health.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,mBAAmB,EAAE,MAAM,CAAA;IAC3B,8EAA8E;IAC9E,UAAU,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;CACxB;AAED,2FAA2F;AAC3F,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAW/D;AAED;;;;GAIG;AACH,qBAAa,WAAW;;gBAeV,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM;IAWlD,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;CAsChC"}
@@ -0,0 +1,84 @@
1
+ import { EntropyError } from '../errors.js';
2
+ const ALPHA = 2 ** -20; // false-positive rate for both tests (SP 800-90B recommendation)
3
+ /** SP 800-90B §4.4.1 Repetition Count Test cutoff: C = 1 + ceil(20 / H) at alpha 2^-20. */
4
+ export function rctCutoff(h) {
5
+ return 1 + Math.ceil(20 / h);
6
+ }
7
+ /**
8
+ * SP 800-90B §4.4.2 Adaptive Proportion Test cutoff:
9
+ * 1 + smallest k with P(Binomial(W, 2^-H) <= k) >= 1 - 2^-20,
10
+ * computed via the iterative pmf recurrence (exact enough for W <= 1024).
11
+ */
12
+ export function aptCutoff(h, windowSize) {
13
+ const p = 2 ** -h;
14
+ let pmf = (1 - p) ** windowSize;
15
+ let cdf = pmf;
16
+ let k = 0;
17
+ while (cdf < 1 - ALPHA && k < windowSize) {
18
+ pmf *= ((windowSize - k) / (k + 1)) * (p / (1 - p));
19
+ k++;
20
+ cdf += pmf;
21
+ }
22
+ return 1 + k;
23
+ }
24
+ /**
25
+ * Continuous health tests over RAW samples (run in both conditioning modes).
26
+ * Throws EntropyError('health_test') the moment either test fails — a failing
27
+ * source must never silently degrade to pseudo-randomness.
28
+ */
29
+ export class HealthTests {
30
+ #rctCutoff;
31
+ #aptCutoff;
32
+ #windowSize;
33
+ #provider;
34
+ // Repetition Count Test state
35
+ #lastSample = -1;
36
+ #runLength = 0;
37
+ // Adaptive Proportion Test state
38
+ #windowIndex = 0;
39
+ #reference = -1;
40
+ #referenceCount = 0;
41
+ constructor(config, provider) {
42
+ const { minEntropyPerSample, windowSize = 512 } = config;
43
+ if (!(minEntropyPerSample > 0)) {
44
+ throw new TypeError('minEntropyPerSample must be > 0');
45
+ }
46
+ this.#rctCutoff = rctCutoff(minEntropyPerSample);
47
+ this.#aptCutoff = aptCutoff(minEntropyPerSample, windowSize);
48
+ this.#windowSize = windowSize;
49
+ this.#provider = provider;
50
+ }
51
+ test(samples) {
52
+ for (const sample of samples) {
53
+ // Repetition Count Test
54
+ if (sample === this.#lastSample) {
55
+ this.#runLength++;
56
+ if (this.#runLength >= this.#rctCutoff) {
57
+ throw new EntropyError('health_test', `repetition count test failed: ${this.#runLength} identical samples (cutoff ${this.#rctCutoff})`, { provider: this.#provider });
58
+ }
59
+ }
60
+ else {
61
+ this.#lastSample = sample;
62
+ this.#runLength = 1;
63
+ }
64
+ // Adaptive Proportion Test
65
+ if (this.#windowIndex === 0) {
66
+ this.#reference = sample;
67
+ this.#referenceCount = 1;
68
+ this.#windowIndex = 1;
69
+ }
70
+ else {
71
+ if (sample === this.#reference) {
72
+ this.#referenceCount++;
73
+ if (this.#referenceCount >= this.#aptCutoff) {
74
+ throw new EntropyError('health_test', `adaptive proportion test failed: value ${this.#reference} seen ${this.#referenceCount}× in a ${this.#windowSize}-sample window (cutoff ${this.#aptCutoff})`, { provider: this.#provider });
75
+ }
76
+ }
77
+ this.#windowIndex++;
78
+ if (this.#windowIndex === this.#windowSize)
79
+ this.#windowIndex = 0;
80
+ }
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/internal/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { EntropyError } from '../errors.js';
2
+ export interface FetchJsonOptions {
3
+ /** Provider name for error attribution. */
4
+ provider: string;
5
+ method?: 'GET' | 'POST';
6
+ headers?: Record<string, string>;
7
+ /** JSON-stringified and sent with content-type: application/json. */
8
+ body?: unknown;
9
+ signal?: AbortSignal;
10
+ fetchImpl?: typeof fetch;
11
+ /**
12
+ * Provider-specific mapping of non-2xx responses (e.g. ANU legacy signals
13
+ * its rate limit as HTTP 500 with a message). Return undefined to fall back
14
+ * to the default mapping.
15
+ */
16
+ onErrorResponse?: (status: number, body: string) => EntropyError | undefined;
17
+ }
18
+ /**
19
+ * fetch + JSON parse with the library's uniform error taxonomy. Abort/timeout
20
+ * reasons pass through unwrapped so `defineProvider` can classify them.
21
+ */
22
+ export declare function fetchJson<T>(url: string, opts: FetchJsonOptions): Promise<T>;
23
+ /** fetch returning the raw text body (e.g. Bitcoin tip-hash endpoints). */
24
+ export declare function fetchText(url: string, opts: FetchJsonOptions): Promise<string>;
25
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/internal/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,qEAAqE;IACrE,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS,CAAA;CAC7E;AAyDD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAUlF;AAED,2EAA2E;AAC3E,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpF"}