@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.
- package/README.md +169 -0
- package/dist/esm/compress.js +160 -0
- package/dist/esm/compress.js.map +1 -0
- package/dist/esm/config.js +47 -0
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/decompress.js +105 -0
- package/dist/esm/decompress.js.map +1 -0
- package/dist/esm/dictionaries/index.js +104 -0
- package/dist/esm/dictionaries/index.js.map +1 -0
- package/dist/esm/dictionaries/json.json +28 -0
- package/dist/esm/dictionaries/markdown.json +28 -0
- package/dist/esm/dictionaries/python.json +28 -0
- package/dist/esm/dictionaries/sql.json +28 -0
- package/dist/esm/dictionaries/typescript.json +28 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/streaming.js +139 -0
- package/dist/esm/streaming.js.map +1 -0
- package/dist/esm/types.js +25 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/wasm/index.js +5 -0
- package/dist/esm/wasm/index.js.map +1 -0
- package/dist/esm/wasm/loader.js +179 -0
- package/dist/esm/wasm/loader.js.map +1 -0
- package/dist/esm/worker.js +304 -0
- package/dist/esm/worker.js.map +1 -0
- package/dist/types/compress.d.ts +39 -0
- package/dist/types/compress.d.ts.map +1 -0
- package/dist/types/config.d.ts +113 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/decompress.d.ts +53 -0
- package/dist/types/decompress.d.ts.map +1 -0
- package/dist/types/dictionaries/index.d.ts +127 -0
- package/dist/types/dictionaries/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/streaming.d.ts +81 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/types/types.d.ts +116 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/wasm/index.d.ts +6 -0
- package/dist/types/wasm/index.d.ts.map +1 -0
- package/dist/types/wasm/loader.d.ts +71 -0
- package/dist/types/wasm/loader.d.ts.map +1 -0
- package/dist/types/worker.d.ts +106 -0
- package/dist/types/worker.d.ts.map +1 -0
- package/package.json +63 -0
- 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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAA0B,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAGL,eAAe,GAChB,MAAM,YAAY,CAAC;AAoDpB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAA0B;IAE1B,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEhE,OAAO,IAAI,uBAAuB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,uBAAuB;IACnB,UAAU,CAA0B;IACpC,MAAM,CAAwD;IAC9D,QAAQ,GAAG,KAAK,CAAC;IACjB,WAAW,GAAG,CAAC,CAAC;IAChB,WAAW,GAAG,CAAC,CAAC;IAExB,YACE,UAAmC,EACnC,MAA6D;QAE7D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAkB;QAC/B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAElC,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACtE,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;QAC1D,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAElE,uBAAuB;QACvB,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QAEzC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,OAAO,GAAG,GAAG,gBAAgB,CAAC,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5E,GAAG,EAAE,CAAC;QACR,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,OAAO,GAAG,GAAG,gBAAgB,CAAC,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC;YAC1E,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC;YACvC,IAAI,GAAG,GAAG,MAAM,GAAG,gBAAgB,CAAC,MAAM;gBAAE,MAAM;YAClD,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;YAC7D,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACzC,GAAG,IAAI,MAAM,CAAC;QAChB,CAAC;QAED,OAAO;YACL,cAAc;YACd,gBAAgB;YAChB,gBAAgB;YAChB,UAAU;YACV,cAAc,EAAE,UAAU,CAAC,eAAe;YAC1C,gBAAgB,EAAE,UAAU,CAAC,iBAAiB;YAC9C,gBAAgB,EAAE,UAAU,CAAC,iBAAiB;YAC9C,aAAa;YACb,kBAAkB,EAAE,SAAS;YAC7B,OAAO,EAAE;gBACP,eAAe,EAAE,CAAC;gBAClB,eAAe,EAAE,CAAC;gBAClB,mBAAmB,EAAE,CAAC;gBACtB,WAAW,EAAE,OAAO,GAAG,SAAS;gBAChC,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE;aACpC;SACF,CAAC;IACJ,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;IACxC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAsC,EACtC,MAA0B;IAE1B,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAE3D,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QACtC,MAAM,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAkB,EAClB,SAAiB,EACjB,QAA2D;IAE3D,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAQ,EAAE,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -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 @@
|
|
|
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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"}
|