mirror of
https://github.com/denoland/deno.git
synced 2025-01-11 00:21:05 -05:00
0d03fafbfe
Refactors handlers.rs The idea is that all Deno "ops" (aka bindings) should map onto a Rust Future. By setting the "sync" flag in the Base message users can determine if the future is executed immediately or put on the event loop. In the case of async futures, a promise is automatically created. Errors are automatically forwarded and raised. TODO: - The file system ops in src/handler.rs are not using the thread pool yet. This will be done in the future using tokio_threadpool::blocking. That is, if you try to call them asynchronously, you will get a promise and it will act asynchronous, but currently it will be blocking. - Handlers in src/handler.rs returned boxed futures. This was to make it easy while developing. We should try to remove this allocation.
93 lines
2.4 KiB
TypeScript
93 lines
2.4 KiB
TypeScript
// Copyright 2018 the Deno authors. All rights reserved. MIT license.
|
|
import { TypedArray } from "./types";
|
|
|
|
let logDebug = false;
|
|
|
|
// @internal
|
|
export function setLogDebug(debug: boolean): void {
|
|
logDebug = debug;
|
|
}
|
|
|
|
/**
|
|
* Debug logging for deno. Enable with the `--DEBUG` command line flag.
|
|
* @internal
|
|
*/
|
|
// tslint:disable-next-line:no-any
|
|
export function log(...args: any[]): void {
|
|
if (logDebug) {
|
|
console.log("DEBUG JS -", ...args);
|
|
}
|
|
}
|
|
|
|
// @internal
|
|
export function assert(cond: boolean, msg = "assert") {
|
|
if (!cond) {
|
|
throw Error(msg);
|
|
}
|
|
}
|
|
|
|
// @internal
|
|
export function typedArrayToArrayBuffer(ta: TypedArray): ArrayBuffer {
|
|
const ab = ta.buffer.slice(ta.byteOffset, ta.byteOffset + ta.byteLength);
|
|
return ab as ArrayBuffer;
|
|
}
|
|
|
|
// @internal
|
|
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<number>();
|
|
* ...
|
|
* 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.
|
|
*
|
|
* @internal
|
|
*/
|
|
|
|
export interface ResolvableMethods<T> {
|
|
resolve: (value?: T | PromiseLike<T>) => void;
|
|
// tslint:disable-next-line:no-any
|
|
reject: (reason?: any) => void;
|
|
}
|
|
|
|
// @internal
|
|
export type Resolvable<T> = Promise<T> & ResolvableMethods<T>;
|
|
|
|
// @internal
|
|
export function createResolvable<T>(): Resolvable<T> {
|
|
let methods: ResolvableMethods<T>;
|
|
const promise = new Promise<T>((resolve, reject) => {
|
|
methods = { resolve, reject };
|
|
});
|
|
// TypeScript doesn't know that the Promise callback occurs synchronously
|
|
// therefore use of not null assertion (`!`)
|
|
return Object.assign(promise, methods!) as Resolvable<T>;
|
|
}
|
|
|
|
// @internal
|
|
export function notImplemented(): never {
|
|
throw new Error("Not implemented");
|
|
}
|
|
|
|
// @internal
|
|
export function unreachable(): never {
|
|
throw new Error("Code not reachable");
|
|
}
|
|
|
|
export function hexdump(u8: Uint8Array): string {
|
|
return Array.prototype.map
|
|
.call(u8, (x: number) => {
|
|
return ("00" + x.toString(16)).slice(-2);
|
|
})
|
|
.join(" ");
|
|
}
|