/* * MARTINS.js Free Edition * GPU-accelerated Augmented Reality for the web * Copyright (C) 2022 Alexandre Martins * https://github.com/alemart/martins-js * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License version 3 * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * * asap.ts * Schedule a function to run "as soon as possible" */ /** callbacks */ const callbacks: Function[] = []; /** arguments to be passed to the callbacks */ const args: any[][] = []; /** asap key */ const ASAP_KEY = 'asap' + Math.random().toString(36).substr(1); // Register an event listener window.addEventListener('message', event => { if(event.source !== window || event.data !== ASAP_KEY) return; event.stopPropagation(); if(callbacks.length == 0) return; const fn = callbacks.pop() as Function; const argArray = args.pop() as any[]; fn.apply(undefined, argArray); }, true); /** * Schedule a function to run "as soon as possible" * @param fn callback * @param params optional parameters */ export function asap(fn: Function, ...params: any[]): void { callbacks.unshift(fn); args.unshift(params); window.postMessage(ASAP_KEY, '*'); }