@small-ltsc/sdk 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 (48) hide show
  1. package/README.md +169 -0
  2. package/dist/esm/compress.js +160 -0
  3. package/dist/esm/compress.js.map +1 -0
  4. package/dist/esm/config.js +47 -0
  5. package/dist/esm/config.js.map +1 -0
  6. package/dist/esm/decompress.js +105 -0
  7. package/dist/esm/decompress.js.map +1 -0
  8. package/dist/esm/dictionaries/index.js +104 -0
  9. package/dist/esm/dictionaries/index.js.map +1 -0
  10. package/dist/esm/dictionaries/json.json +28 -0
  11. package/dist/esm/dictionaries/markdown.json +28 -0
  12. package/dist/esm/dictionaries/python.json +28 -0
  13. package/dist/esm/dictionaries/sql.json +28 -0
  14. package/dist/esm/dictionaries/typescript.json +28 -0
  15. package/dist/esm/index.js +26 -0
  16. package/dist/esm/index.js.map +1 -0
  17. package/dist/esm/streaming.js +139 -0
  18. package/dist/esm/streaming.js.map +1 -0
  19. package/dist/esm/types.js +25 -0
  20. package/dist/esm/types.js.map +1 -0
  21. package/dist/esm/wasm/index.js +5 -0
  22. package/dist/esm/wasm/index.js.map +1 -0
  23. package/dist/esm/wasm/loader.js +179 -0
  24. package/dist/esm/wasm/loader.js.map +1 -0
  25. package/dist/esm/worker.js +304 -0
  26. package/dist/esm/worker.js.map +1 -0
  27. package/dist/types/compress.d.ts +39 -0
  28. package/dist/types/compress.d.ts.map +1 -0
  29. package/dist/types/config.d.ts +113 -0
  30. package/dist/types/config.d.ts.map +1 -0
  31. package/dist/types/decompress.d.ts +53 -0
  32. package/dist/types/decompress.d.ts.map +1 -0
  33. package/dist/types/dictionaries/index.d.ts +127 -0
  34. package/dist/types/dictionaries/index.d.ts.map +1 -0
  35. package/dist/types/index.d.ts +18 -0
  36. package/dist/types/index.d.ts.map +1 -0
  37. package/dist/types/streaming.d.ts +81 -0
  38. package/dist/types/streaming.d.ts.map +1 -0
  39. package/dist/types/types.d.ts +116 -0
  40. package/dist/types/types.d.ts.map +1 -0
  41. package/dist/types/wasm/index.d.ts +6 -0
  42. package/dist/types/wasm/index.d.ts.map +1 -0
  43. package/dist/types/wasm/loader.d.ts +71 -0
  44. package/dist/types/wasm/loader.d.ts.map +1 -0
  45. package/dist/types/worker.d.ts +106 -0
  46. package/dist/types/worker.d.ts.map +1 -0
  47. package/package.json +63 -0
  48. package/src/wasm/small_ltsc_core_bg.wasm +0 -0
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "python-v1",
3
+ "version": "1.0.0",
4
+ "name": "Python Code Dictionary",
5
+ "description": "Pre-built patterns for Python source code compression",
6
+ "entries": [
7
+ { "metaToken": 4294934528, "pattern": [29499, 25] },
8
+ { "metaToken": 4294934529, "pattern": [1312, 512] },
9
+ { "metaToken": 4294934530, "pattern": [3846, 512] },
10
+ { "metaToken": 4294934531, "pattern": [565, 512] },
11
+ { "metaToken": 4294934532, "pattern": [471, 6927] },
12
+ { "metaToken": 4294934533, "pattern": [220, 220, 220, 220] },
13
+ { "metaToken": 4294934534, "pattern": [220, 220, 220, 220, 220, 220, 220, 220] },
14
+ { "metaToken": 4294934535, "pattern": [55609, 512] },
15
+ { "metaToken": 4294934536, "pattern": [3784, 512] },
16
+ { "metaToken": 4294934537, "pattern": [961, 512] },
17
+ { "metaToken": 4294934538, "pattern": [422, 659] },
18
+ { "metaToken": 4294934539, "pattern": [512, 11, 659] },
19
+ { "metaToken": 4294934540, "pattern": [512, 8, 610] },
20
+ { "metaToken": 4294934541, "pattern": [4288, 568, 512] },
21
+ { "metaToken": 4294934542, "pattern": [1374, 659] },
22
+ { "metaToken": 4294934543, "pattern": [4288, 2073, 610] },
23
+ { "metaToken": 4294934544, "pattern": [368, 659] },
24
+ { "metaToken": 4294934545, "pattern": [610, 25] },
25
+ { "metaToken": 4294934546, "pattern": [512, 304] },
26
+ { "metaToken": 4294934547, "pattern": [198, 198] }
27
+ ]
28
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "sql-v1",
3
+ "version": "1.0.0",
4
+ "name": "SQL Dictionary",
5
+ "description": "Pre-built patterns for SQL query compression",
6
+ "entries": [
7
+ { "metaToken": 4294934528, "pattern": [4963, 198] },
8
+ { "metaToken": 4294934529, "pattern": [3963, 198] },
9
+ { "metaToken": 4294934530, "pattern": [33067, 198] },
10
+ { "metaToken": 4294934531, "pattern": [11075, 198] },
11
+ { "metaToken": 4294934532, "pattern": [12038, 198] },
12
+ { "metaToken": 4294934533, "pattern": [40462, 198] },
13
+ { "metaToken": 4294934534, "pattern": [4276, 198] },
14
+ { "metaToken": 4294934535, "pattern": [40114, 198] },
15
+ { "metaToken": 4294934536, "pattern": [5765, 220] },
16
+ { "metaToken": 4294934537, "pattern": [37094, 198] },
17
+ { "metaToken": 4294934538, "pattern": [3740, 198] },
18
+ { "metaToken": 4294934539, "pattern": [9149, 198] },
19
+ { "metaToken": 4294934540, "pattern": [220, 220, 220, 220] },
20
+ { "metaToken": 4294934541, "pattern": [3740, 11075] },
21
+ { "metaToken": 4294934542, "pattern": [198, 198] },
22
+ { "metaToken": 4294934543, "pattern": [9829, 11] },
23
+ { "metaToken": 4294934544, "pattern": [29766, 11] },
24
+ { "metaToken": 4294934545, "pattern": [26717, 11] },
25
+ { "metaToken": 4294934546, "pattern": [6657, 11] },
26
+ { "metaToken": 4294934547, "pattern": [3740, 4963] }
27
+ ]
28
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "typescript-v1",
3
+ "version": "1.0.0",
4
+ "name": "TypeScript Code Dictionary",
5
+ "description": "Pre-built patterns for TypeScript source code compression",
6
+ "entries": [
7
+ { "metaToken": 4294934528, "pattern": [736, 512] },
8
+ { "metaToken": 4294934529, "pattern": [1034, 512] },
9
+ { "metaToken": 4294934530, "pattern": [738, 512] },
10
+ { "metaToken": 4294934531, "pattern": [471, 6927] },
11
+ { "metaToken": 4294934532, "pattern": [220, 220] },
12
+ { "metaToken": 4294934533, "pattern": [220, 220, 220, 220] },
13
+ { "metaToken": 4294934534, "pattern": [198, 198] },
14
+ { "metaToken": 4294934535, "pattern": [512, 25] },
15
+ { "metaToken": 4294934536, "pattern": [512, 11, 659] },
16
+ { "metaToken": 4294934537, "pattern": [368, 659] },
17
+ { "metaToken": 4294934538, "pattern": [4288, 568, 512] },
18
+ { "metaToken": 4294934539, "pattern": [512, 304] },
19
+ { "metaToken": 4294934540, "pattern": [610, 25] },
20
+ { "metaToken": 4294934541, "pattern": [422, 659] },
21
+ { "metaToken": 4294934542, "pattern": [61, 2511, 25] },
22
+ { "metaToken": 4294934543, "pattern": [61, 1808, 25] },
23
+ { "metaToken": 4294934544, "pattern": [6706, 25] },
24
+ { "metaToken": 4294934545, "pattern": [961, 512] },
25
+ { "metaToken": 4294934546, "pattern": [1374, 659] },
26
+ { "metaToken": 4294934547, "pattern": [4288, 2073, 610] }
27
+ ]
28
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Small LTSC SDK - Lossless Token Sequence Compression
3
+ *
4
+ * A TypeScript SDK for compressing LLM token sequences to reduce
5
+ * inference costs and context length requirements.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ // Main compression API
10
+ export { compress, discoverPatterns } from './compress.js';
11
+ export { decompress, extractDictionary, extractBody, isCompressed } from './decompress.js';
12
+ // Streaming API
13
+ export { createStreamingCompressor, compressStream, processInChunks, } from './streaming.js';
14
+ // Worker API
15
+ export { createWorkerPool, compressInWorker, decompressInWorker, } from './worker.js';
16
+ // Configuration
17
+ export { DEFAULT_CONFIG, mergeConfig, } from './config.js';
18
+ // Types
19
+ export { normalizeTokens, isTokenSeq, } from './types.js';
20
+ // Static dictionaries
21
+ export { loadStaticDictionary, createStaticDictionary, listStaticDictionaries, isBuiltinDictionary, STATIC_DICTIONARIES, } from './dictionaries/index.js';
22
+ // WASM initialization
23
+ export { initWasm, initWasmFromModule, initWasmFromBytes, isWasmInitialized, getWasmVersion, } from './wasm/loader.js';
24
+ // Re-export version from package.json at runtime
25
+ export const VERSION = '0.1.0';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,uBAAuB;AACvB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE3F,gBAAgB;AAChB,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,eAAe,GAEhB,MAAM,gBAAgB,CAAC;AAExB,aAAa;AACb,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AAErB,gBAAgB;AAChB,OAAO,EAIL,cAAc,EACd,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,QAAQ;AACR,OAAO,EAOL,eAAe,EACf,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,sBAAsB;AACtB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EAGnB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAEjC,sBAAsB;AACtB,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,iDAAiD;AACjD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Streaming compression API for large inputs.
3
+ *
4
+ * Provides a chunk-based interface for compressing token sequences
5
+ * that are too large to fit in memory at once.
6
+ */
7
+ import { getWasm, isWasmInitialized, initWasm } from './wasm/loader.js';
8
+ import { mergeConfig, toWasmConfig } from './config.js';
9
+ import { normalizeTokens, } from './types.js';
10
+ /**
11
+ * Create a new streaming compressor.
12
+ *
13
+ * @param config - Optional compression configuration
14
+ * @returns Streaming compressor instance
15
+ */
16
+ export async function createStreamingCompressor(config) {
17
+ if (!isWasmInitialized()) {
18
+ await initWasm();
19
+ }
20
+ const mergedConfig = mergeConfig(config);
21
+ const wasmConfig = toWasmConfig(mergedConfig);
22
+ const wasm = getWasm();
23
+ const wasmCompressor = new wasm.StreamingCompressor(wasmConfig);
24
+ return new StreamingCompressorImpl(wasmCompressor, mergedConfig);
25
+ }
26
+ /**
27
+ * Internal implementation of StreamingCompressor.
28
+ */
29
+ class StreamingCompressorImpl {
30
+ compressor;
31
+ config;
32
+ finished = false;
33
+ totalChunks = 0;
34
+ totalTokens = 0;
35
+ constructor(compressor, config) {
36
+ this.compressor = compressor;
37
+ this.config = config;
38
+ }
39
+ async addChunk(tokens) {
40
+ if (this.finished) {
41
+ throw new Error('Cannot add chunks to a finished compressor');
42
+ }
43
+ const normalizedTokens = normalizeTokens(tokens);
44
+ this.compressor.add_chunk(normalizedTokens);
45
+ this.totalChunks++;
46
+ this.totalTokens += normalizedTokens.length;
47
+ }
48
+ async finish() {
49
+ if (this.finished) {
50
+ throw new Error('Compressor has already been finished');
51
+ }
52
+ this.finished = true;
53
+ const startTime = performance.now();
54
+ const wasmResult = this.compressor.finish();
55
+ const endTime = performance.now();
56
+ const serializedTokens = Array.from(wasmResult.getSerializedTokens());
57
+ const dictionaryTokens = Array.from(wasmResult.getDictionaryTokens());
58
+ const bodyTokens = Array.from(wasmResult.getBodyTokens());
59
+ const originalTokens = Array.from(wasmResult.getOriginalTokens());
60
+ // Build dictionary map
61
+ const dictionaryMap = new Map();
62
+ const dictStart = this.config.dictStartToken;
63
+ const dictEnd = this.config.dictEndToken;
64
+ let pos = 0;
65
+ while (pos < dictionaryTokens.length && dictionaryTokens[pos] !== dictStart) {
66
+ pos++;
67
+ }
68
+ pos++;
69
+ while (pos < dictionaryTokens.length && dictionaryTokens[pos] !== dictEnd) {
70
+ const metaToken = dictionaryTokens[pos++];
71
+ const length = dictionaryTokens[pos++];
72
+ if (pos + length > dictionaryTokens.length)
73
+ break;
74
+ const definition = dictionaryTokens.slice(pos, pos + length);
75
+ dictionaryMap.set(metaToken, definition);
76
+ pos += length;
77
+ }
78
+ return {
79
+ originalTokens,
80
+ serializedTokens,
81
+ dictionaryTokens,
82
+ bodyTokens,
83
+ originalLength: wasmResult.original_length,
84
+ compressedLength: wasmResult.compressed_length,
85
+ compressionRatio: wasmResult.compression_ratio,
86
+ dictionaryMap,
87
+ staticDictionaryId: undefined,
88
+ metrics: {
89
+ discoveryTimeMs: 0,
90
+ selectionTimeMs: 0,
91
+ serializationTimeMs: 0,
92
+ totalTimeMs: endTime - startTime,
93
+ peakMemoryBytes: this.memoryUsage(),
94
+ },
95
+ };
96
+ }
97
+ memoryUsage() {
98
+ return this.compressor.memory_usage();
99
+ }
100
+ isFinished() {
101
+ return this.finished;
102
+ }
103
+ }
104
+ /**
105
+ * Process a token stream with streaming compression.
106
+ *
107
+ * Convenience function that handles creating the compressor and
108
+ * processing an async iterable of token chunks.
109
+ *
110
+ * @param tokenStream - Async iterable of token chunks
111
+ * @param config - Optional compression configuration
112
+ * @returns Promise resolving to compression result
113
+ */
114
+ export async function compressStream(tokenStream, config) {
115
+ const compressor = await createStreamingCompressor(config);
116
+ for await (const chunk of tokenStream) {
117
+ await compressor.addChunk(chunk);
118
+ }
119
+ return compressor.finish();
120
+ }
121
+ /**
122
+ * Process tokens in chunks with a callback.
123
+ *
124
+ * @param tokens - Full token sequence
125
+ * @param chunkSize - Size of each chunk
126
+ * @param callback - Callback for each chunk
127
+ */
128
+ export async function processInChunks(tokens, chunkSize, callback) {
129
+ const normalized = normalizeTokens(tokens);
130
+ const results = [];
131
+ for (let i = 0; i < normalized.length; i += chunkSize) {
132
+ const end = Math.min(i + chunkSize, normalized.length);
133
+ const chunk = normalized.subarray(i, end);
134
+ const result = await callback(chunk, i);
135
+ results.push(result);
136
+ }
137
+ return results;
138
+ }
139
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/streaming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Core type definitions for Small LTSC SDK.
3
+ */
4
+ /**
5
+ * Normalize any token input to Uint32Array.
6
+ */
7
+ export function normalizeTokens(tokens) {
8
+ if (tokens instanceof Uint32Array) {
9
+ return tokens;
10
+ }
11
+ return new Uint32Array(tokens);
12
+ }
13
+ /**
14
+ * Check if a value is a valid token sequence.
15
+ */
16
+ export function isTokenSeq(value) {
17
+ if (value instanceof Uint32Array) {
18
+ return true;
19
+ }
20
+ if (Array.isArray(value)) {
21
+ return value.every((v) => typeof v === 'number' && Number.isInteger(v) && v >= 0);
22
+ }
23
+ return false;
24
+ }
25
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgIH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAkB;IAChD,IAAI,MAAM,YAAY,WAAW,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,KAAK,CAChB,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * WASM module exports.
3
+ */
4
+ export { initWasm, initWasmFromModule, initWasmFromBytes, getWasm, isWasmInitialized, resetWasm, getWasmVersion, } from './loader.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/wasm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,iBAAiB,EACjB,OAAO,EACP,iBAAiB,EACjB,SAAS,EACT,cAAc,GACf,MAAM,aAAa,CAAC"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * WASM module loader with cross-platform support.
3
+ *
4
+ * Handles loading the WebAssembly module in browser, Node.js, and Deno environments.
5
+ */
6
+ // Global state
7
+ let wasmModule = null;
8
+ let wasmInstance = null;
9
+ let initPromise = null;
10
+ /**
11
+ * Detect the current runtime environment.
12
+ */
13
+ function detectEnvironment() {
14
+ if (typeof Deno !== 'undefined') {
15
+ return 'deno';
16
+ }
17
+ if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {
18
+ return 'browser';
19
+ }
20
+ if (typeof process !== 'undefined' &&
21
+ process.versions &&
22
+ process.versions.node) {
23
+ return 'node';
24
+ }
25
+ return 'browser'; // Default fallback
26
+ }
27
+ /**
28
+ * Load WASM bytes based on environment.
29
+ */
30
+ async function loadWasmBytes() {
31
+ const env = detectEnvironment();
32
+ // Get the path to the WASM file
33
+ // This will be populated during the build process
34
+ const wasmPath = new URL('./small_ltsc_core_bg.wasm', import.meta.url);
35
+ switch (env) {
36
+ case 'browser': {
37
+ const response = await fetch(wasmPath);
38
+ if (!response.ok) {
39
+ throw new Error(`Failed to fetch WASM: ${response.statusText}`);
40
+ }
41
+ return response.arrayBuffer();
42
+ }
43
+ case 'node': {
44
+ // Dynamic import for Node.js fs module
45
+ const { readFile } = await import('node:fs/promises');
46
+ const { fileURLToPath } = await import('node:url');
47
+ const path = fileURLToPath(wasmPath);
48
+ const buffer = await readFile(path);
49
+ return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
50
+ }
51
+ case 'deno': {
52
+ // Deno can use fetch for local files
53
+ const response = await fetch(wasmPath);
54
+ if (!response.ok) {
55
+ throw new Error(`Failed to fetch WASM: ${response.statusText}`);
56
+ }
57
+ return response.arrayBuffer();
58
+ }
59
+ default:
60
+ throw new Error(`Unsupported environment: ${env}`);
61
+ }
62
+ }
63
+ /**
64
+ * Create import object for WASM instantiation.
65
+ */
66
+ function createImports() {
67
+ return {
68
+ env: {
69
+ // Logging functions for debugging
70
+ console_log: (ptr, len) => {
71
+ // In production, this would decode the string from memory
72
+ console.log('[WASM]', ptr, len);
73
+ },
74
+ },
75
+ wbg: {
76
+ // wasm-bindgen imports will be added here during build
77
+ __wbindgen_throw: (ptr, len) => {
78
+ throw new Error(`WASM error at ${ptr} len ${len}`);
79
+ },
80
+ },
81
+ };
82
+ }
83
+ /**
84
+ * Initialize the WASM module.
85
+ *
86
+ * This function is idempotent - calling it multiple times will only
87
+ * initialize once.
88
+ *
89
+ * @throws Error if WASM loading fails
90
+ */
91
+ export async function initWasm() {
92
+ if (wasmInstance) {
93
+ return; // Already initialized
94
+ }
95
+ if (initPromise) {
96
+ return initPromise; // Initialization in progress
97
+ }
98
+ initPromise = (async () => {
99
+ try {
100
+ const wasmBytes = await loadWasmBytes();
101
+ wasmModule = await WebAssembly.compile(wasmBytes);
102
+ const imports = createImports();
103
+ const instance = await WebAssembly.instantiate(wasmModule, imports);
104
+ wasmInstance = instance.exports;
105
+ }
106
+ catch (error) {
107
+ initPromise = null; // Allow retry on failure
108
+ throw error;
109
+ }
110
+ })();
111
+ return initPromise;
112
+ }
113
+ /**
114
+ * Initialize from pre-compiled WASM module.
115
+ *
116
+ * Useful for environments where the WASM is bundled differently.
117
+ *
118
+ * @param module - Pre-compiled WebAssembly.Module
119
+ */
120
+ export async function initWasmFromModule(module) {
121
+ if (wasmInstance) {
122
+ return;
123
+ }
124
+ wasmModule = module;
125
+ const imports = createImports();
126
+ const instance = await WebAssembly.instantiate(module, imports);
127
+ wasmInstance = instance.exports;
128
+ }
129
+ /**
130
+ * Initialize from WASM bytes.
131
+ *
132
+ * @param bytes - WASM binary as ArrayBuffer or Uint8Array
133
+ */
134
+ export async function initWasmFromBytes(bytes) {
135
+ if (wasmInstance) {
136
+ return;
137
+ }
138
+ const buffer = bytes instanceof Uint8Array
139
+ ? new Uint8Array(bytes).buffer
140
+ : bytes;
141
+ wasmModule = await WebAssembly.compile(buffer);
142
+ const imports = createImports();
143
+ const instance = await WebAssembly.instantiate(wasmModule, imports);
144
+ wasmInstance = instance.exports;
145
+ }
146
+ /**
147
+ * Get the initialized WASM exports.
148
+ *
149
+ * @throws Error if WASM is not initialized
150
+ */
151
+ export function getWasm() {
152
+ if (!wasmInstance) {
153
+ throw new Error('WASM not initialized. Call initWasm() first and await its completion.');
154
+ }
155
+ return wasmInstance;
156
+ }
157
+ /**
158
+ * Check if WASM is initialized.
159
+ */
160
+ export function isWasmInitialized() {
161
+ return wasmInstance !== null;
162
+ }
163
+ /**
164
+ * Reset the WASM instance (mainly for testing).
165
+ */
166
+ export function resetWasm() {
167
+ wasmInstance = null;
168
+ wasmModule = null;
169
+ initPromise = null;
170
+ }
171
+ /**
172
+ * Get WASM module version.
173
+ */
174
+ export function getWasmVersion() {
175
+ const wasm = getWasm();
176
+ return wasm.version();
177
+ }
178
+ // Types are already exported at their interface declarations above
179
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/wasm/loader.ts"],"names":[],"mappings":"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"}