From f0fb06bcba1bcd4ef240ed5b2f271939254ef461 Mon Sep 17 00:00:00 2001 From: Artur Koshtei Date: Thu, 24 Apr 2025 22:55:03 +0300 Subject: [PATCH 1/2] binary data support --- build.sh | 3 +++ package-lock.json | 12 +++++++++++- package.json | 3 ++- src/index.ts | 1 + src/luawasm.ts | 4 ++++ src/thread.ts | 20 +++++++++++++++++++- src/type-extensions/uint8Array.ts | 30 ++++++++++++++++++++++++++++++ test/binary.test.js | 31 +++++++++++++++++++++++++++++++ 8 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 src/type-extensions/uint8Array.ts create mode 100644 test/binary.test.js diff --git a/build.sh b/build.sh index 9d54f96..f99baf3 100755 --- a/build.sh +++ b/build.sh @@ -24,6 +24,9 @@ emcc \ 'setValue', \ 'lengthBytesUTF8', \ 'stringToUTF8', \ + 'HEAPU32', \ + 'HEAPU8', \ + 'HEAP8', \ 'stringToNewUTF8' ]" \ -s INCOMING_MODULE_JS_API="[ diff --git a/package-lock.json b/package-lock.json index a9b3163..ab2f1a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "1.16.0", "license": "MIT", "dependencies": { - "@types/emscripten": "1.39.10" + "@types/emscripten": "1.39.10", + "isutf8": "^4.0.1" }, "bin": { "wasmoon": "bin/wasmoon" @@ -2150,6 +2151,15 @@ "dev": true, "license": "ISC" }, + "node_modules/isutf8": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isutf8/-/isutf8-4.0.1.tgz", + "integrity": "sha512-1pk2/2pE+G48eETnp4uOLxQ9WUCxD7oVauYwhFEAGREJPDxEO7iX9qstylrCcx3lNWa1RCS2DxGTxrHdWqS7/w==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", diff --git a/package.json b/package.json index 6ce6e81..3c94917 100755 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "typescript-eslint": "8.18.2" }, "dependencies": { - "@types/emscripten": "1.39.10" + "@types/emscripten": "1.39.10", + "isutf8": "^4.0.1" } } diff --git a/src/index.ts b/src/index.ts index 243c251..27e1edd 100755 --- a/src/index.ts +++ b/src/index.ts @@ -12,4 +12,5 @@ export { default as LuaTypeExtension } from './type-extension' export { decorateFunction } from './type-extensions/function' export { decorateProxy } from './type-extensions/proxy' export { decorateUserdata } from './type-extensions/userdata' +export { Uint8ArrayExtension } from './type-extensions/uint8Array' export * from './types' diff --git a/src/luawasm.ts b/src/luawasm.ts index 98ed2cd..6aa1262 100755 --- a/src/luawasm.ts +++ b/src/luawasm.ts @@ -111,6 +111,7 @@ export default class LuaWasm { public lua_tointegerx: (L: LuaState, idx: number, isnum: number | null) => bigint public lua_toboolean: (L: LuaState, idx: number) => number public lua_tolstring: (L: LuaState, idx: number, len: number | null) => string + public lua_ptr_tolstring: (L: LuaState, idx: number, len: number | null) => number public lua_rawlen: (L: LuaState, idx: number) => number public lua_tocfunction: (L: LuaState, idx: number) => number public lua_touserdata: (L: LuaState, idx: number) => number @@ -123,6 +124,7 @@ export default class LuaWasm { public lua_pushnumber: (L: LuaState, n: number) => void public lua_pushinteger: (L: LuaState, n: bigint) => void public lua_pushlstring: (L: LuaState, s: string | number | null, len: number) => string + public lua_ptr_pushlstring: (L: LuaState, s: string | number | null, len: number) => number public lua_pushstring: (L: LuaState, s: string | number | null) => string public lua_pushcclosure: (L: LuaState, fn: number, n: number) => void public lua_pushboolean: (L: LuaState, b: number) => void @@ -268,6 +270,7 @@ export default class LuaWasm { this.lua_tointegerx = this.cwrap('lua_tointegerx', 'number', ['number', 'number', 'number']) this.lua_toboolean = this.cwrap('lua_toboolean', 'number', ['number', 'number']) this.lua_tolstring = this.cwrap('lua_tolstring', 'string', ['number', 'number', 'number']) + this.lua_ptr_tolstring = this.cwrap('lua_tolstring', 'number', ['number', 'number', 'number']) this.lua_rawlen = this.cwrap('lua_rawlen', 'number', ['number', 'number']) this.lua_tocfunction = this.cwrap('lua_tocfunction', 'number', ['number', 'number']) this.lua_touserdata = this.cwrap('lua_touserdata', 'number', ['number', 'number']) @@ -280,6 +283,7 @@ export default class LuaWasm { this.lua_pushnumber = this.cwrap('lua_pushnumber', null, ['number', 'number']) this.lua_pushinteger = this.cwrap('lua_pushinteger', null, ['number', 'number']) this.lua_pushlstring = this.cwrap('lua_pushlstring', 'string', ['number', 'string|number', 'number']) + this.lua_ptr_pushlstring = this.cwrap('lua_pushlstring', 'string', ['number', 'string|number', 'number']) this.lua_pushstring = this.cwrap('lua_pushstring', 'string', ['number', 'string|number']) this.lua_pushcclosure = this.cwrap('lua_pushcclosure', null, ['number', 'number', 'number']) this.lua_pushboolean = this.cwrap('lua_pushboolean', null, ['number', 'number']) diff --git a/src/thread.ts b/src/thread.ts index f02ee49..18e26c6 100755 --- a/src/thread.ts +++ b/src/thread.ts @@ -3,6 +3,7 @@ import type LuaWasm from './luawasm' import MultiReturn from './multireturn' import { Pointer } from './pointer' import LuaTypeExtension from './type-extension' +import isUtf8 from 'isutf8' import { LUA_MULTRET, LuaEventMasks, @@ -281,7 +282,7 @@ export default class Thread { case LuaType.Number: return this.lua.lua_tonumberx(this.address, index, null) case LuaType.String: - return this.lua.lua_tolstring(this.address, index, null) + return this.readStringPtr(index) case LuaType.Boolean: return Boolean(this.lua.lua_toboolean(this.address, index)) case LuaType.Thread: @@ -413,4 +414,21 @@ export default class Thread { private getValueDecorations(value: any): Decoration { return value instanceof Decoration ? value : new Decoration(value, {}) } + + private readStringPtr(index: number): Uint8Array | string { + const lenPtr = this.lua.module._malloc(PointerSize) + const bufferPtr = this.lua.lua_ptr_tolstring(this.address, index, lenPtr) + const length = this.lua.module.HEAPU32[lenPtr / Uint32Array.BYTES_PER_ELEMENT] + this.lua.module._free(lenPtr) + + const dataView = this.lua.module.HEAPU8.subarray(bufferPtr, bufferPtr + length) + + if (isUtf8(dataView)) { + const decoder = new TextDecoder('utf-8') + const decodedString = decoder.decode(dataView) + return decodedString + } + + return dataView + } } diff --git a/src/type-extensions/uint8Array.ts b/src/type-extensions/uint8Array.ts new file mode 100644 index 0000000..079949c --- /dev/null +++ b/src/type-extensions/uint8Array.ts @@ -0,0 +1,30 @@ +import LuaTypeExtension from '../type-extension' +import Global from '../global' +import Thread from '../thread' +import { Decoration } from '../decoration' + +export class Uint8ArrayExtension extends LuaTypeExtension { + constructor(thread: Global) { + super(thread, 'js_unit8array') + } + + public pushValue(thread: Thread, { target }: Decoration): boolean { + if (target instanceof Uint8Array) { + thread.lua.lua_checkstack(thread.address, 1) + const bufferSize = target.byteLength + const bufferPtr = thread.lua.module._malloc(bufferSize) + + thread.lua.module.HEAP8.set(target, bufferPtr) + thread.lua.lua_pushlstring(thread.address, bufferPtr, bufferSize) + thread.lua.module._free(bufferPtr) + + return true + } + + return false + } + + public close(): void { + // Nothing to do + } +} diff --git a/test/binary.test.js b/test/binary.test.js new file mode 100644 index 0000000..32af756 --- /dev/null +++ b/test/binary.test.js @@ -0,0 +1,31 @@ +import { expect } from 'chai' +import { getEngine } from './utils.js' +import { Uint8ArrayExtension } from '../dist/index.js' + +describe('Binary', () => { + it('passes utf8 buffer correctly', async () => { + const engine = await getEngine() + const b = Buffer.from('мой тёст', 'utf8') + engine.global.registerTypeExtension(100, new Uint8ArrayExtension(engine.global)) + engine.global.set('str', b) + + const res = await engine.doString('return tostring(str == "мой тёст")') + + expect(res).to.be.equal('true') + }) + + it('passes binary data correctly', async () => { + // 1px png image + const img = Buffer.from( + '89504e470d0a1a0a0000000d4948445200000001000000010802000000907753de0000001974455874536f6674776172650041646f626520496d616765526561647971c9653c0000032669545874584d4c3a636f6d2e61646f62652e786d7000000000003c3f787061636b657420626567696e3d22efbbbf222069643d2257354d304d7043656869487a7265537a4e54637a6b633964223f3e203c783a786d706d65746120786d6c6e733a783d2261646f62653a6e733a6d6574612f2220783a786d70746b3d2241646f626520584d5020436f726520352e362d633133382037392e3135393832342c20323031362f30392f31342d30313a30393a30312020202020202020223e203c7264663a52444620786d6c6e733a7264663d22687474703a2f2f7777772e77332e6f72672f313939392f30322f32322d7264662d73796e7461782d6e7323223e203c7264663a4465736372697074696f6e207264663a61626f75743d222220786d6c6e733a786d703d22687474703a2f2f6e732e61646f62652e636f6d2f7861702f312e302f2220786d6c6e733a786d704d4d3d22687474703a2f2f6e732e61646f62652e636f6d2f7861702f312e302f6d6d2f2220786d6c6e733a73745265663d22687474703a2f2f6e732e61646f62652e636f6d2f7861702f312e302f73547970652f5265736f75726365526566232220786d703a43726561746f72546f6f6c3d2241646f62652050686f746f73686f702043432032303137202857696e646f7773292220786d704d4d3a496e7374616e636549443d22786d702e6969643a46323542393237393031313031314538393731334432373436344437393337362220786d704d4d3a446f63756d656e7449443d22786d702e6469643a4632354239323741303131303131453839373133443237343634443739333736223e203c786d704d4d3a4465726976656446726f6d2073745265663a696e7374616e636549443d22786d702e6969643a4632354239323737303131303131453839373133443237343634443739333736222073745265663a646f63756d656e7449443d22786d702e6469643a4632354239323738303131303131453839373133443237343634443739333736222f3e203c2f7264663a4465736372697074696f6e3e203c2f7264663a5244463e203c2f783a786d706d6574613e203c3f787061636b657420656e643d2272223f3e8503272a0000000f4944415478da62faffff3f40800100060603002b8974ad0000000049454e44ae426082', + 'hex', + ) + const engine = await getEngine() + engine.global.registerTypeExtension(100, new Uint8ArrayExtension(engine.global)) + engine.global.set('img', img) + + const res = await engine.doString('return img') + + expect(Buffer.from(res).toString('hex')).to.be.equal(img.toString('hex')) + }) +}) From 34364c465e5a8d919aaae3e194bcc35836441f89 Mon Sep 17 00:00:00 2001 From: Artur Koshtei Date: Thu, 1 May 2025 19:52:24 +0300 Subject: [PATCH 2/2] fix lint issues, remove stale lua func defenition, make backward --- src/engine.ts | 11 ++++++ src/index.ts | 1 - src/luawasm.ts | 2 - src/thread.ts | 23 ----------- src/type-extensions/binary-string.ts | 59 ++++++++++++++++++++++++++++ src/type-extensions/string.ts | 35 +++++++++++++++++ src/type-extensions/uint8Array.ts | 30 -------------- src/types.ts | 2 + test/binary.test.js | 16 +++++--- test/engine.test.js | 10 ++--- 10 files changed, 123 insertions(+), 66 deletions(-) create mode 100644 src/type-extensions/binary-string.ts create mode 100644 src/type-extensions/string.ts delete mode 100644 src/type-extensions/uint8Array.ts diff --git a/src/engine.ts b/src/engine.ts index 59ab415..71bb6f2 100755 --- a/src/engine.ts +++ b/src/engine.ts @@ -9,6 +9,8 @@ import createPromiseType from './type-extensions/promise' import createProxyType from './type-extensions/proxy' import createTableType from './type-extensions/table' import createUserdataType from './type-extensions/userdata' +import createBinaryStringType from './type-extensions/binary-string' +import createStringType from './type-extensions/string' export default class LuaEngine { public global: Global @@ -21,10 +23,19 @@ export default class LuaEngine { enableProxy = true, traceAllocations = false, functionTimeout = undefined as number | undefined, + binaryString = false, }: CreateEngineOptions = {}, ) { this.global = new Global(this.cmodule, traceAllocations) + // This should be high priority since it is a primitive type. + this.global.registerTypeExtension(6, createStringType(this.global)) + + if (binaryString) { + // This should be higher priority since it is an override for primitive type + this.global.registerTypeExtension(7, createBinaryStringType(this.global)) + } + // Generic handlers - These may be required to be registered for additional types. this.global.registerTypeExtension(0, createTableType(this.global)) this.global.registerTypeExtension(0, createFunctionType(this.global, { functionTimeout })) diff --git a/src/index.ts b/src/index.ts index 27e1edd..243c251 100755 --- a/src/index.ts +++ b/src/index.ts @@ -12,5 +12,4 @@ export { default as LuaTypeExtension } from './type-extension' export { decorateFunction } from './type-extensions/function' export { decorateProxy } from './type-extensions/proxy' export { decorateUserdata } from './type-extensions/userdata' -export { Uint8ArrayExtension } from './type-extensions/uint8Array' export * from './types' diff --git a/src/luawasm.ts b/src/luawasm.ts index 6aa1262..a189956 100755 --- a/src/luawasm.ts +++ b/src/luawasm.ts @@ -124,7 +124,6 @@ export default class LuaWasm { public lua_pushnumber: (L: LuaState, n: number) => void public lua_pushinteger: (L: LuaState, n: bigint) => void public lua_pushlstring: (L: LuaState, s: string | number | null, len: number) => string - public lua_ptr_pushlstring: (L: LuaState, s: string | number | null, len: number) => number public lua_pushstring: (L: LuaState, s: string | number | null) => string public lua_pushcclosure: (L: LuaState, fn: number, n: number) => void public lua_pushboolean: (L: LuaState, b: number) => void @@ -283,7 +282,6 @@ export default class LuaWasm { this.lua_pushnumber = this.cwrap('lua_pushnumber', null, ['number', 'number']) this.lua_pushinteger = this.cwrap('lua_pushinteger', null, ['number', 'number']) this.lua_pushlstring = this.cwrap('lua_pushlstring', 'string', ['number', 'string|number', 'number']) - this.lua_ptr_pushlstring = this.cwrap('lua_pushlstring', 'string', ['number', 'string|number', 'number']) this.lua_pushstring = this.cwrap('lua_pushstring', 'string', ['number', 'string|number']) this.lua_pushcclosure = this.cwrap('lua_pushcclosure', null, ['number', 'number', 'number']) this.lua_pushboolean = this.cwrap('lua_pushboolean', null, ['number', 'number']) diff --git a/src/thread.ts b/src/thread.ts index 18e26c6..e0cab3c 100755 --- a/src/thread.ts +++ b/src/thread.ts @@ -3,7 +3,6 @@ import type LuaWasm from './luawasm' import MultiReturn from './multireturn' import { Pointer } from './pointer' import LuaTypeExtension from './type-extension' -import isUtf8 from 'isutf8' import { LUA_MULTRET, LuaEventMasks, @@ -211,9 +210,6 @@ export default class Thread { this.lua.lua_pushnumber(this.address, target) } break - case 'string': - this.lua.lua_pushstring(this.address, target) - break case 'boolean': this.lua.lua_pushboolean(this.address, target ? 1 : 0) break @@ -281,8 +277,6 @@ export default class Thread { return null case LuaType.Number: return this.lua.lua_tonumberx(this.address, index, null) - case LuaType.String: - return this.readStringPtr(index) case LuaType.Boolean: return Boolean(this.lua.lua_toboolean(this.address, index)) case LuaType.Thread: @@ -414,21 +408,4 @@ export default class Thread { private getValueDecorations(value: any): Decoration { return value instanceof Decoration ? value : new Decoration(value, {}) } - - private readStringPtr(index: number): Uint8Array | string { - const lenPtr = this.lua.module._malloc(PointerSize) - const bufferPtr = this.lua.lua_ptr_tolstring(this.address, index, lenPtr) - const length = this.lua.module.HEAPU32[lenPtr / Uint32Array.BYTES_PER_ELEMENT] - this.lua.module._free(lenPtr) - - const dataView = this.lua.module.HEAPU8.subarray(bufferPtr, bufferPtr + length) - - if (isUtf8(dataView)) { - const decoder = new TextDecoder('utf-8') - const decodedString = decoder.decode(dataView) - return decodedString - } - - return dataView - } } diff --git a/src/type-extensions/binary-string.ts b/src/type-extensions/binary-string.ts new file mode 100644 index 0000000..f8ab08a --- /dev/null +++ b/src/type-extensions/binary-string.ts @@ -0,0 +1,59 @@ +import LuaTypeExtension from '../type-extension' +import Global from '../global' +import Thread from '../thread' +import { Decoration } from '../decoration' +import { LuaType, PointerSize } from '../types' +import isUtf8 from 'isutf8' + +type BinaryType = Uint8Array | string + +class BinaryStringExtension extends LuaTypeExtension { + constructor(thread: Global) { + super(thread, 'js_unit8array') + } + + public pushValue(thread: Thread, { target }: Decoration): boolean { + if (target instanceof Uint8Array) { + thread.lua.lua_checkstack(thread.address, 1) + const bufferSize = target.byteLength + const bufferPtr = thread.lua.module._malloc(bufferSize) + + thread.lua.module.HEAP8.set(target, bufferPtr) + thread.lua.lua_pushlstring(thread.address, bufferPtr, bufferSize) + thread.lua.module._free(bufferPtr) + + return true + } + + return false + } + + public isType(_thread: Thread, _index: number, type: LuaType): boolean { + return type === LuaType.String + } + + public getValue(thread: Thread, index: number, _userdata?: unknown): BinaryType { + const lenPtr = thread.lua.module._malloc(PointerSize) + const bufferPtr = thread.lua.lua_ptr_tolstring(thread.address, index, lenPtr) + const length = thread.lua.module.HEAPU32[lenPtr / Uint32Array.BYTES_PER_ELEMENT] + thread.lua.module._free(lenPtr) + + const dataView = thread.lua.module.HEAPU8.subarray(bufferPtr, bufferPtr + length) + + if (isUtf8(dataView)) { + const decoder = new TextDecoder('utf-8') + const decodedString = decoder.decode(dataView) + return decodedString + } + + return dataView + } + + public close(): void { + // Nothing to do + } +} + +export default function createTypeExtension(thread: Global): LuaTypeExtension { + return new BinaryStringExtension(thread) +} diff --git a/src/type-extensions/string.ts b/src/type-extensions/string.ts new file mode 100644 index 0000000..dd2cc2c --- /dev/null +++ b/src/type-extensions/string.ts @@ -0,0 +1,35 @@ +import LuaTypeExtension from '../type-extension' +import Global from '../global' +import { LuaType } from '../types' +import Thread from '../thread' + +class BasicStringExtension extends LuaTypeExtension { + public constructor(thread: Global) { + super(thread, 'js_string') + } + + public pushValue(thread: Thread, { target }: { target: unknown }): boolean { + if (typeof target !== 'string') { + return false + } + + thread.lua.lua_pushstring(thread.address, target) + return true + } + + public isType(_thread: Thread, _index: number, type: number): boolean { + return type === LuaType.String + } + + public getValue(thread: Thread, index: number): string { + return thread.lua.lua_tolstring(thread.address, index, null) + } + + public close(): void { + // Nothing to do + } +} + +export default function createTypeExtension(thread: Global): LuaTypeExtension { + return new BasicStringExtension(thread) +} diff --git a/src/type-extensions/uint8Array.ts b/src/type-extensions/uint8Array.ts deleted file mode 100644 index 079949c..0000000 --- a/src/type-extensions/uint8Array.ts +++ /dev/null @@ -1,30 +0,0 @@ -import LuaTypeExtension from '../type-extension' -import Global from '../global' -import Thread from '../thread' -import { Decoration } from '../decoration' - -export class Uint8ArrayExtension extends LuaTypeExtension { - constructor(thread: Global) { - super(thread, 'js_unit8array') - } - - public pushValue(thread: Thread, { target }: Decoration): boolean { - if (target instanceof Uint8Array) { - thread.lua.lua_checkstack(thread.address, 1) - const bufferSize = target.byteLength - const bufferPtr = thread.lua.module._malloc(bufferSize) - - thread.lua.module.HEAP8.set(target, bufferPtr) - thread.lua.lua_pushlstring(thread.address, bufferPtr, bufferSize) - thread.lua.module._free(bufferPtr) - - return true - } - - return false - } - - public close(): void { - // Nothing to do - } -} diff --git a/src/types.ts b/src/types.ts index 64e89a8..60b866e 100755 --- a/src/types.ts +++ b/src/types.ts @@ -13,6 +13,8 @@ export interface CreateEngineOptions { traceAllocations?: boolean /** Maximum time in milliseconds a Lua function can run before being interrupted. */ functionTimeout?: number + /** Whether to target lua string as binary data in general, not only UTF encoding, and support byte array as input */ + binaryString?: boolean } export enum LuaReturn { diff --git a/test/binary.test.js b/test/binary.test.js index 32af756..424c165 100644 --- a/test/binary.test.js +++ b/test/binary.test.js @@ -1,12 +1,10 @@ import { expect } from 'chai' import { getEngine } from './utils.js' -import { Uint8ArrayExtension } from '../dist/index.js' describe('Binary', () => { it('passes utf8 buffer correctly', async () => { - const engine = await getEngine() + const engine = await getEngine({ binaryString: true }) const b = Buffer.from('мой тёст', 'utf8') - engine.global.registerTypeExtension(100, new Uint8ArrayExtension(engine.global)) engine.global.set('str', b) const res = await engine.doString('return tostring(str == "мой тёст")') @@ -14,14 +12,22 @@ describe('Binary', () => { expect(res).to.be.equal('true') }) + it('passes utf8 string correctly', async () => { + const engine = await getEngine() + engine.global.set('str', 'мой тёст') + + const res = await engine.doString('return tostring(str == "мой тёст")') + + expect(res).to.be.equal('true') + }) + it('passes binary data correctly', async () => { // 1px png image const img = Buffer.from( '89504e470d0a1a0a0000000d4948445200000001000000010802000000907753de0000001974455874536f6674776172650041646f626520496d616765526561647971c9653c0000032669545874584d4c3a636f6d2e61646f62652e786d7000000000003c3f787061636b657420626567696e3d22efbbbf222069643d2257354d304d7043656869487a7265537a4e54637a6b633964223f3e203c783a786d706d65746120786d6c6e733a783d2261646f62653a6e733a6d6574612f2220783a786d70746b3d2241646f626520584d5020436f726520352e362d633133382037392e3135393832342c20323031362f30392f31342d30313a30393a30312020202020202020223e203c7264663a52444620786d6c6e733a7264663d22687474703a2f2f7777772e77332e6f72672f313939392f30322f32322d7264662d73796e7461782d6e7323223e203c7264663a4465736372697074696f6e207264663a61626f75743d222220786d6c6e733a786d703d22687474703a2f2f6e732e61646f62652e636f6d2f7861702f312e302f2220786d6c6e733a786d704d4d3d22687474703a2f2f6e732e61646f62652e636f6d2f7861702f312e302f6d6d2f2220786d6c6e733a73745265663d22687474703a2f2f6e732e61646f62652e636f6d2f7861702f312e302f73547970652f5265736f75726365526566232220786d703a43726561746f72546f6f6c3d2241646f62652050686f746f73686f702043432032303137202857696e646f7773292220786d704d4d3a496e7374616e636549443d22786d702e6969643a46323542393237393031313031314538393731334432373436344437393337362220786d704d4d3a446f63756d656e7449443d22786d702e6469643a4632354239323741303131303131453839373133443237343634443739333736223e203c786d704d4d3a4465726976656446726f6d2073745265663a696e7374616e636549443d22786d702e6969643a4632354239323737303131303131453839373133443237343634443739333736222073745265663a646f63756d656e7449443d22786d702e6469643a4632354239323738303131303131453839373133443237343634443739333736222f3e203c2f7264663a4465736372697074696f6e3e203c2f7264663a5244463e203c2f783a786d706d6574613e203c3f787061636b657420656e643d2272223f3e8503272a0000000f4944415478da62faffff3f40800100060603002b8974ad0000000049454e44ae426082', 'hex', ) - const engine = await getEngine() - engine.global.registerTypeExtension(100, new Uint8ArrayExtension(engine.global)) + const engine = await getEngine({ binaryString: true }) engine.global.set('img', img) const res = await engine.doString('return img') diff --git a/test/engine.test.js b/test/engine.test.js index 23e6361..3a1ab1f 100644 --- a/test/engine.test.js +++ b/test/engine.test.js @@ -806,13 +806,13 @@ describe('Engine', () => { it('lots of doString calls should succeed', async () => { const engine = await getEngine() - const length = 10000; + const length = 10000 for (let i = 0; i < length; i++) { - const a = Math.floor(Math.random() * 100); - const b = Math.floor(Math.random() * 100); - const result = await engine.doString(`return ${a} + ${b};`); - expect(result).to.equal(a + b); + const a = Math.floor(Math.random() * 100) + const b = Math.floor(Math.random() * 100) + const result = await engine.doString(`return ${a} + ${b};`) + expect(result).to.equal(a + b) } }) })