diff options
author | Fabio Alessandrelli <fabio.alessandrelli@gmail.com> | 2020-11-23 12:13:52 +0100 |
---|---|---|
committer | Fabio Alessandrelli <fabio.alessandrelli@gmail.com> | 2020-11-23 12:15:18 +0100 |
commit | 4617a7fa9cea323978f14053ef2726c84e9bd267 (patch) | |
tree | 73ce95b3b77e3e9cffa2c4e4080622abd5936e2a /platform/javascript/js/libs | |
parent | c38984d286419f2d46b80c6d978fea31a0296d46 (diff) |
[HTML5] Run eslint --fix.
Should I write a poem about this whole new world? ;)
Diffstat (limited to 'platform/javascript/js/libs')
-rw-r--r-- | platform/javascript/js/libs/audio.worklet.js | 8 | ||||
-rw-r--r-- | platform/javascript/js/libs/library_godot_audio.js | 116 | ||||
-rw-r--r-- | platform/javascript/js/libs/library_godot_display.js | 169 | ||||
-rw-r--r-- | platform/javascript/js/libs/library_godot_editor_tools.js | 2 | ||||
-rw-r--r-- | platform/javascript/js/libs/library_godot_eval.js | 56 | ||||
-rw-r--r-- | platform/javascript/js/libs/library_godot_http_request.js | 68 | ||||
-rw-r--r-- | platform/javascript/js/libs/library_godot_os.js | 89 | ||||
-rw-r--r-- | platform/javascript/js/libs/library_godot_runtime.js | 30 |
8 files changed, 271 insertions, 267 deletions
diff --git a/platform/javascript/js/libs/audio.worklet.js b/platform/javascript/js/libs/audio.worklet.js index a27035ef22..414dc37097 100644 --- a/platform/javascript/js/libs/audio.worklet.js +++ b/platform/javascript/js/libs/audio.worklet.js @@ -105,7 +105,7 @@ class GodotProcessor extends AudioWorkletProcessor { } parse_message(p_cmd, p_data) { - if (p_cmd === "start" && p_data) { + if (p_cmd === 'start' && p_data) { const state = p_data[0]; let idx = 0; this.lock = state.subarray(idx, ++idx); @@ -114,7 +114,7 @@ class GodotProcessor extends AudioWorkletProcessor { const avail_out = state.subarray(idx, ++idx); this.input = new RingBuffer(p_data[1], avail_in); this.output = new RingBuffer(p_data[2], avail_out); - } else if (p_cmd === "stop") { + } else if (p_cmd === 'stop') { this.runing = false; this.output = null; this.input = null; @@ -143,7 +143,7 @@ class GodotProcessor extends AudioWorkletProcessor { GodotProcessor.write_input(this.input_buffer, input); this.input.write(this.input_buffer); } else { - this.port.postMessage("Input buffer is full! Skipping input frame."); + this.port.postMessage('Input buffer is full! Skipping input frame.'); } } const process_output = GodotProcessor.array_has_data(outputs); @@ -157,7 +157,7 @@ class GodotProcessor extends AudioWorkletProcessor { this.output.read(this.output_buffer); GodotProcessor.write_output(output, this.output_buffer); } else { - this.port.postMessage("Output buffer has not enough frames! Skipping output frame."); + this.port.postMessage('Output buffer has not enough frames! Skipping output frame.'); } } this.process_notify(); diff --git a/platform/javascript/js/libs/library_godot_audio.js b/platform/javascript/js/libs/library_godot_audio.js index a657d0a125..0c1f477f34 100644 --- a/platform/javascript/js/libs/library_godot_audio.js +++ b/platform/javascript/js/libs/library_godot_audio.js @@ -36,32 +36,32 @@ const GodotAudio = { driver: null, interval: 0, - init: function(mix_rate, latency, onstatechange, onlatencyupdate) { + init: function (mix_rate, latency, onstatechange, onlatencyupdate) { const ctx = new (window.AudioContext || window.webkitAudioContext)({ sampleRate: mix_rate, // latencyHint: latency / 1000 // Do not specify, leave 'interactive' for good performance. }); GodotAudio.ctx = ctx; - ctx.onstatechange = function() { + ctx.onstatechange = function () { let state = 0; switch (ctx.state) { - case 'suspended': - state = 0; - break; - case 'running': - state = 1; - break; - case 'closed': - state = 2; - break; + case 'suspended': + state = 0; + break; + case 'running': + state = 1; + break; + case 'closed': + state = 2; + break; // no default } onstatechange(state); - } + }; ctx.onstatechange(); // Immeditately notify state. // Update computed latency - GodotAudio.interval = setInterval(function() { + GodotAudio.interval = setInterval(function () { let computed_latency = 0; if (ctx.baseLatency) { computed_latency += GodotAudio.ctx.baseLatency; @@ -75,29 +75,33 @@ const GodotAudio = { return ctx.destination.channelCount; }, - create_input: function(callback) { + create_input: function (callback) { if (GodotAudio.input) { return; // Already started. } function gotMediaInput(stream) { GodotAudio.input = GodotAudio.ctx.createMediaStreamSource(stream); - callback(GodotAudio.input) + callback(GodotAudio.input); } if (navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserMedia({ - "audio": true - }).then(gotMediaInput, function(e) { GodotRuntime.print(e) }); + 'audio': true, + }).then(gotMediaInput, function (e) { + GodotRuntime.print(e); + }); } else { if (!navigator.getUserMedia) { navigator.getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia; } navigator.getUserMedia({ - "audio": true - }, gotMediaInput, function(e) { GodotRuntime.print(e) }); + 'audio': true, + }, gotMediaInput, function (e) { + GodotRuntime.print(e); + }); } }, - close_async: function(resolve, reject) { + close_async: function (resolve, reject) { const ctx = GodotAudio.ctx; GodotAudio.ctx = null; // Audio was not initialized. @@ -120,14 +124,14 @@ const GodotAudio = { if (GodotAudio.driver) { closed = GodotAudio.driver.close(); } - closed.then(function() { + closed.then(function () { return ctx.close(); - }).then(function() { + }).then(function () { ctx.onstatechange = null; resolve(); - }).catch(function(e) { + }).catch(function (e) { ctx.onstatechange = null; - GodotRuntime.error("Error closing AudioContext", e); + GodotRuntime.error('Error closing AudioContext', e); resolve(); }); }, @@ -141,30 +145,30 @@ const GodotAudio = { return 1; }, - godot_audio_init: function(p_mix_rate, p_latency, p_state_change, p_latency_update) { + godot_audio_init: function (p_mix_rate, p_latency, p_state_change, p_latency_update) { const statechange = GodotRuntime.get_func(p_state_change); const latencyupdate = GodotRuntime.get_func(p_latency_update); return GodotAudio.init(p_mix_rate, p_latency, statechange, latencyupdate); }, - godot_audio_resume: function() { + godot_audio_resume: function () { if (GodotAudio.ctx && GodotAudio.ctx.state !== 'running') { GodotAudio.ctx.resume(); } }, godot_audio_capture_start__proxy: 'sync', - godot_audio_capture_start: function() { + godot_audio_capture_start: function () { if (GodotAudio.input) { return; // Already started. } - GodotAudio.create_input(function(input) { + GodotAudio.create_input(function (input) { input.connect(GodotAudio.driver.get_node()); }); }, godot_audio_capture_stop__proxy: 'sync', - godot_audio_capture_stop: function() { + godot_audio_capture_stop: function () { if (GodotAudio.input) { const tracks = GodotAudio.input['mediaStream']['getTracks'](); for (let i = 0; i < tracks.length; i++) { @@ -176,7 +180,7 @@ const GodotAudio = { }, }; -autoAddDeps(GodotAudio, "$GodotAudio"); +autoAddDeps(GodotAudio, '$GodotAudio'); mergeInto(LibraryManager.library, GodotAudio); /** @@ -188,42 +192,42 @@ const GodotAudioWorklet = { promise: null, worklet: null, - create: function(channels) { + create: function (channels) { const path = GodotConfig.locate_file('godot.audio.worklet.js'); - GodotAudioWorklet.promise = GodotAudio.ctx.audioWorklet.addModule(path).then(function() { + GodotAudioWorklet.promise = GodotAudio.ctx.audioWorklet.addModule(path).then(function () { GodotAudioWorklet.worklet = new AudioWorkletNode( GodotAudio.ctx, 'godot-processor', { - 'outputChannelCount': [channels] - } + 'outputChannelCount': [channels], + }, ); return Promise.resolve(); }); GodotAudio.driver = GodotAudioWorklet; }, - start: function(in_buf, out_buf, state) { - GodotAudioWorklet.promise.then(function() { + start: function (in_buf, out_buf, state) { + GodotAudioWorklet.promise.then(function () { const node = GodotAudioWorklet.worklet; node.connect(GodotAudio.ctx.destination); node.port.postMessage({ 'cmd': 'start', 'data': [state, in_buf, out_buf], }); - node.port.onmessage = function(event) { + node.port.onmessage = function (event) { GodotRuntime.error(event.data); }; }); }, - get_node: function() { + get_node: function () { return GodotAudioWorklet.worklet; }, - close: function() { - return new Promise(function(resolve, reject) { - GodotAudioWorklet.promise.then(function() { + close: function () { + return new Promise(function (resolve, reject) { + GodotAudioWorklet.promise.then(function () { GodotAudioWorklet.worklet.port.postMessage({ 'cmd': 'stop', 'data': null, @@ -237,32 +241,32 @@ const GodotAudioWorklet = { }, }, - godot_audio_worklet_create: function(channels) { + godot_audio_worklet_create: function (channels) { GodotAudioWorklet.create(channels); }, - godot_audio_worklet_start: function(p_in_buf, p_in_size, p_out_buf, p_out_size, p_state) { + godot_audio_worklet_start: function (p_in_buf, p_in_size, p_out_buf, p_out_size, p_state) { const out_buffer = GodotRuntime.heapSub(HEAPF32, p_out_buf, p_out_size); const in_buffer = GodotRuntime.heapSub(HEAPF32, p_in_buf, p_in_size); const state = GodotRuntime.heapSub(HEAP32, p_state, 4); GodotAudioWorklet.start(in_buffer, out_buffer, state); }, - godot_audio_worklet_state_wait: function(p_state, p_idx, p_expected, p_timeout) { + godot_audio_worklet_state_wait: function (p_state, p_idx, p_expected, p_timeout) { Atomics.wait(HEAP32, (p_state >> 2) + p_idx, p_expected, p_timeout); return Atomics.load(HEAP32, (p_state >> 2) + p_idx); }, - godot_audio_worklet_state_add: function(p_state, p_idx, p_value) { + godot_audio_worklet_state_add: function (p_state, p_idx, p_value) { return Atomics.add(HEAP32, (p_state >> 2) + p_idx, p_value); }, - godot_audio_worklet_state_get: function(p_state, p_idx) { + godot_audio_worklet_state_get: function (p_state, p_idx) { return Atomics.load(HEAP32, (p_state >> 2) + p_idx); }, }; -autoAddDeps(GodotAudioWorklet, "$GodotAudioWorklet"); +autoAddDeps(GodotAudioWorklet, '$GodotAudioWorklet'); mergeInto(LibraryManager.library, GodotAudioWorklet); /* @@ -273,14 +277,14 @@ const GodotAudioScript = { $GodotAudioScript: { script: null, - create: function(buffer_length, channel_count) { + create: function (buffer_length, channel_count) { GodotAudioScript.script = GodotAudio.ctx.createScriptProcessor(buffer_length, 2, channel_count); GodotAudio.driver = GodotAudioScript; return GodotAudioScript.script.bufferSize; }, - start: function(p_in_buf, p_in_size, p_out_buf, p_out_size, onprocess) { - GodotAudioScript.script.onaudioprocess = function(event) { + start: function (p_in_buf, p_in_size, p_out_buf, p_out_size, onprocess) { + GodotAudioScript.script.onaudioprocess = function (event) { // Read input const inb = GodotRuntime.heapSub(HEAPF32, p_in_buf, p_in_size); const input = event.inputBuffer; @@ -312,12 +316,12 @@ const GodotAudioScript = { GodotAudioScript.script.connect(GodotAudio.ctx.destination); }, - get_node: function() { + get_node: function () { return GodotAudioScript.script; }, - close: function() { - return new Promise(function(resolve, reject) { + close: function () { + return new Promise(function (resolve, reject) { GodotAudioScript.script.disconnect(); GodotAudioScript.script.onaudioprocess = null; GodotAudioScript.script = null; @@ -326,15 +330,15 @@ const GodotAudioScript = { }, }, - godot_audio_script_create: function(buffer_length, channel_count) { + godot_audio_script_create: function (buffer_length, channel_count) { return GodotAudioScript.create(buffer_length, channel_count); }, - godot_audio_script_start: function(p_in_buf, p_in_size, p_out_buf, p_out_size, p_cb) { + godot_audio_script_start: function (p_in_buf, p_in_size, p_out_buf, p_out_size, p_cb) { const onprocess = GodotRuntime.get_func(p_cb); GodotAudioScript.start(p_in_buf, p_in_size, p_out_buf, p_out_size, onprocess); }, }; -autoAddDeps(GodotAudioScript, "$GodotAudioScript"); +autoAddDeps(GodotAudioScript, '$GodotAudioScript'); mergeInto(LibraryManager.library, GodotAudioScript); diff --git a/platform/javascript/js/libs/library_godot_display.js b/platform/javascript/js/libs/library_godot_display.js index 28f63ba557..9651b48952 100644 --- a/platform/javascript/js/libs/library_godot_display.js +++ b/platform/javascript/js/libs/library_godot_display.js @@ -38,13 +38,13 @@ const GodotDisplayListeners = { $GodotDisplayListeners: { handlers: [], - has: function(target, event, method, capture) { - return GodotDisplayListeners.handlers.findIndex(function(e) { + has: function (target, event, method, capture) { + return GodotDisplayListeners.handlers.findIndex(function (e) { return e.target === target && e.event === event && e.method === method && e.capture === capture; }) !== -1; }, - add: function(target, event, method, capture) { + add: function (target, event, method, capture) { if (GodotDisplayListeners.has(target, event, method, capture)) { return; } @@ -53,13 +53,13 @@ const GodotDisplayListeners = { this.event = p_event; this.method = p_method; this.capture = p_capture; - }; + } GodotDisplayListeners.handlers.push(new Handler(target, event, method, capture)); target.addEventListener(event, method, capture); }, - clear: function() { - GodotDisplayListeners.handlers.forEach(function(h) { + clear: function () { + GodotDisplayListeners.handlers.forEach(function (h) { h.target.removeEventListener(h.event, h.method, h.capture); }); GodotDisplayListeners.handlers.length = 0; @@ -84,20 +84,20 @@ const GodotDisplayDragDrop = { promises: [], pending_files: [], - add_entry: function(entry) { + add_entry: function (entry) { if (entry.isDirectory) { GodotDisplayDragDrop.add_dir(entry); } else if (entry.isFile) { GodotDisplayDragDrop.add_file(entry); } else { - GodotRuntime.error("Unrecognized entry...", entry); + GodotRuntime.error('Unrecognized entry...', entry); } }, - add_dir: function(entry) { - GodotDisplayDragDrop.promises.push(new Promise(function(resolve, reject) { + add_dir: function (entry) { + GodotDisplayDragDrop.promises.push(new Promise(function (resolve, reject) { const reader = entry.createReader(); - reader.readEntries(function(entries) { + reader.readEntries(function (entries) { for (let i = 0; i < entries.length; i++) { GodotDisplayDragDrop.add_entry(entries[i]); } @@ -106,58 +106,58 @@ const GodotDisplayDragDrop = { })); }, - add_file: function(entry) { - GodotDisplayDragDrop.promises.push(new Promise(function(resolve, reject) { - entry.file(function(file) { + add_file: function (entry) { + GodotDisplayDragDrop.promises.push(new Promise(function (resolve, reject) { + entry.file(function (file) { const reader = new FileReader(); - reader.onload = function() { + reader.onload = function () { const f = { - "path": file.relativePath || file.webkitRelativePath, - "name": file.name, - "type": file.type, - "size": file.size, - "data": reader.result + 'path': file.relativePath || file.webkitRelativePath, + 'name': file.name, + 'type': file.type, + 'size': file.size, + 'data': reader.result, }; if (!f['path']) { f['path'] = f['name']; } GodotDisplayDragDrop.pending_files.push(f); - resolve() + resolve(); }; - reader.onerror = function() { - GodotRuntime.print("Error reading file"); + reader.onerror = function () { + GodotRuntime.print('Error reading file'); reject(); - } + }; reader.readAsArrayBuffer(file); - }, function(err) { - GodotRuntime.print("Error!"); + }, function (err) { + GodotRuntime.print('Error!'); reject(); }); })); }, - process: function(resolve, reject) { + process: function (resolve, reject) { if (GodotDisplayDragDrop.promises.length === 0) { resolve(); return; } - GodotDisplayDragDrop.promises.pop().then(function() { - setTimeout(function() { + GodotDisplayDragDrop.promises.pop().then(function () { + setTimeout(function () { GodotDisplayDragDrop.process(resolve, reject); }, 0); }); }, - _process_event: function(ev, callback) { + _process_event: function (ev, callback) { ev.preventDefault(); if (ev.dataTransfer.items) { // Use DataTransferItemList interface to access the file(s) for (let i = 0; i < ev.dataTransfer.items.length; i++) { const item = ev.dataTransfer.items[i]; let entry = null; - if ("getAsEntry" in item) { + if ('getAsEntry' in item) { entry = item.getAsEntry(); - } else if ("webkitGetAsEntry" in item) { + } else if ('webkitGetAsEntry' in item) { entry = item.webkitGetAsEntry(); } if (entry) { @@ -165,24 +165,24 @@ const GodotDisplayDragDrop = { } } } else { - GodotRuntime.error("File upload not supported"); + GodotRuntime.error('File upload not supported'); } - new Promise(GodotDisplayDragDrop.process).then(function() { - const DROP = "/tmp/drop-" + parseInt(Math.random() * (1 << 30), 10) + "/"; + new Promise(GodotDisplayDragDrop.process).then(function () { + const DROP = `/tmp/drop-${parseInt(Math.random() * (1 << 30), 10)}/`; const drops = []; const files = []; FS.mkdir(DROP); GodotDisplayDragDrop.pending_files.forEach((elem) => { const path = elem['path']; GodotFS.copy_to_fs(DROP + path, elem['data']); - let idx = path.indexOf("/"); + let idx = path.indexOf('/'); if (idx === -1) { // Root file drops.push(DROP + path); } else { // Subdir const sub = path.substr(0, idx); - idx = sub.indexOf("/"); + idx = sub.indexOf('/'); if (idx < 0 && drops.indexOf(DROP + sub) === -1) { drops.push(DROP + sub); } @@ -192,37 +192,38 @@ const GodotDisplayDragDrop = { GodotDisplayDragDrop.promises = []; GodotDisplayDragDrop.pending_files = []; callback(drops); - const dirs = [DROP.substr(0, DROP.length -1)]; + const dirs = [DROP.substr(0, DROP.length - 1)]; // Remove temporary files files.forEach(function (file) { FS.unlink(file); - let dir = file.replace(DROP, ""); - let idx = dir.lastIndexOf("/"); + let dir = file.replace(DROP, ''); + let idx = dir.lastIndexOf('/'); while (idx > 0) { dir = dir.substr(0, idx); if (dirs.indexOf(DROP + dir) === -1) { dirs.push(DROP + dir); } - idx = dir.lastIndexOf("/"); + idx = dir.lastIndexOf('/'); } }); // Remove dirs. - dirs.sort(function(a, b) { + dirs.sort(function (a, b) { const al = (a.match(/\//g) || []).length; const bl = (b.match(/\//g) || []).length; - if (al > bl) + if (al > bl) { return -1; - else if (al < bl) + } else if (al < bl) { return 1; + } return 0; - }).forEach(function(dir) { + }).forEach(function (dir) { FS.rmdir(dir); }); }); }, - handler: function(callback) { - return function(ev) { + handler: function (callback) { + return function (ev) { GodotDisplayDragDrop._process_event(ev, callback); }; }, @@ -241,25 +242,25 @@ const GodotDisplayCursor = { shape: 'auto', visible: true, cursors: {}, - set_style: function(style) { + set_style: function (style) { GodotConfig.canvas.style.cursor = style; }, - set_shape: function(shape) { + set_shape: function (shape) { GodotDisplayCursor.shape = shape; let css = shape; if (shape in GodotDisplayCursor.cursors) { const c = GodotDisplayCursor.cursors[shape]; - css = 'url("' + c.url + '") ' + c.x + ' ' + c.y + ', auto'; + css = `url("${c.url}") ${c.x} ${c.y}, auto`; } if (GodotDisplayCursor.visible) { GodotDisplayCursor.set_style(css); } }, - clear: function() { + clear: function () { GodotDisplayCursor.set_style(''); GodotDisplayCursor.shape = 'auto'; GodotDisplayCursor.visible = true; - Object.keys(GodotDisplayCursor.cursors).forEach(function(key) { + Object.keys(GodotDisplayCursor.cursors).forEach(function (key) { URL.revokeObjectURL(GodotDisplayCursor.cursors[key]); delete GodotDisplayCursor.cursors[key]; }); @@ -279,35 +280,35 @@ const GodotDisplay = { window_icon: '', }, - godot_js_display_is_swap_ok_cancel: function() { + godot_js_display_is_swap_ok_cancel: function () { const win = (['Windows', 'Win64', 'Win32', 'WinCE']); - const plat = navigator.platform || ""; + const plat = navigator.platform || ''; if (win.indexOf(plat) !== -1) { return 1; } return 0; }, - godot_js_display_alert: function(p_text) { + godot_js_display_alert: function (p_text) { window.alert(GodotRuntime.parseString(p_text)); // eslint-disable-line no-alert }, - godot_js_display_pixel_ratio_get: function() { + godot_js_display_pixel_ratio_get: function () { return window.devicePixelRatio || 1; }, /* * Canvas */ - godot_js_display_canvas_focus: function() { + godot_js_display_canvas_focus: function () { GodotConfig.canvas.focus(); }, - godot_js_display_canvas_is_focused: function() { + godot_js_display_canvas_is_focused: function () { return document.activeElement === GodotConfig.canvas; }, - godot_js_display_canvas_bounding_rect_position_get: function(r_x, r_y) { + godot_js_display_canvas_bounding_rect_position_get: function (r_x, r_y) { const brect = GodotConfig.canvas.getBoundingClientRect(); GodotRuntime.setHeapValue(r_x, brect.x, 'i32'); GodotRuntime.setHeapValue(r_y, brect.y, 'i32'); @@ -316,26 +317,26 @@ const GodotDisplay = { /* * Touchscreen */ - godot_js_display_touchscreen_is_available: function() { + godot_js_display_touchscreen_is_available: function () { return 'ontouchstart' in window; }, /* * Clipboard */ - godot_js_display_clipboard_set: function(p_text) { + godot_js_display_clipboard_set: function (p_text) { const text = GodotRuntime.parseString(p_text); if (!navigator.clipboard || !navigator.clipboard.writeText) { return 1; } - navigator.clipboard.writeText(text).catch(function(e) { + navigator.clipboard.writeText(text).catch(function (e) { // Setting OS clipboard is only possible from an input callback. - GodotRuntime.error("Setting OS clipboard is only possible from an input callback for the HTML5 plafrom. Exception:", e); + GodotRuntime.error('Setting OS clipboard is only possible from an input callback for the HTML5 plafrom. Exception:', e); }); return 0; }, - godot_js_display_clipboard_get: function(callback) { + godot_js_display_clipboard_get: function (callback) { const func = GodotRuntime.get_func(callback); try { navigator.clipboard.readText().then(function (result) { @@ -353,19 +354,19 @@ const GodotDisplay = { /* * Window */ - godot_js_display_window_request_fullscreen: function() { + godot_js_display_window_request_fullscreen: function () { const canvas = GodotConfig.canvas; - (canvas.requestFullscreen || canvas.msRequestFullscreen || - canvas.mozRequestFullScreen || canvas.mozRequestFullscreen || - canvas.webkitRequestFullscreen + (canvas.requestFullscreen || canvas.msRequestFullscreen + || canvas.mozRequestFullScreen || canvas.mozRequestFullscreen + || canvas.webkitRequestFullscreen ).call(canvas); }, - godot_js_display_window_title_set: function(p_data) { + godot_js_display_window_title_set: function (p_data) { document.title = GodotRuntime.parseString(p_data); }, - godot_js_display_window_icon_set: function(p_ptr, p_len) { + godot_js_display_window_icon_set: function (p_ptr, p_len) { let link = document.getElementById('-gd-engine-icon'); if (link === null) { link = document.createElement('link'); @@ -374,7 +375,7 @@ const GodotDisplay = { document.head.appendChild(link); } const old_icon = GodotDisplay.window_icon; - const png = new Blob([GodotRuntime.heapCopy(HEAPU8, p_ptr, p_len)], { type: "image/png" }); + const png = new Blob([GodotRuntime.heapCopy(HEAPU8, p_ptr, p_len)], { type: 'image/png' }); GodotDisplay.window_icon = URL.createObjectURL(png); link.href = GodotDisplay.window_icon; if (old_icon) { @@ -385,7 +386,7 @@ const GodotDisplay = { /* * Cursor */ - godot_js_display_cursor_set_visible: function(p_visible) { + godot_js_display_cursor_set_visible: function (p_visible) { const visible = p_visible !== 0; if (visible === GodotDisplayCursor.visible) { return; @@ -398,15 +399,15 @@ const GodotDisplay = { } }, - godot_js_display_cursor_is_hidden: function() { + godot_js_display_cursor_is_hidden: function () { return !GodotDisplayCursor.visible; }, - godot_js_display_cursor_set_shape: function(p_string) { + godot_js_display_cursor_set_shape: function (p_string) { GodotDisplayCursor.set_shape(GodotRuntime.parseString(p_string)); }, - godot_js_display_cursor_set_custom_shape: function(p_shape, p_ptr, p_len, p_hotspot_x, p_hotspot_y) { + godot_js_display_cursor_set_custom_shape: function (p_shape, p_ptr, p_len, p_hotspot_x, p_hotspot_y) { const shape = GodotRuntime.parseString(p_shape); const old_shape = GodotDisplayCursor.cursors[shape]; if (p_len > 0) { @@ -431,20 +432,20 @@ const GodotDisplay = { /* * Listeners */ - godot_js_display_notification_cb: function(callback, p_enter, p_exit, p_in, p_out) { + godot_js_display_notification_cb: function (callback, p_enter, p_exit, p_in, p_out) { const canvas = GodotConfig.canvas; const func = GodotRuntime.get_func(callback); const notif = [p_enter, p_exit, p_in, p_out]; - ['mouseover', 'mouseleave', 'focus', 'blur'].forEach(function(evt_name, idx) { - GodotDisplayListeners.add(canvas, evt_name, function() { + ['mouseover', 'mouseleave', 'focus', 'blur'].forEach(function (evt_name, idx) { + GodotDisplayListeners.add(canvas, evt_name, function () { func.bind(null, notif[idx]); }, true); }); }, - godot_js_display_paste_cb: function(callback) { + godot_js_display_paste_cb: function (callback) { const func = GodotRuntime.get_func(callback); - GodotDisplayListeners.add(window, 'paste', function(evt) { + GodotDisplayListeners.add(window, 'paste', function (evt) { const text = evt.clipboardData.getData('text'); const ptr = GodotRuntime.allocString(text); func(ptr); @@ -452,9 +453,9 @@ const GodotDisplay = { }, false); }, - godot_js_display_drop_files_cb: function(callback) { - const func = GodotRuntime.get_func(callback) - const dropFiles = function(files) { + godot_js_display_drop_files_cb: function (callback) { + const func = GodotRuntime.get_func(callback); + const dropFiles = function (files) { const args = files || []; if (!args.length) { return; @@ -465,7 +466,7 @@ const GodotDisplay = { GodotRuntime.freeStringArray(argv, argc); }; const canvas = GodotConfig.canvas; - GodotDisplayListeners.add(canvas, 'dragover', function(ev) { + GodotDisplayListeners.add(canvas, 'dragover', function (ev) { // Prevent default behavior (which would try to open the file(s)) ev.preventDefault(); }, false); diff --git a/platform/javascript/js/libs/library_godot_editor_tools.js b/platform/javascript/js/libs/library_godot_editor_tools.js index 21e40185ae..f39fed04a8 100644 --- a/platform/javascript/js/libs/library_godot_editor_tools.js +++ b/platform/javascript/js/libs/library_godot_editor_tools.js @@ -30,7 +30,7 @@ const GodotEditorTools = { godot_js_editor_download_file__deps: ['$FS'], - godot_js_editor_download_file: function(p_path, p_name, p_mime) { + godot_js_editor_download_file: function (p_path, p_name, p_mime) { const path = GodotRuntime.parseString(p_path); const name = GodotRuntime.parseString(p_name); const mime = GodotRuntime.parseString(p_mime); diff --git a/platform/javascript/js/libs/library_godot_eval.js b/platform/javascript/js/libs/library_godot_eval.js index 4064938d3e..33ff231726 100644 --- a/platform/javascript/js/libs/library_godot_eval.js +++ b/platform/javascript/js/libs/library_godot_eval.js @@ -30,7 +30,7 @@ const GodotEval = { godot_js_eval__deps: ['$GodotRuntime'], - godot_js_eval: function(p_js, p_use_global_ctx, p_union_ptr, p_byte_arr, p_byte_arr_write, p_callback) { + godot_js_eval: function (p_js, p_use_global_ctx, p_union_ptr, p_byte_arr, p_byte_arr_write, p_callback) { const js_code = GodotRuntime.parseString(p_js); let eval_ret = null; try { @@ -46,42 +46,40 @@ const GodotEval = { } switch (typeof eval_ret) { + case 'boolean': + GodotRuntime.setHeapValue(p_union_ptr, eval_ret, 'i32'); + return 1; // BOOL - case 'boolean': - GodotRuntime.setHeapValue(p_union_ptr, eval_ret, 'i32'); - return 1; // BOOL + case 'number': + GodotRuntime.setHeapValue(p_union_ptr, eval_ret, 'double'); + return 3; // REAL - case 'number': - GodotRuntime.setHeapValue(p_union_ptr, eval_ret, 'double'); - return 3; // REAL + case 'string': + GodotRuntime.setHeapValue(p_union_ptr, GodotRuntime.allocString(eval_ret), '*'); + return 4; // STRING - case 'string': - GodotRuntime.setHeapValue(p_union_ptr, GodotRuntime.allocString(eval_ret), '*'); - return 4; // STRING - - case 'object': - if (eval_ret === null) { - break; - } - - if (ArrayBuffer.isView(eval_ret) && !(eval_ret instanceof Uint8Array)) { - eval_ret = new Uint8Array(eval_ret.buffer); - } - else if (eval_ret instanceof ArrayBuffer) { - eval_ret = new Uint8Array(eval_ret); - } - if (eval_ret instanceof Uint8Array) { - const func = GodotRuntime.get_func(p_callback); - const bytes_ptr = func(p_byte_arr, p_byte_arr_write, eval_ret.length); - HEAPU8.set(eval_ret, bytes_ptr); - return 20; // POOL_BYTE_ARRAY - } + case 'object': + if (eval_ret === null) { break; + } + + if (ArrayBuffer.isView(eval_ret) && !(eval_ret instanceof Uint8Array)) { + eval_ret = new Uint8Array(eval_ret.buffer); + } else if (eval_ret instanceof ArrayBuffer) { + eval_ret = new Uint8Array(eval_ret); + } + if (eval_ret instanceof Uint8Array) { + const func = GodotRuntime.get_func(p_callback); + const bytes_ptr = func(p_byte_arr, p_byte_arr_write, eval_ret.length); + HEAPU8.set(eval_ret, bytes_ptr); + return 20; // POOL_BYTE_ARRAY + } + break; // no default } return 0; // NIL }, -} +}; mergeInto(LibraryManager.library, GodotEval); diff --git a/platform/javascript/js/libs/library_godot_http_request.js b/platform/javascript/js/libs/library_godot_http_request.js index 6f80f3b958..2b9aa88208 100644 --- a/platform/javascript/js/libs/library_godot_http_request.js +++ b/platform/javascript/js/libs/library_godot_http_request.js @@ -33,111 +33,113 @@ const GodotHTTPRequest = { $GodotHTTPRequest: { requests: [], - getUnusedRequestId: function() { - var idMax = GodotHTTPRequest.requests.length; - for (var potentialId = 0; potentialId < idMax; ++potentialId) { + getUnusedRequestId: function () { + const idMax = GodotHTTPRequest.requests.length; + for (let potentialId = 0; potentialId < idMax; ++potentialId) { if (GodotHTTPRequest.requests[potentialId] instanceof XMLHttpRequest) { continue; } return potentialId; } - GodotHTTPRequest.requests.push(null) + GodotHTTPRequest.requests.push(null); return idMax; }, - setupRequest: function(xhr) { + setupRequest: function (xhr) { xhr.responseType = 'arraybuffer'; }, }, - godot_xhr_new: function() { - var newId = GodotHTTPRequest.getUnusedRequestId(); - GodotHTTPRequest.requests[newId] = new XMLHttpRequest; + godot_xhr_new: function () { + const newId = GodotHTTPRequest.getUnusedRequestId(); + GodotHTTPRequest.requests[newId] = new XMLHttpRequest(); GodotHTTPRequest.setupRequest(GodotHTTPRequest.requests[newId]); return newId; }, - godot_xhr_reset: function(xhrId) { - GodotHTTPRequest.requests[xhrId] = new XMLHttpRequest; + godot_xhr_reset: function (xhrId) { + GodotHTTPRequest.requests[xhrId] = new XMLHttpRequest(); GodotHTTPRequest.setupRequest(GodotHTTPRequest.requests[xhrId]); }, - godot_xhr_free: function(xhrId) { + godot_xhr_free: function (xhrId) { GodotHTTPRequest.requests[xhrId].abort(); GodotHTTPRequest.requests[xhrId] = null; }, - godot_xhr_open: function(xhrId, method, url, p_user, p_password) { + godot_xhr_open: function (xhrId, method, url, p_user, p_password) { const user = p_user > 0 ? GodotRuntime.parseString(p_user) : null; const password = p_password > 0 ? GodotRuntime.parseString(p_password) : null; GodotHTTPRequest.requests[xhrId].open(GodotRuntime.parseString(method), GodotRuntime.parseString(url), true, user, password); }, - godot_xhr_set_request_header: function(xhrId, header, value) { + godot_xhr_set_request_header: function (xhrId, header, value) { GodotHTTPRequest.requests[xhrId].setRequestHeader(GodotRuntime.parseString(header), GodotRuntime.parseString(value)); }, - godot_xhr_send_null: function(xhrId) { + godot_xhr_send_null: function (xhrId) { GodotHTTPRequest.requests[xhrId].send(); }, - godot_xhr_send_string: function(xhrId, strPtr) { + godot_xhr_send_string: function (xhrId, strPtr) { if (!strPtr) { - GodotRuntime.error("Failed to send string per XHR: null pointer"); + GodotRuntime.error('Failed to send string per XHR: null pointer'); return; } GodotHTTPRequest.requests[xhrId].send(GodotRuntime.parseString(strPtr)); }, - godot_xhr_send_data: function(xhrId, ptr, len) { + godot_xhr_send_data: function (xhrId, ptr, len) { if (!ptr) { - GodotRuntime.error("Failed to send data per XHR: null pointer"); + GodotRuntime.error('Failed to send data per XHR: null pointer'); return; } if (len < 0) { - GodotRuntime.error("Failed to send data per XHR: buffer length less than 0"); + GodotRuntime.error('Failed to send data per XHR: buffer length less than 0'); return; } GodotHTTPRequest.requests[xhrId].send(HEAPU8.subarray(ptr, ptr + len)); }, - godot_xhr_abort: function(xhrId) { + godot_xhr_abort: function (xhrId) { GodotHTTPRequest.requests[xhrId].abort(); }, - godot_xhr_get_status: function(xhrId) { + godot_xhr_get_status: function (xhrId) { return GodotHTTPRequest.requests[xhrId].status; }, - godot_xhr_get_ready_state: function(xhrId) { + godot_xhr_get_ready_state: function (xhrId) { return GodotHTTPRequest.requests[xhrId].readyState; }, - godot_xhr_get_response_headers_length: function(xhrId) { - var headers = GodotHTTPRequest.requests[xhrId].getAllResponseHeaders(); + godot_xhr_get_response_headers_length: function (xhrId) { + const headers = GodotHTTPRequest.requests[xhrId].getAllResponseHeaders(); return headers === null ? 0 : GodotRuntime.strlen(headers); }, - godot_xhr_get_response_headers: function(xhrId, dst, len) { - var str = GodotHTTPRequest.requests[xhrId].getAllResponseHeaders(); - if (str === null) + godot_xhr_get_response_headers: function (xhrId, dst, len) { + const str = GodotHTTPRequest.requests[xhrId].getAllResponseHeaders(); + if (str === null) { return; + } GodotRuntime.stringToHeap(str, dst, len); }, - godot_xhr_get_response_length: function(xhrId) { - var body = GodotHTTPRequest.requests[xhrId].response; + godot_xhr_get_response_length: function (xhrId) { + const body = GodotHTTPRequest.requests[xhrId].response; return body === null ? 0 : body.byteLength; }, - godot_xhr_get_response: function(xhrId, dst, len) { - var buf = GodotHTTPRequest.requests[xhrId].response; - if (buf === null) + godot_xhr_get_response: function (xhrId, dst, len) { + let buf = GodotHTTPRequest.requests[xhrId].response; + if (buf === null) { return; + } buf = new Uint8Array(buf).subarray(0, len); HEAPU8.set(buf, dst); }, }; -autoAddDeps(GodotHTTPRequest, "$GodotHTTPRequest"); +autoAddDeps(GodotHTTPRequest, '$GodotHTTPRequest'); mergeInto(LibraryManager.library, GodotHTTPRequest); diff --git a/platform/javascript/js/libs/library_godot_os.js b/platform/javascript/js/libs/library_godot_os.js index 582f04cb1b..488753d704 100644 --- a/platform/javascript/js/libs/library_godot_os.js +++ b/platform/javascript/js/libs/library_godot_os.js @@ -33,23 +33,23 @@ const IDHandler = { _last_id: 0, _references: {}, - get: function(p_id) { + get: function (p_id) { return IDHandler._references[p_id]; }, - add: function(p_data) { + add: function (p_data) { const id = ++IDHandler._last_id; IDHandler._references[id] = p_data; return id; }, - remove: function(p_id) { + remove: function (p_id) { delete IDHandler._references[p_id]; }, }, }; -autoAddDeps(IDHandler, "$IDHandler"); +autoAddDeps(IDHandler, '$IDHandler'); mergeInto(LibraryManager.library, IDHandler); const GodotConfig = { @@ -57,12 +57,12 @@ const GodotConfig = { $GodotConfig__deps: ['$GodotRuntime'], $GodotConfig: { canvas: null, - locale: "en", + locale: 'en', resize_on_start: false, on_execute: null, - init_config: function(p_opts) { - GodotConfig.resize_on_start = p_opts['resizeCanvasOnStart'] ? true : false; + init_config: function (p_opts) { + GodotConfig.resize_on_start = !!p_opts['resizeCanvasOnStart']; GodotConfig.canvas = p_opts['canvas']; GodotConfig.locale = p_opts['locale'] || GodotConfig.locale; GodotConfig.on_execute = p_opts['onExecute']; @@ -70,20 +70,20 @@ const GodotConfig = { Module['onExit'] = p_opts['onExit']; // eslint-disable-line no-undef }, - locate_file: function(file) { - return Module["locateFile"](file); // eslint-disable-line no-undef + locate_file: function (file) { + return Module['locateFile'](file); // eslint-disable-line no-undef }, }, - godot_js_config_canvas_id_get: function(p_ptr, p_ptr_max) { - GodotRuntime.stringToHeap('#' + GodotConfig.canvas.id, p_ptr, p_ptr_max); + godot_js_config_canvas_id_get: function (p_ptr, p_ptr_max) { + GodotRuntime.stringToHeap(`#${GodotConfig.canvas.id}`, p_ptr, p_ptr_max); }, - godot_js_config_locale_get: function(p_ptr, p_ptr_max) { + godot_js_config_locale_get: function (p_ptr, p_ptr_max) { GodotRuntime.stringToHeap(GodotConfig.locale, p_ptr, p_ptr_max); }, - godot_js_config_is_resize_on_start: function() { + godot_js_config_is_resize_on_start: function () { return GodotConfig.resize_on_start ? 1 : 0; }, }; @@ -91,7 +91,6 @@ const GodotConfig = { autoAddDeps(GodotConfig, '$GodotConfig'); mergeInto(LibraryManager.library, GodotConfig); - const GodotFS = { $GodotFS__deps: ['$FS', '$IDBFS', '$GodotRuntime'], $GodotFS__postset: [ @@ -104,7 +103,7 @@ const GodotFS = { _syncing: false, _mount_points: [], - is_persistent: function() { + is_persistent: function () { return GodotFS._idbfs ? 1 : 0; }, @@ -112,7 +111,7 @@ const GodotFS = { // Returns a promise that resolves when the FS is ready. // We keep track of mount_points, so that we can properly close the IDBFS // since emscripten is not doing it by itself. (emscripten GH#12516). - init: function(persistentPaths) { + init: function (persistentPaths) { GodotFS._idbfs = false; if (!Array.isArray(persistentPaths)) { return Promise.reject(new Error('Persistent paths must be an array')); @@ -133,16 +132,16 @@ const GodotFS = { } } - GodotFS._mount_points.forEach(function(path) { + GodotFS._mount_points.forEach(function (path) { createRecursive(path); FS.mount(IDBFS, {}, path); }); - return new Promise(function(resolve, reject) { - FS.syncfs(true, function(err) { + return new Promise(function (resolve, reject) { + FS.syncfs(true, function (err) { if (err) { GodotFS._mount_points = []; GodotFS._idbfs = false; - GodotRuntime.print("IndexedDB not available: " + err.message); + GodotRuntime.print(`IndexedDB not available: ${err.message}`); } else { GodotFS._idbfs = true; } @@ -152,12 +151,12 @@ const GodotFS = { }, // Deinit godot file system, making sure to unmount file systems, and close IDBFS(s). - deinit: function() { - GodotFS._mount_points.forEach(function(path) { + deinit: function () { + GodotFS._mount_points.forEach(function (path) { try { FS.unmount(path); } catch (e) { - GodotRuntime.print("Already unmounted", e); + GodotRuntime.print('Already unmounted', e); } if (GodotFS._idbfs && IDBFS.dbs[path]) { IDBFS.dbs[path].close(); @@ -169,16 +168,16 @@ const GodotFS = { GodotFS._syncing = false; }, - sync: function() { + sync: function () { if (GodotFS._syncing) { GodotRuntime.error('Already syncing!'); return Promise.resolve(); } GodotFS._syncing = true; return new Promise(function (resolve, reject) { - FS.syncfs(false, function(error) { + FS.syncfs(false, function (error) { if (error) { - GodotRuntime.error('Failed to save IDB file system: ' + error.message); + GodotRuntime.error(`Failed to save IDB file system: ${error.message}`); } GodotFS._syncing = false; resolve(error); @@ -187,9 +186,9 @@ const GodotFS = { }, // Copies a buffer to the internal file system. Creating directories recursively. - copy_to_fs: function(path, buffer) { - const idx = path.lastIndexOf("/"); - let dir = "/"; + copy_to_fs: function (path, buffer) { + const idx = path.lastIndexOf('/'); + let dir = '/'; if (idx > 0) { dir = path.slice(0, idx); } @@ -201,7 +200,7 @@ const GodotFS = { } FS.mkdirTree(dir); } - FS.writeFile(path, new Uint8Array(buffer), {'flags': 'wx+'}); + FS.writeFile(path, new Uint8Array(buffer), { 'flags': 'wx+' }); }, }, }; @@ -214,54 +213,54 @@ const GodotOS = { 'GodotOS._fs_sync_promise = Promise.resolve();', ].join(''), $GodotOS: { - request_quit: function() {}, + request_quit: function () {}, _async_cbs: [], _fs_sync_promise: null, - atexit: function(p_promise_cb) { + atexit: function (p_promise_cb) { GodotOS._async_cbs.push(p_promise_cb); }, - finish_async: function(callback) { - GodotOS._fs_sync_promise.then(function(err) { + finish_async: function (callback) { + GodotOS._fs_sync_promise.then(function (err) { const promises = []; - GodotOS._async_cbs.forEach(function(cb) { + GodotOS._async_cbs.forEach(function (cb) { promises.push(new Promise(cb)); }); return Promise.all(promises); - }).then(function() { + }).then(function () { return GodotFS.sync(); // Final FS sync. - }).then(function(err) { + }).then(function (err) { // Always deferred. - setTimeout(function() { + setTimeout(function () { callback(); }, 0); }); }, }, - godot_js_os_finish_async: function(p_callback) { + godot_js_os_finish_async: function (p_callback) { const func = GodotRuntime.get_func(p_callback); GodotOS.finish_async(func); }, - godot_js_os_request_quit_cb: function(p_callback) { + godot_js_os_request_quit_cb: function (p_callback) { GodotOS.request_quit = GodotRuntime.get_func(p_callback); }, - godot_js_os_fs_is_persistent: function() { + godot_js_os_fs_is_persistent: function () { return GodotFS.is_persistent(); }, - godot_js_os_fs_sync: function(callback) { + godot_js_os_fs_sync: function (callback) { const func = GodotRuntime.get_func(callback); GodotOS._fs_sync_promise = GodotFS.sync(); - GodotOS._fs_sync_promise.then(function(err) { + GodotOS._fs_sync_promise.then(function (err) { func(); }); }, - godot_js_os_execute: function(p_json) { + godot_js_os_execute: function (p_json) { const json_args = GodotRuntime.parseString(p_json); const args = JSON.parse(json_args); if (GodotConfig.on_execute) { @@ -271,7 +270,7 @@ const GodotOS = { return 1; }, - godot_js_os_shell_open: function(p_uri) { + godot_js_os_shell_open: function (p_uri) { window.open(GodotRuntime.parseString(p_uri), '_blank'); }, }; diff --git a/platform/javascript/js/libs/library_godot_runtime.js b/platform/javascript/js/libs/library_godot_runtime.js index 1769f83623..04f29ad681 100644 --- a/platform/javascript/js/libs/library_godot_runtime.js +++ b/platform/javascript/js/libs/library_godot_runtime.js @@ -33,29 +33,29 @@ const GodotRuntime = { /* * Functions */ - get_func: function(ptr) { + get_func: function (ptr) { return wasmTable.get(ptr); // eslint-disable-line no-undef }, /* * Prints */ - error: function() { + error: function () { err.apply(null, Array.from(arguments)); // eslint-disable-line no-undef }, - print: function() { + print: function () { out.apply(null, Array.from(arguments)); // eslint-disable-line no-undef }, /* * Memory */ - malloc: function(p_size) { + malloc: function (p_size) { return _malloc(p_size); // eslint-disable-line no-undef }, - free: function(p_ptr) { + free: function (p_ptr) { _free(p_ptr); // eslint-disable-line no-undef }, @@ -63,16 +63,16 @@ const GodotRuntime = { return getValue(p_ptr, p_type); // eslint-disable-line no-undef }, - setHeapValue: function(p_ptr, p_value, p_type) { + setHeapValue: function (p_ptr, p_value, p_type) { setValue(p_ptr, p_value, p_type); // eslint-disable-line no-undef }, - heapSub: function(p_heap, p_ptr, p_len) { + heapSub: function (p_heap, p_ptr, p_len) { const bytes = p_heap.BYTES_PER_ELEMENT; return p_heap.subarray(p_ptr / bytes, p_ptr / bytes + p_len); }, - heapCopy: function(p_heap, p_ptr, p_len) { + heapCopy: function (p_heap, p_ptr, p_len) { const bytes = p_heap.BYTES_PER_ELEMENT; return p_heap.slice(p_ptr / bytes, p_ptr / bytes + p_len); }, @@ -80,22 +80,22 @@ const GodotRuntime = { /* * Strings */ - parseString: function(p_ptr) { + parseString: function (p_ptr) { return UTF8ToString(p_ptr); // eslint-disable-line no-undef }, - strlen: function(p_str) { + strlen: function (p_str) { return lengthBytesUTF8(p_str); // eslint-disable-line no-undef }, - allocString: function(p_str) { - const length = GodotRuntime.strlen(p_str)+1; + allocString: function (p_str) { + const length = GodotRuntime.strlen(p_str) + 1; const c_str = GodotRuntime.malloc(length); stringToUTF8(p_str, c_str, length); // eslint-disable-line no-undef return c_str; }, - allocStringArray: function(p_strings) { + allocStringArray: function (p_strings) { const size = p_strings.length; const c_ptr = GodotRuntime.malloc(size * 4); for (let i = 0; i < size; i++) { @@ -104,7 +104,7 @@ const GodotRuntime = { return c_ptr; }, - freeStringArray: function(p_ptr, p_len) { + freeStringArray: function (p_ptr, p_len) { for (let i = 0; i < p_len; i++) { GodotRuntime.free(HEAP32[(p_ptr >> 2) + i]); } @@ -116,5 +116,5 @@ const GodotRuntime = { }, }, }; -autoAddDeps(GodotRuntime, "$GodotRuntime"); +autoAddDeps(GodotRuntime, '$GodotRuntime'); mergeInto(LibraryManager.library, GodotRuntime); |