{"version":3,"sources":["../../../src/shared/pubsub/publishAction.ts"],"names":["publishAction","creator","args","publishActionToTopics","topic","multicastAction","topics","length","Error","app","messagePrototype","channel","senderId","timestamp","messageId","traceId","Promise","all","map","message","console","log","type"],"mappings":";;;;;;;AAMA;;AACA;;AACA;;AACA;;AAEO,MAAMA,aAAa,GAAG,OAG3BC,OAH2B,EAI3B,GAAGC,IAJwB,KAKxB;AACH,SAAOC,qBAAqB,CAAC,CAACF,OAAO,CAACG,KAAT,CAAD,EAAkBH,OAAlB,EAA2B,GAAGC,IAA9B,CAA5B;AACD,CAPM;;;;AASA,MAAMG,eAAe,GAAG,OAG7BC,MAH6B,EAI7BL,OAJ6B,EAK7B,GAAGC,IAL0B,KAM1B;AACH,SAAOC,qBAAqB,CAACG,MAAD,EAASL,OAAT,EAAkB,GAAGC,IAArB,CAA5B;AACD,CARM;;;;AAUP,MAAMC,qBAAqB,GAAG,OAG5BG,MAH4B,EAI5BL,OAJ4B,EAK5B,GAAGC,IALyB,KAMzB;AACH,MAAII,MAAM,CAACC,MAAP,KAAkB,CAAtB,EAAyB;AACvB,UAAM,IAAIC,KAAJ,CAAU,uCAAV,CAAN;AACD;;AAED,QAAMC,GAAG,GAAG,MAAM,mBAAlB;AAEA,QAAMC,gBAA6D,GAAG;AACpEC,IAAAA,OAAO,EAAEL,MAAM,CAAC,CAAD,CADqD;AAEpEM,IAAAA,QAAQ,EAAEH,GAF0D;AAGpEI,IAAAA,SAAS,EAAE,qBAHyD;AAIpEC,IAAAA,SAAS,EAAE,iBAJyD;AAKpEC,IAAAA,OAAO,EAAE,iBAL2D;AAMpE,OAAId,OAAO,CAAC,GAAGC,IAAJ;AANyD,GAAtE;AASA,QAAMc,OAAO,CAACC,GAAR,CACJX,MAAM,CAACY,GAAP,CAAW,MAAOd,KAAP,IAAiB;AAC1B,UAAMe,OAAO,GAAG,EACd,GAAGT,gBADW;AAEdC,MAAAA,OAAO,EAAEP;AAFK,KAAhB;AAKA,UAAM,qBAAQA,KAAR,EAAee,OAAf,CAAN;AAEAC,IAAAA,OAAO,CAACC,GAAR,CACG,6BAA4BF,OAAO,CAACG,IAAK,aAAYH,OAAO,CAACR,OAAQ,YAAWQ,OAAO,CAACL,SAAU,cAAaK,OAAO,CAACJ,OAAQ,UAASI,OAAO,CAACP,QAAS,EAD5J;AAGD,GAXD,CADI,CAAN,CAhBG,CA+BH;;AACA,SAAOF,gBAAP;AACD,CAvCD","sourcesContent":["import {\n  ITopicBoundActionCreator,\n  IActionCreator,\n  Channels,\n  IAnyAction,\n} from '@aimee-blue/ab-contracts';\nimport { appName } from '../app';\nimport { localNow } from '../time';\nimport { publish } from './pubsub';\nimport { uuid } from '../uuid';\n\nexport const publishAction = async <\n  C extends ITopicBoundActionCreator<IAnyAction, string, unknown[]>\n>(\n  creator: C,\n  ...args: Parameters<C>\n) => {\n  return publishActionToTopics([creator.topic], creator, ...args);\n};\n\nexport const multicastAction = async <\n  C extends IActionCreator<IAnyAction, unknown[]>\n>(\n  topics: string[],\n  creator: C,\n  ...args: Parameters<C>\n) => {\n  return publishActionToTopics(topics, creator, ...args);\n};\n\nconst publishActionToTopics = async <\n  C extends IActionCreator<IAnyAction, unknown[]>\n>(\n  topics: string[],\n  creator: C,\n  ...args: Parameters<C>\n) => {\n  if (topics.length === 0) {\n    throw new Error('Need at least one topic to publish to');\n  }\n\n  const app = await appName();\n\n  const messagePrototype: Channels.IPubSubMessageShape<ReturnType<C>> = {\n    channel: topics[0],\n    senderId: app,\n    timestamp: localNow(),\n    messageId: uuid(),\n    traceId: uuid(),\n    ...(creator(...args) as ReturnType<C>),\n  };\n\n  await Promise.all(\n    topics.map(async (topic) => {\n      const message = {\n        ...messagePrototype,\n        channel: topic,\n      };\n\n      await publish(topic, message);\n\n      console.log(\n        `Published message of type ${message.type} to topic ${message.channel} with id ${message.messageId} (trace id ${message.traceId}) from ${message.senderId}`\n      );\n    })\n  );\n\n  // messages only differ by channel, so we shouldn't rely on that\n  return messagePrototype;\n};\n"],"file":"publishAction.js"}