// Copyright 2018 the Deno authors. All rights reserved. MIT license. //import { debug } from "./main"; const debug = false; import { TypedArray } from "./types"; // Internal logging for deno. Use the "debug" variable above to control // output. // tslint:disable-next-line:no-any export function log(...args: any[]): void { if (debug) { console.log(...args); } } export function assert(cond: boolean, msg = "assert") { if (!cond) { throw Error(msg); } } let cmdIdCounter = 0; export function assignCmdId(): number { // TODO(piscisaureus) Safely re-use so they don't overflow. const cmdId = ++cmdIdCounter; assert(cmdId < 2 ** 32, "cmdId overflow"); return cmdId; } export function typedArrayToArrayBuffer(ta: TypedArray): ArrayBuffer { const ab = ta.buffer.slice(ta.byteOffset, ta.byteOffset + ta.byteLength); return ab as ArrayBuffer; } export function arrayToStr(ui8: Uint8Array): string { return String.fromCharCode(...ui8); } // A `Resolvable` is a Promise with the `reject` and `resolve` functions // placed as methods on the promise object itself. It allows you to do: // // const p = createResolvable(); // ... // p.resolve(42); // // It'd be prettier to make Resolvable a class that inherits from Promise, // rather than an interface. This is possible in ES2016, however typescript // produces broken code when targeting ES5 code. // See https://github.com/Microsoft/TypeScript/issues/15202 // At the time of writing, the github issue is closed but the problem remains. export interface Resolvable extends Promise { resolve: (value?: T | PromiseLike) => void; // tslint:disable-next-line:no-any reject: (reason?: any) => void; } export function createResolvable(): Resolvable { let methods; const promise = new Promise((resolve, reject) => { methods = { resolve, reject }; }); return Object.assign(promise, methods) as Resolvable; }