@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,27 @@
1
+ import type { FrameSource } from '../providers/camera.js';
2
+ export interface FfmpegFrameOptions {
3
+ /** avfoundation index on macOS (e.g. '0'), v4l2 device on Linux (e.g. '/dev/video0'). */
4
+ device: string;
5
+ width?: number;
6
+ height?: number;
7
+ /** Capture framerate; omit to use the device default. */
8
+ fps?: number;
9
+ ffmpegPath?: string;
10
+ }
11
+ interface VideoArgsInput {
12
+ device: string;
13
+ width: number;
14
+ height: number;
15
+ fps?: number;
16
+ }
17
+ export declare function ffmpegVideoArgs(opts: VideoArgsInput, platform: string): string[];
18
+ /** Stateful slicer: raw byte chunks in, complete fixed-size frames out. */
19
+ export declare function frameSlicer(frameBytes: number): (chunk: Uint8Array) => Uint8Array[];
20
+ /**
21
+ * Camera frames for Node via ffmpeg (must be on PATH or given via
22
+ * ffmpegPath): grayscale rawvideo piped from avfoundation (macOS) or v4l2
23
+ * (Linux). Plug into cameraEntropy({ source: ffmpegFrameSource({...}) }).
24
+ */
25
+ export declare function ffmpegFrameSource(opts: FfmpegFrameOptions): FrameSource;
26
+ export {};
27
+ //# sourceMappingURL=ffmpeg-frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffmpeg-frames.d.ts","sourceRoot":"","sources":["../../src/node/ffmpeg-frames.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAS,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEhE,MAAM,WAAW,kBAAkB;IACjC,yFAAyF;IACzF,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BhF;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,EAAE,CAiBnF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,WAAW,CA4CvE"}
@@ -0,0 +1,102 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { once } from 'node:events';
3
+ import { EntropyError } from '../errors.js';
4
+ import { concatBytes } from '../internal/bytes.js';
5
+ export function ffmpegVideoArgs(opts, platform) {
6
+ const { device, width, height, fps } = opts;
7
+ // Cameras only accept specific native modes, so capture at the device
8
+ // default and CROP a center region: scaling would average pixels and
9
+ // smooth away the very sensor noise we harvest.
10
+ const framerate = fps !== undefined ? ['-framerate', String(fps)] : [];
11
+ const input = platform === 'darwin'
12
+ ? ['-f', 'avfoundation', ...framerate, '-i', device]
13
+ : ['-f', 'v4l2', ...framerate, '-i', device];
14
+ return [
15
+ '-hide_banner',
16
+ '-loglevel',
17
+ 'error',
18
+ ...input,
19
+ '-vf',
20
+ `crop=${width}:${height}`,
21
+ '-pix_fmt',
22
+ 'gray',
23
+ '-f',
24
+ 'rawvideo',
25
+ // write each captured frame exactly once — the default rate sync
26
+ // duplicates frames massively against avfoundation wall-clock timestamps
27
+ '-fps_mode',
28
+ 'passthrough',
29
+ '-an',
30
+ 'pipe:1',
31
+ ];
32
+ }
33
+ /** Stateful slicer: raw byte chunks in, complete fixed-size frames out. */
34
+ export function frameSlicer(frameBytes) {
35
+ let pending = [];
36
+ let size = 0;
37
+ return (chunk) => {
38
+ pending.push(chunk);
39
+ size += chunk.length;
40
+ if (size < frameBytes)
41
+ return [];
42
+ let all = concatBytes(pending);
43
+ const frames = [];
44
+ while (all.length >= frameBytes) {
45
+ frames.push(all.slice(0, frameBytes));
46
+ all = all.slice(frameBytes);
47
+ }
48
+ pending = all.length > 0 ? [all] : [];
49
+ size = all.length;
50
+ return frames;
51
+ };
52
+ }
53
+ /**
54
+ * Camera frames for Node via ffmpeg (must be on PATH or given via
55
+ * ffmpegPath): grayscale rawvideo piped from avfoundation (macOS) or v4l2
56
+ * (Linux). Plug into cameraEntropy({ source: ffmpegFrameSource({...}) }).
57
+ */
58
+ export function ffmpegFrameSource(opts) {
59
+ // avfoundation defaults to 29.97 fps, which most cameras reject — they
60
+ // support exact modes like 15/30. Default to 30 on macOS; v4l2 negotiates.
61
+ const defaultFps = process.platform === 'darwin' ? 30 : undefined;
62
+ const { device, width = 640, height = 480, fps = defaultFps, ffmpegPath = 'ffmpeg' } = opts;
63
+ if (!device)
64
+ throw new TypeError('ffmpegFrameSource({ device }) requires a capture device');
65
+ return {
66
+ async *frames(signal) {
67
+ const child = spawn(ffmpegPath, ffmpegVideoArgs({ device, width, height, fps }, process.platform), {
68
+ stdio: ['ignore', 'pipe', 'pipe'],
69
+ });
70
+ let stderr = '';
71
+ child.stderr?.on('data', (data) => {
72
+ stderr += data.toString();
73
+ });
74
+ try {
75
+ await once(child, 'spawn');
76
+ }
77
+ catch (error) {
78
+ throw new EntropyError('network', `ffmpeg failed to start: ${error.message}`, {
79
+ provider: 'camera',
80
+ cause: error,
81
+ });
82
+ }
83
+ const slice = frameSlicer(width * height);
84
+ try {
85
+ for await (const chunk of child.stdout) {
86
+ if (signal?.aborted)
87
+ throw signal.reason ?? new DOMException('aborted', 'AbortError');
88
+ for (const data of slice(new Uint8Array(chunk))) {
89
+ yield { width, height, data, channels: 1 };
90
+ }
91
+ }
92
+ throw new EntropyError('network', `ffmpeg exited: ${stderr.trim().slice(0, 300)}`, {
93
+ provider: 'camera',
94
+ });
95
+ }
96
+ finally {
97
+ child.kill('SIGKILL');
98
+ }
99
+ },
100
+ };
101
+ }
102
+ //# sourceMappingURL=ffmpeg-frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffmpeg-frames.js","sourceRoot":"","sources":["../../src/node/ffmpeg-frames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { SampleSource } from '../providers/microphone.js';
2
+ export interface FfmpegSampleOptions {
3
+ /** avfoundation audio spec on macOS (e.g. ':0'), alsa device on Linux (e.g. 'default'). */
4
+ device: string;
5
+ sampleRate?: number;
6
+ ffmpegPath?: string;
7
+ }
8
+ interface AudioArgsInput {
9
+ device: string;
10
+ sampleRate: number;
11
+ }
12
+ export declare function ffmpegAudioArgs(opts: AudioArgsInput, platform: string): string[];
13
+ /** Stateful little-endian int16 decoder that carries odd trailing bytes. */
14
+ export declare function int16Chunker(): (chunk: Uint8Array) => Int16Array;
15
+ /**
16
+ * Microphone PCM for Node via ffmpeg: mono s16le piped from avfoundation
17
+ * (macOS) or alsa (Linux). Plug into micEntropy({ source: ffmpegSampleSource({...}) }).
18
+ */
19
+ export declare function ffmpegSampleSource(opts: FfmpegSampleOptions): SampleSource;
20
+ export {};
21
+ //# sourceMappingURL=ffmpeg-samples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffmpeg-samples.d.ts","sourceRoot":"","sources":["../../src/node/ffmpeg-samples.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,WAAW,mBAAmB;IAClC,2FAA2F;IAC3F,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBhF;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,CAWhE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAoC1E"}
@@ -0,0 +1,81 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { once } from 'node:events';
3
+ import { EntropyError } from '../errors.js';
4
+ import { concatBytes } from '../internal/bytes.js';
5
+ export function ffmpegAudioArgs(opts, platform) {
6
+ const { device, sampleRate } = opts;
7
+ const input = platform === 'darwin' ? ['-f', 'avfoundation', '-i', device] : ['-f', 'alsa', '-i', device];
8
+ return [
9
+ '-hide_banner',
10
+ '-loglevel',
11
+ 'error',
12
+ ...input,
13
+ '-ar',
14
+ String(sampleRate),
15
+ '-ac',
16
+ '1',
17
+ '-f',
18
+ 's16le',
19
+ 'pipe:1',
20
+ ];
21
+ }
22
+ /** Stateful little-endian int16 decoder that carries odd trailing bytes. */
23
+ export function int16Chunker() {
24
+ let carry = null;
25
+ return (chunk) => {
26
+ const bytes = carry ? concatBytes([carry, chunk]) : chunk;
27
+ const even = bytes.length - (bytes.length % 2);
28
+ carry = bytes.length % 2 === 1 ? bytes.slice(even) : null;
29
+ const out = new Int16Array(even / 2);
30
+ const view = new DataView(bytes.buffer, bytes.byteOffset, even);
31
+ for (let i = 0; i < out.length; i++)
32
+ out[i] = view.getInt16(i * 2, true);
33
+ return out;
34
+ };
35
+ }
36
+ /**
37
+ * Microphone PCM for Node via ffmpeg: mono s16le piped from avfoundation
38
+ * (macOS) or alsa (Linux). Plug into micEntropy({ source: ffmpegSampleSource({...}) }).
39
+ */
40
+ export function ffmpegSampleSource(opts) {
41
+ const { device, sampleRate = 48_000, ffmpegPath = 'ffmpeg' } = opts;
42
+ if (!device)
43
+ throw new TypeError('ffmpegSampleSource({ device }) requires a capture device');
44
+ return {
45
+ async *samples(signal) {
46
+ const child = spawn(ffmpegPath, ffmpegAudioArgs({ device, sampleRate }, process.platform), {
47
+ stdio: ['ignore', 'pipe', 'pipe'],
48
+ });
49
+ let stderr = '';
50
+ child.stderr?.on('data', (data) => {
51
+ stderr += data.toString();
52
+ });
53
+ try {
54
+ await once(child, 'spawn');
55
+ }
56
+ catch (error) {
57
+ throw new EntropyError('network', `ffmpeg failed to start: ${error.message}`, {
58
+ provider: 'microphone',
59
+ cause: error,
60
+ });
61
+ }
62
+ const decode = int16Chunker();
63
+ try {
64
+ for await (const chunk of child.stdout) {
65
+ if (signal?.aborted)
66
+ throw signal.reason ?? new DOMException('aborted', 'AbortError');
67
+ const samples = decode(new Uint8Array(chunk));
68
+ if (samples.length > 0)
69
+ yield samples;
70
+ }
71
+ throw new EntropyError('network', `ffmpeg exited: ${stderr.trim().slice(0, 300)}`, {
72
+ provider: 'microphone',
73
+ });
74
+ }
75
+ finally {
76
+ child.kill('SIGKILL');
77
+ }
78
+ },
79
+ };
80
+ }
81
+ //# sourceMappingURL=ffmpeg-samples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffmpeg-samples.js","sourceRoot":"","sources":["../../src/node/ffmpeg-samples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ConditioningOptions } from '../internal/condition.js';
2
+ import type { EntropyProvider } from '../types.js';
3
+ export interface HwRngOptions extends ConditioningOptions {
4
+ /** Default /dev/hwrng — whatever hardware RNG the kernel trusts. */
5
+ path?: string;
6
+ }
7
+ /**
8
+ * The kernel's hardware RNG character device (Linux/Raspberry Pi; also how a
9
+ * plugged-in ChaosKey surfaces). Usually root-only by default.
10
+ */
11
+ export declare function hwRng(opts?: HwRngOptions): EntropyProvider;
12
+ //# sourceMappingURL=hwrng.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hwrng.d.ts","sourceRoot":"","sources":["../../src/node/hwrng.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,MAAM,WAAW,YAAa,SAAQ,mBAAmB;IACvD,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,IAAI,GAAE,YAAiB,GAAG,eAAe,CA6C9D"}
@@ -0,0 +1,43 @@
1
+ import { createReadStream } from 'node:fs';
2
+ import { EntropyError } from '../errors.js';
3
+ import { sampledProvider } from '../internal/sampled.js';
4
+ /**
5
+ * The kernel's hardware RNG character device (Linux/Raspberry Pi; also how a
6
+ * plugged-in ChaosKey surfaces). Usually root-only by default.
7
+ */
8
+ export function hwRng(opts = {}) {
9
+ const { path = '/dev/hwrng' } = opts;
10
+ async function* open() {
11
+ const stream = createReadStream(path, { highWaterMark: 4096 });
12
+ try {
13
+ for await (const chunk of stream) {
14
+ yield new Uint8Array(chunk);
15
+ }
16
+ }
17
+ catch (error) {
18
+ const code = error.code;
19
+ if (code === 'EACCES' || code === 'EPERM') {
20
+ throw new EntropyError('network', `${path} is usually root-only — run with sufficient privileges or adjust the device permissions`, { provider: 'hwrng', cause: error });
21
+ }
22
+ if (code === 'ENOENT') {
23
+ throw new EntropyError('network', `${path} does not exist — this system exposes no kernel hardware RNG`, { provider: 'hwrng', cause: error });
24
+ }
25
+ throw new EntropyError('network', `failed reading ${path}: ${error.message}`, {
26
+ provider: 'hwrng',
27
+ cause: error,
28
+ });
29
+ }
30
+ finally {
31
+ stream.destroy();
32
+ }
33
+ }
34
+ return sampledProvider({
35
+ name: 'hwrng',
36
+ kind: 'trng',
37
+ privacy: 'private',
38
+ open,
39
+ defaultMinEntropyPerSample: 7,
40
+ defaultSafetyFactor: 2,
41
+ }, opts);
42
+ }
43
+ //# sourceMappingURL=hwrng.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hwrng.js","sourceRoot":"","sources":["../../src/node/hwrng.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAQxD;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,OAAqB,EAAE;IAC3C,MAAM,EAAE,IAAI,GAAG,YAAY,EAAE,GAAG,IAAI,CAAA;IAEpC,KAAK,SAAS,CAAC,CAAC,IAAI;QAClB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9D,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAA+B,EAAE,CAAC;gBAC1D,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAA;YAClD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC1C,MAAM,IAAI,YAAY,CACpB,SAAS,EACT,GAAG,IAAI,yFAAyF,EAChG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CACpC,CAAA;YACH,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,MAAM,IAAI,YAAY,CACpB,SAAS,EACT,GAAG,IAAI,8DAA8D,EACrE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CACpC,CAAA;YACH,CAAC;YACD,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,kBAAkB,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,EAAE;gBACvF,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,KAAK;aACb,CAAC,CAAA;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAA;QAClB,CAAC;IACH,CAAC;IAED,OAAO,eAAe,CACpB;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,IAAI;QACJ,0BAA0B,EAAE,CAAC;QAC7B,mBAAmB,EAAE,CAAC;KACvB,EACD,IAAI,CACL,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type { FfmpegFrameOptions } from './ffmpeg-frames.js';
2
+ export { ffmpegFrameSource } from './ffmpeg-frames.js';
3
+ export type { FfmpegSampleOptions } from './ffmpeg-samples.js';
4
+ export { ffmpegSampleSource } from './ffmpeg-samples.js';
5
+ export type { HwRngOptions } from './hwrng.js';
6
+ export { hwRng } from './hwrng.js';
7
+ export type { NodeSerialOptions, NodeSerialStream } from './serial-source.js';
8
+ export { nodeSerialSource } from './serial-source.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,7 @@
1
+ // Node-only adapters — import from '@mindpeeker/entropy/node'.
2
+ // The root '@mindpeeker/entropy' entry stays browser-safe.
3
+ export { ffmpegFrameSource } from './ffmpeg-frames.js';
4
+ export { ffmpegSampleSource } from './ffmpeg-samples.js';
5
+ export { hwRng } from './hwrng.js';
6
+ export { nodeSerialSource } from './serial-source.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,2DAA2D;AAG3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAExD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,31 @@
1
+ export interface RtlSdrOptions {
2
+ /** Tuned frequency in Hz. Default 70 MHz — quiet spectrum, away from broadcast bands. */
3
+ frequencyHz?: number;
4
+ /** Default 2_400_000 (2.4 MS/s — higher rates drop USB samples). */
5
+ sampleRate?: number;
6
+ /** Manual tuner gain in dB. Default 49.6 (R820T max) — NEVER auto/AGC, which
7
+ * external transmitters modulate. */
8
+ gain?: number;
9
+ deviceIndex?: number;
10
+ rtlSdrPath?: string;
11
+ }
12
+ export interface RtlSdrStream extends AsyncIterable<Uint8Array> {
13
+ close(): void;
14
+ }
15
+ export declare function rtlSdrArgs(opts: {
16
+ frequencyHz: number;
17
+ sampleRate: number;
18
+ gain: number;
19
+ deviceIndex: number;
20
+ }): string[];
21
+ /**
22
+ * Spawn `rtl_sdr` and stream its raw IQ bytes. Needs the rtl-sdr CLI tools
23
+ * (apt install rtl-sdr / brew install librtlsdr) and a dongle. RTL-SDR Blog
24
+ * V4 dongles require the rtlsdrblog driver fork — stock librtlsdr silently
25
+ * produces corrupted output on V4, which is exactly why sdrEntropy runs
26
+ * health tests on the raw stream.
27
+ *
28
+ * sdrEntropy({ source: await rtlSdrSource() })
29
+ */
30
+ export declare function rtlSdrSource(opts?: RtlSdrOptions): Promise<RtlSdrStream>;
31
+ //# sourceMappingURL=rtl-sdr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtl-sdr.d.ts","sourceRoot":"","sources":["../../src/node/rtl-sdr.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;yCACqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa,CAAC,UAAU,CAAC;IAC7D,KAAK,IAAI,IAAI,CAAA;CACd;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,MAAM,EAAE,CAYX;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CA2ClF"}
@@ -0,0 +1,63 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { once } from 'node:events';
3
+ import { EntropyError } from '../errors.js';
4
+ export function rtlSdrArgs(opts) {
5
+ return [
6
+ '-f',
7
+ String(opts.frequencyHz),
8
+ '-s',
9
+ String(opts.sampleRate),
10
+ '-g',
11
+ String(opts.gain),
12
+ '-d',
13
+ String(opts.deviceIndex),
14
+ '-', // raw interleaved uint8 IQ to stdout
15
+ ];
16
+ }
17
+ /**
18
+ * Spawn `rtl_sdr` and stream its raw IQ bytes. Needs the rtl-sdr CLI tools
19
+ * (apt install rtl-sdr / brew install librtlsdr) and a dongle. RTL-SDR Blog
20
+ * V4 dongles require the rtlsdrblog driver fork — stock librtlsdr silently
21
+ * produces corrupted output on V4, which is exactly why sdrEntropy runs
22
+ * health tests on the raw stream.
23
+ *
24
+ * sdrEntropy({ source: await rtlSdrSource() })
25
+ */
26
+ export async function rtlSdrSource(opts = {}) {
27
+ const { frequencyHz = 70_000_000, sampleRate = 2_400_000, gain = 49.6, deviceIndex = 0, rtlSdrPath = 'rtl_sdr', } = opts;
28
+ const child = spawn(rtlSdrPath, rtlSdrArgs({ frequencyHz, sampleRate, gain, deviceIndex }), {
29
+ stdio: ['ignore', 'pipe', 'pipe'],
30
+ });
31
+ let stderr = '';
32
+ child.stderr?.on('data', (data) => {
33
+ stderr += data.toString();
34
+ });
35
+ try {
36
+ await once(child, 'spawn');
37
+ }
38
+ catch (error) {
39
+ throw new EntropyError('network', `rtl_sdr failed to start: ${error.message}`, {
40
+ provider: 'sdr',
41
+ cause: error,
42
+ });
43
+ }
44
+ let closedByUs = false;
45
+ return {
46
+ async *[Symbol.asyncIterator]() {
47
+ for await (const chunk of child.stdout) {
48
+ yield new Uint8Array(chunk);
49
+ }
50
+ if (!closedByUs) {
51
+ // the dongle stream must never end on its own
52
+ throw new EntropyError('network', `rtl_sdr exited: ${stderr.trim().slice(0, 300)}`, {
53
+ provider: 'sdr',
54
+ });
55
+ }
56
+ },
57
+ close: () => {
58
+ closedByUs = true;
59
+ child.kill('SIGKILL');
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=rtl-sdr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtl-sdr.js","sourceRoot":"","sources":["../../src/node/rtl-sdr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAkB3C,MAAM,UAAU,UAAU,CAAC,IAK1B;IACC,OAAO;QACL,IAAI;QACJ,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QACxB,IAAI;QACJ,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACvB,IAAI;QACJ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACjB,IAAI;QACJ,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QACxB,GAAG,EAAE,qCAAqC;KAC3C,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAsB,EAAE;IACzD,MAAM,EACJ,WAAW,GAAG,UAAU,EACxB,UAAU,GAAG,SAAS,EACtB,IAAI,GAAG,IAAI,EACX,WAAW,GAAG,CAAC,EACf,UAAU,GAAG,SAAS,GACvB,GAAG,IAAI,CAAA;IAER,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE;QAC1F,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAA;IACF,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IACF,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,4BAA6B,KAAe,CAAC,OAAO,EAAE,EAAE;YACxF,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,KAAK;SACb,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,OAAO;QACL,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,MAA+B,EAAE,CAAC;gBAChE,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;YAC7B,CAAC;YACD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,8CAA8C;gBAC9C,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE;oBAClF,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,UAAU,GAAG,IAAI,CAAA;YACjB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACvB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ export interface NodeSerialOptions {
2
+ /** Serial device path, e.g. /dev/cu.usbserial-110 (macOS) or /dev/ttyUSB0 (Linux). */
3
+ path: string;
4
+ /** Default 921_600 — the AetherOnePi ESP32 firmware rate. */
5
+ baudRate?: number;
6
+ /** Override the stty binary (tests). */
7
+ sttyPath?: string;
8
+ }
9
+ export interface NodeSerialStream extends AsyncIterable<Uint8Array> {
10
+ close(): void;
11
+ }
12
+ /** stty argv per platform: -f (BSD/macOS) vs -F (GNU/Linux). */
13
+ export declare function sttyArgs(devicePath: string, baudRate: number, platform: string): string[];
14
+ /**
15
+ * Zero-npm-dependency serial reader for macOS/Linux: configures the tty via
16
+ * stty, then streams the character device with fs.createReadStream. Windows
17
+ * users should inject a `serialport` instance into serialEntropy instead.
18
+ *
19
+ * serialEntropy({ source: await nodeSerialSource({ path }), name: 'esp32' })
20
+ */
21
+ export declare function nodeSerialSource(opts: NodeSerialOptions): Promise<NodeSerialStream>;
22
+ //# sourceMappingURL=serial-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial-source.d.ts","sourceRoot":"","sources":["../../src/node/serial-source.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa,CAAC,UAAU,CAAC;IACjE,KAAK,IAAI,IAAI,CAAA;CACd;AAED,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzF;AA8BD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoBzF"}
@@ -0,0 +1,63 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { once } from 'node:events';
3
+ import { createReadStream } from 'node:fs';
4
+ import { EntropyError } from '../errors.js';
5
+ /** stty argv per platform: -f (BSD/macOS) vs -F (GNU/Linux). */
6
+ export function sttyArgs(devicePath, baudRate, platform) {
7
+ return [platform === 'darwin' ? '-f' : '-F', devicePath, String(baudRate), 'raw', '-echo'];
8
+ }
9
+ function configurePort(sttyPath, args) {
10
+ return new Promise((resolve, reject) => {
11
+ const child = spawn(sttyPath, args, { stdio: ['ignore', 'ignore', 'pipe'] });
12
+ let stderr = '';
13
+ child.stderr?.on('data', (data) => {
14
+ stderr += data.toString();
15
+ });
16
+ child.on('error', (error) => {
17
+ reject(new EntropyError('network', `stty failed to start: ${error.message}`, {
18
+ provider: 'serial',
19
+ cause: error,
20
+ }));
21
+ });
22
+ child.on('close', (code) => {
23
+ if (code === 0)
24
+ resolve();
25
+ else {
26
+ reject(new EntropyError('network', `stty exited with ${code}: ${stderr.trim().slice(0, 200)}`, {
27
+ provider: 'serial',
28
+ }));
29
+ }
30
+ });
31
+ });
32
+ }
33
+ /**
34
+ * Zero-npm-dependency serial reader for macOS/Linux: configures the tty via
35
+ * stty, then streams the character device with fs.createReadStream. Windows
36
+ * users should inject a `serialport` instance into serialEntropy instead.
37
+ *
38
+ * serialEntropy({ source: await nodeSerialSource({ path }), name: 'esp32' })
39
+ */
40
+ export async function nodeSerialSource(opts) {
41
+ const { path, baudRate = 921_600, sttyPath = 'stty' } = opts;
42
+ if (!path)
43
+ throw new TypeError('nodeSerialSource({ path }) requires a device path');
44
+ // Open our fd BEFORE running stty: tty settings reset when the last file
45
+ // descriptor closes (stty's own), which would silently drop the port back
46
+ // to 9600 baud. Holding the stream open keeps the configuration applied.
47
+ const stream = createReadStream(path, { highWaterMark: 4096 });
48
+ try {
49
+ await once(stream, 'open');
50
+ await configurePort(sttyPath, sttyArgs(path, baudRate, process.platform));
51
+ }
52
+ catch (error) {
53
+ stream.destroy();
54
+ throw error;
55
+ }
56
+ return {
57
+ [Symbol.asyncIterator]: () => stream[Symbol.asyncIterator](),
58
+ close: () => {
59
+ stream.destroy();
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=serial-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial-source.js","sourceRoot":"","sources":["../../src/node/serial-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAe3C,gEAAgE;AAChE,MAAM,UAAU,QAAQ,CAAC,UAAkB,EAAE,QAAgB,EAAE,QAAgB;IAC7E,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;AAC5F,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,IAAc;IACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QAC5E,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,CACJ,IAAI,YAAY,CAAC,SAAS,EAAE,yBAAyB,KAAK,CAAC,OAAO,EAAE,EAAE;gBACpE,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,KAAK;aACb,CAAC,CACH,CAAA;QACH,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAA;iBACpB,CAAC;gBACJ,MAAM,CACJ,IAAI,YAAY,CAAC,SAAS,EAAE,oBAAoB,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE;oBACtF,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CACH,CAAA;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAuB;IAC5D,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,QAAQ,GAAG,MAAM,EAAE,GAAG,IAAI,CAAA;IAC5D,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAA;IACnF,yEAAyE;IACzE,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9D,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC1B,MAAM,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,EAAE,CAAA;QAChB,MAAM,KAAK,CAAA;IACb,CAAC;IACD,OAAO;QACL,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAA+B;QACzF,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,CAAC,OAAO,EAAE,CAAA;QAClB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { EntropyProvider } from '../types.js';
2
+ export interface AnuLegacyOptions {
3
+ fetch?: typeof fetch;
4
+ baseUrl?: string;
5
+ /**
6
+ * Client-side spacing between requests. ANU's server limit is 1/minute
7
+ * (signalled as HTTP 500); default stays just above it.
8
+ */
9
+ minIntervalMs?: number;
10
+ }
11
+ /**
12
+ * ANU's legacy free QRNG API. Zero-config but limited to one request per
13
+ * minute and officially slated for retirement — use it as a fallback link,
14
+ * not a primary source.
15
+ */
16
+ export declare function anuLegacy(opts?: AnuLegacyOptions): EntropyProvider;
17
+ //# sourceMappingURL=anu-legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anu-legacy.d.ts","sourceRoot":"","sources":["../../src/providers/anu-legacy.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,aAAa,CAAA;AAWrE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAOD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,GAAE,gBAAqB,GAAG,eAAe,CAqCtE"}
@@ -0,0 +1,56 @@
1
+ import { EntropyError } from '../errors.js';
2
+ import { concatBytes } from '../internal/bytes.js';
3
+ import { fetchJson } from '../internal/http.js';
4
+ import { defineProvider } from '../internal/provider.js';
5
+ import { MinIntervalGate } from '../internal/rate-limit.js';
6
+ import { byteArrayFrom } from '../internal/validate.js';
7
+ const INFO = Object.freeze({
8
+ name: 'anu-legacy',
9
+ kind: 'qrng',
10
+ privacy: 'private',
11
+ });
12
+ const MAX_PER_REQUEST = 1024;
13
+ const DEFAULT_BASE_URL = 'https://qrng.anu.edu.au/API/jsonI.php';
14
+ const RATE_LIMIT_SNIPPET = 'limited to 1 requests per minute';
15
+ /**
16
+ * ANU's legacy free QRNG API. Zero-config but limited to one request per
17
+ * minute and officially slated for retirement — use it as a fallback link,
18
+ * not a primary source.
19
+ */
20
+ export function anuLegacy(opts = {}) {
21
+ const { baseUrl = DEFAULT_BASE_URL, minIntervalMs = 61_000, fetch: fetchImpl } = opts;
22
+ const gate = new MinIntervalGate(minIntervalMs);
23
+ return defineProvider({
24
+ ...INFO,
25
+ // At 1 request/minute, make every poll pull a full request's worth.
26
+ defaultChunkBytes: MAX_PER_REQUEST,
27
+ async getBytes(length, reqOpts) {
28
+ const chunks = [];
29
+ for (let remaining = length; remaining > 0;) {
30
+ const n = Math.min(MAX_PER_REQUEST, remaining);
31
+ await gate.wait(reqOpts?.signal);
32
+ const query = new URLSearchParams({ length: String(n), type: 'uint8' });
33
+ const res = await fetchJson(`${baseUrl}?${query}`, {
34
+ provider: INFO.name,
35
+ signal: reqOpts?.signal,
36
+ fetchImpl,
37
+ onErrorResponse: (status, body) => status === 500 && body.includes(RATE_LIMIT_SNIPPET)
38
+ ? new EntropyError('rate_limited', 'ANU legacy API allows 1 request per minute', {
39
+ provider: INFO.name,
40
+ retryAfterMs: 60_000,
41
+ })
42
+ : undefined,
43
+ });
44
+ if (res?.success !== true) {
45
+ throw new EntropyError('bad_response', 'ANU QRNG returned an unsuccessful response', {
46
+ provider: INFO.name,
47
+ });
48
+ }
49
+ chunks.push(byteArrayFrom(res.data, n, INFO.name));
50
+ remaining -= n;
51
+ }
52
+ return { bytes: concatBytes(chunks), sources: [INFO] };
53
+ },
54
+ });
55
+ }
56
+ //# sourceMappingURL=anu-legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anu-legacy.js","sourceRoot":"","sources":["../../src/providers/anu-legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAGvD,MAAM,IAAI,GAAsB,MAAM,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;CACnB,CAAC,CAAA;AACF,MAAM,eAAe,GAAG,IAAI,CAAA;AAC5B,MAAM,gBAAgB,GAAG,uCAAuC,CAAA;AAChE,MAAM,kBAAkB,GAAG,kCAAkC,CAAA;AAiB7D;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,OAAyB,EAAE;IACnD,MAAM,EAAE,OAAO,GAAG,gBAAgB,EAAE,aAAa,GAAG,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;IACrF,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,aAAa,CAAC,CAAA;IAE/C,OAAO,cAAc,CAAC;QACpB,GAAG,IAAI;QACP,oEAAoE;QACpE,iBAAiB,EAAE,eAAe;QAClC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO;YAC5B,MAAM,MAAM,GAAiB,EAAE,CAAA;YAC/B,KAAK,IAAI,SAAS,GAAG,MAAM,EAAE,SAAS,GAAG,CAAC,GAAI,CAAC;gBAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAA;gBAC9C,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBAChC,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;gBACvE,MAAM,GAAG,GAAG,MAAM,SAAS,CAAoB,GAAG,OAAO,IAAI,KAAK,EAAE,EAAE;oBACpE,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,MAAM,EAAE,OAAO,EAAE,MAAM;oBACvB,SAAS;oBACT,eAAe,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAChC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;wBACjD,CAAC,CAAC,IAAI,YAAY,CAAC,cAAc,EAAE,4CAA4C,EAAE;4BAC7E,QAAQ,EAAE,IAAI,CAAC,IAAI;4BACnB,YAAY,EAAE,MAAM;yBACrB,CAAC;wBACJ,CAAC,CAAC,SAAS;iBAChB,CAAC,CAAA;gBACF,IAAI,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;oBAC1B,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,4CAA4C,EAAE;wBACnF,QAAQ,EAAE,IAAI,CAAC,IAAI;qBACpB,CAAC,CAAA;gBACJ,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;gBAClD,SAAS,IAAI,CAAC,CAAA;YAChB,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAA;QACxD,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}