@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.
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/casting.d.ts +45 -0
- package/dist/casting.js +110 -0
- package/dist/casting.js.map +1 -0
- package/dist/engine.test.d.ts +1 -0
- package/dist/engine.test.js +74 -0
- package/dist/engine.test.js.map +1 -0
- package/dist/entropy/gesture.d.ts +26 -0
- package/dist/entropy/gesture.js +52 -0
- package/dist/entropy/gesture.js.map +1 -0
- package/dist/entropy/pool.d.ts +29 -0
- package/dist/entropy/pool.js +70 -0
- package/dist/entropy/pool.js.map +1 -0
- package/dist/entropy/qrng.d.ts +47 -0
- package/dist/entropy/qrng.js +130 -0
- package/dist/entropy/qrng.js.map +1 -0
- package/dist/hexagram-data.d.ts +2 -0
- package/dist/hexagram-data.js +1859 -0
- package/dist/hexagram-data.js.map +1 -0
- package/dist/hexagrams.d.ts +19 -0
- package/dist/hexagrams.js +90 -0
- package/dist/hexagrams.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/trigrams.d.ts +10 -0
- package/dist/trigrams.js +60 -0
- package/dist/trigrams.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +17 -0
- package/dist/util.js +79 -0
- package/dist/util.js.map +1 -0
- package/package.json +48 -0
- package/src/casting.ts +131 -0
- package/src/engine.test.ts +77 -0
- package/src/entropy/gesture.ts +57 -0
- package/src/entropy/pool.ts +74 -0
- package/src/entropy/qrng.ts +170 -0
- package/src/hexagram-data.ts +1863 -0
- package/src/hexagrams.ts +97 -0
- package/src/index.ts +33 -0
- package/src/trigrams.ts +66 -0
- package/src/types.ts +98 -0
- 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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"}
|