@q-ching/core 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 (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -0
  3. package/dist/casting.d.ts +45 -0
  4. package/dist/casting.js +110 -0
  5. package/dist/casting.js.map +1 -0
  6. package/dist/engine.test.d.ts +1 -0
  7. package/dist/engine.test.js +74 -0
  8. package/dist/engine.test.js.map +1 -0
  9. package/dist/entropy/gesture.d.ts +26 -0
  10. package/dist/entropy/gesture.js +52 -0
  11. package/dist/entropy/gesture.js.map +1 -0
  12. package/dist/entropy/pool.d.ts +29 -0
  13. package/dist/entropy/pool.js +70 -0
  14. package/dist/entropy/pool.js.map +1 -0
  15. package/dist/entropy/qrng.d.ts +47 -0
  16. package/dist/entropy/qrng.js +130 -0
  17. package/dist/entropy/qrng.js.map +1 -0
  18. package/dist/hexagram-data.d.ts +2 -0
  19. package/dist/hexagram-data.js +1859 -0
  20. package/dist/hexagram-data.js.map +1 -0
  21. package/dist/hexagrams.d.ts +19 -0
  22. package/dist/hexagrams.js +90 -0
  23. package/dist/hexagrams.js.map +1 -0
  24. package/dist/index.d.ts +14 -0
  25. package/dist/index.js +15 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/trigrams.d.ts +10 -0
  28. package/dist/trigrams.js +60 -0
  29. package/dist/trigrams.js.map +1 -0
  30. package/dist/types.d.ts +82 -0
  31. package/dist/types.js +10 -0
  32. package/dist/types.js.map +1 -0
  33. package/dist/util.d.ts +17 -0
  34. package/dist/util.js +79 -0
  35. package/dist/util.js.map +1 -0
  36. package/package.json +48 -0
  37. package/src/casting.ts +131 -0
  38. package/src/engine.test.ts +77 -0
  39. package/src/entropy/gesture.ts +57 -0
  40. package/src/entropy/pool.ts +74 -0
  41. package/src/entropy/qrng.ts +170 -0
  42. package/src/hexagram-data.ts +1863 -0
  43. package/src/hexagrams.ts +97 -0
  44. package/src/index.ts +33 -0
  45. package/src/trigrams.ts +66 -0
  46. package/src/types.ts +98 -0
  47. package/src/util.ts +83 -0
@@ -0,0 +1,130 @@
1
+ import { fromHex, getCrypto } from '../util.js';
2
+ export function localCsprng(numBytes) {
3
+ const out = new Uint8Array(numBytes);
4
+ getCrypto().getRandomValues(out);
5
+ return out;
6
+ }
7
+ function getFetch(config) {
8
+ const f = config.fetchImpl ?? globalThis.fetch;
9
+ if (!f)
10
+ throw new Error('No fetch implementation available.');
11
+ return f;
12
+ }
13
+ async function withTimeout(p, ms) {
14
+ const controller = new AbortController();
15
+ const timer = setTimeout(() => controller.abort(), ms);
16
+ try {
17
+ return await p(controller.signal);
18
+ }
19
+ finally {
20
+ clearTimeout(timer);
21
+ }
22
+ }
23
+ /**
24
+ * NIST Randomness Beacon (v2). Public, keyless, quantum-seeded. Publishes a
25
+ * 512-bit value every 60s — the same for everyone in a given minute, which is
26
+ * its own kind of poetry: the cosmic pulse at the moment you asked.
27
+ */
28
+ export async function fetchNistBeacon(numBytes, config = {}) {
29
+ const fetchImpl = getFetch(config);
30
+ try {
31
+ const res = await withTimeout((signal) => fetchImpl('https://beacon.nist.gov/beacon/2.0/pulse/last', { signal }), config.timeoutMs ?? 6000);
32
+ if (!res.ok)
33
+ return { source: 'nist', ok: false, bytes: null, detail: `HTTP ${res.status}` };
34
+ const json = (await res.json());
35
+ const hex = json?.pulse?.outputValue;
36
+ if (!hex)
37
+ return { source: 'nist', ok: false, bytes: null, detail: 'no outputValue' };
38
+ const full = fromHex(hex);
39
+ return { source: 'nist', ok: true, bytes: full.subarray(0, numBytes) };
40
+ }
41
+ catch (err) {
42
+ return { source: 'nist', ok: false, bytes: null, detail: String(err) };
43
+ }
44
+ }
45
+ /**
46
+ * ANU Quantum Random Numbers — vacuum fluctuations. The classic public
47
+ * endpoint is now rate-limited and may require an API key; we pass one if
48
+ * provided and fail gracefully otherwise.
49
+ */
50
+ export async function fetchAnu(numBytes, config = {}) {
51
+ const fetchImpl = getFetch(config);
52
+ try {
53
+ const url = `https://qrng.anu.edu.au/API/jsonI.php?length=${numBytes}&type=uint8`;
54
+ const headers = {};
55
+ if (config.anuApiKey)
56
+ headers['x-api-key'] = config.anuApiKey;
57
+ const res = await withTimeout((signal) => fetchImpl(url, { headers, signal }), config.timeoutMs ?? 6000);
58
+ if (!res.ok)
59
+ return { source: 'anu', ok: false, bytes: null, detail: `HTTP ${res.status}` };
60
+ const json = (await res.json());
61
+ if (!json?.success || !Array.isArray(json.data)) {
62
+ return { source: 'anu', ok: false, bytes: null, detail: 'unsuccessful response' };
63
+ }
64
+ return { source: 'anu', ok: true, bytes: Uint8Array.from(json.data.slice(0, numBytes)) };
65
+ }
66
+ catch (err) {
67
+ return { source: 'anu', ok: false, bytes: null, detail: String(err) };
68
+ }
69
+ }
70
+ /** RANDOM.ORG atmospheric noise (JSON-RPC v4). Requires an API key. */
71
+ export async function fetchRandomOrg(numBytes, config = {}) {
72
+ const fetchImpl = getFetch(config);
73
+ if (!config.randomOrgApiKey) {
74
+ return { source: 'random.org', ok: false, bytes: null, detail: 'no API key' };
75
+ }
76
+ try {
77
+ const body = {
78
+ jsonrpc: '2.0',
79
+ method: 'generateIntegers',
80
+ params: { apiKey: config.randomOrgApiKey, n: numBytes, min: 0, max: 255, replacement: true },
81
+ id: 1,
82
+ };
83
+ const res = await withTimeout((signal) => fetchImpl('https://api.random.org/json-rpc/4/invoke', {
84
+ method: 'POST',
85
+ headers: { 'content-type': 'application/json' },
86
+ body: JSON.stringify(body),
87
+ signal,
88
+ }), config.timeoutMs ?? 6000);
89
+ if (!res.ok)
90
+ return { source: 'random.org', ok: false, bytes: null, detail: `HTTP ${res.status}` };
91
+ const json = (await res.json());
92
+ const data = json?.result?.random?.data;
93
+ if (!Array.isArray(data)) {
94
+ return { source: 'random.org', ok: false, bytes: null, detail: 'no data' };
95
+ }
96
+ return { source: 'random.org', ok: true, bytes: Uint8Array.from(data) };
97
+ }
98
+ catch (err) {
99
+ return { source: 'random.org', ok: false, bytes: null, detail: String(err) };
100
+ }
101
+ }
102
+ /**
103
+ * Attempt every configured source concurrently and always include the local
104
+ * CSPRNG. Returns one result per attempted source (failures included, so the
105
+ * UI can show what answered the call).
106
+ */
107
+ export async function gatherEntropy(numBytes, config = {}) {
108
+ const requested = config.sources ?? ['nist', 'csprng'];
109
+ const set = new Set(requested);
110
+ set.add('csprng'); // guaranteed fallback, always present
111
+ const jobs = [];
112
+ for (const source of set) {
113
+ switch (source) {
114
+ case 'nist':
115
+ jobs.push(fetchNistBeacon(numBytes, config));
116
+ break;
117
+ case 'anu':
118
+ jobs.push(fetchAnu(numBytes, config));
119
+ break;
120
+ case 'random.org':
121
+ jobs.push(fetchRandomOrg(numBytes, config));
122
+ break;
123
+ case 'csprng':
124
+ jobs.push(Promise.resolve({ source: 'csprng', ok: true, bytes: localCsprng(numBytes) }));
125
+ break;
126
+ }
127
+ }
128
+ return Promise.all(jobs);
129
+ }
130
+ //# sourceMappingURL=qrng.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qrng.js","sourceRoot":"","sources":["../../src/entropy/qrng.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { RawHexagram } from './types.js';
2
+ export declare const HEXAGRAM_DATA: RawHexagram[];