@wavehouse/chtypes 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 (72) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +202 -0
  3. package/README.md +442 -0
  4. package/dist/cli.d.ts +43 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +303 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/discover.d.ts +134 -0
  9. package/dist/discover.d.ts.map +1 -0
  10. package/dist/discover.js +291 -0
  11. package/dist/discover.js.map +1 -0
  12. package/dist/errors.d.ts +204 -0
  13. package/dist/errors.d.ts.map +1 -0
  14. package/dist/errors.js +228 -0
  15. package/dist/errors.js.map +1 -0
  16. package/dist/fetch.d.ts +235 -0
  17. package/dist/fetch.d.ts.map +1 -0
  18. package/dist/fetch.js +842 -0
  19. package/dist/fetch.js.map +1 -0
  20. package/dist/ffi.d.ts +346 -0
  21. package/dist/ffi.d.ts.map +1 -0
  22. package/dist/ffi.js +913 -0
  23. package/dist/ffi.js.map +1 -0
  24. package/dist/format.d.ts +104 -0
  25. package/dist/format.d.ts.map +1 -0
  26. package/dist/format.js +108 -0
  27. package/dist/format.js.map +1 -0
  28. package/dist/index.d.ts +28 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +28 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/json.d.ts +127 -0
  33. package/dist/json.d.ts.map +1 -0
  34. package/dist/json.js +577 -0
  35. package/dist/json.js.map +1 -0
  36. package/dist/library.d.ts +225 -0
  37. package/dist/library.d.ts.map +1 -0
  38. package/dist/library.js +234 -0
  39. package/dist/library.js.map +1 -0
  40. package/dist/numeric.d.ts +20 -0
  41. package/dist/numeric.d.ts.map +1 -0
  42. package/dist/numeric.js +107 -0
  43. package/dist/numeric.js.map +1 -0
  44. package/dist/paths.d.ts +47 -0
  45. package/dist/paths.d.ts.map +1 -0
  46. package/dist/paths.js +78 -0
  47. package/dist/paths.js.map +1 -0
  48. package/dist/registry.d.ts +204 -0
  49. package/dist/registry.d.ts.map +1 -0
  50. package/dist/registry.js +409 -0
  51. package/dist/registry.js.map +1 -0
  52. package/dist/results.d.ts +326 -0
  53. package/dist/results.d.ts.map +1 -0
  54. package/dist/results.js +235 -0
  55. package/dist/results.js.map +1 -0
  56. package/dist/schema.d.ts +444 -0
  57. package/dist/schema.d.ts.map +1 -0
  58. package/dist/schema.js +448 -0
  59. package/dist/schema.js.map +1 -0
  60. package/dist/settings.d.ts +43 -0
  61. package/dist/settings.d.ts.map +1 -0
  62. package/dist/settings.js +33 -0
  63. package/dist/settings.js.map +1 -0
  64. package/dist/tar.d.ts +32 -0
  65. package/dist/tar.d.ts.map +1 -0
  66. package/dist/tar.js +310 -0
  67. package/dist/tar.js.map +1 -0
  68. package/dist/transform.d.ts +73 -0
  69. package/dist/transform.d.ts.map +1 -0
  70. package/dist/transform.js +527 -0
  71. package/dist/transform.js.map +1 -0
  72. package/package.json +62 -0
@@ -0,0 +1,409 @@
1
+ /**
2
+ * The artifact-directory loader: one subdirectory per ClickHouse minor line,
3
+ * each self-contained (spec/artifact.md).
4
+ *
5
+ * <registry>/25.8/{manifest.json, libchtypes.dylib, CH_VERSION, unsafe_families.txt}
6
+ *
7
+ * Two rules here were paid for and are not negotiable:
8
+ *
9
+ * - **The shared library's file name comes from `manifest.json`'s `library`
10
+ * field.** Not from a hard-coded `libchtypes.so`, not from a glob, not from
11
+ * the platform. The current tree proves why: every darwin artifact says
12
+ * `libchtypes.dylib` while the *shipping* linux artifacts still say
13
+ * `libchtypes_s1.so`, so a loader that constructs the name finds nothing on
14
+ * the platform that matters.
15
+ * - **Each artifact is loaded into its own symbol scope (`RTLD_LOCAL`).** That
16
+ * is the entire mechanism by which two builds that both define
17
+ * `DB::DataTypeFactory` live in one process. ffi-rs loads through libloading,
18
+ * which uses `RTLD_LAZY | RTLD_LOCAL`; `assertLocalSymbolScope()` in the test
19
+ * suite proves it from outside rather than trusting the claim.
20
+ *
21
+ * Where a registry IS follows the search path of docs/fetch.md §1 (`paths.ts`):
22
+ * the explicit directory, `CHTYPES_REGISTRY`, the per-user cache, then the
23
+ * reserved system locations. The first directory holding artifacts is scanned
24
+ * and loaded at construction; a line it lacks is taken, on request, from the
25
+ * first later directory that has it. A line no directory has is the one §7
26
+ * error, `ArtifactMissingError` — or, with `autofetch`, a fetch on first
27
+ * `open()`.
28
+ */
29
+ import { createHash } from 'node:crypto';
30
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
31
+ import path from 'node:path';
32
+ import { ArtifactMissingError, FETCH_COMMAND, RegistryError } from './errors.js';
33
+ import { ensure } from './fetch.js';
34
+ import { NativeLibrary } from './ffi.js';
35
+ import { Library, minorOf } from './library.js';
36
+ import { cacheRegistryDir, fetchDestination, hostPlatform, registrySearchPath, systemRegistryDirs } from './paths.js';
37
+ /**
38
+ * The artifact-directory loader — the multi-version entry point of this
39
+ * package. Construction scans one subdirectory per ClickHouse version, dlopens
40
+ * each artifact into its own symbol scope (`RTLD_LOCAL`, ~120 MB resident per
41
+ * version), verifies its ABI revision against this binding's `ABI_REVISION`
42
+ * (a different nonzero revision is refused; 0 means the artifact predates the
43
+ * probe and degrades per symbol), and runs each library's one-time
44
+ * `chs_init` with the UTC default timezone and the artifact's own
45
+ * `unsafe_families.txt`.
46
+ *
47
+ * Libraries are never dlclosed; `close()` joins background threads only.
48
+ * Loading the same artifact path from two `Registry` instances shares one
49
+ * loaded image, so `chs_init` still runs exactly once per artifact.
50
+ */
51
+ export class Registry {
52
+ /**
53
+ * The primary registry directory: the first on the search path that held
54
+ * artifacts, scanned and loaded at construction — or, with `autofetch` and
55
+ * nothing installed anywhere, the directory the first fetch will create.
56
+ */
57
+ dir;
58
+ /** The §1 search path, in order, every candidate whether or not it exists. */
59
+ searchPath;
60
+ /** This host's platform key, e.g. `darwin-arm64` — the only artifacts a process can dlopen. */
61
+ platform;
62
+ byId = new Map();
63
+ byPath = new Map();
64
+ loaded = [];
65
+ timezone;
66
+ verifyChecksums;
67
+ autofetch;
68
+ fetchOptions;
69
+ explicit;
70
+ /**
71
+ * Scan and load a registry.
72
+ *
73
+ * @param dir - the registry root; the head of the search path. Absent, the
74
+ * path is `CHTYPES_REGISTRY`, the per-user artifact cache, then the system
75
+ * locations (see `registrySearchPath` / `defaultRegistryDir`).
76
+ * @param options - timezone, checksum verification, autofetch — see `RegistryOptions`.
77
+ * @throws {RegistryError} when a directory named explicitly (the argument or
78
+ * `CHTYPES_REGISTRY`) does not exist and autofetch is off, when no
79
+ * directory on the search path holds an artifact (and autofetch is off),
80
+ * the primary directory cannot be read, an artifact fails its checksum,
81
+ * fails to load, or reports a ClickHouse version different from its
82
+ * manifest's.
83
+ * @throws {ChtypesError} when an artifact reports a different nonzero ABI
84
+ * revision than this binding speaks, or `chs_init` fails (e.g. an unknown
85
+ * timezone — the message names it).
86
+ */
87
+ constructor(dir, options = {}) {
88
+ this.platform = hostPlatform();
89
+ this.timezone = options.timezone ?? 'UTC';
90
+ this.verifyChecksums = options.verifyChecksums ?? false;
91
+ this.autofetch = options.autofetch ?? envFlag('CHTYPES_AUTOFETCH');
92
+ this.fetchOptions = options.fetch ?? {};
93
+ this.explicit = dir !== undefined && dir !== '' ? path.resolve(dir) : undefined;
94
+ this.searchPath = registrySearchPath(dir, this.platform);
95
+ // A directory somebody NAMED and that does not exist is a configuration
96
+ // mistake and must be an error naming it, never a silent fallback — unless
97
+ // autofetch is on, in which case it is the destination the first fetch creates.
98
+ const fromEnv = process.env['CHTYPES_REGISTRY'];
99
+ const named = [this.explicit, fromEnv !== undefined && fromEnv !== '' ? path.resolve(fromEnv) : undefined];
100
+ for (const d of named) {
101
+ if (d !== undefined && !isDirectory(d) && !this.autofetch) {
102
+ throw new RegistryError(`chtypes: cannot read registry ${d}: not a directory`);
103
+ }
104
+ }
105
+ const primary = this.searchPath.find((d) => looksLikeRegistry(d));
106
+ if (primary === undefined) {
107
+ if (!this.autofetch) {
108
+ throw new RegistryError(`chtypes: no artifacts in any registry directory. Looked in: ${this.searchPath.join(', ')}.\n` +
109
+ `Install one: ${FETCH_COMMAND} <line>\n` +
110
+ 'or set CHTYPES_AUTOFETCH=1 to fetch on first use.');
111
+ }
112
+ this.dir = fetchDestination(this.explicit, this.platform);
113
+ return;
114
+ }
115
+ this.dir = primary;
116
+ let entries;
117
+ try {
118
+ entries = readdirSync(this.dir);
119
+ }
120
+ catch (err) {
121
+ throw new RegistryError(`chtypes: cannot read registry ${this.dir}: ${String(err)}`, { cause: err });
122
+ }
123
+ for (const entry of entries.sort()) {
124
+ // A dot-directory is never a version: fetch stages its downloads and
125
+ // unpacks in hidden siblings, and a .DS_Store is not a version either.
126
+ if (entry.startsWith('.'))
127
+ continue;
128
+ const sub = path.join(this.dir, entry);
129
+ if (!isDirectory(sub))
130
+ continue;
131
+ // A registry may legitimately hold scratch directories: a missing or
132
+ // unparseable manifest is skipped in silence.
133
+ const manifest = readManifest(sub);
134
+ if (manifest === null)
135
+ continue;
136
+ this.load(sub, manifest);
137
+ }
138
+ if (this.loaded.length === 0) {
139
+ throw new RegistryError(`chtypes: no version artifacts under ${this.dir}`);
140
+ }
141
+ }
142
+ /** dlopen one artifact directory, cross-check it, `chs_init` it, index it. */
143
+ load(sub, manifest) {
144
+ const already = this.byPath.get(sub);
145
+ if (already !== undefined)
146
+ return already;
147
+ const libPath = path.join(sub, manifest.library);
148
+ if (this.verifyChecksums)
149
+ verifyChecksum(libPath, manifest);
150
+ // A directory that has a manifest and does not load is broken, not absent.
151
+ let native;
152
+ try {
153
+ native = NativeLibrary.open(libPath);
154
+ }
155
+ catch (err) {
156
+ throw new RegistryError(`chtypes: cannot load ${libPath}: ${String(err)}`, { cause: err });
157
+ }
158
+ // The right bytes in the wrong directory is the one corruption a hash
159
+ // cannot catch, so cross-check what the library says about itself.
160
+ const declared = manifest.clickhouse_version;
161
+ if (declared !== undefined && declared !== '' && declared !== native.version) {
162
+ throw new RegistryError(`chtypes: ${libPath} reports ClickHouse ${native.version} but its manifest says ${declared}`);
163
+ }
164
+ // Each library keeps its own DateLUT and its own refuse-list. An absent or
165
+ // empty unsafe_families.txt is a valid empty list, not a missing file.
166
+ native.init(this.timezone, readUnsafeFamilies(sub, manifest));
167
+ const library = new Library(native);
168
+ this.loaded.push(library);
169
+ // Release order, not scan order: the directory listing is lexical, which
170
+ // put 25.10 before 25.8 (spec/bindings.md §Version selection, rule 2 —
171
+ // every ordered surface uses numeric release order; fixed 2026-08-26).
172
+ this.loaded.sort((a, b) => compareMinor(a.minor, b.minor));
173
+ this.byPath.set(sub, library);
174
+ // Indexed under both spellings: docker tags drift, and an exact-match-only
175
+ // lookup silently loses a whole version column. First directory wins: a
176
+ // line already loaded from earlier on the search path is not displaced.
177
+ if (!this.byId.has(library.version))
178
+ this.byId.set(library.version, library);
179
+ if (!this.byId.has(library.minor))
180
+ this.byId.set(library.minor, library);
181
+ return library;
182
+ }
183
+ /** Load `<dir>/<minor>/` if it is an artifact directory; null when it is not. */
184
+ loadLine(dir, minor) {
185
+ const sub = path.join(dir, minor);
186
+ if (!isDirectory(sub))
187
+ return null;
188
+ const manifest = readManifest(sub);
189
+ if (manifest === null)
190
+ return null;
191
+ return this.load(sub, manifest);
192
+ }
193
+ lookup(version) {
194
+ return this.byId.get(version) ?? this.byId.get(minorOf(version));
195
+ }
196
+ /** The ClickHouse minor lines this registry has loaded, oldest first. */
197
+ versions() {
198
+ return [...new Set(this.loaded.map((l) => l.minor))].sort(compareMinor);
199
+ }
200
+ /** Every loaded library, in release order (oldest minor line first). */
201
+ libraries() {
202
+ return this.loaded;
203
+ }
204
+ /**
205
+ * Resolve a version to its library. A minor line ("25.8") or an exact patch
206
+ * ("25.8.28.1-lts") both work, and an unknown patch inside a loaded minor line
207
+ * resolves to that line — asking for "25.8.30.16" finds the loaded 25.8.
208
+ *
209
+ * A line the primary directory lacks is loaded from the first later
210
+ * directory on the search path that holds it (docs/fetch.md §1), and joins
211
+ * `versions()` / `libraries()` from then on. Never a fetch: this call is
212
+ * synchronous; `open()` is the one that may fetch.
213
+ *
214
+ * Failure is the one §7 error, never a fallback to the nearest version:
215
+ * answering 26.7 semantics from a 25.8 artifact is a lie, and silent
216
+ * wrongness is what the rigs score hardest.
217
+ *
218
+ * @param version - a minor line (`"25.8"`) or an exact patch
219
+ * (`"25.8.28.1-lts"`), e.g. what `parseVersionResult` discovered.
220
+ * @returns the loaded `Library` for that version.
221
+ * @throws {ArtifactMissingError} (`code` `CHTYPES_ARTIFACT_MISSING`, a
222
+ * `RegistryError`) when no directory on the search path holds the line;
223
+ * the message names every directory looked in and the fetch command.
224
+ * @throws {RegistryError} when a directory holds the line but it does not load.
225
+ */
226
+ for(version) {
227
+ const hit = this.lookup(version);
228
+ if (hit !== undefined)
229
+ return hit;
230
+ const minor = minorOf(version);
231
+ for (const dir of this.searchPath) {
232
+ if (this.loadLine(dir, minor) !== null) {
233
+ const found = this.lookup(version);
234
+ if (found !== undefined)
235
+ return found;
236
+ }
237
+ }
238
+ throw new ArtifactMissingError(minor, this.platform, this.searchPath);
239
+ }
240
+ /**
241
+ * `for()`, with the lazy fetch of docs/fetch.md §6 in front of it: a line no
242
+ * directory on the search path holds is fetched through `ensure()` — into
243
+ * the directory a fetch writes to (§1), verified, once per process per line
244
+ * even under concurrent opens — and then loaded. With `autofetch` off (the
245
+ * default) this is `for()` behind a promise, and a missing line rejects
246
+ * with the same `ArtifactMissingError`.
247
+ *
248
+ * @throws {ArtifactMissingError} when the line is missing and autofetch is off.
249
+ * @throws {FetchError} the §7 fetch verdicts (`CHTYPES_ARTIFACT_UNTRUSTED`,
250
+ * `…_CORRUPT`, `…_PINNED`, `…_UNPUBLISHED`, `CHTYPES_SOURCE_UNREACHABLE`).
251
+ * @throws {RegistryError} when the fetched artifact does not load.
252
+ */
253
+ async open(version) {
254
+ try {
255
+ return this.for(version);
256
+ }
257
+ catch (err) {
258
+ if (!(err instanceof ArtifactMissingError) || !this.autofetch)
259
+ throw err;
260
+ }
261
+ const minor = minorOf(version);
262
+ const dest = this.fetchOptions.dest ?? fetchDestination(this.explicit, this.platform);
263
+ const result = await ensure(minor, { ...this.fetchOptions, dest, platform: this.platform });
264
+ this.loadLine(result.registry, result.line);
265
+ return this.for(version);
266
+ }
267
+ /**
268
+ * True when this registry can answer for a version: loaded already, or held
269
+ * by a directory on the search path (which `for()` would load). Never a
270
+ * fetch, and never a load.
271
+ */
272
+ has(version) {
273
+ if (this.lookup(version) !== undefined)
274
+ return true;
275
+ const minor = minorOf(version);
276
+ return this.searchPath.some((dir) => {
277
+ const sub = path.join(dir, minor);
278
+ const manifest = readManifest(sub);
279
+ return manifest !== null && existsSync(path.join(sub, manifest.library));
280
+ });
281
+ }
282
+ /**
283
+ * Join every loaded library's background threads. `chs_init` registers
284
+ * `chs_shutdown` with `atexit`, so an ordinary process needs no call; a test
285
+ * that must not depend on `atexit` should make one.
286
+ */
287
+ close() {
288
+ for (const library of this.loaded)
289
+ library.shutdown();
290
+ }
291
+ /** `using registry = new Registry(...)` closes it at scope exit. */
292
+ [Symbol.dispose]() {
293
+ this.close();
294
+ }
295
+ }
296
+ /** Numeric ordering: 25.10 is a later minor than 25.8, whatever strings say. */
297
+ export function compareMinor(a, b) {
298
+ const pa = a.split('.').map((p) => Number.parseInt(p, 10));
299
+ const pb = b.split('.').map((p) => Number.parseInt(p, 10));
300
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
301
+ const x = pa[i] ?? -1;
302
+ const y = pb[i] ?? -1;
303
+ if (Number.isNaN(x) || Number.isNaN(y))
304
+ return a < b ? -1 : a > b ? 1 : 0;
305
+ if (x !== y)
306
+ return x - y;
307
+ }
308
+ return 0;
309
+ }
310
+ /**
311
+ * Where the registry is: the explicit argument, else `CHTYPES_REGISTRY`, else
312
+ * the first of the per-user artifact cache and the system locations that
313
+ * holds artifacts (docs/fetch.md §1). An explicit path and the environment
314
+ * variable are returned as given — a wrong one must produce an error naming
315
+ * it, not a silent fallback — while the unnamed candidates only count if they
316
+ * actually hold artifacts.
317
+ */
318
+ export function resolveRegistryDir(explicit) {
319
+ if (explicit !== undefined && explicit !== '')
320
+ return path.resolve(explicit);
321
+ const fromEnv = process.env['CHTYPES_REGISTRY'];
322
+ if (fromEnv !== undefined && fromEnv !== '')
323
+ return path.resolve(fromEnv);
324
+ const platform = hostPlatform();
325
+ for (const candidate of [cacheRegistryDir(platform), ...systemRegistryDirs(platform)]) {
326
+ if (looksLikeRegistry(candidate))
327
+ return candidate;
328
+ }
329
+ return null;
330
+ }
331
+ /**
332
+ * The per-user artifact cache for this host —
333
+ * `${XDG_CACHE_HOME:-~/.cache}/chtypes/artifacts/<os>-<arch>`, `<arch>` spelled
334
+ * the artifact way (`amd64`, `arm64`). Where `chtypes fetch` and
335
+ * `scripts/fetch.sh` install, where a core-repository build lands, and what
336
+ * every SDK's tests and playgrounds fall back to when `CHTYPES_REGISTRY` is
337
+ * unset — one directory the four SDKs agree on. A path, not a promise:
338
+ * `Registry` still throws if nothing is there.
339
+ */
340
+ export function defaultRegistryDir() {
341
+ return cacheRegistryDir(hostPlatform());
342
+ }
343
+ /** Does this directory hold at least one artifact with a usable manifest? */
344
+ export function looksLikeRegistry(dir) {
345
+ if (!isDirectory(dir))
346
+ return false;
347
+ try {
348
+ return readdirSync(dir).some((entry) => {
349
+ if (entry.startsWith('.'))
350
+ return false;
351
+ const sub = path.join(dir, entry);
352
+ if (!isDirectory(sub))
353
+ return false;
354
+ const manifest = readManifest(sub);
355
+ return manifest !== null && existsSync(path.join(sub, manifest.library));
356
+ });
357
+ }
358
+ catch {
359
+ return false;
360
+ }
361
+ }
362
+ function envFlag(name) {
363
+ const v = process.env[name];
364
+ return v !== undefined && ['1', 'true', 'yes', 'on'].includes(v.trim().toLowerCase());
365
+ }
366
+ function isDirectory(p) {
367
+ try {
368
+ // statSync follows symlinks on purpose: a registry is often a symlink
369
+ // into ~/.cache/chtypes, which is where the artifacts actually live.
370
+ return statSync(p).isDirectory();
371
+ }
372
+ catch {
373
+ return false;
374
+ }
375
+ }
376
+ function readManifest(dir) {
377
+ try {
378
+ const parsed = JSON.parse(readFileSync(path.join(dir, 'manifest.json'), 'utf8'));
379
+ if (typeof parsed.library !== 'string' || parsed.library === '')
380
+ return null;
381
+ return parsed;
382
+ }
383
+ catch {
384
+ return null;
385
+ }
386
+ }
387
+ function readUnsafeFamilies(dir, manifest) {
388
+ try {
389
+ return readFileSync(path.join(dir, 'unsafe_families.txt'), 'utf8').trim();
390
+ }
391
+ catch {
392
+ return (manifest.unsafe_families ?? '').trim();
393
+ }
394
+ }
395
+ function verifyChecksum(libPath, manifest) {
396
+ const expected = manifest.library_sha256;
397
+ if (expected === undefined || expected === '') {
398
+ throw new RegistryError(`chtypes: ${libPath} cannot be verified: its manifest carries no library_sha256`);
399
+ }
400
+ const bytes = readFileSync(libPath);
401
+ if (manifest.library_bytes !== undefined && bytes.byteLength !== manifest.library_bytes) {
402
+ throw new RegistryError(`chtypes: ${libPath} is ${bytes.byteLength} bytes, manifest says ${manifest.library_bytes}`);
403
+ }
404
+ const actual = createHash('sha256').update(bytes).digest('hex');
405
+ if (actual !== expected) {
406
+ throw new RegistryError(`chtypes: ${libPath} sha256 ${actual} does not match manifest ${expected}`);
407
+ }
408
+ }
409
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}