1fb726d48Sopenharmony_ci/* 2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb726d48Sopenharmony_ci * You may obtain a copy of the License at 6fb726d48Sopenharmony_ci * 7fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb726d48Sopenharmony_ci * 9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and 13fb726d48Sopenharmony_ci * limitations under the License. 14fb726d48Sopenharmony_ci */ 15fb726d48Sopenharmony_ci 16fb726d48Sopenharmony_ciimport { DataMessage } from '../message/DataMessage'; 17fb726d48Sopenharmony_ci 18fb726d48Sopenharmony_ciexport class DataMessageQueue<T> { 19fb726d48Sopenharmony_ci private eleArray: Array<T>; 20fb726d48Sopenharmony_ci 21fb726d48Sopenharmony_ci constructor() { 22fb726d48Sopenharmony_ci this.eleArray = []; 23fb726d48Sopenharmony_ci } 24fb726d48Sopenharmony_ci 25fb726d48Sopenharmony_ci public push(entry: T): boolean { 26fb726d48Sopenharmony_ci if (entry === null) { 27fb726d48Sopenharmony_ci return false; 28fb726d48Sopenharmony_ci } 29fb726d48Sopenharmony_ci this.eleArray.unshift(entry); 30fb726d48Sopenharmony_ci return true; 31fb726d48Sopenharmony_ci } 32fb726d48Sopenharmony_ci 33fb726d48Sopenharmony_ci public pop(): T | undefined { 34fb726d48Sopenharmony_ci return this.eleArray.pop(); 35fb726d48Sopenharmony_ci } 36fb726d48Sopenharmony_ci 37fb726d48Sopenharmony_ci public size(): number { 38fb726d48Sopenharmony_ci return this.eleArray.length; 39fb726d48Sopenharmony_ci } 40fb726d48Sopenharmony_ci} 41fb726d48Sopenharmony_ci 42fb726d48Sopenharmony_ciinterface Resolver { 43fb726d48Sopenharmony_ci (data: DataMessage): void; 44fb726d48Sopenharmony_ci} 45fb726d48Sopenharmony_ci 46fb726d48Sopenharmony_ciexport class AsyncQueue<T> { 47fb726d48Sopenharmony_ci private promiseQueue: DataMessageQueue<Promise<DataMessage>> = new DataMessageQueue<Promise<DataMessage>>(); 48fb726d48Sopenharmony_ci private resolverQueue: DataMessageQueue<Resolver> = new DataMessageQueue<Resolver>(); 49fb726d48Sopenharmony_ci 50fb726d48Sopenharmony_ci add(): void { 51fb726d48Sopenharmony_ci this.promiseQueue.push( 52fb726d48Sopenharmony_ci new Promise((resolve) => { 53fb726d48Sopenharmony_ci this.resolverQueue.push(resolve); 54fb726d48Sopenharmony_ci }) 55fb726d48Sopenharmony_ci ); 56fb726d48Sopenharmony_ci } 57fb726d48Sopenharmony_ci 58fb726d48Sopenharmony_ci enqueue(item: DataMessage): void { 59fb726d48Sopenharmony_ci if (this.resolverQueue.size() === 0) { 60fb726d48Sopenharmony_ci this.add(); 61fb726d48Sopenharmony_ci } 62fb726d48Sopenharmony_ci const resolve = this.resolverQueue.pop(); 63fb726d48Sopenharmony_ci resolve ? resolve(item) : null; 64fb726d48Sopenharmony_ci } 65fb726d48Sopenharmony_ci 66fb726d48Sopenharmony_ci async dequeue(): Promise<DataMessage> { 67fb726d48Sopenharmony_ci if (this.promiseQueue.size() === 0) { 68fb726d48Sopenharmony_ci this.add(); 69fb726d48Sopenharmony_ci } 70fb726d48Sopenharmony_ci return this.promiseQueue.pop() || new Promise<DataMessage>((): void => {}); 71fb726d48Sopenharmony_ci } 72fb726d48Sopenharmony_ci} 73