{"version":3,"file":"pubsub.cjs","names":["Emitter","JsonEncoder","uname","DefaultLogger"],"sources":["../../../src/common/msg/pubsub.ts"],"sourcesContent":["import type { DisposerFunction } from '../dispose-types'\nimport type { Channel } from './channel'\nimport type { DefaultListener, EmitterSubscriberOptions, ListenerSignature } from './emitter'\nimport type { Encoder } from './encoder'\nimport { DefaultLogger } from '../log/log'\nimport { uname } from '../uuid'\nimport { Emitter } from './emitter'\nimport { JsonEncoder } from './encoder'\n\nexport interface PubSubConfig {\n  channel: Channel\n  encoder?: Encoder\n  name?: string\n  debug?: boolean\n}\n\nexport class PubSub<L extends ListenerSignature<L> = DefaultListener> extends Emitter<L> {\n  name: string\n  channel: Channel\n  encoder: Encoder\n  log: any\n  debug: boolean\n\n  get shortId() {\n    return this.name.substr(0, 6)\n  }\n\n  constructor(opt: PubSubConfig) {\n    super()\n\n    const { name, encoder = new JsonEncoder(), channel, debug = false } = opt\n\n    this.channel = channel\n    this.encoder = encoder\n    this.debug = debug\n\n    this.name = name ?? this.channel.id ?? uname('pubsub')\n    this.log = DefaultLogger(`${this.shortId}`)\n\n    if (this.debug) {\n      this.channel.on('connect', () => {\n        this.log('channel connected')\n      })\n      this.channel.on('disconnect', () => {\n        this.log('channel disconnected')\n      })\n    }\n\n    this.channel.on('message', async ({ data }) => {\n      const info = await this.encoder.decode(data)\n      if (this.debug)\n        this.log(`channel message, event=${info?.event}, info=`, info)\n      else this.log(`channel message, event=${info?.event}`)\n      if (info) {\n        const { event, args } = info\n        await this.emitSuper(event, ...args)\n      }\n    })\n  }\n\n  private async emitSuper<U extends keyof L>(\n    event: U,\n    ...args: Parameters<L[U]>\n  ): Promise<boolean> {\n    return await super.emit(event, ...args)\n  }\n\n  async emit<U extends keyof L>(\n    event: U,\n    ...args: Parameters<L[U]>\n  ): Promise<boolean> {\n    try {\n      if (this.debug)\n        this.log(`emit(${String(event)})`, event)\n      else this.log(`emit(${String(event)})`, args.length)\n      if (!this.channel.isConnected) {\n        this.log.warn('channel not connected')\n        return false\n      }\n      const data = await this.encoder.encode({ event, args })\n      this.channel.postMessage(data)\n      return true\n    }\n    catch (err) {\n      this.log.warn(`emit(${String(event)})`, err)\n    }\n    return false\n  }\n\n  public async publish<U extends keyof L>(\n    event: U,\n    ...args: Parameters<L[U]>\n  ): Promise<boolean> {\n    return await this.emit(event, ...args)\n  }\n\n  public subscribe<U extends keyof L>(\n    event: U,\n    fn: L[U],\n    opt: EmitterSubscriberOptions = {},\n  ): DisposerFunction {\n    return this.on(event as any as string | number, fn as any, opt)\n  }\n}\n\nexport function usePubSub<L extends ListenerSignature<L> = DefaultListener>(\n  opt: PubSubConfig,\n) {\n  return new PubSub<L>(opt)\n}\n"],"mappings":";;;;;;;AAgBA,IAAa,SAAb,cAA8EA,mCAAW;CACvF;CACA;CACA;CACA;CACA;CAEA,IAAI,UAAU;AACZ,SAAO,KAAK,KAAK,OAAO,GAAG,EAAE;;CAG/B,YAAY,KAAmB;AAC7B,SAAO;EAEP,MAAM,EAAE,MAAM,UAAU,IAAIC,wCAAa,EAAE,SAAS,QAAQ,UAAU;AAEtE,OAAK,UAAU;AACf,OAAK,UAAU;AACf,OAAK,QAAQ;AAEb,OAAK,OAAO,QAAQ,KAAK,QAAQ,MAAMC,0BAAM,SAAS;AACtD,OAAK,MAAMC,qCAAc,GAAG,KAAK,UAAU;AAE3C,MAAI,KAAK,OAAO;AACd,QAAK,QAAQ,GAAG,iBAAiB;AAC/B,SAAK,IAAI,oBAAoB;KAC7B;AACF,QAAK,QAAQ,GAAG,oBAAoB;AAClC,SAAK,IAAI,uBAAuB;KAChC;;AAGJ,OAAK,QAAQ,GAAG,WAAW,OAAO,EAAE,WAAW;GAC7C,MAAM,OAAO,MAAM,KAAK,QAAQ,OAAO,KAAK;AAC5C,OAAI,KAAK,MACP,MAAK,IAAI,0BAA0B,MAAM,MAAM,UAAU,KAAK;OAC3D,MAAK,IAAI,0BAA0B,MAAM,QAAQ;AACtD,OAAI,MAAM;IACR,MAAM,EAAE,OAAO,SAAS;AACxB,UAAM,KAAK,UAAU,OAAO,GAAG,KAAK;;IAEtC;;CAGJ,MAAc,UACZ,OACA,GAAG,MACe;AAClB,SAAO,MAAM,MAAM,KAAK,OAAO,GAAG,KAAK;;CAGzC,MAAM,KACJ,OACA,GAAG,MACe;AAClB,MAAI;AACF,OAAI,KAAK,MACP,MAAK,IAAI,QAAQ,OAAO,MAAM,CAAC,IAAI,MAAM;OACtC,MAAK,IAAI,QAAQ,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO;AACpD,OAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,SAAK,IAAI,KAAK,wBAAwB;AACtC,WAAO;;GAET,MAAM,OAAO,MAAM,KAAK,QAAQ,OAAO;IAAE;IAAO;IAAM,CAAC;AACvD,QAAK,QAAQ,YAAY,KAAK;AAC9B,UAAO;WAEF,KAAK;AACV,QAAK,IAAI,KAAK,QAAQ,OAAO,MAAM,CAAC,IAAI,IAAI;;AAE9C,SAAO;;CAGT,MAAa,QACX,OACA,GAAG,MACe;AAClB,SAAO,MAAM,KAAK,KAAK,OAAO,GAAG,KAAK;;CAGxC,AAAO,UACL,OACA,IACA,MAAgC,EAAE,EAChB;AAClB,SAAO,KAAK,GAAG,OAAiC,IAAW,IAAI;;;AAInE,SAAgB,UACd,KACA;AACA,QAAO,IAAI,OAAU,IAAI"}