Signed-off-by: Jess Frazelle <github@jessfraz.com>
This commit is contained in:
Jess Frazelle
2024-04-19 16:25:08 -07:00
parent e0e6acf231
commit 5bdc899831
3 changed files with 41 additions and 13 deletions

View File

@ -2,18 +2,19 @@ import {
ParserWorkerResponse, ParserWorkerResponse,
WasmWorker, WasmWorker,
WasmWorkerEventType, WasmWorkerEventType,
ParserWorkerCallResponse,
} from 'lang/workers/types' } from 'lang/workers/types'
import ParserWorker from 'lang/workers/parser?worker' import Worker from 'lang/workers/parser?worker'
import { wasmUrl } from 'lang/wasm' import { Program, wasmUrl } from 'lang/wasm'
import { KCLError } from 'lang/errors' import { KCLError } from 'lang/errors'
import { v4 as uuidv4 } from 'uuid' import { v4 as uuidv4 } from 'uuid'
export type { Program } from 'wasm-lib/kcl/bindings/Program'
export default class Parser { export default class Parser {
worker: ParserWorker | null = null worker: any = new Worker({ name: 'parse' })
intitalized: boolean = false
mappings: Map<string, Program | KCLError> = new Map() mappings: Map<string, Program | KCLError> = new Map()
async parse(code: string): Program { async parse(code: string): Promise<Program> {
this.ensureWorker() this.ensureWorker()
const uuid = uuidv4() const uuid = uuidv4()
this.worker.postMessage({ this.worker.postMessage({
@ -46,14 +47,17 @@ export default class Parser {
} }
ensureWorker() { ensureWorker() {
if (!this.worker) { if (!this.intitalized) {
this.start() this.start()
} }
} }
// Start the worker. // Start the worker.
start() { start() {
this.worker = new ParserWorker({ name: 'parse' }) if (this.intitalized) {
console.log('Worker already initialized')
return
}
this.worker.postMessage({ this.worker.postMessage({
worker: WasmWorker.Parser, worker: WasmWorker.Parser,
eventType: WasmWorkerEventType.Init, eventType: WasmWorkerEventType.Init,
@ -62,9 +66,16 @@ export default class Parser {
}, },
}) })
this.worker.onmessage = function (e) { this.worker.onmessage = function (r: ParserWorkerResponse) {
const { uuid, response } = e.data as ParserWorkerResponse switch (r.eventType) {
this.mappings.set(uuid, response) case WasmWorkerEventType.Init:
this.intitalized = true
break
case WasmWorkerEventType.Call:
const c = r.response as ParserWorkerCallResponse
this.mappings.set(c.uuid, c.response)
break
}
} }
} }
} }

View File

@ -26,6 +26,10 @@ onmessage = function (event) {
initialise(wasmUrl) initialise(wasmUrl)
.then((instantiatedModule) => { .then((instantiatedModule) => {
console.log('Worker: WASM module loaded', worker, instantiatedModule) console.log('Worker: WASM module loaded', worker, instantiatedModule)
postMessage({
eventType: WasmWorkerEventType.Init,
response: { worker: worker, initialized: true },
})
}) })
.catch((error) => { .catch((error) => {
console.error('Worker: Error loading wasm module', worker, error) console.error('Worker: Error loading wasm module', worker, error)
@ -35,7 +39,7 @@ onmessage = function (event) {
const data = eventData as ParserWorkerCall const data = eventData as ParserWorkerCall
try { try {
const program: Program = parse_wasm(data.code) const program: Program = parse_wasm(data.code)
postMessage(program) postMessage({ uuid: data.uuid, response: program })
} catch (e: any) { } catch (e: any) {
const parsed: RustKclError = JSON.parse(e.toString()) const parsed: RustKclError = JSON.parse(e.toString())
const kclError = new KCLError( const kclError = new KCLError(
@ -44,7 +48,10 @@ onmessage = function (event) {
rangeTypeFix(parsed.sourceRanges) rangeTypeFix(parsed.sourceRanges)
) )
postMessage(kclError) postMessage({
eventType: WasmWorkerEventType.Call,
response: { uuid: data.uuid, response: kclError },
})
} }
break break
default: default:

View File

@ -18,11 +18,21 @@ export interface ParserWorkerCall {
code: string code: string
} }
export interface ParserWorkerResponse { export interface ParserWorkerInitResponse {
worker: WasmWorker
initialized: boolean
}
export interface ParserWorkerCallResponse {
uuid: string uuid: string
response: Program | KCLError response: Program | KCLError
} }
export interface ParserWorkerResponse {
eventType: WasmWorkerEventType
response: ParserWorkerInitResponse | ParserWorkerCallResponse
}
export interface WasmWorkerEvent { export interface WasmWorkerEvent {
eventType: WasmWorkerEventType eventType: WasmWorkerEventType
eventData: Uint8Array | WasmWorkerOptions | ParserWorkerCall eventData: Uint8Array | WasmWorkerOptions | ParserWorkerCall