create examples folder
This commit is contained in:
231
dart_filament/examples/web_wasm/bin/example_web.mjs
Normal file
231
dart_filament/examples/web_wasm/bin/example_web.mjs
Normal file
@@ -0,0 +1,231 @@
|
||||
let buildArgsList;
|
||||
|
||||
// `modulePromise` is a promise to the `WebAssembly.module` object to be
|
||||
// instantiated.
|
||||
// `importObjectPromise` is a promise to an object that contains any additional
|
||||
// imports needed by the module that aren't provided by the standard runtime.
|
||||
// The fields on this object will be merged into the importObject with which
|
||||
// the module will be instantiated.
|
||||
// This function returns a promise to the instantiated module.
|
||||
export const instantiate = async (modulePromise, importObjectPromise) => {
|
||||
let dartInstance;
|
||||
|
||||
function stringFromDartString(string) {
|
||||
const totalLength = dartInstance.exports.$stringLength(string);
|
||||
let result = '';
|
||||
let index = 0;
|
||||
while (index < totalLength) {
|
||||
let chunkLength = Math.min(totalLength - index, 0xFFFF);
|
||||
const array = new Array(chunkLength);
|
||||
for (let i = 0; i < chunkLength; i++) {
|
||||
array[i] = dartInstance.exports.$stringRead(string, index++);
|
||||
}
|
||||
result += String.fromCharCode(...array);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function stringToDartString(string) {
|
||||
const length = string.length;
|
||||
let range = 0;
|
||||
for (let i = 0; i < length; i++) {
|
||||
range |= string.codePointAt(i);
|
||||
}
|
||||
if (range < 256) {
|
||||
const dartString = dartInstance.exports.$stringAllocate1(length);
|
||||
for (let i = 0; i < length; i++) {
|
||||
dartInstance.exports.$stringWrite1(dartString, i, string.codePointAt(i));
|
||||
}
|
||||
return dartString;
|
||||
} else {
|
||||
const dartString = dartInstance.exports.$stringAllocate2(length);
|
||||
for (let i = 0; i < length; i++) {
|
||||
dartInstance.exports.$stringWrite2(dartString, i, string.charCodeAt(i));
|
||||
}
|
||||
return dartString;
|
||||
}
|
||||
}
|
||||
|
||||
// Prints to the console
|
||||
function printToConsole(value) {
|
||||
if (typeof dartPrint == "function") {
|
||||
dartPrint(value);
|
||||
return;
|
||||
}
|
||||
if (typeof console == "object" && typeof console.log != "undefined") {
|
||||
console.log(value);
|
||||
return;
|
||||
}
|
||||
if (typeof print == "function") {
|
||||
print(value);
|
||||
return;
|
||||
}
|
||||
|
||||
throw "Unable to print message: " + js;
|
||||
}
|
||||
|
||||
// Converts a Dart List to a JS array. Any Dart objects will be converted, but
|
||||
// this will be cheap for JSValues.
|
||||
function arrayFromDartList(constructor, list) {
|
||||
const length = dartInstance.exports.$listLength(list);
|
||||
const array = new constructor(length);
|
||||
for (let i = 0; i < length; i++) {
|
||||
array[i] = dartInstance.exports.$listRead(list, i);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
buildArgsList = function(list) {
|
||||
const dartList = dartInstance.exports.$makeStringList();
|
||||
for (let i = 0; i < list.length; i++) {
|
||||
dartInstance.exports.$listAdd(dartList, stringToDartString(list[i]));
|
||||
}
|
||||
return dartList;
|
||||
}
|
||||
|
||||
// A special symbol attached to functions that wrap Dart functions.
|
||||
const jsWrappedDartFunctionSymbol = Symbol("JSWrappedDartFunction");
|
||||
|
||||
function finalizeWrapper(dartFunction, wrapped) {
|
||||
wrapped.dartFunction = dartFunction;
|
||||
wrapped[jsWrappedDartFunctionSymbol] = true;
|
||||
return wrapped;
|
||||
}
|
||||
|
||||
// Imports
|
||||
const dart2wasm = {
|
||||
|
||||
_48: v => stringToDartString(v.toString()),
|
||||
_64: () => {
|
||||
let stackString = new Error().stack.toString();
|
||||
let frames = stackString.split('\n');
|
||||
let drop = 2;
|
||||
if (frames[0] === 'Error') {
|
||||
drop += 1;
|
||||
}
|
||||
return frames.slice(drop).join('\n');
|
||||
},
|
||||
_83: s => stringToDartString(JSON.stringify(stringFromDartString(s))),
|
||||
_84: s => printToConsole(stringFromDartString(s)),
|
||||
_98: (ms, c) =>
|
||||
setTimeout(() => dartInstance.exports.$invokeCallback(c),ms),
|
||||
_102: (c) =>
|
||||
queueMicrotask(() => dartInstance.exports.$invokeCallback(c)),
|
||||
_104: (a, i) => a.push(i),
|
||||
_115: a => a.length,
|
||||
_117: (a, i) => a[i],
|
||||
_118: (a, i, v) => a[i] = v,
|
||||
_120: a => a.join(''),
|
||||
_130: (s, p, i) => s.indexOf(p, i),
|
||||
_133: (o, start, length) => new Uint8Array(o.buffer, o.byteOffset + start, length),
|
||||
_134: (o, start, length) => new Int8Array(o.buffer, o.byteOffset + start, length),
|
||||
_135: (o, start, length) => new Uint8ClampedArray(o.buffer, o.byteOffset + start, length),
|
||||
_136: (o, start, length) => new Uint16Array(o.buffer, o.byteOffset + start, length),
|
||||
_137: (o, start, length) => new Int16Array(o.buffer, o.byteOffset + start, length),
|
||||
_138: (o, start, length) => new Uint32Array(o.buffer, o.byteOffset + start, length),
|
||||
_139: (o, start, length) => new Int32Array(o.buffer, o.byteOffset + start, length),
|
||||
_142: (o, start, length) => new Float32Array(o.buffer, o.byteOffset + start, length),
|
||||
_143: (o, start, length) => new Float64Array(o.buffer, o.byteOffset + start, length),
|
||||
_148: (o) => new DataView(o.buffer, o.byteOffset, o.byteLength),
|
||||
_152: Function.prototype.call.bind(Object.getOwnPropertyDescriptor(DataView.prototype, 'byteLength').get),
|
||||
_153: (b, o) => new DataView(b, o),
|
||||
_155: Function.prototype.call.bind(DataView.prototype.getUint8),
|
||||
_157: Function.prototype.call.bind(DataView.prototype.getInt8),
|
||||
_159: Function.prototype.call.bind(DataView.prototype.getUint16),
|
||||
_161: Function.prototype.call.bind(DataView.prototype.getInt16),
|
||||
_163: Function.prototype.call.bind(DataView.prototype.getUint32),
|
||||
_165: Function.prototype.call.bind(DataView.prototype.getInt32),
|
||||
_171: Function.prototype.call.bind(DataView.prototype.getFloat32),
|
||||
_173: Function.prototype.call.bind(DataView.prototype.getFloat64),
|
||||
_194: o => o === undefined,
|
||||
_195: o => typeof o === 'boolean',
|
||||
_196: o => typeof o === 'number',
|
||||
_198: o => typeof o === 'string',
|
||||
_201: o => o instanceof Int8Array,
|
||||
_202: o => o instanceof Uint8Array,
|
||||
_203: o => o instanceof Uint8ClampedArray,
|
||||
_204: o => o instanceof Int16Array,
|
||||
_205: o => o instanceof Uint16Array,
|
||||
_206: o => o instanceof Int32Array,
|
||||
_207: o => o instanceof Uint32Array,
|
||||
_208: o => o instanceof Float32Array,
|
||||
_209: o => o instanceof Float64Array,
|
||||
_210: o => o instanceof ArrayBuffer,
|
||||
_211: o => o instanceof DataView,
|
||||
_212: o => o instanceof Array,
|
||||
_213: o => typeof o === 'function' && o[jsWrappedDartFunctionSymbol] === true,
|
||||
_217: (l, r) => l === r,
|
||||
_218: o => o,
|
||||
_219: o => o,
|
||||
_220: o => o,
|
||||
_221: b => !!b,
|
||||
_222: o => o.length,
|
||||
_225: (o, i) => o[i],
|
||||
_226: f => f.dartFunction,
|
||||
_227: l => arrayFromDartList(Int8Array, l),
|
||||
_228: l => arrayFromDartList(Uint8Array, l),
|
||||
_229: l => arrayFromDartList(Uint8ClampedArray, l),
|
||||
_230: l => arrayFromDartList(Int16Array, l),
|
||||
_231: l => arrayFromDartList(Uint16Array, l),
|
||||
_232: l => arrayFromDartList(Int32Array, l),
|
||||
_233: l => arrayFromDartList(Uint32Array, l),
|
||||
_234: l => arrayFromDartList(Float32Array, l),
|
||||
_235: l => arrayFromDartList(Float64Array, l),
|
||||
_236: (data, length) => {
|
||||
const view = new DataView(new ArrayBuffer(length));
|
||||
for (let i = 0; i < length; i++) {
|
||||
view.setUint8(i, dartInstance.exports.$byteDataGetUint8(data, i));
|
||||
}
|
||||
return view;
|
||||
},
|
||||
_237: l => arrayFromDartList(Array, l),
|
||||
_238: stringFromDartString,
|
||||
_239: stringToDartString,
|
||||
_242: l => new Array(l),
|
||||
_246: (o, p) => o[p],
|
||||
_250: o => String(o)
|
||||
};
|
||||
|
||||
const baseImports = {
|
||||
dart2wasm: dart2wasm,
|
||||
|
||||
|
||||
Math: Math,
|
||||
Date: Date,
|
||||
Object: Object,
|
||||
Array: Array,
|
||||
Reflect: Reflect,
|
||||
};
|
||||
|
||||
const jsStringPolyfill = {
|
||||
"charCodeAt": (s, i) => s.charCodeAt(i),
|
||||
"compare": (s1, s2) => {
|
||||
if (s1 < s2) return -1;
|
||||
if (s1 > s2) return 1;
|
||||
return 0;
|
||||
},
|
||||
"concat": (s1, s2) => s1 + s2,
|
||||
"equals": (s1, s2) => s1 === s2,
|
||||
"fromCharCode": (i) => String.fromCharCode(i),
|
||||
"length": (s) => s.length,
|
||||
"substring": (s, a, b) => s.substring(a, b),
|
||||
};
|
||||
|
||||
dartInstance = await WebAssembly.instantiate(await modulePromise, {
|
||||
...baseImports,
|
||||
...(await importObjectPromise),
|
||||
"wasm:js-string": jsStringPolyfill,
|
||||
});
|
||||
|
||||
return dartInstance;
|
||||
}
|
||||
|
||||
// Call the main function for the instantiated module
|
||||
// `moduleInstance` is the instantiated dart2wasm module
|
||||
// `args` are any arguments that should be passed into the main function.
|
||||
export const invoke = (moduleInstance, ...args) => {
|
||||
const dartMain = moduleInstance.exports.$getMain();
|
||||
const dartArgs = buildArgsList(args);
|
||||
moduleInstance.exports.$invokeMain(dartMain, dartArgs);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user