1/**
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import { WorkerMessage } from './WorkerWrapper'
17import { ThreadWorkerGlobalScope, MessageEvents } from '@ohos.worker';
18import { HiLog } from '../../../../../../common'
19import buffer from '@ohos.buffer'
20
21const TAG = 'WorkerTask'
22/*
23 * WorkerTask
24 *
25 * Work sub thread task
26 */
27export abstract class WorkerTask {
28    workerPort: ThreadWorkerGlobalScope
29
30    constructor(workerPort?: ThreadWorkerGlobalScope) {
31        HiLog.i(TAG, `WorkerTask constructor`)
32        this.workerPort = workerPort;
33    }
34
35    /**
36     * Defines the event handler to be called when the worker thread receives a message sent by the host thread.
37     * The event handler is executed in the worker thread.
38     *
39     * @param e message data
40     */
41    public onmessage(message: MessageEvents) {
42        try {
43            let data = <WorkerMessage> message.data
44            HiLog.i(TAG, `onmessage ${data.request}`)
45            this.runInWorker(data.request, (v) => {
46                HiLog.i(TAG, 'runInWorker callback in')
47                data.param = v;
48                const str = JSON.stringify(data)
49                let buf = buffer.from(str).buffer;
50                this.workerPort?.postMessage(buf, [buf]);
51            }, data.param);
52        } catch (err) {
53            HiLog.e(TAG, 'runInWorker err = ' + JSON.stringify(err));
54        }
55    }
56
57    public abstract runInWorker(request: string, callBack: (v?: any) => void, param?: any);
58}
59
60export default WorkerTask;