@cogitator-ai/wasm-tools 0.5.9 → 0.5.11
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/dist/__tests__/wasm-loader.test.js +2 -2
- package/dist/__tests__/wasm-loader.test.js.map +1 -1
- package/dist/manager/file-watcher.d.ts.map +1 -1
- package/dist/manager/file-watcher.js +6 -0
- package/dist/manager/file-watcher.js.map +1 -1
- package/dist/manager/types.d.ts +9 -3
- package/dist/manager/types.d.ts.map +1 -1
- package/dist/manager/wasm-loader.d.ts +1 -0
- package/dist/manager/wasm-loader.d.ts.map +1 -1
- package/dist/manager/wasm-loader.js +15 -3
- package/dist/manager/wasm-loader.js.map +1 -1
- package/dist/manager/wasm-tool-manager.d.ts +5 -0
- package/dist/manager/wasm-tool-manager.d.ts.map +1 -1
- package/dist/manager/wasm-tool-manager.js +72 -30
- package/dist/manager/wasm-tool-manager.js.map +1 -1
- package/dist/plugins/base64.d.ts.map +1 -1
- package/dist/plugins/base64.js +57 -8
- package/dist/plugins/base64.js.map +1 -1
- package/dist/plugins/calc.d.ts.map +1 -1
- package/dist/plugins/calc.js +10 -3
- package/dist/plugins/calc.js.map +1 -1
- package/dist/plugins/compression.d.ts.map +1 -1
- package/dist/plugins/compression.js +6 -2
- package/dist/plugins/compression.js.map +1 -1
- package/dist/plugins/csv.d.ts.map +1 -1
- package/dist/plugins/csv.js +6 -0
- package/dist/plugins/csv.js.map +1 -1
- package/dist/plugins/datetime.d.ts.map +1 -1
- package/dist/plugins/datetime.js +20 -7
- package/dist/plugins/datetime.js.map +1 -1
- package/dist/plugins/hash.d.ts.map +1 -1
- package/dist/plugins/hash.js +4 -3
- package/dist/plugins/hash.js.map +1 -1
- package/dist/plugins/signing.d.ts.map +1 -1
- package/dist/plugins/signing.js +26 -13
- package/dist/plugins/signing.js.map +1 -1
- package/dist/plugins/slug.d.ts.map +1 -1
- package/dist/plugins/slug.js +3 -0
- package/dist/plugins/slug.js.map +1 -1
- package/dist/plugins/validation.js +1 -1
- package/dist/plugins/validation.js.map +1 -1
- package/dist/temp/base64.js +55 -8
- package/dist/temp/calc.js +8 -2
- package/dist/temp/compression.js +6 -2
- package/dist/temp/csv.js +6 -0
- package/dist/temp/datetime.js +21 -5
- package/dist/temp/hash.js +4 -3
- package/dist/temp/signing.js +29 -13
- package/dist/temp/slug.js +3 -0
- package/dist/temp/validation.js +1 -1
- package/dist/wasm/base64.wasm +0 -0
- package/dist/wasm/calc.wasm +0 -0
- package/dist/wasm/compression.wasm +0 -0
- package/dist/wasm/csv.wasm +0 -0
- package/dist/wasm/datetime.wasm +0 -0
- package/dist/wasm/diff.wasm +0 -0
- package/dist/wasm/hash.wasm +0 -0
- package/dist/wasm/json.wasm +0 -0
- package/dist/wasm/markdown.wasm +0 -0
- package/dist/wasm/regex.wasm +0 -0
- package/dist/wasm/signing.wasm +0 -0
- package/dist/wasm/slug.wasm +0 -0
- package/dist/wasm/validation.wasm +0 -0
- package/dist/wasm/xml.wasm +0 -0
- package/package.json +14 -14
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Cogitator Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -15,7 +15,7 @@ const mockCreatePlugin = vi.fn().mockImplementation((source, _options) => {
|
|
|
15
15
|
});
|
|
16
16
|
});
|
|
17
17
|
vi.mock('@extism/extism', () => {
|
|
18
|
-
return { default: mockCreatePlugin };
|
|
18
|
+
return { default: mockCreatePlugin, createPlugin: mockCreatePlugin };
|
|
19
19
|
});
|
|
20
20
|
describe('WasmLoader', () => {
|
|
21
21
|
let loader;
|
|
@@ -48,7 +48,7 @@ describe('WasmLoader', () => {
|
|
|
48
48
|
expect(fs.readFile).not.toHaveBeenCalled();
|
|
49
49
|
expect(plugin).toBeDefined();
|
|
50
50
|
expect(plugin.source).toEqual({
|
|
51
|
-
url: 'https://example.com/test.wasm',
|
|
51
|
+
wasm: [{ url: 'https://example.com/test.wasm' }],
|
|
52
52
|
});
|
|
53
53
|
});
|
|
54
54
|
it('resolves relative paths to absolute', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-loader.test.js","sourceRoot":"","sources":["../../src/__tests__/wasm-loader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;CACvE,CAAC,CAAC,CAAC;AAEJ,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,MAAe,EAAE,QAAiB,EAAE,EAAE;IACzF,OAAO,OAAO,CAAC,OAAO,CAAC;QACrB,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC9C,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,UAAU,EAAE;SAC9B,CAAC;QACF,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC3C,MAAM;KACP,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC7B,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"wasm-loader.test.js","sourceRoot":"","sources":["../../src/__tests__/wasm-loader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;CACvE,CAAC,CAAC,CAAC;AAEJ,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,MAAe,EAAE,QAAiB,EAAE,EAAE;IACzF,OAAO,OAAO,CAAC,OAAO,CAAC;QACrB,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC9C,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,UAAU,EAAE;SAC9B,CAAC;QACF,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC3C,MAAM;KACP,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC7B,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,MAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC1B,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,YAAY,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAE1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAEvD,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QAEzE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAE,MAAkE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACzF,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,+BAA+B,EAAE,CAAC;SACjD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAEhD,MAAM,YAAY,GAAG,EAAE,CAAC,QAAoC,CAAC;QAC7D,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;QAC3D,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAEvC,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAC3C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,MAAM,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../src/manager/file-watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAIvD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAA4B;IAIpD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../src/manager/file-watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAIvD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAA4B;IAIpD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,GAAG,IAAI;IAoC7D,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,aAAa;IAQf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAW7B"}
|
|
@@ -29,6 +29,12 @@ export class FileWatcher {
|
|
|
29
29
|
this.clearDebounce(path);
|
|
30
30
|
callbacks.onUnlink(path);
|
|
31
31
|
});
|
|
32
|
+
this.watcher.on('error', (error) => {
|
|
33
|
+
callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
34
|
+
});
|
|
35
|
+
this.watcher.on('ready', () => {
|
|
36
|
+
callbacks.onReady?.();
|
|
37
|
+
});
|
|
32
38
|
}
|
|
33
39
|
debounce(path, fn) {
|
|
34
40
|
this.clearDebounce(path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../src/manager/file-watcher.ts"],"names":[],"mappings":"AAAA,OAAO,QAA4B,MAAM,UAAU,CAAC;AAGpD,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,MAAM,OAAO,WAAW;IACd,OAAO,GAAqB,IAAI,CAAC;IACjC,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;IACnD,UAAU,CAAS;IAE3B,YAAY,aAAqB,mBAAmB;QAClD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,SAA+B;QACpD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE;YACrC,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE;gBAChB,kBAAkB,EAAE,GAAG;gBACvB,YAAY,EAAE,EAAE;aACjB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACzB,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,IAAY,EAAE,EAAc;QAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjC,EAAE,EAAE,CAAC;QACP,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAE5B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../src/manager/file-watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/manager/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Tool } from '@cogitator-ai/types';
|
|
2
2
|
export interface ExtismPlugin {
|
|
3
|
-
call(functionName: string, input: string | Uint8Array): Promise<PluginOutput>;
|
|
3
|
+
call(functionName: string, input: string | Uint8Array): Promise<PluginOutput | null>;
|
|
4
4
|
close?(): Promise<void>;
|
|
5
5
|
}
|
|
6
6
|
export interface PluginOutput {
|
|
@@ -8,9 +8,13 @@ export interface PluginOutput {
|
|
|
8
8
|
bytes(): Uint8Array;
|
|
9
9
|
}
|
|
10
10
|
export type WasmSource = {
|
|
11
|
-
wasm:
|
|
11
|
+
wasm: Array<{
|
|
12
|
+
data: Uint8Array;
|
|
13
|
+
}>;
|
|
12
14
|
} | {
|
|
13
|
-
|
|
15
|
+
wasm: Array<{
|
|
16
|
+
url: string;
|
|
17
|
+
}>;
|
|
14
18
|
};
|
|
15
19
|
export type CreatePluginFn = (source: WasmSource, options: {
|
|
16
20
|
useWasi: boolean;
|
|
@@ -36,5 +40,7 @@ export interface FileWatcherCallbacks {
|
|
|
36
40
|
onAdd: (path: string) => void;
|
|
37
41
|
onChange: (path: string) => void;
|
|
38
42
|
onUnlink: (path: string) => void;
|
|
43
|
+
onError?: (error: Error) => void;
|
|
44
|
+
onReady?: () => void;
|
|
39
45
|
}
|
|
40
46
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACrF,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,MAAM,CAAC;IACf,KAAK,IAAI,UAAU,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAElG,MAAM,MAAM,cAAc,GAAG,CAC3B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,KAC1B,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7B,QAAQ,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-loader.d.ts","sourceRoot":"","sources":["../../src/manager/wasm-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkB,YAAY,EAAc,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"wasm-loader.d.ts","sourceRoot":"","sources":["../../src/manager/wasm-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkB,YAAY,EAAc,MAAM,YAAY,CAAC;AAI3E,qBAAa,UAAU;IACrB,OAAO,CAAC,YAAY,CAAC,CAAiB;IAEhC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;YASvD,UAAU;IAWxB,OAAO,CAAC,eAAe;CAMxB"}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { isAbsolute, resolve } from 'node:path';
|
|
3
|
+
const WASM_MAGIC = [0x00, 0x61, 0x73, 0x6d];
|
|
3
4
|
export class WasmLoader {
|
|
4
5
|
createPlugin;
|
|
5
6
|
async initialize() {
|
|
6
7
|
if (this.createPlugin)
|
|
7
8
|
return;
|
|
8
9
|
const extism = await import('@extism/extism');
|
|
9
|
-
|
|
10
|
+
const factory = extism.createPlugin ?? extism.default;
|
|
11
|
+
if (typeof factory !== 'function') {
|
|
12
|
+
throw new Error('Unable to resolve createPlugin from @extism/extism');
|
|
13
|
+
}
|
|
14
|
+
this.createPlugin = factory;
|
|
10
15
|
}
|
|
11
16
|
async load(wasmPath, useWasi) {
|
|
12
17
|
if (!this.createPlugin) {
|
|
@@ -17,11 +22,18 @@ export class WasmLoader {
|
|
|
17
22
|
}
|
|
18
23
|
async loadSource(wasmPath) {
|
|
19
24
|
if (wasmPath.startsWith('http://') || wasmPath.startsWith('https://')) {
|
|
20
|
-
return { url: wasmPath };
|
|
25
|
+
return { wasm: [{ url: wasmPath }] };
|
|
21
26
|
}
|
|
22
27
|
const absolutePath = isAbsolute(wasmPath) ? wasmPath : resolve(process.cwd(), wasmPath);
|
|
23
28
|
const wasm = await readFile(absolutePath);
|
|
24
|
-
|
|
29
|
+
this.assertWasmMagic(wasm, absolutePath);
|
|
30
|
+
return { wasm: [{ data: wasm }] };
|
|
31
|
+
}
|
|
32
|
+
assertWasmMagic(bytes, path) {
|
|
33
|
+
const valid = bytes.length >= WASM_MAGIC.length && WASM_MAGIC.every((b, i) => bytes[i] === b);
|
|
34
|
+
if (!valid) {
|
|
35
|
+
throw new Error(`Not a valid WASM module (bad magic bytes): ${path}`);
|
|
36
|
+
}
|
|
25
37
|
}
|
|
26
38
|
}
|
|
27
39
|
//# sourceMappingURL=wasm-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-loader.js","sourceRoot":"","sources":["../../src/manager/wasm-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGhD,MAAM,OAAO,UAAU;IACb,YAAY,CAAkB;IAEtC,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9C,
|
|
1
|
+
{"version":3,"file":"wasm-loader.js","sourceRoot":"","sources":["../../src/manager/wasm-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGhD,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE5C,MAAM,OAAO,UAAU;IACb,YAAY,CAAkB;IAEtC,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC;QACtD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,OAAyB,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,OAAgB;QAC3C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,QAAgB;QACvC,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACtE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACvC,CAAC;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QACxF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACpC,CAAC;IAEO,eAAe,CAAC,KAAiB,EAAE,IAAY;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -4,7 +4,9 @@ export declare class WasmToolManager {
|
|
|
4
4
|
private loader;
|
|
5
5
|
private watcher;
|
|
6
6
|
private modules;
|
|
7
|
+
private opQueues;
|
|
7
8
|
private initialized;
|
|
9
|
+
private closed;
|
|
8
10
|
private callbacks;
|
|
9
11
|
private options;
|
|
10
12
|
constructor(options?: WasmToolManagerOptions);
|
|
@@ -16,10 +18,13 @@ export declare class WasmToolManager {
|
|
|
16
18
|
getModules(): LoadedModule[];
|
|
17
19
|
close(): Promise<void>;
|
|
18
20
|
private ensureInitialized;
|
|
21
|
+
private runSerialized;
|
|
19
22
|
private handleAdd;
|
|
20
23
|
private handleReload;
|
|
24
|
+
private loadOrReload;
|
|
21
25
|
private handleUnlink;
|
|
22
26
|
private loadModule;
|
|
27
|
+
private callPlugin;
|
|
23
28
|
private createProxyTool;
|
|
24
29
|
private getModuleName;
|
|
25
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-tool-manager.d.ts","sourceRoot":"","sources":["../../src/manager/wasm-tool-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,qBAAqB,CAAC;AAGzE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"wasm-tool-manager.d.ts","sourceRoot":"","sources":["../../src/manager/wasm-tool-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,qBAAqB,CAAC;AAGzE,OAAO,KAAK,EACV,YAAY,EAEZ,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAQpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,OAAO,CAAmC;gBAEtC,OAAO,GAAE,sBAA2B;IAO1C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBpE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAM7D,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;IAIpC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS;IAIzD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIjD,UAAU,IAAI,YAAY,EAAE;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBd,iBAAiB;IAO/B,OAAO,CAAC,aAAa;YAaP,SAAS;YAKT,YAAY;YAKZ,YAAY;YAUZ,YAAY;YAgBZ,UAAU;IAoCxB,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,eAAe;IA4CvB,OAAO,CAAC,aAAa;CAGtB"}
|
|
@@ -3,11 +3,16 @@ import { z } from 'zod';
|
|
|
3
3
|
import { FileWatcher } from './file-watcher.js';
|
|
4
4
|
import { WasmLoader } from './wasm-loader.js';
|
|
5
5
|
const DEFAULT_DEBOUNCE_MS = 100;
|
|
6
|
+
function toError(value) {
|
|
7
|
+
return value instanceof Error ? value : new Error(String(value));
|
|
8
|
+
}
|
|
6
9
|
export class WasmToolManager {
|
|
7
10
|
loader = new WasmLoader();
|
|
8
11
|
watcher = null;
|
|
9
12
|
modules = new Map();
|
|
13
|
+
opQueues = new Map();
|
|
10
14
|
initialized = false;
|
|
15
|
+
closed = false;
|
|
11
16
|
callbacks = {};
|
|
12
17
|
options;
|
|
13
18
|
constructor(options = {}) {
|
|
@@ -27,11 +32,13 @@ export class WasmToolManager {
|
|
|
27
32
|
onAdd: (path) => void this.handleAdd(path),
|
|
28
33
|
onChange: (path) => void this.handleReload(path),
|
|
29
34
|
onUnlink: (path) => void this.handleUnlink(path),
|
|
35
|
+
onError: (error) => this.callbacks.onError?.('watcher', pattern, error),
|
|
30
36
|
});
|
|
31
37
|
}
|
|
32
38
|
async load(wasmPath) {
|
|
33
39
|
await this.ensureInitialized();
|
|
34
|
-
|
|
40
|
+
const name = this.getModuleName(wasmPath);
|
|
41
|
+
return this.runSerialized(name, () => this.loadModule(wasmPath));
|
|
35
42
|
}
|
|
36
43
|
getTools() {
|
|
37
44
|
return Array.from(this.modules.values()).map((m) => m.tool);
|
|
@@ -46,10 +53,13 @@ export class WasmToolManager {
|
|
|
46
53
|
return Array.from(this.modules.values());
|
|
47
54
|
}
|
|
48
55
|
async close() {
|
|
56
|
+
this.closed = true;
|
|
49
57
|
if (this.watcher) {
|
|
50
58
|
await this.watcher.close();
|
|
51
59
|
this.watcher = null;
|
|
52
60
|
}
|
|
61
|
+
await Promise.all(Array.from(this.opQueues.values()));
|
|
62
|
+
this.opQueues.clear();
|
|
53
63
|
for (const mod of this.modules.values()) {
|
|
54
64
|
await mod.plugin.close?.();
|
|
55
65
|
}
|
|
@@ -61,51 +71,64 @@ export class WasmToolManager {
|
|
|
61
71
|
this.initialized = true;
|
|
62
72
|
}
|
|
63
73
|
}
|
|
74
|
+
runSerialized(name, op) {
|
|
75
|
+
const prev = this.opQueues.get(name) ?? Promise.resolve();
|
|
76
|
+
const result = prev.then(op);
|
|
77
|
+
this.opQueues.set(name, result.then(() => undefined, () => undefined));
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
64
80
|
async handleAdd(wasmPath) {
|
|
65
81
|
const name = this.getModuleName(wasmPath);
|
|
66
|
-
|
|
67
|
-
const existing = this.modules.get(name);
|
|
68
|
-
if (existing) {
|
|
69
|
-
await existing.plugin.close?.();
|
|
70
|
-
}
|
|
71
|
-
await this.loadModule(wasmPath);
|
|
72
|
-
this.callbacks.onLoad?.(name, wasmPath);
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
this.callbacks.onError?.(name, wasmPath, error);
|
|
76
|
-
}
|
|
82
|
+
await this.runSerialized(name, () => this.loadOrReload(wasmPath, 'onLoad'));
|
|
77
83
|
}
|
|
78
84
|
async handleReload(wasmPath) {
|
|
85
|
+
const name = this.getModuleName(wasmPath);
|
|
86
|
+
await this.runSerialized(name, () => this.loadOrReload(wasmPath, 'onReload'));
|
|
87
|
+
}
|
|
88
|
+
async loadOrReload(wasmPath, event) {
|
|
79
89
|
const name = this.getModuleName(wasmPath);
|
|
80
90
|
try {
|
|
81
|
-
const existing = this.modules.get(name);
|
|
82
|
-
if (existing) {
|
|
83
|
-
await existing.plugin.close?.();
|
|
84
|
-
}
|
|
85
91
|
await this.loadModule(wasmPath);
|
|
86
|
-
this.callbacks
|
|
92
|
+
this.callbacks[event]?.(name, wasmPath);
|
|
87
93
|
}
|
|
88
94
|
catch (error) {
|
|
89
|
-
this.callbacks.onError?.(name, wasmPath, error);
|
|
95
|
+
this.callbacks.onError?.(name, wasmPath, toError(error));
|
|
90
96
|
}
|
|
91
97
|
}
|
|
92
98
|
async handleUnlink(wasmPath) {
|
|
93
99
|
const name = this.getModuleName(wasmPath);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
+
await this.runSerialized(name, async () => {
|
|
101
|
+
try {
|
|
102
|
+
const existing = this.modules.get(name);
|
|
103
|
+
if (existing) {
|
|
104
|
+
await existing.plugin.close?.();
|
|
105
|
+
this.modules.delete(name);
|
|
106
|
+
this.callbacks.onUnload?.(name, wasmPath);
|
|
107
|
+
}
|
|
100
108
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
this.callbacks.onError?.(name, wasmPath, toError(error));
|
|
111
|
+
}
|
|
112
|
+
});
|
|
105
113
|
}
|
|
106
114
|
async loadModule(wasmPath) {
|
|
115
|
+
if (this.closed) {
|
|
116
|
+
throw new Error('WasmToolManager is closed');
|
|
117
|
+
}
|
|
107
118
|
const name = this.getModuleName(wasmPath);
|
|
119
|
+
const existing = this.modules.get(name);
|
|
120
|
+
if (existing) {
|
|
121
|
+
if (existing.path !== wasmPath) {
|
|
122
|
+
console.warn(`[wasm-tools] Module name "${name}" collision: ${wasmPath} replaces ${existing.path}`);
|
|
123
|
+
}
|
|
124
|
+
await existing.plugin.close?.();
|
|
125
|
+
this.modules.delete(name);
|
|
126
|
+
}
|
|
108
127
|
const plugin = await this.loader.load(wasmPath, this.options.useWasi);
|
|
128
|
+
if (this.closed) {
|
|
129
|
+
await plugin.close?.();
|
|
130
|
+
throw new Error('WasmToolManager is closed');
|
|
131
|
+
}
|
|
109
132
|
const tool = this.createProxyTool(name);
|
|
110
133
|
this.modules.set(name, {
|
|
111
134
|
name,
|
|
@@ -116,19 +139,38 @@ export class WasmToolManager {
|
|
|
116
139
|
});
|
|
117
140
|
return tool;
|
|
118
141
|
}
|
|
142
|
+
callPlugin(mod, input, signal) {
|
|
143
|
+
if (signal.aborted) {
|
|
144
|
+
return Promise.reject(new Error(`WASM tool ${mod.name} aborted`));
|
|
145
|
+
}
|
|
146
|
+
return new Promise((resolve, reject) => {
|
|
147
|
+
const onAbort = () => reject(new Error(`WASM tool ${mod.name} aborted`));
|
|
148
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
149
|
+
mod.plugin.call('run', input).then((output) => {
|
|
150
|
+
signal.removeEventListener('abort', onAbort);
|
|
151
|
+
resolve(output);
|
|
152
|
+
}, (error) => {
|
|
153
|
+
signal.removeEventListener('abort', onAbort);
|
|
154
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
}
|
|
119
158
|
createProxyTool(name) {
|
|
120
159
|
const parameters = z.record(z.string(), z.unknown());
|
|
121
160
|
const tool = {
|
|
122
161
|
name,
|
|
123
162
|
description: `WASM tool: ${name}`,
|
|
124
163
|
parameters,
|
|
125
|
-
execute: async (params,
|
|
164
|
+
execute: async (params, context) => {
|
|
126
165
|
const mod = this.modules.get(name);
|
|
127
166
|
if (!mod) {
|
|
128
167
|
throw new Error(`Module ${name} not loaded`);
|
|
129
168
|
}
|
|
130
169
|
const input = JSON.stringify(params);
|
|
131
|
-
const output = await
|
|
170
|
+
const output = await this.callPlugin(mod, input, context.signal);
|
|
171
|
+
if (!output) {
|
|
172
|
+
throw new Error(`WASM tool ${name} returned no output`);
|
|
173
|
+
}
|
|
132
174
|
try {
|
|
133
175
|
return JSON.parse(output.text());
|
|
134
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-tool-manager.js","sourceRoot":"","sources":["../../src/manager/wasm-tool-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"wasm-tool-manager.js","sourceRoot":"","sources":["../../src/manager/wasm-tool-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/plugins/base64.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/plugins/base64.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsIH,wBAAgB,MAAM,IAAI,MAAM,CAiC/B"}
|
package/dist/plugins/base64.js
CHANGED
|
@@ -10,14 +10,60 @@
|
|
|
10
10
|
*/
|
|
11
11
|
const STANDARD_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
12
12
|
const URL_SAFE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
|
|
13
|
+
function stringToUtf8Bytes(str) {
|
|
14
|
+
const bytes = [];
|
|
15
|
+
for (let i = 0; i < str.length; i++) {
|
|
16
|
+
let c = str.charCodeAt(i);
|
|
17
|
+
if (c < 0x80) {
|
|
18
|
+
bytes.push(c);
|
|
19
|
+
}
|
|
20
|
+
else if (c < 0x800) {
|
|
21
|
+
bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));
|
|
22
|
+
}
|
|
23
|
+
else if (c >= 0xd800 && c < 0xdc00 && i + 1 < str.length) {
|
|
24
|
+
const c2 = str.charCodeAt(++i);
|
|
25
|
+
c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff);
|
|
26
|
+
bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return bytes;
|
|
33
|
+
}
|
|
34
|
+
function utf8BytesToString(bytes) {
|
|
35
|
+
let result = '';
|
|
36
|
+
let i = 0;
|
|
37
|
+
while (i < bytes.length) {
|
|
38
|
+
const b = bytes[i++];
|
|
39
|
+
if (b < 0x80) {
|
|
40
|
+
result += String.fromCharCode(b);
|
|
41
|
+
}
|
|
42
|
+
else if (b < 0xe0) {
|
|
43
|
+
result += String.fromCharCode(((b & 0x1f) << 6) | (bytes[i++] & 0x3f));
|
|
44
|
+
}
|
|
45
|
+
else if (b < 0xf0) {
|
|
46
|
+
result += String.fromCharCode(((b & 0x0f) << 12) | ((bytes[i++] & 0x3f) << 6) | (bytes[i++] & 0x3f));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const cp = ((b & 0x07) << 18) |
|
|
50
|
+
((bytes[i++] & 0x3f) << 12) |
|
|
51
|
+
((bytes[i++] & 0x3f) << 6) |
|
|
52
|
+
(bytes[i++] & 0x3f);
|
|
53
|
+
result += String.fromCodePoint(cp);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
13
58
|
function encodeBase64(input, urlSafe) {
|
|
14
59
|
const chars = urlSafe ? URL_SAFE_CHARS : STANDARD_CHARS;
|
|
60
|
+
const inputBytes = stringToUtf8Bytes(input);
|
|
15
61
|
let result = '';
|
|
16
62
|
let i = 0;
|
|
17
|
-
while (i <
|
|
18
|
-
const a =
|
|
19
|
-
const b = i <
|
|
20
|
-
const c = i <
|
|
63
|
+
while (i < inputBytes.length) {
|
|
64
|
+
const a = inputBytes[i++];
|
|
65
|
+
const b = i < inputBytes.length ? inputBytes[i++] : 0;
|
|
66
|
+
const c = i < inputBytes.length ? inputBytes[i++] : 0;
|
|
21
67
|
const bitmap = (a << 16) | (b << 8) | c;
|
|
22
68
|
result +=
|
|
23
69
|
chars.charAt((bitmap >> 18) & 63) +
|
|
@@ -25,7 +71,7 @@ function encodeBase64(input, urlSafe) {
|
|
|
25
71
|
chars.charAt((bitmap >> 6) & 63) +
|
|
26
72
|
chars.charAt(bitmap & 63);
|
|
27
73
|
}
|
|
28
|
-
const padding =
|
|
74
|
+
const padding = inputBytes.length % 3;
|
|
29
75
|
if (padding === 1) {
|
|
30
76
|
result = result.slice(0, -2) + (urlSafe ? '' : '==');
|
|
31
77
|
}
|
|
@@ -46,7 +92,7 @@ function decodeBase64(input, urlSafe) {
|
|
|
46
92
|
for (let i = 0; i < chars.length; i++) {
|
|
47
93
|
lookup[chars[i]] = i;
|
|
48
94
|
}
|
|
49
|
-
|
|
95
|
+
const decodedBytes = [];
|
|
50
96
|
let buffer = 0;
|
|
51
97
|
let bits = 0;
|
|
52
98
|
for (const char of normalized) {
|
|
@@ -58,16 +104,19 @@ function decodeBase64(input, urlSafe) {
|
|
|
58
104
|
bits += 6;
|
|
59
105
|
if (bits >= 8) {
|
|
60
106
|
bits -= 8;
|
|
61
|
-
|
|
107
|
+
decodedBytes.push((buffer >> bits) & 0xff);
|
|
62
108
|
}
|
|
63
109
|
}
|
|
64
|
-
return
|
|
110
|
+
return utf8BytesToString(decodedBytes);
|
|
65
111
|
}
|
|
66
112
|
export function base64() {
|
|
67
113
|
try {
|
|
68
114
|
const inputStr = Host.inputString();
|
|
69
115
|
const input = JSON.parse(inputStr);
|
|
70
116
|
const urlSafe = input.urlSafe ?? false;
|
|
117
|
+
if (input.operation !== 'encode' && input.operation !== 'decode') {
|
|
118
|
+
throw new Error(`Unknown operation: ${input.operation}`);
|
|
119
|
+
}
|
|
71
120
|
let result;
|
|
72
121
|
if (input.operation === 'encode') {
|
|
73
122
|
result = encodeBase64(input.text, urlSafe);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/plugins/base64.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,MAAM,cAAc,GAAG,kEAAkE,CAAC;AAC1F,MAAM,cAAc,GAAG,kEAAkE,CAAC;AAE1F,SAAS,
|
|
1
|
+
{"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/plugins/base64.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calc.d.ts","sourceRoot":"","sources":["../../src/plugins/calc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"calc.d.ts","sourceRoot":"","sources":["../../src/plugins/calc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqFH,wBAAgB,SAAS,IAAI,MAAM,CAuBlC"}
|
package/dist/plugins/calc.js
CHANGED
|
@@ -42,6 +42,8 @@ function safeEval(expression) {
|
|
|
42
42
|
left /= right;
|
|
43
43
|
}
|
|
44
44
|
else {
|
|
45
|
+
if (right === 0)
|
|
46
|
+
throw new Error('Modulo by zero');
|
|
45
47
|
left %= right;
|
|
46
48
|
}
|
|
47
49
|
}
|
|
@@ -51,8 +53,9 @@ function safeEval(expression) {
|
|
|
51
53
|
if (tokens[pos] === '(') {
|
|
52
54
|
pos++;
|
|
53
55
|
const val = parseExpr();
|
|
54
|
-
if (tokens[pos]
|
|
55
|
-
|
|
56
|
+
if (tokens[pos] !== ')')
|
|
57
|
+
throw new Error('Missing closing parenthesis');
|
|
58
|
+
pos++;
|
|
56
59
|
return val;
|
|
57
60
|
}
|
|
58
61
|
if (tokens[pos] === '-') {
|
|
@@ -68,7 +71,11 @@ function safeEval(expression) {
|
|
|
68
71
|
throw new Error('Invalid expression');
|
|
69
72
|
return num;
|
|
70
73
|
}
|
|
71
|
-
|
|
74
|
+
const result = parseExpr();
|
|
75
|
+
if (pos < tokens.length) {
|
|
76
|
+
throw new Error(`Unexpected token: ${tokens[pos]}`);
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
72
79
|
}
|
|
73
80
|
export function calculate() {
|
|
74
81
|
try {
|