diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2020-04-13 22:18:31 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-13 22:18:31 +0200 |
commit | 2585b72c9bdd5ca36b6b43cf5b5609419081c7a8 (patch) | |
tree | 265f6060e6ac1351f5a68edec625fc5acca02009 /cli/js/runtime_worker.ts | |
parent | 8397cd52a5ec915a0b5e85d337cfcc38f4aaa63f (diff) |
feat: implement EventTarget for worker scope (#4737)
Diffstat (limited to 'cli/js/runtime_worker.ts')
-rw-r--r-- | cli/js/runtime_worker.ts | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/cli/js/runtime_worker.ts b/cli/js/runtime_worker.ts index c7742cf31..8881b438b 100644 --- a/cli/js/runtime_worker.ts +++ b/cli/js/runtime_worker.ts @@ -15,10 +15,12 @@ import { windowOrWorkerGlobalScopeMethods, windowOrWorkerGlobalScopeProperties, eventTargetProperties, + setEventTargetData, } from "./globals.ts"; import * as webWorkerOps from "./ops/web_worker.ts"; import { LocationImpl } from "./web/location.ts"; import { log, assert, immutableDefine } from "./util.ts"; +import { MessageEvent, ErrorEvent } from "./web/workers.ts"; import { TextEncoder } from "./web/text_encoding.ts"; import * as runtime from "./runtime.ts"; @@ -48,33 +50,50 @@ export function close(): void { } export async function workerMessageRecvCallback(data: string): Promise<void> { - let result: void | Promise<void>; - const event = { data }; + const msgEvent = new MessageEvent("message", { + cancelable: false, + data, + }); try { - // if (globalThis["onmessage"]) { - result = globalThis.onmessage!(event); + const result = globalThis.onmessage!(msgEvent); if (result && "then" in result) { await result; } } - - // TODO: run the rest of liteners + globalThis.dispatchEvent(msgEvent); } catch (e) { + let handled = false; + + const errorEvent = new ErrorEvent("error", { + cancelable: true, + message: e.message, + lineno: e.lineNumber ? e.lineNumber + 1 : undefined, + colno: e.columnNumber ? e.columnNumber + 1 : undefined, + filename: e.fileName, + error: null, + }); + if (globalThis["onerror"]) { - const result = globalThis.onerror( + const ret = globalThis.onerror( e.message, e.fileName, e.lineNumber, e.columnNumber, e ); - if (result === true) { - return; - } + handled = ret === true; + } + + globalThis.dispatchEvent(errorEvent); + if (errorEvent.defaultPrevented) { + handled = true; + } + + if (!handled) { + throw e; } - throw e; } } @@ -99,6 +118,7 @@ export function bootstrapWorkerRuntime(name: string): void { Object.defineProperties(globalThis, workerRuntimeGlobalProperties); Object.defineProperties(globalThis, eventTargetProperties); Object.defineProperties(globalThis, { name: readOnly(name) }); + setEventTargetData(globalThis); const s = runtime.start(name); const location = new LocationImpl(s.location); |