Skip to content

Instantly share code, notes, and snippets.

@qwtel
qwtel / create-resolvable-promise.ts
Last active June 21, 2020 14:27
TS implementation of a promise that can be resolved after it has been created.
type Resolver<T> = (value: T | PromiseLike<T>) => void;
type Rejector = (reason?: any) => void;
type ResolvablePromise<T> = Promise<T> & { resolve: Resolver<T>, reject: Rejector }
export function createResolvablePromise<T>(): ResolvablePromise<T> {
let res: Resolver<T>
let rej: Rejector;
const promise = new Promise((r, s) => (res = r, rej = s)) as ResolvablePromise<T>;
promise.resolve = res;
promise.reject = rej;
return promise;
@qwtel
qwtel / cf-storage-area.ts
Last active November 8, 2021 01:28
kv-storage implementation for Cloudflare Workers
import { Base64Encoder, Base64Decoder } from 'base64-encoding';
const PREFIX = 'data:application/octet-stream;base64,';
const b64e = new Base64Encoder();
const b64d = new Base64Decoder();
const encodeKey = (key: string | BufferSource) => typeof key !== 'string' ? PREFIX + b64e.encode(key) : key;
const decodeKey = (key: string) => key.startsWith(PREFIX) ? b64d.decode(key.substr(PREFIX.length)) : key;
@qwtel
qwtel / whatwg-stream-to-async-iterable.ts
Created October 12, 2020 09:02
Convert WHATWG web streams to async iterables and back
export async function* streamToAsyncIterable<T>(stream: ReadableStream<T>): AsyncIterableIterator<T> {
const reader = stream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) return;
yield value;
}
} finally { reader.releaseLock() }
}
// import { TransformStream } from 'node:stream/web';
import { Buffer } from 'node:buffer';
import { Packr, Unpackr, Options } from 'msgpackr';
export class PackrTransformStream extends TransformStream<any, Uint8Array> {
constructor(options: Options & { packr?: Packr } = {}) {
options = { ...options, sequential: true };
const packr = options.packr || new Packr(options);
super({