From d2f9fd6ec8b59c9599b58efa2b684de7b04f5249 Mon Sep 17 00:00:00 2001 From: Bjorn Stromberg Date: Tue, 28 Jul 2020 00:06:12 +0900 Subject: [PATCH] Improve types for web workers (#502) * Improve types for web workers * Move worker-loader config inline * Remove trailing spaces in translations --- gulp/webpack.config.js | 10 ---- src/js/core/animation_frame.js | 47 +++++++------------ src/js/core/async_compression.js | 6 +-- src/js/core/read_write_proxy.js | 2 +- src/js/core/sensitive_utils.encrypt.js | 15 ++---- src/js/globals.d.ts | 8 ++++ src/js/tsconfig.json | 3 +- ...kground_animation_frame_emittter.worker.js | 11 ++--- src/js/webworkers/compression.worker.js | 10 +--- src/js/webworkers/tsconfig.json | 8 ++++ 10 files changed, 50 insertions(+), 70 deletions(-) create mode 100644 src/js/webworkers/tsconfig.json diff --git a/gulp/webpack.config.js b/gulp/webpack.config.js index 26923796..022e2773 100644 --- a/gulp/webpack.config.js +++ b/gulp/webpack.config.js @@ -94,16 +94,6 @@ module.exports = ({ watch = false, standalone = false }) => { }, ], }, - { - test: /\.worker\.js$/, - use: { - loader: "worker-loader", - options: { - fallback: false, - inline: true, - }, - }, - }, { test: /\.ya?ml$/, type: "json", // Required by Webpack v4 diff --git a/src/js/core/animation_frame.js b/src/js/core/animation_frame.js index 0e921174..14147f7f 100644 --- a/src/js/core/animation_frame.js +++ b/src/js/core/animation_frame.js @@ -1,7 +1,6 @@ import { Signal } from "./signal"; -// @ts-ignore -import BackgroundAnimationFrameEmitterWorker from "../webworkers/background_animation_frame_emittter.worker"; +import BackgroundAnimationFrameEmitterWorker from "worker-loader?inline=true&fallback=false!../webworkers/background_animation_frame_emittter.worker"; import { createLogger } from "./logging"; const logger = createLogger("animation_frame"); @@ -14,12 +13,11 @@ export class AnimationFrame { this.frameEmitted = new Signal(); this.bgFrameEmitted = new Signal(); - this.lastTime = null; - this.bgLastTime = null; + this.lastTime = performance.now(); + this.bgLastTime = performance.now(); this.boundMethod = this.handleAnimationFrame.bind(this); - /** @type {Worker} */ this.backgroundWorker = new BackgroundAnimationFrameEmitterWorker(); this.backgroundWorker.addEventListener("error", err => { logger.error("Error in background fps worker:", err); @@ -27,22 +25,16 @@ export class AnimationFrame { this.backgroundWorker.addEventListener("message", this.handleBackgroundTick.bind(this)); } - /** - * - * @param {MessageEvent} event - */ - handleBackgroundTick(event) { + handleBackgroundTick() { const time = performance.now(); - if (!this.bgLastTime) { - // First update, first delta is always 16ms - this.bgFrameEmitted.dispatch(1000 / 60); - } else { - let dt = time - this.bgLastTime; - if (dt > maxDtMs) { - dt = resetDtMs; - } - this.bgFrameEmitted.dispatch(dt); + + let dt = time - this.bgLastTime; + + if (dt > maxDtMs) { + dt = resetDtMs; } + + this.bgFrameEmitted.dispatch(dt); this.bgLastTime = time; } @@ -52,18 +44,15 @@ export class AnimationFrame { } handleAnimationFrame(time) { - if (!this.lastTime) { - // First update, first delta is always 16ms - this.frameEmitted.dispatch(1000 / 60); - } else { - let dt = time - this.lastTime; - if (dt > maxDtMs) { - // warn(this, "Clamping", dt, "to", resetDtMs); - dt = resetDtMs; - } - this.frameEmitted.dispatch(dt); + let dt = time - this.lastTime; + + if (dt > maxDtMs) { + dt = resetDtMs; } + + this.frameEmitted.dispatch(dt); this.lastTime = time; + window.requestAnimationFrame(this.boundMethod); } } diff --git a/src/js/core/async_compression.js b/src/js/core/async_compression.js index b11f8fd5..9263cdab 100644 --- a/src/js/core/async_compression.js +++ b/src/js/core/async_compression.js @@ -1,7 +1,6 @@ -// @ts-ignore -import CompressionWorker from "../webworkers/compression.worker"; +import CompressionWorker from "worker-loader?inline=true&fallback=false!../webworkers/compression.worker"; import { createLogger } from "./logging"; -import { compressX64 } from "./lzstring"; + const logger = createLogger("async_compression"); export let compressionPrefix = String.fromCodePoint(1); @@ -35,7 +34,6 @@ if (!checkCryptPrefix(compressionPrefix)) { class AsynCompression { constructor() { - /** @type {Worker} */ this.worker = new CompressionWorker(); this.currentJobId = 1000; diff --git a/src/js/core/read_write_proxy.js b/src/js/core/read_write_proxy.js index 5474467a..3444057a 100644 --- a/src/js/core/read_write_proxy.js +++ b/src/js/core/read_write_proxy.js @@ -8,7 +8,7 @@ import { FILE_NOT_FOUND } from "../platform/storage"; import { accessNestedPropertyReverse } from "./utils"; import { IS_DEBUG, globalConfig } from "./config"; import { ExplainedResult } from "./explained_result"; -import { decompressX64, compressX64 } from ".//lzstring"; +import { decompressX64, compressX64 } from "./lzstring"; import { asyncCompressor, compressionPrefix } from "./async_compression"; import { compressObject, decompressObject } from "../savegame/savegame_compressor"; diff --git a/src/js/core/sensitive_utils.encrypt.js b/src/js/core/sensitive_utils.encrypt.js index 710de478..0a8906e7 100644 --- a/src/js/core/sensitive_utils.encrypt.js +++ b/src/js/core/sensitive_utils.encrypt.js @@ -1,19 +1,12 @@ -import { globalConfig } from "./config"; -import { decompressX64, compressX64 } from "./lzstring"; +import { createHash } from "rusha"; -const Rusha = require("rusha"); - -const encryptKey = globalConfig.info.sgSalt; - -export function decodeHashedString(s) { - return decompressX64(s); -} +import { decompressX64 } from "./lzstring"; export function sha1(str) { - return Rusha.createHash().update(str).digest("hex"); + return createHash().update(str).digest("hex"); } // Window.location.host export function getNameOfProvider() { - return window[decodeHashedString("DYewxghgLgliB2Q")][decodeHashedString("BYewzgLgdghgtgUyA")]; + return window[decompressX64("DYewxghgLgliB2Q")][decompressX64("BYewzgLgdghgtgUyA")]; } diff --git a/src/js/globals.d.ts b/src/js/globals.d.ts index e1a8fad1..cc6118ca 100644 --- a/src/js/globals.d.ts +++ b/src/js/globals.d.ts @@ -190,3 +190,11 @@ declare interface TypedSignal> { removeAll(); } + +declare module "worker-loader?inline=true&fallback=false!*" { + class WebpackWorker extends Worker { + constructor(); + } + + export default WebpackWorker; +} diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json index a5d95517..8a151000 100644 --- a/src/js/tsconfig.json +++ b/src/js/tsconfig.json @@ -54,5 +54,6 @@ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ "resolveJsonModule": true - } + }, + "exclude": ["webworkers"] } diff --git a/src/js/webworkers/background_animation_frame_emittter.worker.js b/src/js/webworkers/background_animation_frame_emittter.worker.js index c927b2d3..5469f7aa 100644 --- a/src/js/webworkers/background_animation_frame_emittter.worker.js +++ b/src/js/webworkers/background_animation_frame_emittter.worker.js @@ -1,15 +1,14 @@ // We clamp high deltas so 30 fps is fairly ok -var bgFps = 30; -var desiredMsDelay = 1000 / bgFps; +const bgFps = 30; +const desiredMsDelay = 1000 / bgFps; -let lastTick = 0; +let lastTick = performance.now(); function tick() { - var now = performance.now(); - var delta = now - lastTick; + const now = performance.now(); + const delta = now - lastTick; lastTick = now; - // @ts-ignore postMessage({ delta }); } diff --git a/src/js/webworkers/compression.worker.js b/src/js/webworkers/compression.worker.js index 0bcb0ea6..5820a4a1 100644 --- a/src/js/webworkers/compression.worker.js +++ b/src/js/webworkers/compression.worker.js @@ -12,15 +12,9 @@ function accessNestedPropertyReverse(obj, keys) { const salt = accessNestedPropertyReverse(globalConfig, ["file", "info"]); -onmessage = function (event) { - const { jobId, job, data } = event.data; +onmessage = function ({ data: { jobId, job, data } }) { const result = performJob(job, data); - - // @ts-ignore - postMessage({ - jobId, - result, - }); + postMessage({ jobId, result }); }; function performJob(job, data) { diff --git a/src/js/webworkers/tsconfig.json b/src/js/webworkers/tsconfig.json new file mode 100644 index 00000000..dce06856 --- /dev/null +++ b/src/js/webworkers/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "lib": ["ES2018","WebWorker"] + }, + "exclude": [], + "extends": "../tsconfig", + "include": ["*.worker.js"] +}