consortium
Version:
Remote control and session sharing CLI for AI coding agents
572 lines (560 loc) • 16.8 kB
JavaScript
'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;