| // Copyright 2022 The IREE Authors |
| // |
| // Licensed under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| // Promise-based API for interacting with the IREE runtime. |
| |
| let ireeWorker = null; |
| let nextMessageId = 0; |
| const pendingPromises = {}; |
| |
| // Communication protocol to and from the worker: |
| // { |
| // 'messageType': string |
| // * the type of message (initialized, predict, etc.) |
| // 'id': number? |
| // * optional id to disambiguate messages of the same type |
| // 'payload': Object? |
| // * optional message data, format defined by message type |
| // 'error': string? |
| // * optional error message |
| // } |
| |
| function _handleMessageFromWorker(messageEvent) { |
| const {messageType, id, payload, error} = messageEvent.data; |
| |
| if (messageType == 'initialized') { |
| pendingPromises['initialize']['resolve'](); |
| delete pendingPromises['initialize']; |
| } else if (messageType == 'predictResult') { |
| if (payload !== undefined) { |
| pendingPromises[id]['resolve'](payload); |
| } else { |
| pendingPromises[id]['reject'](error); |
| } |
| delete pendingPromises[id]; |
| } |
| } |
| |
| // Initializes IREE's web worker asynchronously. |
| // Resolves when the worker is fully initialized. |
| function ireeInitializeWorker() { |
| return new Promise((resolve, reject) => { |
| pendingPromises['initialize'] = { |
| 'resolve': resolve, |
| 'reject': reject, |
| }; |
| |
| ireeWorker = new Worker('iree_worker.js', {name: 'IREE-main'}); |
| ireeWorker.onmessage = _handleMessageFromWorker; |
| }); |
| } |
| |
| // Predicts the handwritten digit in a provided image asynchronously. |
| // Input: 28x28 pixel data from CanvasRenderingContext2D.getImageData() |
| // Resolves with a Number in [0, 9] (inclusive) on success |
| function ireePredictDigit(imageData) { |
| return new Promise((resolve, reject) => { |
| const messageId = nextMessageId++; |
| const message = { |
| 'messageType': 'predict', |
| 'id': messageId, |
| 'payload': imageData, |
| }; |
| |
| pendingPromises[messageId] = { |
| 'resolve': resolve, |
| 'reject': reject, |
| }; |
| |
| ireeWorker.postMessage(message); |
| }); |
| } |