UNPKG

@klodianimeri/channeljs

Version:

Javascript channel like async communication.

1 lines 3.78 kB
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["type ResolveType<T = any> = (value: T | PromiseLike<T>) => void;\r\n\r\ntype ItemType<T = any, TReturn = any> = IteratorResult<T, TReturn> | ResolveType<IteratorResult<T, TReturn>>;\r\n\r\nif (typeof Promise.withResolvers === \"undefined\") {\r\n Promise.withResolvers = <T>() => {\r\n let resolve!: (value: T | PromiseLike<T>) => void;\r\n let reject!: (reason?: unknown) => void;\r\n const promise = new Promise<T>((res, rej) => {\r\n resolve = res;\r\n reject = rej;\r\n });\r\n return { promise, resolve, reject };\r\n };\r\n}\r\n\r\nexport class Channel<T = any, TReturn = any> {\r\n #items: Set<Array<ItemType<T, TReturn>>> = new Set<Array<ItemType<T, TReturn>>>();\r\n\r\n #push(ir: IteratorResult<T, TReturn>) {\r\n for (const items of this.#items) {\r\n if (items.length === 1 && typeof items[0] === 'function') {\r\n (items.shift() as ResolveType<IteratorResult<T, TReturn>>)(ir);\r\n continue;\r\n }\r\n\r\n items.push(ir);\r\n }\r\n }\r\n\r\n send(data: T) {\r\n this.#push({ done: false, value: data });\r\n }\r\n\r\n close() {\r\n this.#push({ done: true, value: undefined });\r\n this.#items.clear();\r\n }\r\n\r\n [Symbol.asyncIterator]() {\r\n let items: Array<ItemType<T, TReturn>> = new Array<ItemType<T, TReturn>>();\r\n let channel = this;\r\n channel.#items.add(items);\r\n\r\n return {\r\n next(): IteratorResult<T> | Promise<IteratorResult<T>> {\r\n if (items.length) return items.shift() as IteratorResult<T>;\r\n\r\n const { promise, resolve } = Promise.withResolvers<IteratorResult<T>>();\r\n\r\n items.push(resolve);\r\n\r\n return promise;\r\n },\r\n return(value?: TReturn): Promise<IteratorReturnResult<TReturn>> {\r\n channel.#items.delete(items);\r\n return Promise.resolve({ done: true, value: value });\r\n }\r\n };\r\n }\r\n}"],"names":["Promise","withResolvers","resolve","reject","promise","res","rej","_items","_classPrivateFieldLooseKey","_push","_push2","ir","_step","_iterator","_createForOfIteratorHelperLoose","_classPrivateFieldLooseBase","this","done","items","value","length","push","shift","Channel","Object","defineProperty","writable","Set","_proto","prototype","send","data","close","undefined","clear","Symbol","asyncIterator","Array","channel","add","next","_Promise$withResolver"],"mappings":"6RAIqC,IAA1BA,QAAQC,gBACfD,QAAQC,cAAgB,WACpB,IAAIC,EACAC,EAKJ,MAAO,CAAEC,QAJO,IAAIJ,QAAW,SAACK,EAAKC,GACjCJ,EAAUG,EACVF,EAASG,CACb,GACkBJ,QAAAA,EAASC,OAAAA,EAC/B,GACH,IAAAI,eAAAC,EAAAC,SAAAA,eAAAD,EAAA,QA8CA,SAAAE,EAzCSC,GACF,QAAwBC,EAAxBC,2pBAAAC,CAAAC,EAAoBC,KAAIT,GAAAA,MAAAK,EAAAC,KAAAI,MAAS,KAAtBC,EAAKN,EAAAO,MACS,IAAjBD,EAAME,QAAoC,mBAAbF,EAAM,GAKvCA,EAAMG,KAAKV,GAJNO,EAAMI,OAANJ,CAA0DP,EAKnE,CACJ,kDAZgBY,IAAAC,OAAAC,oBAAAhB,EAAA,CAAAU,MAAAT,IAAAc,OAAAC,eAAAlB,KAAAA,GAAAmB,UAAA,EAAAP,MAC2B,IAAIQ,KAAkC,CAAA,IAAAC,EAAAL,EAAAM,UA0ChFN,OA1CgFK,EAajFE,KAAA,SAAKC,GACDhB,EAAIC,KAAAP,GAAAA,GAAO,CAAEQ,MAAM,EAAOE,MAAOY,GACrC,EAACH,EAEDI,MAAA,WACIjB,EAAIC,KAAAP,GAAAA,GAAO,CAAEQ,MAAM,EAAME,WAAOc,IAChClB,OAAIR,GAAAA,GAAQ2B,OAChB,EAACN,EAEAO,OAAOC,eAAR,WACI,IAAIlB,EAAqC,IAAImB,MACzCC,EAAUtB,KAGd,OAFAD,EAAAuB,EAAO/B,GAAAA,GAAQgC,IAAIrB,GAEZ,CACHsB,KAAI,WACA,GAAItB,EAAME,OAAQ,OAAOF,EAAMI,QAE/B,IAAAmB,EAA6BzC,QAAQC,gBAA7BG,EAAOqC,EAAPrC,QAIR,OAFAc,EAAMG,KAFkBoB,EAAPvC,SAIVE,CACX,kBACOe,GAEH,OADAJ,EAAAuB,EAAO/B,GAAAA,GAAA,OAAeW,GACflB,QAAQE,QAAQ,CAAEe,MAAM,EAAME,MAAOA,GAChD,EAER,EAACI,CAAA"}