UNPKG

@glamboyosa/chan

Version:

`@glamboyosa/chan` is a TypeScript package that implements channels similar to Go’s channels. Channels are a powerful concurrency primitive that enable safe and efficient communication between different parts of your application. This package is designed

1 lines 2.79 kB
{"version":3,"sources":["../client.ts"],"sourcesContent":["class Channel<T> {\n\tprivate queue: T[] = [];\n\tprivate resolveQueue: ((value: T | null) => void)[] = [];\n\tprivate closed = false;\n\n\tconstructor(private bufferSize = 0) {}\n\n\tasync send(value: T): Promise<void> {\n\t\tif (this.resolveQueue.length > 0) {\n\t\t\tconst resolve = this.resolveQueue.shift();\n\t\t\tif (!resolve) {\n\t\t\t\tthrow new Error(\"Expected an item in the resolveQueue but found none.\");\n\t\t\t}\n\t\t\tresolve(value); // Resolve the pending promise with the value\n\t\t} else if (this.queue.length < this.bufferSize) {\n\t\t\tthis.queue.push(value); // Queue the value if the buffer isn't full\n\t\t} else {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tthis.resolveQueue.push(() => resolve()); // Add to the resolve queue\n\t\t\t});\n\t\t\tthis.queue.push(value); // After promise resolves, queue the value\n\t\t}\n\t}\n\n\tasync receive(): Promise<T | null> {\n\t\tif (this.queue.length > 0) {\n\t\t\tconst val = this.queue.shift();\n\t\t\tif (!val) {\n\t\t\t\tthrow new Error(\"Expected an item in the resolveQueue but found none.\");\n\t\t\t}\n\t\t\treturn val; // Return the next queued value\n\t\t}\n\t\tif (this.closed) {\n\t\t\treturn null; // If channel is closed, return null\n\t\t}\n\t\treturn new Promise<T | null>((resolve) => {\n\t\t\tthis.resolveQueue.push(resolve); // Add to the resolve queue\n\t\t});\n\t}\n\n\tclose(): void {\n\t\tthis.closed = true;\n\t\twhile (this.resolveQueue.length > 0) {\n\t\t\tconst resolve = this.resolveQueue.shift();\n\t\t\tif (!resolve) {\n\t\t\t\tthrow new Error(\"Expected an item in the resolveQueue but found none.\");\n\t\t\t}\n\t\t\tresolve(null); // Resolve all pending receives with null\n\t\t}\n\t}\n}\n\nexport { Channel };\n"],"mappings":";AAAA,IAAM,UAAN,MAAiB;AAAA,EAKhB,YAAoB,aAAa,GAAG;AAAhB;AAAA,EAAiB;AAAA,EAJ7B,QAAa,CAAC;AAAA,EACd,eAA8C,CAAC;AAAA,EAC/C,SAAS;AAAA,EAIjB,MAAM,KAAK,OAAyB;AACnC,QAAI,KAAK,aAAa,SAAS,GAAG;AACjC,YAAM,UAAU,KAAK,aAAa,MAAM;AACxC,UAAI,CAAC,SAAS;AACb,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACvE;AACA,cAAQ,KAAK;AAAA,IACd,WAAW,KAAK,MAAM,SAAS,KAAK,YAAY;AAC/C,WAAK,MAAM,KAAK,KAAK;AAAA,IACtB,OAAO;AACN,YAAM,IAAI,QAAc,CAAC,YAAY;AACpC,aAAK,aAAa,KAAK,MAAM,QAAQ,CAAC;AAAA,MACvC,CAAC;AACD,WAAK,MAAM,KAAK,KAAK;AAAA,IACtB;AAAA,EACD;AAAA,EAEA,MAAM,UAA6B;AAClC,QAAI,KAAK,MAAM,SAAS,GAAG;AAC1B,YAAM,MAAM,KAAK,MAAM,MAAM;AAC7B,UAAI,CAAC,KAAK;AACT,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACvE;AACA,aAAO;AAAA,IACR;AACA,QAAI,KAAK,QAAQ;AAChB,aAAO;AAAA,IACR;AACA,WAAO,IAAI,QAAkB,CAAC,YAAY;AACzC,WAAK,aAAa,KAAK,OAAO;AAAA,IAC/B,CAAC;AAAA,EACF;AAAA,EAEA,QAAc;AACb,SAAK,SAAS;AACd,WAAO,KAAK,aAAa,SAAS,GAAG;AACpC,YAAM,UAAU,KAAK,aAAa,MAAM;AACxC,UAAI,CAAC,SAAS;AACb,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACvE;AACA,cAAQ,IAAI;AAAA,IACb;AAAA,EACD;AACD;","names":[]}