UNPKG

consortium

Version:

Remote control and session sharing CLI for AI coding agents

572 lines (560 loc) • 16.8 kB
'use strict'; var consumable = require('./consumable-jpudCE9S.cjs'); function advance(iterator, next) { while (true) { const { done, value } = iterator.next(next); if (done) { return value; } if (consumable.isPromiseLike(value)) { return value.then((value2) => advance(iterator, { resolved: value2 }), (error) => advance(iterator, { error })); } next = value; } } // @__NO_SIDE_EFFECTS__ function bipedal(fn, bindThis) { function result(...args) { const iterator = fn.call(this, function* (value) { if (consumable.isPromiseLike(value)) { const result2 = yield value; if ("resolved" in result2) { return result2.resolved; } else { throw result2.error; } } return value; }, ...args); return advance(iterator, void 0); } { return result; } } function defaultFieldSerializer(serializer) { return (source, context) => { if ("buffer" in context) { const buffer = serializer(source, context); context.buffer.set(buffer, context.index); return buffer.length; } else { return serializer(source, context); } }; } function byobFieldSerializer(size, serializer) { return (source, context) => { if ("buffer" in context) { context.index ??= 0; serializer(source, context); return size; } else { const buffer = new Uint8Array(size); serializer(source, { buffer, index: 0, littleEndian: context.littleEndian }); return buffer; } }; } // @__NO_SIDE_EFFECTS__ function _field(size, type, serialize, deserialize, options) { const field2 = { size, type, serialize: type === "default" ? defaultFieldSerializer(serialize) : byobFieldSerializer(size, serialize), deserialize: bipedal(deserialize), omitInit: options?.omitInit }; if (options?.init) { field2.init = options.init; } return field2; } const field = _field; const EmptyUint8Array = new Uint8Array(0); function copyMaybeDifferentLength(dest, source, index, length) { if (source.length < length) { dest.set(source, index); dest.fill(0, index + source.length, index + length); } else if (source.length === length) { dest.set(source, index); } else { dest.set(source.subarray(0, length), index); } } // @__NO_SIDE_EFFECTS__ function buffer(lengthOrField, converter) { if (typeof lengthOrField === "number") { let serialize; let deserialize2; let init2; if (lengthOrField === 0) { serialize = () => { }; if (converter) { deserialize2 = function* () { return converter.convert(EmptyUint8Array); }; } else { deserialize2 = function* () { return EmptyUint8Array; }; } } else { serialize = (value, { buffer: buffer2, index }) => copyMaybeDifferentLength(buffer2, value, index, lengthOrField); if (converter) { deserialize2 = function* (then, reader) { const array = reader.readExactly(lengthOrField); return converter.convert(yield* then(array)); }; init2 = (value) => converter.back(value); } else { deserialize2 = function* (_then, reader) { const array = reader.readExactly(lengthOrField); return array; }; } } return field(lengthOrField, "byob", serialize, deserialize2, { init: init2 }); } if ((typeof lengthOrField === "object" || typeof lengthOrField === "function") && "serialize" in lengthOrField) { let deserialize2; let init2; if (converter) { deserialize2 = function* (then, reader, context) { const length = yield* then(lengthOrField.deserialize(reader, context)); const array = length !== 0 ? reader.readExactly(length) : EmptyUint8Array; return converter.convert(yield* then(array)); }; init2 = (value) => converter.back(value); } else { deserialize2 = function* (then, reader, context) { const length = yield* then(lengthOrField.deserialize(reader, context)); const array = length !== 0 ? reader.readExactly(length) : EmptyUint8Array; return array; }; } return field(lengthOrField.size, "default", (value, { littleEndian }) => { if (lengthOrField.type === "default") { const lengthBuffer = lengthOrField.serialize(value.length, { littleEndian }); if (value.length === 0) { return lengthBuffer; } const result = new Uint8Array(lengthBuffer.length + value.length); result.set(lengthBuffer, 0); result.set(value, lengthBuffer.length); return result; } else { const result = new Uint8Array(lengthOrField.size + value.length); lengthOrField.serialize(value.length, { buffer: result, index: 0, littleEndian }); result.set(value, lengthOrField.size); return result; } }, deserialize2, { init: init2 }); } if (typeof lengthOrField === "string") { let deserialize2; let init2; if (converter) { deserialize2 = function* (then, reader, { dependencies }) { const length = dependencies[lengthOrField]; const array = length !== 0 ? reader.readExactly(length) : EmptyUint8Array; return converter.convert(yield* then(array)); }; init2 = (value, dependencies) => { const array = converter.back(value); dependencies[lengthOrField] = array.length; return array; }; } else { deserialize2 = function* (_then, reader, { dependencies }) { const length = dependencies[lengthOrField]; const array = length !== 0 ? reader.readExactly(length) : EmptyUint8Array; return array; }; init2 = (value, dependencies) => { const array = value; dependencies[lengthOrField] = array.length; return array; }; } return field(0, "default", (source) => source, deserialize2, { init: init2 }); } let deserialize; let init; if (converter) { deserialize = function* (then, reader, { dependencies }) { const rawLength = dependencies[lengthOrField.field]; const length = lengthOrField.convert(rawLength); const array = length !== 0 ? reader.readExactly(length) : EmptyUint8Array; return converter.convert(yield* then(array)); }; init = (value, dependencies) => { const array = converter.back(value); dependencies[lengthOrField.field] = lengthOrField.back(array.length); return array; }; } else { deserialize = function* (_then, reader, { dependencies }) { const rawLength = dependencies[lengthOrField.field]; const length = lengthOrField.convert(rawLength); const array = length !== 0 ? reader.readExactly(length) : EmptyUint8Array; return array; }; init = (value, dependencies) => { const array = value; dependencies[lengthOrField.field] = lengthOrField.back(array.length); return array; }; } return field(0, "default", (source) => source, deserialize, { init }); } class ExactReadableEndedError extends Error { constructor() { super("ExactReadable ended"); } } class StructDeserializeError extends Error { constructor(message) { super(message); } } class StructNotEnoughDataError extends StructDeserializeError { constructor() { super("The underlying readable was ended before the struct was fully deserialized"); } } class StructEmptyError extends StructDeserializeError { constructor() { super("The underlying readable doesn't contain any more struct"); } } // @__NO_SIDE_EFFECTS__ function struct(fields, options) { const fieldList = Object.entries(fields); let size = 0; let byob = true; for (const [, field] of fieldList) { size += field.size; if (byob && field.type !== "byob") { byob = false; } } const littleEndian = options.littleEndian; const extra = options.extra ? Object.getOwnPropertyDescriptors(options.extra) : void 0; return { littleEndian, fields, extra: options.extra, type: byob ? "byob" : "default", size, serialize(source, bufferOrContext) { const temp = { ...source }; for (const [key, field] of fieldList) { if (key in temp && "init" in field) { const result = field.init?.(temp[key], temp); temp[key] = result; } } const sizes = new Array(fieldList.length); const buffers = new Array(fieldList.length); { const context2 = { littleEndian }; for (const [index2, [key, field]] of fieldList.entries()) { if (field.type === "byob") { sizes[index2] = field.size; } else { buffers[index2] = field.serialize(temp[key], context2); sizes[index2] = buffers[index2].length; } } } const size2 = sizes.reduce((sum, size3) => sum + size3, 0); let externalBuffer; let buffer; let index; if (bufferOrContext instanceof Uint8Array) { if (bufferOrContext.length < size2) { throw new Error("Buffer too small"); } externalBuffer = true; buffer = bufferOrContext; index = 0; } else if (typeof bufferOrContext === "object" && "buffer" in bufferOrContext) { externalBuffer = true; buffer = bufferOrContext.buffer; index = bufferOrContext.index ?? 0; if (buffer.length - index < size2) { throw new Error("Buffer too small"); } } else { externalBuffer = false; buffer = new Uint8Array(size2); index = 0; } const context = { buffer, index, littleEndian }; for (const [index2, [key, field]] of fieldList.entries()) { if (buffers[index2]) { buffer.set(buffers[index2], context.index); } else { field.serialize(temp[key], context); } context.index += sizes[index2]; } if (externalBuffer) { return size2; } else { return buffer; } }, deserialize: bipedal(function* (then, reader) { const startPosition = reader.position; const result = {}; const context = { dependencies: result, littleEndian }; try { for (const [key, field] of fieldList) { result[key] = yield* then(field.deserialize(reader, context)); } } catch (e) { if (!(e instanceof ExactReadableEndedError)) { throw e; } if (reader.position === startPosition) { throw new StructEmptyError(); } else { throw new StructNotEnoughDataError(); } } if (extra) { Object.defineProperties(result, extra); } if (options.postDeserialize) { return options.postDeserialize.call(result, result); } else { return result; } }) }; } class BufferedReadableStream { #buffered; // PERF: `subarray` is slow // don't use it until absolutely necessary #bufferedOffset = 0; #bufferedLength = 0; #position = 0; get position() { return this.#position; } stream; reader; constructor(stream) { this.stream = stream; this.reader = stream.getReader(); } #readBuffered(length) { if (!this.#buffered) { return void 0; } const value = this.#buffered.subarray(this.#bufferedOffset, this.#bufferedOffset + length); if (this.#bufferedLength > length) { this.#position += length; this.#bufferedOffset += length; this.#bufferedLength -= length; return value; } this.#position += this.#bufferedLength; this.#buffered = void 0; this.#bufferedOffset = 0; this.#bufferedLength = 0; return value; } async #readSource(length) { const { done, value } = await this.reader.read(); if (done) { throw new ExactReadableEndedError(); } if (value.length > length) { this.#buffered = value; this.#bufferedOffset = length; this.#bufferedLength = value.length - length; this.#position += length; return value.subarray(0, length); } this.#position += value.length; return value; } iterateExactly(length) { let state = this.#buffered ? 0 : 1; return { next: () => { switch (state) { case 0: { const value = this.#readBuffered(length); if (value.length === length) { state = 2; } else { length -= value.length; state = 1; } return { done: false, value }; } case 1: state = 3; return { done: false, value: this.#readSource(length).then((value) => { if (value.length === length) { state = 2; } else { length -= value.length; state = 1; } return value; }) }; case 2: return { done: true, value: void 0 }; case 3: throw new Error("Can't call `next` before previous Promise resolves"); default: throw new Error("unreachable"); } } }; } readExactly = bipedal(function* (then, length) { let result; let index = 0; const initial = this.#readBuffered(length); if (initial) { if (initial.length === length) { return initial; } result = new Uint8Array(length); result.set(initial, index); index += initial.length; length -= initial.length; } else { result = new Uint8Array(length); } while (length > 0) { const value = yield* then(this.#readSource(length)); result.set(value, index); index += value.length; length -= value.length; } return result; }); /** * Return a readable stream with unconsumed data (if any) and * all data from the wrapped stream. * @returns A `ReadableStream` */ release() { if (this.#bufferedLength > 0) { return new consumable.PushReadableStream(async (controller) => { const buffered = this.#buffered.subarray(this.#bufferedOffset); await controller.enqueue(buffered); controller.abortSignal.addEventListener("abort", () => { void consumable.tryCancel(this.reader); }); while (true) { const { done, value } = await this.reader.read(); if (done) { return; } await controller.enqueue(value); } }); } else { this.reader.releaseLock(); return this.stream; } } async cancel(reason) { await this.reader.cancel(reason); } } class BufferedTransformStream { #readable; get readable() { return this.#readable; } #writable; get writable() { return this.#writable; } constructor(transform) { let bufferedStreamController; let writableStreamController; const buffered = new BufferedReadableStream(new consumable.PushReadableStream((controller) => { bufferedStreamController = controller; })); this.#readable = new consumable.ReadableStream({ async pull(controller) { try { const value = await transform(buffered); controller.enqueue(value); } catch (e) { if (e instanceof StructEmptyError) { controller.close(); return; } throw e; } }, cancel: (reason) => { return writableStreamController.error(reason); } }); this.#writable = new consumable.WritableStream({ start(controller) { writableStreamController = controller; }, async write(chunk) { await bufferedStreamController.enqueue(chunk); }, abort() { bufferedStreamController.close(); }, close() { bufferedStreamController.close(); } }); } } class StructDeserializeStream extends BufferedTransformStream { constructor(struct) { super((stream) => { return struct.deserialize(stream); }); } } exports.BufferedReadableStream = BufferedReadableStream; exports.BufferedTransformStream = BufferedTransformStream; exports.EmptyUint8Array = EmptyUint8Array; exports.ExactReadableEndedError = ExactReadableEndedError; exports.StructDeserializeStream = StructDeserializeStream; exports.StructEmptyError = StructEmptyError; exports.bipedal = bipedal; exports.buffer = buffer; exports.field = field; exports.struct = struct;