@vm0/cli 9.278.1 → 9.279.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{agent-4F3XAJWN.js → agent-4N7ZZDFJ.js} +16 -16
- package/{banking-CWQFQKZB.js → banking-HBODHOCJ.js} +5 -5
- package/{browser-BI6UFWPH.js → browser-KT5KVZY2.js} +7 -7
- package/{chat-MKIW4FPP.js → chat-6RRIXDF5.js} +17 -17
- package/{chunk-YDS3X7KB.js → chunk-4ATK3VFX.js} +4 -4
- package/{chunk-CEJGHPF3.js → chunk-4CXT7THL.js} +4 -4
- package/{chunk-RUKMHBNQ.js → chunk-4QGLWHVD.js} +3 -3
- package/{chunk-U2GQH6AD.js → chunk-4SGKKHZW.js} +5 -5
- package/{chunk-AUWSMG4F.js → chunk-52CNCL6Y.js} +5 -2
- package/{chunk-AUWSMG4F.js.map → chunk-52CNCL6Y.js.map} +1 -1
- package/{chunk-A6ZRMNM3.js → chunk-5RY3DZTW.js} +3 -4
- package/{chunk-A6ZRMNM3.js.map → chunk-5RY3DZTW.js.map} +1 -1
- package/{chunk-KER77KJB.js → chunk-AFKJ4MU3.js} +4 -4
- package/{chunk-SJPOFQJU.js → chunk-AMLZWOJK.js} +4 -4
- package/{chunk-ZXSCBS77.js → chunk-B3U6VDOF.js} +5 -5
- package/{chunk-PFWBO2VK.js → chunk-B6RXOHA2.js} +4 -4
- package/{chunk-2SJTFDC2.js → chunk-BB6QIVAM.js} +4 -4
- package/{chunk-NDYPPVD3.js → chunk-BMQE7GWV.js} +2 -2
- package/{chunk-LIYPTQAO.js → chunk-BMRAUGFL.js} +4 -4
- package/{chunk-45J5VDVQ.js → chunk-BS6PZU7T.js} +2 -2
- package/{chunk-DUA6CF7E.js → chunk-C4LKBBIS.js} +8 -8
- package/{chunk-C62A6LD6.js → chunk-CBNDRL4P.js} +3 -3
- package/{chunk-SMPSKBAP.js → chunk-CMWQJ3XO.js} +4 -4
- package/{chunk-NKYACNWA.js → chunk-DUWZNPUA.js} +2 -2
- package/{chunk-BVCE3PAD.js → chunk-G2HB4N56.js} +2 -2
- package/{chunk-UIXUGVZB.js → chunk-HMH473P6.js} +4 -4
- package/{chunk-GY7D76EZ.js → chunk-HMUAPCDD.js} +4 -4
- package/{chunk-HHHHZMTA.js → chunk-HXIDRGW4.js} +5 -5
- package/{chunk-HZYOJTEE.js → chunk-JXWXVXOW.js} +7 -7
- package/{chunk-32FE3MDA.js → chunk-KHPTA6UQ.js} +2 -2
- package/{chunk-JJWFO27K.js → chunk-KWHNNLC5.js} +4 -4
- package/{chunk-XRZKJACM.js → chunk-LLQCX33F.js} +4 -4
- package/{chunk-T2X2EGV2.js → chunk-LO24UKAH.js} +5 -5
- package/{chunk-U6A2RPHO.js → chunk-ML33LZ5V.js} +4 -4
- package/{chunk-JV6LM2YC.js → chunk-NIG6LRRX.js} +3 -3
- package/{chunk-JAUTPXVK.js → chunk-PAULHBEP.js} +2 -2
- package/{chunk-CCTF3YVW.js → chunk-PO3DAXC6.js} +4 -4
- package/{chunk-E2TQAKNL.js → chunk-QQT7SBVV.js} +6 -6
- package/{chunk-J45P5ALH.js → chunk-RAQ7DE6K.js} +2 -2
- package/{chunk-RTCRU35A.js → chunk-RKOODQ77.js} +4 -4
- package/{chunk-KKO2XGLQ.js → chunk-T656XQMT.js} +7 -2
- package/chunk-T656XQMT.js.map +1 -0
- package/{chunk-7UZXNER2.js → chunk-TDLAIIDN.js} +4 -4
- package/{chunk-ZKNJW4K6.js → chunk-TQKKFLRI.js} +12 -13
- package/{chunk-ZKNJW4K6.js.map → chunk-TQKKFLRI.js.map} +1 -1
- package/{chunk-GHKWW4NC.js → chunk-U2PPHCTL.js} +4 -4
- package/{chunk-VNNPAHD3.js → chunk-UH7XK55U.js} +2 -2
- package/{chunk-SA4DYSBR.js → chunk-VCAMYQOI.js} +4 -4
- package/chunk-WERS62WT.js +21130 -0
- package/chunk-WERS62WT.js.map +1 -0
- package/{chunk-CD2BLKGC.js → chunk-XIZVMBW4.js} +4 -4
- package/{chunk-SVFOPAWB.js → chunk-XJXBVERS.js} +2 -2
- package/{chunk-LYLDVUHT.js → chunk-XQ4CXHGB.js} +4 -4
- package/{chunk-RTEEWZUT.js → chunk-XW5M3ADB.js} +3 -3
- package/{chunk-4FTIKZKP.js → chunk-YEXLP5U7.js} +5 -5
- package/{chunk-GV3PG6CZ.js → chunk-ZEFTCUFJ.js} +4 -4
- package/{computer-use-6AEVW47F.js → computer-use-VG65FLDL.js} +8 -8
- package/{connector-XDQ6JEBU.js → connector-25H4SU52.js} +19 -19
- package/{credit-JPQA5XPA.js → credit-D3RLUW6C.js} +10 -10
- package/{developer-support-V7NZOU2P.js → developer-support-NMZJG32A.js} +7 -7
- package/{doctor-FJO24TG3.js → doctor-MXF4RDPN.js} +13 -13
- package/{esm-GRI4FR5B.js → esm-XLHK4LBA.js} +3 -3
- package/{feishu-PNOAM33Q.js → feishu-SHMTS5ZM.js} +7 -7
- package/{finance-55OJ6GYP.js → finance-A3QUYKGH.js} +7 -7
- package/{generate-XUKBK523.js → generate-QQ6ZTCR2.js} +21 -21
- package/{getMachineId-bsd-UR6WEJ6T.js → getMachineId-bsd-WOC3WZM5.js} +4 -4
- package/{getMachineId-darwin-O3UESQMK.js → getMachineId-darwin-K35YZX2F.js} +4 -4
- package/{getMachineId-linux-EGNGXDN3.js → getMachineId-linux-A4QJCCBS.js} +3 -3
- package/{getMachineId-unsupported-EZ7SMARH.js → getMachineId-unsupported-UOQIWS5S.js} +3 -3
- package/{getMachineId-win-CM62ICHH.js → getMachineId-win-YJDJQYJQ.js} +4 -4
- package/{github-V4MD2PMM.js → github-5M3YRGDF.js} +7 -7
- package/{goal-FS5FJKVU.js → goal-F6G5KOI2.js} +7 -7
- package/{host-GITTJ6PR.js → host-6UT2OW4I.js} +7 -7
- package/{intro-2UYXBOHI.js → intro-HYSW634N.js} +3 -3
- package/{logs-EEUIGYUD.js → logs-YH346I7J.js} +32 -32
- package/{mail-G4SAJSBD.js → mail-SC44CH54.js} +17 -17
- package/{maps-7ANNU3BX.js → maps-YQ62JSHO.js} +5 -5
- package/{model-DSPDCJLB.js → model-PPOIXDVZ.js} +9 -9
- package/{model-provider-RZQ45PNG.js → model-provider-PD7FGL7A.js} +9 -9
- package/package.json +2 -5
- package/{people-search-I7PUMF5M.js → people-search-VS5J4HME.js} +7 -7
- package/{phone-SSAPGMTW.js → phone-YZ7TX25A.js} +7 -7
- package/{recognize-D7VORZBN.js → recognize-XKO53YEI.js} +9 -9
- package/{resource-76IV3TMW.js → resource-V43QBVKO.js} +8 -8
- package/{scrape-JBDLNTLB.js → scrape-PDMJI2PY.js} +7 -7
- package/{search-UNZNUTZX.js → search-USJZ3HKX.js} +33 -33
- package/{slack-AAH6GG2W.js → slack-K557P6WW.js} +9 -9
- package/{teams-6OPXE4TX.js → teams-HN2UOU3U.js} +7 -7
- package/{telegram-RRZG73RT.js → telegram-YCRQFLJC.js} +7 -7
- package/{undici-MBS5ACFE.js → undici-YESHDB4G.js} +2 -2
- package/{upgrade-I5IL4UQL.js → upgrade-VVJ3KJ6V.js} +7 -7
- package/{video-HV44W4X7.js → video-DNGIFKVY.js} +8 -8
- package/{weather-EQ7CSADB.js → weather-4Z7OZ2TP.js} +5 -5
- package/{web-6LIMWEOZ.js → web-C6RLBMZM.js} +8 -8
- package/{web-search-AT7WONZN.js → web-search-CDPWLF74.js} +7 -7
- package/{whoami-RKTLLSI4.js → whoami-VDI5345O.js} +17 -17
- package/{workflow-ZH32P622.js → workflow-VEZ3NTPR.js} +19 -19
- package/zero.js +46 -46
- package/chunk-J3ZRXVI6.js +0 -740
- package/chunk-J3ZRXVI6.js.map +0 -1
- package/chunk-KKO2XGLQ.js.map +0 -1
- /package/{agent-4F3XAJWN.js.map → agent-4N7ZZDFJ.js.map} +0 -0
- /package/{banking-CWQFQKZB.js.map → banking-HBODHOCJ.js.map} +0 -0
- /package/{browser-BI6UFWPH.js.map → browser-KT5KVZY2.js.map} +0 -0
- /package/{chat-MKIW4FPP.js.map → chat-6RRIXDF5.js.map} +0 -0
- /package/{chunk-YDS3X7KB.js.map → chunk-4ATK3VFX.js.map} +0 -0
- /package/{chunk-CEJGHPF3.js.map → chunk-4CXT7THL.js.map} +0 -0
- /package/{chunk-RUKMHBNQ.js.map → chunk-4QGLWHVD.js.map} +0 -0
- /package/{chunk-U2GQH6AD.js.map → chunk-4SGKKHZW.js.map} +0 -0
- /package/{chunk-KER77KJB.js.map → chunk-AFKJ4MU3.js.map} +0 -0
- /package/{chunk-SJPOFQJU.js.map → chunk-AMLZWOJK.js.map} +0 -0
- /package/{chunk-ZXSCBS77.js.map → chunk-B3U6VDOF.js.map} +0 -0
- /package/{chunk-PFWBO2VK.js.map → chunk-B6RXOHA2.js.map} +0 -0
- /package/{chunk-2SJTFDC2.js.map → chunk-BB6QIVAM.js.map} +0 -0
- /package/{chunk-NDYPPVD3.js.map → chunk-BMQE7GWV.js.map} +0 -0
- /package/{chunk-LIYPTQAO.js.map → chunk-BMRAUGFL.js.map} +0 -0
- /package/{chunk-45J5VDVQ.js.map → chunk-BS6PZU7T.js.map} +0 -0
- /package/{chunk-DUA6CF7E.js.map → chunk-C4LKBBIS.js.map} +0 -0
- /package/{chunk-C62A6LD6.js.map → chunk-CBNDRL4P.js.map} +0 -0
- /package/{chunk-SMPSKBAP.js.map → chunk-CMWQJ3XO.js.map} +0 -0
- /package/{chunk-NKYACNWA.js.map → chunk-DUWZNPUA.js.map} +0 -0
- /package/{chunk-BVCE3PAD.js.map → chunk-G2HB4N56.js.map} +0 -0
- /package/{chunk-UIXUGVZB.js.map → chunk-HMH473P6.js.map} +0 -0
- /package/{chunk-GY7D76EZ.js.map → chunk-HMUAPCDD.js.map} +0 -0
- /package/{chunk-HHHHZMTA.js.map → chunk-HXIDRGW4.js.map} +0 -0
- /package/{chunk-HZYOJTEE.js.map → chunk-JXWXVXOW.js.map} +0 -0
- /package/{chunk-32FE3MDA.js.map → chunk-KHPTA6UQ.js.map} +0 -0
- /package/{chunk-JJWFO27K.js.map → chunk-KWHNNLC5.js.map} +0 -0
- /package/{chunk-XRZKJACM.js.map → chunk-LLQCX33F.js.map} +0 -0
- /package/{chunk-T2X2EGV2.js.map → chunk-LO24UKAH.js.map} +0 -0
- /package/{chunk-U6A2RPHO.js.map → chunk-ML33LZ5V.js.map} +0 -0
- /package/{chunk-JV6LM2YC.js.map → chunk-NIG6LRRX.js.map} +0 -0
- /package/{chunk-JAUTPXVK.js.map → chunk-PAULHBEP.js.map} +0 -0
- /package/{chunk-CCTF3YVW.js.map → chunk-PO3DAXC6.js.map} +0 -0
- /package/{chunk-E2TQAKNL.js.map → chunk-QQT7SBVV.js.map} +0 -0
- /package/{chunk-J45P5ALH.js.map → chunk-RAQ7DE6K.js.map} +0 -0
- /package/{chunk-RTCRU35A.js.map → chunk-RKOODQ77.js.map} +0 -0
- /package/{chunk-7UZXNER2.js.map → chunk-TDLAIIDN.js.map} +0 -0
- /package/{chunk-GHKWW4NC.js.map → chunk-U2PPHCTL.js.map} +0 -0
- /package/{chunk-VNNPAHD3.js.map → chunk-UH7XK55U.js.map} +0 -0
- /package/{chunk-SA4DYSBR.js.map → chunk-VCAMYQOI.js.map} +0 -0
- /package/{chunk-CD2BLKGC.js.map → chunk-XIZVMBW4.js.map} +0 -0
- /package/{chunk-SVFOPAWB.js.map → chunk-XJXBVERS.js.map} +0 -0
- /package/{chunk-LYLDVUHT.js.map → chunk-XQ4CXHGB.js.map} +0 -0
- /package/{chunk-RTEEWZUT.js.map → chunk-XW5M3ADB.js.map} +0 -0
- /package/{chunk-4FTIKZKP.js.map → chunk-YEXLP5U7.js.map} +0 -0
- /package/{chunk-GV3PG6CZ.js.map → chunk-ZEFTCUFJ.js.map} +0 -0
- /package/{computer-use-6AEVW47F.js.map → computer-use-VG65FLDL.js.map} +0 -0
- /package/{connector-XDQ6JEBU.js.map → connector-25H4SU52.js.map} +0 -0
- /package/{credit-JPQA5XPA.js.map → credit-D3RLUW6C.js.map} +0 -0
- /package/{developer-support-V7NZOU2P.js.map → developer-support-NMZJG32A.js.map} +0 -0
- /package/{doctor-FJO24TG3.js.map → doctor-MXF4RDPN.js.map} +0 -0
- /package/{esm-GRI4FR5B.js.map → esm-XLHK4LBA.js.map} +0 -0
- /package/{feishu-PNOAM33Q.js.map → feishu-SHMTS5ZM.js.map} +0 -0
- /package/{finance-55OJ6GYP.js.map → finance-A3QUYKGH.js.map} +0 -0
- /package/{generate-XUKBK523.js.map → generate-QQ6ZTCR2.js.map} +0 -0
- /package/{getMachineId-bsd-UR6WEJ6T.js.map → getMachineId-bsd-WOC3WZM5.js.map} +0 -0
- /package/{getMachineId-darwin-O3UESQMK.js.map → getMachineId-darwin-K35YZX2F.js.map} +0 -0
- /package/{getMachineId-linux-EGNGXDN3.js.map → getMachineId-linux-A4QJCCBS.js.map} +0 -0
- /package/{getMachineId-unsupported-EZ7SMARH.js.map → getMachineId-unsupported-UOQIWS5S.js.map} +0 -0
- /package/{getMachineId-win-CM62ICHH.js.map → getMachineId-win-YJDJQYJQ.js.map} +0 -0
- /package/{github-V4MD2PMM.js.map → github-5M3YRGDF.js.map} +0 -0
- /package/{goal-FS5FJKVU.js.map → goal-F6G5KOI2.js.map} +0 -0
- /package/{host-GITTJ6PR.js.map → host-6UT2OW4I.js.map} +0 -0
- /package/{intro-2UYXBOHI.js.map → intro-HYSW634N.js.map} +0 -0
- /package/{logs-EEUIGYUD.js.map → logs-YH346I7J.js.map} +0 -0
- /package/{mail-G4SAJSBD.js.map → mail-SC44CH54.js.map} +0 -0
- /package/{maps-7ANNU3BX.js.map → maps-YQ62JSHO.js.map} +0 -0
- /package/{model-DSPDCJLB.js.map → model-PPOIXDVZ.js.map} +0 -0
- /package/{model-provider-RZQ45PNG.js.map → model-provider-PD7FGL7A.js.map} +0 -0
- /package/{people-search-I7PUMF5M.js.map → people-search-VS5J4HME.js.map} +0 -0
- /package/{phone-SSAPGMTW.js.map → phone-YZ7TX25A.js.map} +0 -0
- /package/{recognize-D7VORZBN.js.map → recognize-XKO53YEI.js.map} +0 -0
- /package/{resource-76IV3TMW.js.map → resource-V43QBVKO.js.map} +0 -0
- /package/{scrape-JBDLNTLB.js.map → scrape-PDMJI2PY.js.map} +0 -0
- /package/{search-UNZNUTZX.js.map → search-USJZ3HKX.js.map} +0 -0
- /package/{slack-AAH6GG2W.js.map → slack-K557P6WW.js.map} +0 -0
- /package/{teams-6OPXE4TX.js.map → teams-HN2UOU3U.js.map} +0 -0
- /package/{telegram-RRZG73RT.js.map → telegram-YCRQFLJC.js.map} +0 -0
- /package/{undici-MBS5ACFE.js.map → undici-YESHDB4G.js.map} +0 -0
- /package/{upgrade-I5IL4UQL.js.map → upgrade-VVJ3KJ6V.js.map} +0 -0
- /package/{video-HV44W4X7.js.map → video-DNGIFKVY.js.map} +0 -0
- /package/{weather-EQ7CSADB.js.map → weather-4Z7OZ2TP.js.map} +0 -0
- /package/{web-6LIMWEOZ.js.map → web-C6RLBMZM.js.map} +0 -0
- /package/{web-search-AT7WONZN.js.map → web-search-CDPWLF74.js.map} +0 -0
- /package/{whoami-RKTLLSI4.js.map → whoami-VDI5345O.js.map} +0 -0
- /package/{workflow-ZH32P622.js.map → workflow-VEZ3NTPR.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/constants.js","../../../node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node-gyp-build.js","../../../node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/index.js","../../../node_modules/.pnpm/bufferutil@4.1.0/node_modules/bufferutil/fallback.js","../../../node_modules/.pnpm/bufferutil@4.1.0/node_modules/bufferutil/index.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/buffer-util.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/limiter.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/permessage-deflate.js","../../../node_modules/.pnpm/utf-8-validate@6.0.6/node_modules/utf-8-validate/fallback.js","../../../node_modules/.pnpm/utf-8-validate@6.0.6/node_modules/utf-8-validate/index.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/validation.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/receiver.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/sender.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/event-target.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/extension.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/websocket.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/stream.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/subprotocol.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/lib/websocket-server.js","../../../node_modules/.pnpm/ws@8.21.0_bufferutil@4.1.0_utf-8-validate@6.0.6/node_modules/ws/index.js","../../../node_modules/.pnpm/@sindresorhus+is@4.6.0/node_modules/@sindresorhus/is/dist/index.js","../../../node_modules/.pnpm/p-cancelable@2.1.1/node_modules/p-cancelable/index.js","../../../node_modules/.pnpm/defer-to-connect@2.0.1/node_modules/defer-to-connect/dist/source/index.js","../../../node_modules/.pnpm/@szmarczak+http-timer@4.0.6/node_modules/@szmarczak/http-timer/dist/source/index.js","../../../node_modules/.pnpm/cacheable-lookup@5.0.4/node_modules/cacheable-lookup/source/index.js","../../../node_modules/.pnpm/normalize-url@6.1.0/node_modules/normalize-url/index.js","../../../node_modules/.pnpm/wrappy@1.0.2/node_modules/wrappy/wrappy.js","../../../node_modules/.pnpm/once@1.4.0/node_modules/once/once.js","../../../node_modules/.pnpm/end-of-stream@1.4.5/node_modules/end-of-stream/index.js","../../../node_modules/.pnpm/pump@3.0.4/node_modules/pump/index.js","../../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/buffer-stream.js","../../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/index.js","../../../node_modules/.pnpm/http-cache-semantics@4.2.0/node_modules/http-cache-semantics/index.js","../../../node_modules/.pnpm/lowercase-keys@2.0.0/node_modules/lowercase-keys/index.js","../../../node_modules/.pnpm/responselike@2.0.1/node_modules/responselike/src/index.js","../../../node_modules/.pnpm/mimic-response@1.0.1/node_modules/mimic-response/index.js","../../../node_modules/.pnpm/clone-response@1.0.3/node_modules/clone-response/src/index.js","../../../node_modules/.pnpm/json-buffer@3.0.1/node_modules/json-buffer/index.js","../../../node_modules/.pnpm/keyv@4.5.4/node_modules/keyv/src/index.js","../../../node_modules/.pnpm/cacheable-request@7.0.4/node_modules/cacheable-request/src/index.js","../../../node_modules/.pnpm/mimic-response@3.1.0/node_modules/mimic-response/index.js","../../../node_modules/.pnpm/decompress-response@6.0.0/node_modules/decompress-response/index.js","../../../node_modules/.pnpm/quick-lru@5.1.1/node_modules/quick-lru/index.js","../../../node_modules/.pnpm/http2-wrapper@1.0.3/node_modules/http2-wrapper/source/agent.js","../../../node_modules/.pnpm/http2-wrapper@1.0.3/node_modules/http2-wrapper/source/incoming-message.js","../../../node_modules/.pnpm/http2-wrapper@1.0.3/node_modules/http2-wrapper/source/utils/url-to-options.js","../../../node_modules/.pnpm/http2-wrapper@1.0.3/node_modules/http2-wrapper/source/utils/proxy-events.js","../../../node_modules/.pnpm/http2-wrapper@1.0.3/node_modules/http2-wrapper/source/utils/is-request-pseudo-header.js","../../../node_modules/.pnpm/http2-wrapper@1.0.3/node_modules/http2-wrapper/source/utils/errors.js","../../../node_modules/.pnpm/http2-wrapper@1.0.3/node_modules/http2-wrapper/source/client-request.js","../../../node_modules/.pnpm/resolve-alpn@1.2.1/node_modules/resolve-alpn/index.js","../../../node_modules/.pnpm/http2-wrapper@1.0.3/node_modules/http2-wrapper/source/utils/calculate-server-name.js","../../../node_modules/.pnpm/http2-wrapper@1.0.3/node_modules/http2-wrapper/source/auto.js","../../../node_modules/.pnpm/http2-wrapper@1.0.3/node_modules/http2-wrapper/source/index.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/is-form-data.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/get-body-size.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/proxy-events.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/unhandle.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/timed-out.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/url-to-options.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/options-to-url.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/weakable-map.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/get-buffer.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/dns-ip-version.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/utils/is-response-ok.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/utils/deprecation-warning.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/as-promise/normalize-arguments.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/calculate-retry-delay.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/core/index.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/as-promise/types.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/as-promise/parse-body.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/as-promise/index.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/as-promise/create-rejection.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/utils/deep-freeze.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/types.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/create.js","../../../node_modules/.pnpm/got@11.8.6/node_modules/got/dist/source/index.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/bops/from.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/bops/to.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/bops/is.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/bops/subarray.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/bops/join.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/bops/copy.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/bops/create.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/bops/read.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/bops/write.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/bops/index.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/node_modules/@ably/msgpack-js/msgpack.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/platform.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/util/logger.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/util/utils.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/errorinfo.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/package.json","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/util/defaults.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/util/multicaster.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/constants/HttpMethods.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/constants/HttpStatusCodes.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/auth.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/types/http.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/util/eventemitter.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/protocolmessagecommon.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/basemessage.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/baseclient.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/devicedetails.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/resource.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/paginatedresource.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/pushchannelsubscription.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/push.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/presencemessage.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/restpresence.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/message.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/restchannel.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/stats.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/restchannelmixin.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/restpresencemixin.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/rest.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/baserest.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/modularplugins.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/defaultmessage.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/defaultpresencemessage.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/annotation.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/defaultannotation.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/restannotations.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/types/protocolmessage.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/channelstatechange.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/realtimechannel.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/realtimeannotations.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/defaultrest.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/transport/messagequeue.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/transport/protocol.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/connectionstatechange.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/transport/connectionerrors.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/transport/transport.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/constants/TransportName.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/transport/connectionmanager.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/connection.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/baserealtime.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/presencemap.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/realtimepresence.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/transport/websockettransport.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/filteredsubscriptions.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/client/defaultrealtime.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/platform/nodejs/lib/util/bufferutils.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/platform/nodejs/lib/util/crypto.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/platform/nodejs/lib/util/http.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/platform/nodejs/config.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/constants/XHRStates.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/common/lib/transport/comettransport.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/platform/nodejs/lib/transport/nodecomettransport.js","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/platform/nodejs/lib/transport/index.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/platform/nodejs/lib/util/defaults.ts","../../../node_modules/.pnpm/ably@2.21.0_bufferutil@4.1.0_react-dom@19.2.6_react@19.2.6__react@19.2.6_utf-8-validate@6.0.6/node_modules/ably/src/platform/nodejs/index.ts","../src/lib/api/domains/web.ts"],"sourcesContent":["'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n CLOSE_TIMEOUT: 30000,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n","var fs = require('fs')\nvar path = require('path')\nvar os = require('os')\n\n// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression'\nvar runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\n\nvar vars = (process.config && process.config.variables) || {}\nvar prebuildsOnly = !!process.env.PREBUILDS_ONLY\nvar abi = process.versions.modules // TODO: support old node where this is undef\nvar runtime = isElectron() ? 'electron' : (isNwjs() ? 'node-webkit' : 'node')\n\nvar arch = process.env.npm_config_arch || os.arch()\nvar platform = process.env.npm_config_platform || os.platform()\nvar libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc')\nvar armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : vars.arm_version) || ''\nvar uv = (process.versions.uv || '').split('.')[0]\n\nmodule.exports = load\n\nfunction load (dir) {\n return runtimeRequire(load.resolve(dir))\n}\n\nload.resolve = load.path = function (dir) {\n dir = path.resolve(dir || '.')\n\n try {\n var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_')\n if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD']\n } catch (err) {}\n\n if (!prebuildsOnly) {\n var release = getFirst(path.join(dir, 'build/Release'), matchBuild)\n if (release) return release\n\n var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild)\n if (debug) return debug\n }\n\n var prebuild = resolve(dir)\n if (prebuild) return prebuild\n\n var nearby = resolve(path.dirname(process.execPath))\n if (nearby) return nearby\n\n var target = [\n 'platform=' + platform,\n 'arch=' + arch,\n 'runtime=' + runtime,\n 'abi=' + abi,\n 'uv=' + uv,\n armv ? 'armv=' + armv : '',\n 'libc=' + libc,\n 'node=' + process.versions.node,\n process.versions.electron ? 'electron=' + process.versions.electron : '',\n typeof __webpack_require__ === 'function' ? 'webpack=true' : '' // eslint-disable-line\n ].filter(Boolean).join(' ')\n\n throw new Error('No native build was found for ' + target + '\\n loaded from: ' + dir + '\\n')\n\n function resolve (dir) {\n // Find matching \"prebuilds/<platform>-<arch>\" directory\n var tuples = readdirSync(path.join(dir, 'prebuilds')).map(parseTuple)\n var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0]\n if (!tuple) return\n\n // Find most specific flavor first\n var prebuilds = path.join(dir, 'prebuilds', tuple.name)\n var parsed = readdirSync(prebuilds).map(parseTags)\n var candidates = parsed.filter(matchTags(runtime, abi))\n var winner = candidates.sort(compareTags(runtime))[0]\n if (winner) return path.join(prebuilds, winner.file)\n }\n}\n\nfunction readdirSync (dir) {\n try {\n return fs.readdirSync(dir)\n } catch (err) {\n return []\n }\n}\n\nfunction getFirst (dir, filter) {\n var files = readdirSync(dir).filter(filter)\n return files[0] && path.join(dir, files[0])\n}\n\nfunction matchBuild (name) {\n return /\\.node$/.test(name)\n}\n\nfunction parseTuple (name) {\n // Example: darwin-x64+arm64\n var arr = name.split('-')\n if (arr.length !== 2) return\n\n var platform = arr[0]\n var architectures = arr[1].split('+')\n\n if (!platform) return\n if (!architectures.length) return\n if (!architectures.every(Boolean)) return\n\n return { name, platform, architectures }\n}\n\nfunction matchTuple (platform, arch) {\n return function (tuple) {\n if (tuple == null) return false\n if (tuple.platform !== platform) return false\n return tuple.architectures.includes(arch)\n }\n}\n\nfunction compareTuples (a, b) {\n // Prefer single-arch prebuilds over multi-arch\n return a.architectures.length - b.architectures.length\n}\n\nfunction parseTags (file) {\n var arr = file.split('.')\n var extension = arr.pop()\n var tags = { file: file, specificity: 0 }\n\n if (extension !== 'node') return\n\n for (var i = 0; i < arr.length; i++) {\n var tag = arr[i]\n\n if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') {\n tags.runtime = tag\n } else if (tag === 'napi') {\n tags.napi = true\n } else if (tag.slice(0, 3) === 'abi') {\n tags.abi = tag.slice(3)\n } else if (tag.slice(0, 2) === 'uv') {\n tags.uv = tag.slice(2)\n } else if (tag.slice(0, 4) === 'armv') {\n tags.armv = tag.slice(4)\n } else if (tag === 'glibc' || tag === 'musl') {\n tags.libc = tag\n } else {\n continue\n }\n\n tags.specificity++\n }\n\n return tags\n}\n\nfunction matchTags (runtime, abi) {\n return function (tags) {\n if (tags == null) return false\n if (tags.runtime && tags.runtime !== runtime && !runtimeAgnostic(tags)) return false\n if (tags.abi && tags.abi !== abi && !tags.napi) return false\n if (tags.uv && tags.uv !== uv) return false\n if (tags.armv && tags.armv !== armv) return false\n if (tags.libc && tags.libc !== libc) return false\n\n return true\n }\n}\n\nfunction runtimeAgnostic (tags) {\n return tags.runtime === 'node' && tags.napi\n}\n\nfunction compareTags (runtime) {\n // Precedence: non-agnostic runtime, abi over napi, then by specificity.\n return function (a, b) {\n if (a.runtime !== b.runtime) {\n return a.runtime === runtime ? -1 : 1\n } else if (a.abi !== b.abi) {\n return a.abi ? -1 : 1\n } else if (a.specificity !== b.specificity) {\n return a.specificity > b.specificity ? -1 : 1\n } else {\n return 0\n }\n }\n}\n\nfunction isNwjs () {\n return !!(process.versions && process.versions.nw)\n}\n\nfunction isElectron () {\n if (process.versions && process.versions.electron) return true\n if (process.env.ELECTRON_RUN_AS_NODE) return true\n return typeof window !== 'undefined' && window.process && window.process.type === 'renderer'\n}\n\nfunction isAlpine (platform) {\n return platform === 'linux' && fs.existsSync('/etc/alpine-release')\n}\n\n// Exposed for unit tests\n// TODO: move to lib\nload.parseTags = parseTags\nload.matchTags = matchTags\nload.compareTags = compareTags\nload.parseTuple = parseTuple\nload.matchTuple = matchTuple\nload.compareTuples = compareTuples\n","const runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\nif (typeof runtimeRequire.addon === 'function') { // if the platform supports native resolving prefer that\n module.exports = runtimeRequire.addon.bind(runtimeRequire)\n} else { // else use the runtime version here\n module.exports = require('./node-gyp-build.js')\n}\n","'use strict';\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nconst mask = (source, mask, output, offset, length) => {\n for (var i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n};\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nconst unmask = (buffer, mask) => {\n // Required until https://github.com/nodejs/node/issues/9006 is resolved.\n const length = buffer.length;\n for (var i = 0; i < length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n};\n\nmodule.exports = { mask, unmask };\n","'use strict';\n\ntry {\n module.exports = require('node-gyp-build')(__dirname);\n} catch (e) {\n module.exports = require('./fallback');\n}\n","'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {Boolean} [options.isServer=false] Create the instance in either\n * server or client mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n */\n constructor(options) {\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._maxPayload = this._options.maxPayload | 0;\n this._isServer = !!this._options.isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0x00) { // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) { // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) { // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80 || // overlong\n buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0 // surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) { // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80 || // overlong\n buf[i] === 0xf4 && buf[i + 1] > 0x8f || buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = isValidUTF8;\n","'use strict';\n\ntry {\n module.exports = require('node-gyp-build')(__dirname);\n} catch (e) {\n module.exports = require('./fallback');\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxBufferedChunks=0] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=0] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxBufferedChunks = options.maxBufferedChunks | 0;\n this._maxFragments = options.maxFragments | 0;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n if (\n this._maxBufferedChunks > 0 &&\n this._buffers.length >= this._maxBufferedChunks\n ) {\n cb(\n this.createError(\n RangeError,\n 'Too many buffered chunks',\n false,\n 1008,\n 'WS_ERR_TOO_MANY_BUFFERED_PARTS'\n )\n );\n return;\n }\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n if (\n this._maxFragments > 0 &&\n this._fragments.length >= this._maxFragments\n ) {\n const error = this.createError(\n RangeError,\n 'Too many message fragments',\n false,\n 1008,\n 'WS_ERR_TOO_MANY_BUFFERED_PARTS'\n );\n\n cb(error);\n return;\n }\n\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._maxFragments > 0 &&\n this._fragments.length >= this._maxFragments\n ) {\n const error = this.createError(\n RangeError,\n 'Too many message fragments',\n false,\n 1008,\n 'WS_ERR_TOO_MANY_BUFFERED_PARTS'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\nconst {\n types: { isUint8Array }\n} = require('util');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else if (isUint8Array(data)) {\n buf.set(data, 2);\n } else {\n throw new TypeError('Second argument must be a string or a Uint8Array');\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n CLOSE_TIMEOUT,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._closeTimeout = options.closeTimeout;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxBufferedChunks=0] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=0] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxBufferedChunks: options.maxBufferedChunks,\n maxFragments: options.maxFragments,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to wait\n * for the closing handshake to finish after `websocket.close()` is called\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxBufferedChunks=1048576] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=131072] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n closeTimeout: CLOSE_TIMEOUT,\n protocolVersion: protocolVersions[1],\n maxBufferedChunks: 1024 * 1024,\n maxFragments: 128 * 1024,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n websocket._closeTimeout = opts.closeTimeout;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate({\n ...opts.perMessageDeflate,\n isServer: false,\n maxPayload: opts.maxPayload\n });\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxBufferedChunks: opts.maxBufferedChunks,\n maxFragments: opts.maxFragments,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n websocket._closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written. If instead, the\n // socket is paused, any possible buffered data will be read as a single\n // chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n this._readableState.length !== 0\n ) {\n const chunk = this.read(this._readableState.length);\n\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { CLOSE_TIMEOUT, GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to\n * wait for the closing handshake to finish after `websocket.close()` is\n * called\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxBufferedChunks=1048576] The maximum number of\n * buffered data chunks\n * @param {Number} [options.maxFragments=131072] The maximum number of message\n * fragments\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxBufferedChunks: 1024 * 1024,\n maxFragments: 128 * 1024,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n closeTimeout: CLOSE_TIMEOUT,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate({\n ...this.options.perMessageDeflate,\n isServer: true,\n maxPayload: this.options.maxPayload\n });\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxBufferedChunks: this.options.maxBufferedChunks,\n maxFragments: this.options.maxFragments,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n","'use strict';\n\nconst createWebSocketStream = require('./lib/stream');\nconst extension = require('./lib/extension');\nconst PerMessageDeflate = require('./lib/permessage-deflate');\nconst Receiver = require('./lib/receiver');\nconst Sender = require('./lib/sender');\nconst subprotocol = require('./lib/subprotocol');\nconst WebSocket = require('./lib/websocket');\nconst WebSocketServer = require('./lib/websocket-server');\n\nWebSocket.createWebSocketStream = createWebSocketStream;\nWebSocket.extension = extension;\nWebSocket.PerMessageDeflate = PerMessageDeflate;\nWebSocket.Receiver = Receiver;\nWebSocket.Sender = Sender;\nWebSocket.Server = WebSocketServer;\nWebSocket.subprotocol = subprotocol;\nWebSocket.WebSocket = WebSocket;\nWebSocket.WebSocketServer = WebSocketServer;\n\nmodule.exports = WebSocket;\n","\"use strict\";\n/// <reference lib=\"es2018\"/>\n/// <reference lib=\"dom\"/>\n/// <reference types=\"node\"/>\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst typedArrayTypeNames = [\n 'Int8Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int16Array',\n 'Uint16Array',\n 'Int32Array',\n 'Uint32Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array'\n];\nfunction isTypedArrayName(name) {\n return typedArrayTypeNames.includes(name);\n}\nconst objectTypeNames = [\n 'Function',\n 'Generator',\n 'AsyncGenerator',\n 'GeneratorFunction',\n 'AsyncGeneratorFunction',\n 'AsyncFunction',\n 'Observable',\n 'Array',\n 'Buffer',\n 'Blob',\n 'Object',\n 'RegExp',\n 'Date',\n 'Error',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'ArrayBuffer',\n 'SharedArrayBuffer',\n 'DataView',\n 'Promise',\n 'URL',\n 'FormData',\n 'URLSearchParams',\n 'HTMLElement',\n ...typedArrayTypeNames\n];\nfunction isObjectTypeName(name) {\n return objectTypeNames.includes(name);\n}\nconst primitiveTypeNames = [\n 'null',\n 'undefined',\n 'string',\n 'number',\n 'bigint',\n 'boolean',\n 'symbol'\n];\nfunction isPrimitiveTypeName(name) {\n return primitiveTypeNames.includes(name);\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction isOfType(type) {\n return (value) => typeof value === type;\n}\nconst { toString } = Object.prototype;\nconst getObjectType = (value) => {\n const objectTypeName = toString.call(value).slice(8, -1);\n if (/HTML\\w+Element/.test(objectTypeName) && is.domElement(value)) {\n return 'HTMLElement';\n }\n if (isObjectTypeName(objectTypeName)) {\n return objectTypeName;\n }\n return undefined;\n};\nconst isObjectOfType = (type) => (value) => getObjectType(value) === type;\nfunction is(value) {\n if (value === null) {\n return 'null';\n }\n switch (typeof value) {\n case 'undefined':\n return 'undefined';\n case 'string':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'function':\n return 'Function';\n case 'bigint':\n return 'bigint';\n case 'symbol':\n return 'symbol';\n default:\n }\n if (is.observable(value)) {\n return 'Observable';\n }\n if (is.array(value)) {\n return 'Array';\n }\n if (is.buffer(value)) {\n return 'Buffer';\n }\n const tagType = getObjectType(value);\n if (tagType) {\n return tagType;\n }\n if (value instanceof String || value instanceof Boolean || value instanceof Number) {\n throw new TypeError('Please don\\'t use object wrappers for primitive types');\n }\n return 'Object';\n}\nis.undefined = isOfType('undefined');\nis.string = isOfType('string');\nconst isNumberType = isOfType('number');\nis.number = (value) => isNumberType(value) && !is.nan(value);\nis.bigint = isOfType('bigint');\n// eslint-disable-next-line @typescript-eslint/ban-types\nis.function_ = isOfType('function');\nis.null_ = (value) => value === null;\nis.class_ = (value) => is.function_(value) && value.toString().startsWith('class ');\nis.boolean = (value) => value === true || value === false;\nis.symbol = isOfType('symbol');\nis.numericString = (value) => is.string(value) && !is.emptyStringOrWhitespace(value) && !Number.isNaN(Number(value));\nis.array = (value, assertion) => {\n if (!Array.isArray(value)) {\n return false;\n }\n if (!is.function_(assertion)) {\n return true;\n }\n return value.every(assertion);\n};\nis.buffer = (value) => { var _a, _b, _c, _d; return (_d = (_c = (_b = (_a = value) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.isBuffer) === null || _c === void 0 ? void 0 : _c.call(_b, value)) !== null && _d !== void 0 ? _d : false; };\nis.blob = (value) => isObjectOfType('Blob')(value);\nis.nullOrUndefined = (value) => is.null_(value) || is.undefined(value);\nis.object = (value) => !is.null_(value) && (typeof value === 'object' || is.function_(value));\nis.iterable = (value) => { var _a; return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a[Symbol.iterator]); };\nis.asyncIterable = (value) => { var _a; return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a[Symbol.asyncIterator]); };\nis.generator = (value) => { var _a, _b; return is.iterable(value) && is.function_((_a = value) === null || _a === void 0 ? void 0 : _a.next) && is.function_((_b = value) === null || _b === void 0 ? void 0 : _b.throw); };\nis.asyncGenerator = (value) => is.asyncIterable(value) && is.function_(value.next) && is.function_(value.throw);\nis.nativePromise = (value) => isObjectOfType('Promise')(value);\nconst hasPromiseAPI = (value) => {\n var _a, _b;\n return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a.then) &&\n is.function_((_b = value) === null || _b === void 0 ? void 0 : _b.catch);\n};\nis.promise = (value) => is.nativePromise(value) || hasPromiseAPI(value);\nis.generatorFunction = isObjectOfType('GeneratorFunction');\nis.asyncGeneratorFunction = (value) => getObjectType(value) === 'AsyncGeneratorFunction';\nis.asyncFunction = (value) => getObjectType(value) === 'AsyncFunction';\n// eslint-disable-next-line no-prototype-builtins, @typescript-eslint/ban-types\nis.boundFunction = (value) => is.function_(value) && !value.hasOwnProperty('prototype');\nis.regExp = isObjectOfType('RegExp');\nis.date = isObjectOfType('Date');\nis.error = isObjectOfType('Error');\nis.map = (value) => isObjectOfType('Map')(value);\nis.set = (value) => isObjectOfType('Set')(value);\nis.weakMap = (value) => isObjectOfType('WeakMap')(value);\nis.weakSet = (value) => isObjectOfType('WeakSet')(value);\nis.int8Array = isObjectOfType('Int8Array');\nis.uint8Array = isObjectOfType('Uint8Array');\nis.uint8ClampedArray = isObjectOfType('Uint8ClampedArray');\nis.int16Array = isObjectOfType('Int16Array');\nis.uint16Array = isObjectOfType('Uint16Array');\nis.int32Array = isObjectOfType('Int32Array');\nis.uint32Array = isObjectOfType('Uint32Array');\nis.float32Array = isObjectOfType('Float32Array');\nis.float64Array = isObjectOfType('Float64Array');\nis.bigInt64Array = isObjectOfType('BigInt64Array');\nis.bigUint64Array = isObjectOfType('BigUint64Array');\nis.arrayBuffer = isObjectOfType('ArrayBuffer');\nis.sharedArrayBuffer = isObjectOfType('SharedArrayBuffer');\nis.dataView = isObjectOfType('DataView');\nis.enumCase = (value, targetEnum) => Object.values(targetEnum).includes(value);\nis.directInstanceOf = (instance, class_) => Object.getPrototypeOf(instance) === class_.prototype;\nis.urlInstance = (value) => isObjectOfType('URL')(value);\nis.urlString = (value) => {\n if (!is.string(value)) {\n return false;\n }\n try {\n new URL(value); // eslint-disable-line no-new\n return true;\n }\n catch (_a) {\n return false;\n }\n};\n// Example: `is.truthy = (value: unknown): value is (not false | not 0 | not '' | not undefined | not null) => Boolean(value);`\nis.truthy = (value) => Boolean(value);\n// Example: `is.falsy = (value: unknown): value is (not true | 0 | '' | undefined | null) => Boolean(value);`\nis.falsy = (value) => !value;\nis.nan = (value) => Number.isNaN(value);\nis.primitive = (value) => is.null_(value) || isPrimitiveTypeName(typeof value);\nis.integer = (value) => Number.isInteger(value);\nis.safeInteger = (value) => Number.isSafeInteger(value);\nis.plainObject = (value) => {\n // From: https://github.com/sindresorhus/is-plain-obj/blob/main/index.js\n if (toString.call(value) !== '[object Object]') {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === null || prototype === Object.getPrototypeOf({});\n};\nis.typedArray = (value) => isTypedArrayName(getObjectType(value));\nconst isValidLength = (value) => is.safeInteger(value) && value >= 0;\nis.arrayLike = (value) => !is.nullOrUndefined(value) && !is.function_(value) && isValidLength(value.length);\nis.inRange = (value, range) => {\n if (is.number(range)) {\n return value >= Math.min(0, range) && value <= Math.max(range, 0);\n }\n if (is.array(range) && range.length === 2) {\n return value >= Math.min(...range) && value <= Math.max(...range);\n }\n throw new TypeError(`Invalid range: ${JSON.stringify(range)}`);\n};\nconst NODE_TYPE_ELEMENT = 1;\nconst DOM_PROPERTIES_TO_CHECK = [\n 'innerHTML',\n 'ownerDocument',\n 'style',\n 'attributes',\n 'nodeValue'\n];\nis.domElement = (value) => {\n return is.object(value) &&\n value.nodeType === NODE_TYPE_ELEMENT &&\n is.string(value.nodeName) &&\n !is.plainObject(value) &&\n DOM_PROPERTIES_TO_CHECK.every(property => property in value);\n};\nis.observable = (value) => {\n var _a, _b, _c, _d;\n if (!value) {\n return false;\n }\n // eslint-disable-next-line no-use-extend-native/no-use-extend-native\n if (value === ((_b = (_a = value)[Symbol.observable]) === null || _b === void 0 ? void 0 : _b.call(_a))) {\n return true;\n }\n if (value === ((_d = (_c = value)['@@observable']) === null || _d === void 0 ? void 0 : _d.call(_c))) {\n return true;\n }\n return false;\n};\nis.nodeStream = (value) => is.object(value) && is.function_(value.pipe) && !is.observable(value);\nis.infinite = (value) => value === Infinity || value === -Infinity;\nconst isAbsoluteMod2 = (remainder) => (value) => is.integer(value) && Math.abs(value % 2) === remainder;\nis.evenInteger = isAbsoluteMod2(0);\nis.oddInteger = isAbsoluteMod2(1);\nis.emptyArray = (value) => is.array(value) && value.length === 0;\nis.nonEmptyArray = (value) => is.array(value) && value.length > 0;\nis.emptyString = (value) => is.string(value) && value.length === 0;\nconst isWhiteSpaceString = (value) => is.string(value) && !/\\S/.test(value);\nis.emptyStringOrWhitespace = (value) => is.emptyString(value) || isWhiteSpaceString(value);\n// TODO: Use `not ''` when the `not` operator is available.\nis.nonEmptyString = (value) => is.string(value) && value.length > 0;\n// TODO: Use `not ''` when the `not` operator is available.\nis.nonEmptyStringAndNotWhitespace = (value) => is.string(value) && !is.emptyStringOrWhitespace(value);\nis.emptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length === 0;\n// TODO: Use `not` operator here to remove `Map` and `Set` from type guard:\n// - https://github.com/Microsoft/TypeScript/pull/29317\nis.nonEmptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length > 0;\nis.emptySet = (value) => is.set(value) && value.size === 0;\nis.nonEmptySet = (value) => is.set(value) && value.size > 0;\nis.emptyMap = (value) => is.map(value) && value.size === 0;\nis.nonEmptyMap = (value) => is.map(value) && value.size > 0;\n// `PropertyKey` is any value that can be used as an object key (string, number, or symbol)\nis.propertyKey = (value) => is.any([is.string, is.number, is.symbol], value);\nis.formData = (value) => isObjectOfType('FormData')(value);\nis.urlSearchParams = (value) => isObjectOfType('URLSearchParams')(value);\nconst predicateOnArray = (method, predicate, values) => {\n if (!is.function_(predicate)) {\n throw new TypeError(`Invalid predicate: ${JSON.stringify(predicate)}`);\n }\n if (values.length === 0) {\n throw new TypeError('Invalid number of values');\n }\n return method.call(values, predicate);\n};\nis.any = (predicate, ...values) => {\n const predicates = is.array(predicate) ? predicate : [predicate];\n return predicates.some(singlePredicate => predicateOnArray(Array.prototype.some, singlePredicate, values));\n};\nis.all = (predicate, ...values) => predicateOnArray(Array.prototype.every, predicate, values);\nconst assertType = (condition, description, value, options = {}) => {\n if (!condition) {\n const { multipleValues } = options;\n const valuesMessage = multipleValues ?\n `received values of types ${[\n ...new Set(value.map(singleValue => `\\`${is(singleValue)}\\``))\n ].join(', ')}` :\n `received value of type \\`${is(value)}\\``;\n throw new TypeError(`Expected value which is \\`${description}\\`, ${valuesMessage}.`);\n }\n};\nexports.assert = {\n // Unknowns.\n undefined: (value) => assertType(is.undefined(value), 'undefined', value),\n string: (value) => assertType(is.string(value), 'string', value),\n number: (value) => assertType(is.number(value), 'number', value),\n bigint: (value) => assertType(is.bigint(value), 'bigint', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n function_: (value) => assertType(is.function_(value), 'Function', value),\n null_: (value) => assertType(is.null_(value), 'null', value),\n class_: (value) => assertType(is.class_(value), \"Class\" /* class_ */, value),\n boolean: (value) => assertType(is.boolean(value), 'boolean', value),\n symbol: (value) => assertType(is.symbol(value), 'symbol', value),\n numericString: (value) => assertType(is.numericString(value), \"string with a number\" /* numericString */, value),\n array: (value, assertion) => {\n const assert = assertType;\n assert(is.array(value), 'Array', value);\n if (assertion) {\n value.forEach(assertion);\n }\n },\n buffer: (value) => assertType(is.buffer(value), 'Buffer', value),\n blob: (value) => assertType(is.blob(value), 'Blob', value),\n nullOrUndefined: (value) => assertType(is.nullOrUndefined(value), \"null or undefined\" /* nullOrUndefined */, value),\n object: (value) => assertType(is.object(value), 'Object', value),\n iterable: (value) => assertType(is.iterable(value), \"Iterable\" /* iterable */, value),\n asyncIterable: (value) => assertType(is.asyncIterable(value), \"AsyncIterable\" /* asyncIterable */, value),\n generator: (value) => assertType(is.generator(value), 'Generator', value),\n asyncGenerator: (value) => assertType(is.asyncGenerator(value), 'AsyncGenerator', value),\n nativePromise: (value) => assertType(is.nativePromise(value), \"native Promise\" /* nativePromise */, value),\n promise: (value) => assertType(is.promise(value), 'Promise', value),\n generatorFunction: (value) => assertType(is.generatorFunction(value), 'GeneratorFunction', value),\n asyncGeneratorFunction: (value) => assertType(is.asyncGeneratorFunction(value), 'AsyncGeneratorFunction', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n asyncFunction: (value) => assertType(is.asyncFunction(value), 'AsyncFunction', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n boundFunction: (value) => assertType(is.boundFunction(value), 'Function', value),\n regExp: (value) => assertType(is.regExp(value), 'RegExp', value),\n date: (value) => assertType(is.date(value), 'Date', value),\n error: (value) => assertType(is.error(value), 'Error', value),\n map: (value) => assertType(is.map(value), 'Map', value),\n set: (value) => assertType(is.set(value), 'Set', value),\n weakMap: (value) => assertType(is.weakMap(value), 'WeakMap', value),\n weakSet: (value) => assertType(is.weakSet(value), 'WeakSet', value),\n int8Array: (value) => assertType(is.int8Array(value), 'Int8Array', value),\n uint8Array: (value) => assertType(is.uint8Array(value), 'Uint8Array', value),\n uint8ClampedArray: (value) => assertType(is.uint8ClampedArray(value), 'Uint8ClampedArray', value),\n int16Array: (value) => assertType(is.int16Array(value), 'Int16Array', value),\n uint16Array: (value) => assertType(is.uint16Array(value), 'Uint16Array', value),\n int32Array: (value) => assertType(is.int32Array(value), 'Int32Array', value),\n uint32Array: (value) => assertType(is.uint32Array(value), 'Uint32Array', value),\n float32Array: (value) => assertType(is.float32Array(value), 'Float32Array', value),\n float64Array: (value) => assertType(is.float64Array(value), 'Float64Array', value),\n bigInt64Array: (value) => assertType(is.bigInt64Array(value), 'BigInt64Array', value),\n bigUint64Array: (value) => assertType(is.bigUint64Array(value), 'BigUint64Array', value),\n arrayBuffer: (value) => assertType(is.arrayBuffer(value), 'ArrayBuffer', value),\n sharedArrayBuffer: (value) => assertType(is.sharedArrayBuffer(value), 'SharedArrayBuffer', value),\n dataView: (value) => assertType(is.dataView(value), 'DataView', value),\n enumCase: (value, targetEnum) => assertType(is.enumCase(value, targetEnum), 'EnumCase', value),\n urlInstance: (value) => assertType(is.urlInstance(value), 'URL', value),\n urlString: (value) => assertType(is.urlString(value), \"string with a URL\" /* urlString */, value),\n truthy: (value) => assertType(is.truthy(value), \"truthy\" /* truthy */, value),\n falsy: (value) => assertType(is.falsy(value), \"falsy\" /* falsy */, value),\n nan: (value) => assertType(is.nan(value), \"NaN\" /* nan */, value),\n primitive: (value) => assertType(is.primitive(value), \"primitive\" /* primitive */, value),\n integer: (value) => assertType(is.integer(value), \"integer\" /* integer */, value),\n safeInteger: (value) => assertType(is.safeInteger(value), \"integer\" /* safeInteger */, value),\n plainObject: (value) => assertType(is.plainObject(value), \"plain object\" /* plainObject */, value),\n typedArray: (value) => assertType(is.typedArray(value), \"TypedArray\" /* typedArray */, value),\n arrayLike: (value) => assertType(is.arrayLike(value), \"array-like\" /* arrayLike */, value),\n domElement: (value) => assertType(is.domElement(value), \"HTMLElement\" /* domElement */, value),\n observable: (value) => assertType(is.observable(value), 'Observable', value),\n nodeStream: (value) => assertType(is.nodeStream(value), \"Node.js Stream\" /* nodeStream */, value),\n infinite: (value) => assertType(is.infinite(value), \"infinite number\" /* infinite */, value),\n emptyArray: (value) => assertType(is.emptyArray(value), \"empty array\" /* emptyArray */, value),\n nonEmptyArray: (value) => assertType(is.nonEmptyArray(value), \"non-empty array\" /* nonEmptyArray */, value),\n emptyString: (value) => assertType(is.emptyString(value), \"empty string\" /* emptyString */, value),\n emptyStringOrWhitespace: (value) => assertType(is.emptyStringOrWhitespace(value), \"empty string or whitespace\" /* emptyStringOrWhitespace */, value),\n nonEmptyString: (value) => assertType(is.nonEmptyString(value), \"non-empty string\" /* nonEmptyString */, value),\n nonEmptyStringAndNotWhitespace: (value) => assertType(is.nonEmptyStringAndNotWhitespace(value), \"non-empty string and not whitespace\" /* nonEmptyStringAndNotWhitespace */, value),\n emptyObject: (value) => assertType(is.emptyObject(value), \"empty object\" /* emptyObject */, value),\n nonEmptyObject: (value) => assertType(is.nonEmptyObject(value), \"non-empty object\" /* nonEmptyObject */, value),\n emptySet: (value) => assertType(is.emptySet(value), \"empty set\" /* emptySet */, value),\n nonEmptySet: (value) => assertType(is.nonEmptySet(value), \"non-empty set\" /* nonEmptySet */, value),\n emptyMap: (value) => assertType(is.emptyMap(value), \"empty map\" /* emptyMap */, value),\n nonEmptyMap: (value) => assertType(is.nonEmptyMap(value), \"non-empty map\" /* nonEmptyMap */, value),\n propertyKey: (value) => assertType(is.propertyKey(value), 'PropertyKey', value),\n formData: (value) => assertType(is.formData(value), 'FormData', value),\n urlSearchParams: (value) => assertType(is.urlSearchParams(value), 'URLSearchParams', value),\n // Numbers.\n evenInteger: (value) => assertType(is.evenInteger(value), \"even integer\" /* evenInteger */, value),\n oddInteger: (value) => assertType(is.oddInteger(value), \"odd integer\" /* oddInteger */, value),\n // Two arguments.\n directInstanceOf: (instance, class_) => assertType(is.directInstanceOf(instance, class_), \"T\" /* directInstanceOf */, instance),\n inRange: (value, range) => assertType(is.inRange(value, range), \"in range\" /* inRange */, value),\n // Variadic functions.\n any: (predicate, ...values) => {\n return assertType(is.any(predicate, ...values), \"predicate returns truthy for any value\" /* any */, values, { multipleValues: true });\n },\n all: (predicate, ...values) => assertType(is.all(predicate, ...values), \"predicate returns truthy for all values\" /* all */, values, { multipleValues: true })\n};\n// Some few keywords are reserved, but we'll populate them for Node.js users\n// See https://github.com/Microsoft/TypeScript/issues/2536\nObject.defineProperties(is, {\n class: {\n value: is.class_\n },\n function: {\n value: is.function_\n },\n null: {\n value: is.null_\n }\n});\nObject.defineProperties(exports.assert, {\n class: {\n value: exports.assert.class_\n },\n function: {\n value: exports.assert.function_\n },\n null: {\n value: exports.assert.null_\n }\n});\nexports.default = is;\n// For CommonJS default export support\nmodule.exports = is;\nmodule.exports.default = is;\nmodule.exports.assert = exports.assert;\n","'use strict';\n\nclass CancelError extends Error {\n\tconstructor(reason) {\n\t\tsuper(reason || 'Promise was canceled');\n\t\tthis.name = 'CancelError';\n\t}\n\n\tget isCanceled() {\n\t\treturn true;\n\t}\n}\n\nclass PCancelable {\n\tstatic fn(userFn) {\n\t\treturn (...arguments_) => {\n\t\t\treturn new PCancelable((resolve, reject, onCancel) => {\n\t\t\t\targuments_.push(onCancel);\n\t\t\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\t\t\tuserFn(...arguments_).then(resolve, reject);\n\t\t\t});\n\t\t};\n\t}\n\n\tconstructor(executor) {\n\t\tthis._cancelHandlers = [];\n\t\tthis._isPending = true;\n\t\tthis._isCanceled = false;\n\t\tthis._rejectOnCancel = true;\n\n\t\tthis._promise = new Promise((resolve, reject) => {\n\t\t\tthis._reject = reject;\n\n\t\t\tconst onResolve = value => {\n\t\t\t\tif (!this._isCanceled || !onCancel.shouldReject) {\n\t\t\t\t\tthis._isPending = false;\n\t\t\t\t\tresolve(value);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst onReject = error => {\n\t\t\t\tthis._isPending = false;\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tconst onCancel = handler => {\n\t\t\t\tif (!this._isPending) {\n\t\t\t\t\tthrow new Error('The `onCancel` handler was attached after the promise settled.');\n\t\t\t\t}\n\n\t\t\t\tthis._cancelHandlers.push(handler);\n\t\t\t};\n\n\t\t\tObject.defineProperties(onCancel, {\n\t\t\t\tshouldReject: {\n\t\t\t\t\tget: () => this._rejectOnCancel,\n\t\t\t\t\tset: boolean => {\n\t\t\t\t\t\tthis._rejectOnCancel = boolean;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn executor(onResolve, onReject, onCancel);\n\t\t});\n\t}\n\n\tthen(onFulfilled, onRejected) {\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\treturn this._promise.then(onFulfilled, onRejected);\n\t}\n\n\tcatch(onRejected) {\n\t\treturn this._promise.catch(onRejected);\n\t}\n\n\tfinally(onFinally) {\n\t\treturn this._promise.finally(onFinally);\n\t}\n\n\tcancel(reason) {\n\t\tif (!this._isPending || this._isCanceled) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isCanceled = true;\n\n\t\tif (this._cancelHandlers.length > 0) {\n\t\t\ttry {\n\t\t\t\tfor (const handler of this._cancelHandlers) {\n\t\t\t\t\thandler();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis._reject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (this._rejectOnCancel) {\n\t\t\tthis._reject(new CancelError(reason));\n\t\t}\n\t}\n\n\tget isCanceled() {\n\t\treturn this._isCanceled;\n\t}\n}\n\nObject.setPrototypeOf(PCancelable.prototype, Promise.prototype);\n\nmodule.exports = PCancelable;\nmodule.exports.CancelError = CancelError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isTLSSocket(socket) {\n return socket.encrypted;\n}\nconst deferToConnect = (socket, fn) => {\n let listeners;\n if (typeof fn === 'function') {\n const connect = fn;\n listeners = { connect };\n }\n else {\n listeners = fn;\n }\n const hasConnectListener = typeof listeners.connect === 'function';\n const hasSecureConnectListener = typeof listeners.secureConnect === 'function';\n const hasCloseListener = typeof listeners.close === 'function';\n const onConnect = () => {\n if (hasConnectListener) {\n listeners.connect();\n }\n if (isTLSSocket(socket) && hasSecureConnectListener) {\n if (socket.authorized) {\n listeners.secureConnect();\n }\n else if (!socket.authorizationError) {\n socket.once('secureConnect', listeners.secureConnect);\n }\n }\n if (hasCloseListener) {\n socket.once('close', listeners.close);\n }\n };\n if (socket.writable && !socket.connecting) {\n onConnect();\n }\n else if (socket.connecting) {\n socket.once('connect', onConnect);\n }\n else if (socket.destroyed && hasCloseListener) {\n listeners.close(socket._hadError);\n }\n};\nexports.default = deferToConnect;\n// For CommonJS default export support\nmodule.exports = deferToConnect;\nmodule.exports.default = deferToConnect;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst defer_to_connect_1 = require(\"defer-to-connect\");\nconst util_1 = require(\"util\");\nconst nodejsMajorVersion = Number(process.versions.node.split('.')[0]);\nconst timer = (request) => {\n if (request.timings) {\n return request.timings;\n }\n const timings = {\n start: Date.now(),\n socket: undefined,\n lookup: undefined,\n connect: undefined,\n secureConnect: undefined,\n upload: undefined,\n response: undefined,\n end: undefined,\n error: undefined,\n abort: undefined,\n phases: {\n wait: undefined,\n dns: undefined,\n tcp: undefined,\n tls: undefined,\n request: undefined,\n firstByte: undefined,\n download: undefined,\n total: undefined\n }\n };\n request.timings = timings;\n const handleError = (origin) => {\n const emit = origin.emit.bind(origin);\n origin.emit = (event, ...args) => {\n // Catches the `error` event\n if (event === 'error') {\n timings.error = Date.now();\n timings.phases.total = timings.error - timings.start;\n origin.emit = emit;\n }\n // Saves the original behavior\n return emit(event, ...args);\n };\n };\n handleError(request);\n const onAbort = () => {\n timings.abort = Date.now();\n // Let the `end` response event be responsible for setting the total phase,\n // unless the Node.js major version is >= 13.\n if (!timings.response || nodejsMajorVersion >= 13) {\n timings.phases.total = Date.now() - timings.start;\n }\n };\n request.prependOnceListener('abort', onAbort);\n const onSocket = (socket) => {\n timings.socket = Date.now();\n timings.phases.wait = timings.socket - timings.start;\n if (util_1.types.isProxy(socket)) {\n return;\n }\n const lookupListener = () => {\n timings.lookup = Date.now();\n timings.phases.dns = timings.lookup - timings.socket;\n };\n socket.prependOnceListener('lookup', lookupListener);\n defer_to_connect_1.default(socket, {\n connect: () => {\n timings.connect = Date.now();\n if (timings.lookup === undefined) {\n socket.removeListener('lookup', lookupListener);\n timings.lookup = timings.connect;\n timings.phases.dns = timings.lookup - timings.socket;\n }\n timings.phases.tcp = timings.connect - timings.lookup;\n // This callback is called before flushing any data,\n // so we don't need to set `timings.phases.request` here.\n },\n secureConnect: () => {\n timings.secureConnect = Date.now();\n timings.phases.tls = timings.secureConnect - timings.connect;\n }\n });\n };\n if (request.socket) {\n onSocket(request.socket);\n }\n else {\n request.prependOnceListener('socket', onSocket);\n }\n const onUpload = () => {\n var _a;\n timings.upload = Date.now();\n timings.phases.request = timings.upload - ((_a = timings.secureConnect) !== null && _a !== void 0 ? _a : timings.connect);\n };\n const writableFinished = () => {\n if (typeof request.writableFinished === 'boolean') {\n return request.writableFinished;\n }\n // Node.js doesn't have `request.writableFinished` property\n return request.finished && request.outputSize === 0 && (!request.socket || request.socket.writableLength === 0);\n };\n if (writableFinished()) {\n onUpload();\n }\n else {\n request.prependOnceListener('finish', onUpload);\n }\n request.prependOnceListener('response', (response) => {\n timings.response = Date.now();\n timings.phases.firstByte = timings.response - timings.upload;\n response.timings = timings;\n handleError(response);\n response.prependOnceListener('end', () => {\n timings.end = Date.now();\n timings.phases.download = timings.end - timings.response;\n timings.phases.total = timings.end - timings.start;\n });\n response.prependOnceListener('aborted', onAbort);\n });\n return timings;\n};\nexports.default = timer;\n// For CommonJS default export support\nmodule.exports = timer;\nmodule.exports.default = timer;\n","'use strict';\nconst {\n\tV4MAPPED,\n\tADDRCONFIG,\n\tALL,\n\tpromises: {\n\t\tResolver: AsyncResolver\n\t},\n\tlookup: dnsLookup\n} = require('dns');\nconst {promisify} = require('util');\nconst os = require('os');\n\nconst kCacheableLookupCreateConnection = Symbol('cacheableLookupCreateConnection');\nconst kCacheableLookupInstance = Symbol('cacheableLookupInstance');\nconst kExpires = Symbol('expires');\n\nconst supportsALL = typeof ALL === 'number';\n\nconst verifyAgent = agent => {\n\tif (!(agent && typeof agent.createConnection === 'function')) {\n\t\tthrow new Error('Expected an Agent instance as the first argument');\n\t}\n};\n\nconst map4to6 = entries => {\n\tfor (const entry of entries) {\n\t\tif (entry.family === 6) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tentry.address = `::ffff:${entry.address}`;\n\t\tentry.family = 6;\n\t}\n};\n\nconst getIfaceInfo = () => {\n\tlet has4 = false;\n\tlet has6 = false;\n\n\tfor (const device of Object.values(os.networkInterfaces())) {\n\t\tfor (const iface of device) {\n\t\t\tif (iface.internal) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (iface.family === 'IPv6') {\n\t\t\t\thas6 = true;\n\t\t\t} else {\n\t\t\t\thas4 = true;\n\t\t\t}\n\n\t\t\tif (has4 && has6) {\n\t\t\t\treturn {has4, has6};\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {has4, has6};\n};\n\nconst isIterable = map => {\n\treturn Symbol.iterator in map;\n};\n\nconst ttl = {ttl: true};\nconst all = {all: true};\n\nclass CacheableLookup {\n\tconstructor({\n\t\tcache = new Map(),\n\t\tmaxTtl = Infinity,\n\t\tfallbackDuration = 3600,\n\t\terrorTtl = 0.15,\n\t\tresolver = new AsyncResolver(),\n\t\tlookup = dnsLookup\n\t} = {}) {\n\t\tthis.maxTtl = maxTtl;\n\t\tthis.errorTtl = errorTtl;\n\n\t\tthis._cache = cache;\n\t\tthis._resolver = resolver;\n\t\tthis._dnsLookup = promisify(lookup);\n\n\t\tif (this._resolver instanceof AsyncResolver) {\n\t\t\tthis._resolve4 = this._resolver.resolve4.bind(this._resolver);\n\t\t\tthis._resolve6 = this._resolver.resolve6.bind(this._resolver);\n\t\t} else {\n\t\t\tthis._resolve4 = promisify(this._resolver.resolve4.bind(this._resolver));\n\t\t\tthis._resolve6 = promisify(this._resolver.resolve6.bind(this._resolver));\n\t\t}\n\n\t\tthis._iface = getIfaceInfo();\n\n\t\tthis._pending = {};\n\t\tthis._nextRemovalTime = false;\n\t\tthis._hostnamesToFallback = new Set();\n\n\t\tif (fallbackDuration < 1) {\n\t\t\tthis._fallback = false;\n\t\t} else {\n\t\t\tthis._fallback = true;\n\n\t\t\tconst interval = setInterval(() => {\n\t\t\t\tthis._hostnamesToFallback.clear();\n\t\t\t}, fallbackDuration * 1000);\n\n\t\t\t/* istanbul ignore next: There is no `interval.unref()` when running inside an Electron renderer */\n\t\t\tif (interval.unref) {\n\t\t\t\tinterval.unref();\n\t\t\t}\n\t\t}\n\n\t\tthis.lookup = this.lookup.bind(this);\n\t\tthis.lookupAsync = this.lookupAsync.bind(this);\n\t}\n\n\tset servers(servers) {\n\t\tthis.clear();\n\n\t\tthis._resolver.setServers(servers);\n\t}\n\n\tget servers() {\n\t\treturn this._resolver.getServers();\n\t}\n\n\tlookup(hostname, options, callback) {\n\t\tif (typeof options === 'function') {\n\t\t\tcallback = options;\n\t\t\toptions = {};\n\t\t} else if (typeof options === 'number') {\n\t\t\toptions = {\n\t\t\t\tfamily: options\n\t\t\t};\n\t\t}\n\n\t\tif (!callback) {\n\t\t\tthrow new Error('Callback must be a function.');\n\t\t}\n\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\tthis.lookupAsync(hostname, options).then(result => {\n\t\t\tif (options.all) {\n\t\t\t\tcallback(null, result);\n\t\t\t} else {\n\t\t\t\tcallback(null, result.address, result.family, result.expires, result.ttl);\n\t\t\t}\n\t\t}, callback);\n\t}\n\n\tasync lookupAsync(hostname, options = {}) {\n\t\tif (typeof options === 'number') {\n\t\t\toptions = {\n\t\t\t\tfamily: options\n\t\t\t};\n\t\t}\n\n\t\tlet cached = await this.query(hostname);\n\n\t\tif (options.family === 6) {\n\t\t\tconst filtered = cached.filter(entry => entry.family === 6);\n\n\t\t\tif (options.hints & V4MAPPED) {\n\t\t\t\tif ((supportsALL && options.hints & ALL) || filtered.length === 0) {\n\t\t\t\t\tmap4to6(cached);\n\t\t\t\t} else {\n\t\t\t\t\tcached = filtered;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcached = filtered;\n\t\t\t}\n\t\t} else if (options.family === 4) {\n\t\t\tcached = cached.filter(entry => entry.family === 4);\n\t\t}\n\n\t\tif (options.hints & ADDRCONFIG) {\n\t\t\tconst {_iface} = this;\n\t\t\tcached = cached.filter(entry => entry.family === 6 ? _iface.has6 : _iface.has4);\n\t\t}\n\n\t\tif (cached.length === 0) {\n\t\t\tconst error = new Error(`cacheableLookup ENOTFOUND ${hostname}`);\n\t\t\terror.code = 'ENOTFOUND';\n\t\t\terror.hostname = hostname;\n\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (options.all) {\n\t\t\treturn cached;\n\t\t}\n\n\t\treturn cached[0];\n\t}\n\n\tasync query(hostname) {\n\t\tlet cached = await this._cache.get(hostname);\n\n\t\tif (!cached) {\n\t\t\tconst pending = this._pending[hostname];\n\n\t\t\tif (pending) {\n\t\t\t\tcached = await pending;\n\t\t\t} else {\n\t\t\t\tconst newPromise = this.queryAndCache(hostname);\n\t\t\t\tthis._pending[hostname] = newPromise;\n\n\t\t\t\ttry {\n\t\t\t\t\tcached = await newPromise;\n\t\t\t\t} finally {\n\t\t\t\t\tdelete this._pending[hostname];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcached = cached.map(entry => {\n\t\t\treturn {...entry};\n\t\t});\n\n\t\treturn cached;\n\t}\n\n\tasync _resolve(hostname) {\n\t\tconst wrap = async promise => {\n\t\t\ttry {\n\t\t\t\treturn await promise;\n\t\t\t} catch (error) {\n\t\t\t\tif (error.code === 'ENODATA' || error.code === 'ENOTFOUND') {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t};\n\n\t\t// ANY is unsafe as it doesn't trigger new queries in the underlying server.\n\t\tconst [A, AAAA] = await Promise.all([\n\t\t\tthis._resolve4(hostname, ttl),\n\t\t\tthis._resolve6(hostname, ttl)\n\t\t].map(promise => wrap(promise)));\n\n\t\tlet aTtl = 0;\n\t\tlet aaaaTtl = 0;\n\t\tlet cacheTtl = 0;\n\n\t\tconst now = Date.now();\n\n\t\tfor (const entry of A) {\n\t\t\tentry.family = 4;\n\t\t\tentry.expires = now + (entry.ttl * 1000);\n\n\t\t\taTtl = Math.max(aTtl, entry.ttl);\n\t\t}\n\n\t\tfor (const entry of AAAA) {\n\t\t\tentry.family = 6;\n\t\t\tentry.expires = now + (entry.ttl * 1000);\n\n\t\t\taaaaTtl = Math.max(aaaaTtl, entry.ttl);\n\t\t}\n\n\t\tif (A.length > 0) {\n\t\t\tif (AAAA.length > 0) {\n\t\t\t\tcacheTtl = Math.min(aTtl, aaaaTtl);\n\t\t\t} else {\n\t\t\t\tcacheTtl = aTtl;\n\t\t\t}\n\t\t} else {\n\t\t\tcacheTtl = aaaaTtl;\n\t\t}\n\n\t\treturn {\n\t\t\tentries: [\n\t\t\t\t...A,\n\t\t\t\t...AAAA\n\t\t\t],\n\t\t\tcacheTtl\n\t\t};\n\t}\n\n\tasync _lookup(hostname) {\n\t\ttry {\n\t\t\tconst entries = await this._dnsLookup(hostname, {\n\t\t\t\tall: true\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tentries,\n\t\t\t\tcacheTtl: 0\n\t\t\t};\n\t\t} catch (_) {\n\t\t\treturn {\n\t\t\t\tentries: [],\n\t\t\t\tcacheTtl: 0\n\t\t\t};\n\t\t}\n\t}\n\n\tasync _set(hostname, data, cacheTtl) {\n\t\tif (this.maxTtl > 0 && cacheTtl > 0) {\n\t\t\tcacheTtl = Math.min(cacheTtl, this.maxTtl) * 1000;\n\t\t\tdata[kExpires] = Date.now() + cacheTtl;\n\n\t\t\ttry {\n\t\t\t\tawait this._cache.set(hostname, data, cacheTtl);\n\t\t\t} catch (error) {\n\t\t\t\tthis.lookupAsync = async () => {\n\t\t\t\t\tconst cacheError = new Error('Cache Error. Please recreate the CacheableLookup instance.');\n\t\t\t\t\tcacheError.cause = error;\n\n\t\t\t\t\tthrow cacheError;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (isIterable(this._cache)) {\n\t\t\t\tthis._tick(cacheTtl);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync queryAndCache(hostname) {\n\t\tif (this._hostnamesToFallback.has(hostname)) {\n\t\t\treturn this._dnsLookup(hostname, all);\n\t\t}\n\n\t\tlet query = await this._resolve(hostname);\n\n\t\tif (query.entries.length === 0 && this._fallback) {\n\t\t\tquery = await this._lookup(hostname);\n\n\t\t\tif (query.entries.length !== 0) {\n\t\t\t\t// Use `dns.lookup(...)` for that particular hostname\n\t\t\t\tthis._hostnamesToFallback.add(hostname);\n\t\t\t}\n\t\t}\n\n\t\tconst cacheTtl = query.entries.length === 0 ? this.errorTtl : query.cacheTtl;\n\t\tawait this._set(hostname, query.entries, cacheTtl);\n\n\t\treturn query.entries;\n\t}\n\n\t_tick(ms) {\n\t\tconst nextRemovalTime = this._nextRemovalTime;\n\n\t\tif (!nextRemovalTime || ms < nextRemovalTime) {\n\t\t\tclearTimeout(this._removalTimeout);\n\n\t\t\tthis._nextRemovalTime = ms;\n\n\t\t\tthis._removalTimeout = setTimeout(() => {\n\t\t\t\tthis._nextRemovalTime = false;\n\n\t\t\t\tlet nextExpiry = Infinity;\n\n\t\t\t\tconst now = Date.now();\n\n\t\t\t\tfor (const [hostname, entries] of this._cache) {\n\t\t\t\t\tconst expires = entries[kExpires];\n\n\t\t\t\t\tif (now >= expires) {\n\t\t\t\t\t\tthis._cache.delete(hostname);\n\t\t\t\t\t} else if (expires < nextExpiry) {\n\t\t\t\t\t\tnextExpiry = expires;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nextExpiry !== Infinity) {\n\t\t\t\t\tthis._tick(nextExpiry - now);\n\t\t\t\t}\n\t\t\t}, ms);\n\n\t\t\t/* istanbul ignore next: There is no `timeout.unref()` when running inside an Electron renderer */\n\t\t\tif (this._removalTimeout.unref) {\n\t\t\t\tthis._removalTimeout.unref();\n\t\t\t}\n\t\t}\n\t}\n\n\tinstall(agent) {\n\t\tverifyAgent(agent);\n\n\t\tif (kCacheableLookupCreateConnection in agent) {\n\t\t\tthrow new Error('CacheableLookup has been already installed');\n\t\t}\n\n\t\tagent[kCacheableLookupCreateConnection] = agent.createConnection;\n\t\tagent[kCacheableLookupInstance] = this;\n\n\t\tagent.createConnection = (options, callback) => {\n\t\t\tif (!('lookup' in options)) {\n\t\t\t\toptions.lookup = this.lookup;\n\t\t\t}\n\n\t\t\treturn agent[kCacheableLookupCreateConnection](options, callback);\n\t\t};\n\t}\n\n\tuninstall(agent) {\n\t\tverifyAgent(agent);\n\n\t\tif (agent[kCacheableLookupCreateConnection]) {\n\t\t\tif (agent[kCacheableLookupInstance] !== this) {\n\t\t\t\tthrow new Error('The agent is not owned by this CacheableLookup instance');\n\t\t\t}\n\n\t\t\tagent.createConnection = agent[kCacheableLookupCreateConnection];\n\n\t\t\tdelete agent[kCacheableLookupCreateConnection];\n\t\t\tdelete agent[kCacheableLookupInstance];\n\t\t}\n\t}\n\n\tupdateInterfaceInfo() {\n\t\tconst {_iface} = this;\n\n\t\tthis._iface = getIfaceInfo();\n\n\t\tif ((_iface.has4 && !this._iface.has4) || (_iface.has6 && !this._iface.has6)) {\n\t\t\tthis._cache.clear();\n\t\t}\n\t}\n\n\tclear(hostname) {\n\t\tif (hostname) {\n\t\t\tthis._cache.delete(hostname);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._cache.clear();\n\t}\n}\n\nmodule.exports = CacheableLookup;\nmodule.exports.default = CacheableLookup;\n","'use strict';\n\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\nconst DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';\nconst DATA_URL_DEFAULT_CHARSET = 'us-ascii';\n\nconst testParameter = (name, filters) => {\n\treturn filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);\n};\n\nconst normalizeDataURL = (urlString, {stripHash}) => {\n\tconst match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString);\n\n\tif (!match) {\n\t\tthrow new Error(`Invalid URL: ${urlString}`);\n\t}\n\n\tlet {type, data, hash} = match.groups;\n\tconst mediaType = type.split(';');\n\thash = stripHash ? '' : hash;\n\n\tlet isBase64 = false;\n\tif (mediaType[mediaType.length - 1] === 'base64') {\n\t\tmediaType.pop();\n\t\tisBase64 = true;\n\t}\n\n\t// Lowercase MIME type\n\tconst mimeType = (mediaType.shift() || '').toLowerCase();\n\tconst attributes = mediaType\n\t\t.map(attribute => {\n\t\t\tlet [key, value = ''] = attribute.split('=').map(string => string.trim());\n\n\t\t\t// Lowercase `charset`\n\t\t\tif (key === 'charset') {\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\tif (value === DATA_URL_DEFAULT_CHARSET) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn `${key}${value ? `=${value}` : ''}`;\n\t\t})\n\t\t.filter(Boolean);\n\n\tconst normalizedMediaType = [\n\t\t...attributes\n\t];\n\n\tif (isBase64) {\n\t\tnormalizedMediaType.push('base64');\n\t}\n\n\tif (normalizedMediaType.length !== 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {\n\t\tnormalizedMediaType.unshift(mimeType);\n\t}\n\n\treturn `data:${normalizedMediaType.join(';')},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : ''}`;\n};\n\nconst normalizeUrl = (urlString, options) => {\n\toptions = {\n\t\tdefaultProtocol: 'http:',\n\t\tnormalizeProtocol: true,\n\t\tforceHttp: false,\n\t\tforceHttps: false,\n\t\tstripAuthentication: true,\n\t\tstripHash: false,\n\t\tstripTextFragment: true,\n\t\tstripWWW: true,\n\t\tremoveQueryParameters: [/^utm_\\w+/i],\n\t\tremoveTrailingSlash: true,\n\t\tremoveSingleSlash: true,\n\t\tremoveDirectoryIndex: false,\n\t\tsortQueryParameters: true,\n\t\t...options\n\t};\n\n\turlString = urlString.trim();\n\n\t// Data URL\n\tif (/^data:/i.test(urlString)) {\n\t\treturn normalizeDataURL(urlString, options);\n\t}\n\n\tif (/^view-source:/i.test(urlString)) {\n\t\tthrow new Error('`view-source:` is not supported as it is a non-standard protocol');\n\t}\n\n\tconst hasRelativeProtocol = urlString.startsWith('//');\n\tconst isRelativeUrl = !hasRelativeProtocol && /^\\.*\\//.test(urlString);\n\n\t// Prepend protocol\n\tif (!isRelativeUrl) {\n\t\turlString = urlString.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//, options.defaultProtocol);\n\t}\n\n\tconst urlObj = new URL(urlString);\n\n\tif (options.forceHttp && options.forceHttps) {\n\t\tthrow new Error('The `forceHttp` and `forceHttps` options cannot be used together');\n\t}\n\n\tif (options.forceHttp && urlObj.protocol === 'https:') {\n\t\turlObj.protocol = 'http:';\n\t}\n\n\tif (options.forceHttps && urlObj.protocol === 'http:') {\n\t\turlObj.protocol = 'https:';\n\t}\n\n\t// Remove auth\n\tif (options.stripAuthentication) {\n\t\turlObj.username = '';\n\t\turlObj.password = '';\n\t}\n\n\t// Remove hash\n\tif (options.stripHash) {\n\t\turlObj.hash = '';\n\t} else if (options.stripTextFragment) {\n\t\turlObj.hash = urlObj.hash.replace(/#?:~:text.*?$/i, '');\n\t}\n\n\t// Remove duplicate slashes if not preceded by a protocol\n\tif (urlObj.pathname) {\n\t\turlObj.pathname = urlObj.pathname.replace(/(?<!\\b(?:[a-z][a-z\\d+\\-.]{1,50}:))\\/{2,}/g, '/');\n\t}\n\n\t// Decode URI octets\n\tif (urlObj.pathname) {\n\t\ttry {\n\t\t\turlObj.pathname = decodeURI(urlObj.pathname);\n\t\t} catch (_) {}\n\t}\n\n\t// Remove directory index\n\tif (options.removeDirectoryIndex === true) {\n\t\toptions.removeDirectoryIndex = [/^index\\.[a-z]+$/];\n\t}\n\n\tif (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {\n\t\tlet pathComponents = urlObj.pathname.split('/');\n\t\tconst lastComponent = pathComponents[pathComponents.length - 1];\n\n\t\tif (testParameter(lastComponent, options.removeDirectoryIndex)) {\n\t\t\tpathComponents = pathComponents.slice(0, pathComponents.length - 1);\n\t\t\turlObj.pathname = pathComponents.slice(1).join('/') + '/';\n\t\t}\n\t}\n\n\tif (urlObj.hostname) {\n\t\t// Remove trailing dot\n\t\turlObj.hostname = urlObj.hostname.replace(/\\.$/, '');\n\n\t\t// Remove `www.`\n\t\tif (options.stripWWW && /^www\\.(?!www\\.)(?:[a-z\\-\\d]{1,63})\\.(?:[a-z.\\-\\d]{2,63})$/.test(urlObj.hostname)) {\n\t\t\t// Each label should be max 63 at length (min: 1).\n\t\t\t// Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names\n\t\t\t// Each TLD should be up to 63 characters long (min: 2).\n\t\t\t// It is technically possible to have a single character TLD, but none currently exist.\n\t\t\turlObj.hostname = urlObj.hostname.replace(/^www\\./, '');\n\t\t}\n\t}\n\n\t// Remove query unwanted parameters\n\tif (Array.isArray(options.removeQueryParameters)) {\n\t\tfor (const key of [...urlObj.searchParams.keys()]) {\n\t\t\tif (testParameter(key, options.removeQueryParameters)) {\n\t\t\t\turlObj.searchParams.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (options.removeQueryParameters === true) {\n\t\turlObj.search = '';\n\t}\n\n\t// Sort query parameters\n\tif (options.sortQueryParameters) {\n\t\turlObj.searchParams.sort();\n\t}\n\n\tif (options.removeTrailingSlash) {\n\t\turlObj.pathname = urlObj.pathname.replace(/\\/$/, '');\n\t}\n\n\tconst oldUrlString = urlString;\n\n\t// Take advantage of many of the Node `url` normalizations\n\turlString = urlObj.toString();\n\n\tif (!options.removeSingleSlash && urlObj.pathname === '/' && !oldUrlString.endsWith('/') && urlObj.hash === '') {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Remove ending `/` unless removeSingleSlash is false\n\tif ((options.removeTrailingSlash || urlObj.pathname === '/') && urlObj.hash === '' && options.removeSingleSlash) {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Restore relative protocol, if applicable\n\tif (hasRelativeProtocol && !options.normalizeProtocol) {\n\t\turlString = urlString.replace(/^http:\\/\\//, '//');\n\t}\n\n\t// Remove http/https\n\tif (options.stripProtocol) {\n\t\turlString = urlString.replace(/^(?:https?:)?\\/\\//, '');\n\t}\n\n\treturn urlString;\n};\n\nmodule.exports = normalizeUrl;\n","// Returns a wrapper function that returns a wrapped callback\n// The wrapper function should do some stuff, and return a\n// presumably different callback function.\n// This makes sure that own properties are retained, so that\n// decorations and such are not lost along the way.\nmodule.exports = wrappy\nfunction wrappy (fn, cb) {\n if (fn && cb) return wrappy(fn)(cb)\n\n if (typeof fn !== 'function')\n throw new TypeError('need wrapper function')\n\n Object.keys(fn).forEach(function (k) {\n wrapper[k] = fn[k]\n })\n\n return wrapper\n\n function wrapper() {\n var args = new Array(arguments.length)\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i]\n }\n var ret = fn.apply(this, args)\n var cb = args[args.length-1]\n if (typeof ret === 'function' && ret !== cb) {\n Object.keys(cb).forEach(function (k) {\n ret[k] = cb[k]\n })\n }\n return ret\n }\n}\n","var wrappy = require('wrappy')\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n Object.defineProperty(Function.prototype, 'once', {\n value: function () {\n return once(this)\n },\n configurable: true\n })\n\n Object.defineProperty(Function.prototype, 'onceStrict', {\n value: function () {\n return onceStrict(this)\n },\n configurable: true\n })\n})\n\nfunction once (fn) {\n var f = function () {\n if (f.called) return f.value\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n f.called = false\n return f\n}\n\nfunction onceStrict (fn) {\n var f = function () {\n if (f.called)\n throw new Error(f.onceError)\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n var name = fn.name || 'Function wrapped with `once`'\n f.onceError = name + \" shouldn't be called more than once\"\n f.called = false\n return f\n}\n","var once = require('once');\n\nvar noop = function() {};\n\nvar qnt = global.Bare ? queueMicrotask : process.nextTick.bind(process);\n\nvar isRequest = function(stream) {\n\treturn stream.setHeader && typeof stream.abort === 'function';\n};\n\nvar isChildProcess = function(stream) {\n\treturn stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3\n};\n\nvar eos = function(stream, opts, callback) {\n\tif (typeof opts === 'function') return eos(stream, null, opts);\n\tif (!opts) opts = {};\n\n\tcallback = once(callback || noop);\n\n\tvar ws = stream._writableState;\n\tvar rs = stream._readableState;\n\tvar readable = opts.readable || (opts.readable !== false && stream.readable);\n\tvar writable = opts.writable || (opts.writable !== false && stream.writable);\n\tvar cancelled = false;\n\n\tvar onlegacyfinish = function() {\n\t\tif (!stream.writable) onfinish();\n\t};\n\n\tvar onfinish = function() {\n\t\twritable = false;\n\t\tif (!readable) callback.call(stream);\n\t};\n\n\tvar onend = function() {\n\t\treadable = false;\n\t\tif (!writable) callback.call(stream);\n\t};\n\n\tvar onexit = function(exitCode) {\n\t\tcallback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);\n\t};\n\n\tvar onerror = function(err) {\n\t\tcallback.call(stream, err);\n\t};\n\n\tvar onclose = function() {\n\t\tqnt(onclosenexttick);\n\t};\n\n\tvar onclosenexttick = function() {\n\t\tif (cancelled) return;\n\t\tif (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));\n\t\tif (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));\n\t};\n\n\tvar onrequest = function() {\n\t\tstream.req.on('finish', onfinish);\n\t};\n\n\tif (isRequest(stream)) {\n\t\tstream.on('complete', onfinish);\n\t\tstream.on('abort', onclose);\n\t\tif (stream.req) onrequest();\n\t\telse stream.on('request', onrequest);\n\t} else if (writable && !ws) { // legacy streams\n\t\tstream.on('end', onlegacyfinish);\n\t\tstream.on('close', onlegacyfinish);\n\t}\n\n\tif (isChildProcess(stream)) stream.on('exit', onexit);\n\n\tstream.on('end', onend);\n\tstream.on('finish', onfinish);\n\tif (opts.error !== false) stream.on('error', onerror);\n\tstream.on('close', onclose);\n\n\treturn function() {\n\t\tcancelled = true;\n\t\tstream.removeListener('complete', onfinish);\n\t\tstream.removeListener('abort', onclose);\n\t\tstream.removeListener('request', onrequest);\n\t\tif (stream.req) stream.req.removeListener('finish', onfinish);\n\t\tstream.removeListener('end', onlegacyfinish);\n\t\tstream.removeListener('close', onlegacyfinish);\n\t\tstream.removeListener('finish', onfinish);\n\t\tstream.removeListener('exit', onexit);\n\t\tstream.removeListener('end', onend);\n\t\tstream.removeListener('error', onerror);\n\t\tstream.removeListener('close', onclose);\n\t};\n};\n\nmodule.exports = eos;\n","var once = require('once')\nvar eos = require('end-of-stream')\nvar fs\n\ntry {\n fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes\n} catch (e) {}\n\nvar noop = function () {}\nvar ancient = typeof process === 'undefined' ? false : /^v?\\.0/.test(process.version)\n\nvar isFn = function (fn) {\n return typeof fn === 'function'\n}\n\nvar isFS = function (stream) {\n if (!ancient) return false // newer node version do not need to care about fs is a special way\n if (!fs) return false // browser\n return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)\n}\n\nvar isRequest = function (stream) {\n return stream.setHeader && isFn(stream.abort)\n}\n\nvar destroyer = function (stream, reading, writing, callback) {\n callback = once(callback)\n\n var closed = false\n stream.on('close', function () {\n closed = true\n })\n\n eos(stream, {readable: reading, writable: writing}, function (err) {\n if (err) return callback(err)\n closed = true\n callback()\n })\n\n var destroyed = false\n return function (err) {\n if (closed) return\n if (destroyed) return\n destroyed = true\n\n if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks\n if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want\n\n if (isFn(stream.destroy)) return stream.destroy()\n\n callback(err || new Error('stream was destroyed'))\n }\n}\n\nvar call = function (fn) {\n fn()\n}\n\nvar pipe = function (from, to) {\n return from.pipe(to)\n}\n\nvar pump = function () {\n var streams = Array.prototype.slice.call(arguments)\n var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop\n\n if (Array.isArray(streams[0])) streams = streams[0]\n if (streams.length < 2) throw new Error('pump requires two streams per minimum')\n\n var error\n var destroys = streams.map(function (stream, i) {\n var reading = i < streams.length - 1\n var writing = i > 0\n return destroyer(stream, reading, writing, function (err) {\n if (!error) error = err\n if (err) destroys.forEach(call)\n if (reading) return\n destroys.forEach(call)\n callback(error)\n })\n })\n\n return streams.reduce(pipe)\n}\n\nmodule.exports = pump\n","'use strict';\nconst {PassThrough: PassThroughStream} = require('stream');\n\nmodule.exports = options => {\n\toptions = {...options};\n\n\tconst {array} = options;\n\tlet {encoding} = options;\n\tconst isBuffer = encoding === 'buffer';\n\tlet objectMode = false;\n\n\tif (array) {\n\t\tobjectMode = !(encoding || isBuffer);\n\t} else {\n\t\tencoding = encoding || 'utf8';\n\t}\n\n\tif (isBuffer) {\n\t\tencoding = null;\n\t}\n\n\tconst stream = new PassThroughStream({objectMode});\n\n\tif (encoding) {\n\t\tstream.setEncoding(encoding);\n\t}\n\n\tlet length = 0;\n\tconst chunks = [];\n\n\tstream.on('data', chunk => {\n\t\tchunks.push(chunk);\n\n\t\tif (objectMode) {\n\t\t\tlength = chunks.length;\n\t\t} else {\n\t\t\tlength += chunk.length;\n\t\t}\n\t});\n\n\tstream.getBufferedValue = () => {\n\t\tif (array) {\n\t\t\treturn chunks;\n\t\t}\n\n\t\treturn isBuffer ? Buffer.concat(chunks, length) : chunks.join('');\n\t};\n\n\tstream.getBufferedLength = () => length;\n\n\treturn stream;\n};\n","'use strict';\nconst {constants: BufferConstants} = require('buffer');\nconst pump = require('pump');\nconst bufferStream = require('./buffer-stream');\n\nclass MaxBufferError extends Error {\n\tconstructor() {\n\t\tsuper('maxBuffer exceeded');\n\t\tthis.name = 'MaxBufferError';\n\t}\n}\n\nasync function getStream(inputStream, options) {\n\tif (!inputStream) {\n\t\treturn Promise.reject(new Error('Expected a stream'));\n\t}\n\n\toptions = {\n\t\tmaxBuffer: Infinity,\n\t\t...options\n\t};\n\n\tconst {maxBuffer} = options;\n\n\tlet stream;\n\tawait new Promise((resolve, reject) => {\n\t\tconst rejectPromise = error => {\n\t\t\t// Don't retrieve an oversized buffer.\n\t\t\tif (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) {\n\t\t\t\terror.bufferedData = stream.getBufferedValue();\n\t\t\t}\n\n\t\t\treject(error);\n\t\t};\n\n\t\tstream = pump(inputStream, bufferStream(options), error => {\n\t\t\tif (error) {\n\t\t\t\trejectPromise(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresolve();\n\t\t});\n\n\t\tstream.on('data', () => {\n\t\t\tif (stream.getBufferedLength() > maxBuffer) {\n\t\t\t\trejectPromise(new MaxBufferError());\n\t\t\t}\n\t\t});\n\t});\n\n\treturn stream.getBufferedValue();\n}\n\nmodule.exports = getStream;\n// TODO: Remove this for the next major release\nmodule.exports.default = getStream;\nmodule.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'});\nmodule.exports.array = (stream, options) => getStream(stream, {...options, array: true});\nmodule.exports.MaxBufferError = MaxBufferError;\n","'use strict';\n\n/**\n * @typedef {Object} HttpRequest\n * @property {Record<string, string>} headers - Request headers\n * @property {string} [method] - HTTP method\n * @property {string} [url] - Request URL\n */\n\n/**\n * @typedef {Object} HttpResponse\n * @property {Record<string, string>} headers - Response headers\n * @property {number} [status] - HTTP status code\n */\n\n/**\n * Set of default cacheable status codes per RFC 7231 section 6.1.\n * @type {Set<number>}\n */\nconst statusCodeCacheableByDefault = new Set([\n 200,\n 203,\n 204,\n 206,\n 300,\n 301,\n 308,\n 404,\n 405,\n 410,\n 414,\n 501,\n]);\n\n/**\n * Set of HTTP status codes that the cache implementation understands.\n * Note: This implementation does not understand partial responses (206).\n * @type {Set<number>}\n */\nconst understoodStatuses = new Set([\n 200,\n 203,\n 204,\n 300,\n 301,\n 302,\n 303,\n 307,\n 308,\n 404,\n 405,\n 410,\n 414,\n 501,\n]);\n\n/**\n * Set of HTTP error status codes.\n * @type {Set<number>}\n */\nconst errorStatusCodes = new Set([\n 500,\n 502,\n 503,\n 504,\n]);\n\n/**\n * Object representing hop-by-hop headers that should be removed.\n * @type {Record<string, boolean>}\n */\nconst hopByHopHeaders = {\n date: true, // included, because we add Age update Date\n connection: true,\n 'keep-alive': true,\n 'proxy-authenticate': true,\n 'proxy-authorization': true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n};\n\n/**\n * Headers that are excluded from revalidation update.\n * @type {Record<string, boolean>}\n */\nconst excludedFromRevalidationUpdate = {\n // Since the old body is reused, it doesn't make sense to change properties of the body\n 'content-length': true,\n 'content-encoding': true,\n 'transfer-encoding': true,\n 'content-range': true,\n};\n\n/**\n * Converts a string to a number or returns zero if the conversion fails.\n * @param {string} s - The string to convert.\n * @returns {number} The parsed number or 0.\n */\nfunction toNumberOrZero(s) {\n const n = parseInt(s, 10);\n return isFinite(n) ? n : 0;\n}\n\n/**\n * Determines if the given response is an error response.\n * Implements RFC 5861 behavior.\n * @param {HttpResponse|undefined} response - The HTTP response object.\n * @returns {boolean} true if the response is an error or undefined, false otherwise.\n */\nfunction isErrorResponse(response) {\n // consider undefined response as faulty\n if (!response) {\n return true;\n }\n return errorStatusCodes.has(response.status);\n}\n\n/**\n * Parses a Cache-Control header string into an object.\n * @param {string} [header] - The Cache-Control header value.\n * @returns {Record<string, string|boolean>} An object representing Cache-Control directives.\n */\nfunction parseCacheControl(header) {\n /** @type {Record<string, string|boolean>} */\n const cc = {};\n if (!header) return cc;\n\n // TODO: When there is more than one value present for a given directive (e.g., two Expires header fields, multiple Cache-Control: max-age directives),\n // the directive's value is considered invalid. Caches are encouraged to consider responses that have invalid freshness information to be stale\n const parts = header.trim().split(/,/);\n for (const part of parts) {\n const [k, v] = part.split(/=/, 2);\n cc[k.trim()] = v === undefined ? true : v.trim().replace(/^\"|\"$/g, '');\n }\n\n return cc;\n}\n\n/**\n * Formats a Cache-Control directives object into a header string.\n * @param {Record<string, string|boolean>} cc - The Cache-Control directives.\n * @returns {string|undefined} A formatted Cache-Control header string or undefined if empty.\n */\nfunction formatCacheControl(cc) {\n let parts = [];\n for (const k in cc) {\n const v = cc[k];\n parts.push(v === true ? k : k + '=' + v);\n }\n if (!parts.length) {\n return undefined;\n }\n return parts.join(', ');\n}\n\nmodule.exports = class CachePolicy {\n /**\n * Creates a new CachePolicy instance.\n * @param {HttpRequest} req - Incoming client request.\n * @param {HttpResponse} res - Received server response.\n * @param {Object} [options={}] - Configuration options.\n * @param {boolean} [options.shared=true] - Is the cache shared (a public proxy)? `false` for personal browser caches.\n * @param {number} [options.cacheHeuristic=0.1] - Fallback heuristic (age fraction) for cache duration.\n * @param {number} [options.immutableMinTimeToLive=86400000] - Minimum TTL for immutable responses in milliseconds.\n * @param {boolean} [options.ignoreCargoCult=false] - Detect nonsense cache headers, and override them.\n * @param {any} [options._fromObject] - Internal parameter for deserialization. Do not use.\n */\n constructor(\n req,\n res,\n {\n shared,\n cacheHeuristic,\n immutableMinTimeToLive,\n ignoreCargoCult,\n _fromObject,\n } = {}\n ) {\n if (_fromObject) {\n this._fromObject(_fromObject);\n return;\n }\n\n if (!res || !res.headers) {\n throw Error('Response headers missing');\n }\n this._assertRequestHasHeaders(req);\n\n /** @type {number} Timestamp when the response was received */\n this._responseTime = this.now();\n /** @type {boolean} Indicates if the cache is shared */\n this._isShared = shared !== false;\n /** @type {boolean} Indicates if legacy cargo cult directives should be ignored */\n this._ignoreCargoCult = !!ignoreCargoCult;\n /** @type {number} Heuristic cache fraction */\n this._cacheHeuristic =\n undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE\n /** @type {number} Minimum TTL for immutable responses in ms */\n this._immutableMinTtl =\n undefined !== immutableMinTimeToLive\n ? immutableMinTimeToLive\n : 24 * 3600 * 1000;\n\n /** @type {number} HTTP status code */\n this._status = 'status' in res ? res.status : 200;\n /** @type {Record<string, string>} Response headers */\n this._resHeaders = res.headers;\n /** @type {Record<string, string|boolean>} Parsed Cache-Control directives from response */\n this._rescc = parseCacheControl(res.headers['cache-control']);\n /** @type {string} HTTP method (e.g., GET, POST) */\n this._method = 'method' in req ? req.method : 'GET';\n /** @type {string} Request URL */\n this._url = req.url;\n /** @type {string} Host header from the request */\n this._host = req.headers.host;\n /** @type {boolean} Whether the request does not include an Authorization header */\n this._noAuthorization = !req.headers.authorization;\n /** @type {Record<string, string>|null} Request headers used for Vary matching */\n this._reqHeaders = res.headers.vary ? req.headers : null; // Don't keep all request headers if they won't be used\n /** @type {Record<string, string|boolean>} Parsed Cache-Control directives from request */\n this._reqcc = parseCacheControl(req.headers['cache-control']);\n\n // Assume that if someone uses legacy, non-standard uncecessary options they don't understand caching,\n // so there's no point stricly adhering to the blindly copy&pasted directives.\n if (\n this._ignoreCargoCult &&\n 'pre-check' in this._rescc &&\n 'post-check' in this._rescc\n ) {\n delete this._rescc['pre-check'];\n delete this._rescc['post-check'];\n delete this._rescc['no-cache'];\n delete this._rescc['no-store'];\n delete this._rescc['must-revalidate'];\n this._resHeaders = Object.assign({}, this._resHeaders, {\n 'cache-control': formatCacheControl(this._rescc),\n });\n delete this._resHeaders.expires;\n delete this._resHeaders.pragma;\n }\n\n // When the Cache-Control header field is not present in a request, caches MUST consider the no-cache request pragma-directive\n // as having the same effect as if \"Cache-Control: no-cache\" were present (see Section 5.2.1).\n if (\n res.headers['cache-control'] == null &&\n /no-cache/.test(res.headers.pragma)\n ) {\n this._rescc['no-cache'] = true;\n }\n }\n\n /**\n * You can monkey-patch it for testing.\n * @returns {number} Current time in milliseconds.\n */\n now() {\n return Date.now();\n }\n\n /**\n * Determines if the response is storable in a cache.\n * @returns {boolean} `false` if can never be cached.\n */\n storable() {\n // The \"no-store\" request directive indicates that a cache MUST NOT store any part of either this request or any response to it.\n return !!(\n !this._reqcc['no-store'] &&\n // A cache MUST NOT store a response to any request, unless:\n // The request method is understood by the cache and defined as being cacheable, and\n ('GET' === this._method ||\n 'HEAD' === this._method ||\n ('POST' === this._method && this._hasExplicitExpiration())) &&\n // the response status code is understood by the cache, and\n understoodStatuses.has(this._status) &&\n // the \"no-store\" cache directive does not appear in request or response header fields, and\n !this._rescc['no-store'] &&\n // the \"private\" response directive does not appear in the response, if the cache is shared, and\n (!this._isShared || !this._rescc.private) &&\n // the Authorization header field does not appear in the request, if the cache is shared,\n (!this._isShared ||\n this._noAuthorization ||\n this._allowsStoringAuthenticated()) &&\n // the response either:\n // contains an Expires header field, or\n (this._resHeaders.expires ||\n // contains a max-age response directive, or\n // contains a s-maxage response directive and the cache is shared, or\n // contains a public response directive.\n this._rescc['max-age'] ||\n (this._isShared && this._rescc['s-maxage']) ||\n this._rescc.public ||\n // has a status code that is defined as cacheable by default\n statusCodeCacheableByDefault.has(this._status))\n );\n }\n\n /**\n * @returns {boolean} true if expiration is explicitly defined.\n */\n _hasExplicitExpiration() {\n // 4.2.1 Calculating Freshness Lifetime\n return !!(\n (this._isShared && this._rescc['s-maxage']) ||\n this._rescc['max-age'] ||\n this._resHeaders.expires\n );\n }\n\n /**\n * @param {HttpRequest} req - a request\n * @throws {Error} if the headers are missing.\n */\n _assertRequestHasHeaders(req) {\n if (!req || !req.headers) {\n throw Error('Request headers missing');\n }\n }\n\n /**\n * Checks if the request matches the cache and can be satisfied from the cache immediately,\n * without having to make a request to the server.\n *\n * This doesn't support `stale-while-revalidate`. See `evaluateRequest()` for a more complete solution.\n *\n * @param {HttpRequest} req - The new incoming HTTP request.\n * @returns {boolean} `true`` if the cached response used to construct this cache policy satisfies the request without revalidation.\n */\n satisfiesWithoutRevalidation(req) {\n const result = this.evaluateRequest(req);\n return !result.revalidation;\n }\n\n /**\n * @param {{headers: Record<string, string>, synchronous: boolean}|undefined} revalidation - Revalidation information, if any.\n * @returns {{response: {headers: Record<string, string>}, revalidation: {headers: Record<string, string>, synchronous: boolean}|undefined}} An object with a cached response headers and revalidation info.\n */\n _evaluateRequestHitResult(revalidation) {\n return {\n response: {\n headers: this.responseHeaders(),\n },\n revalidation,\n };\n }\n\n /**\n * @param {HttpRequest} request - new incoming\n * @param {boolean} synchronous - whether revalidation must be synchronous (not s-w-r).\n * @returns {{headers: Record<string, string>, synchronous: boolean}} An object with revalidation headers and a synchronous flag.\n */\n _evaluateRequestRevalidation(request, synchronous) {\n return {\n synchronous,\n headers: this.revalidationHeaders(request),\n };\n }\n\n /**\n * @param {HttpRequest} request - new incoming\n * @returns {{response: undefined, revalidation: {headers: Record<string, string>, synchronous: boolean}}} An object indicating no cached response and revalidation details.\n */\n _evaluateRequestMissResult(request) {\n return {\n response: undefined,\n revalidation: this._evaluateRequestRevalidation(request, true),\n };\n }\n\n /**\n * Checks if the given request matches this cache entry, and how the cache can be used to satisfy it. Returns an object with:\n *\n * ```\n * {\n * // If defined, you must send a request to the server.\n * revalidation: {\n * headers: {}, // HTTP headers to use when sending the revalidation response\n * // If true, you MUST wait for a response from the server before using the cache\n * // If false, this is stale-while-revalidate. The cache is stale, but you can use it while you update it asynchronously.\n * synchronous: bool,\n * },\n * // If defined, you can use this cached response.\n * response: {\n * headers: {}, // Updated cached HTTP headers you must use when responding to the client\n * },\n * }\n * ```\n * @param {HttpRequest} req - new incoming HTTP request\n * @returns {{response: {headers: Record<string, string>}|undefined, revalidation: {headers: Record<string, string>, synchronous: boolean}|undefined}} An object containing keys:\n * - revalidation: { headers: Record<string, string>, synchronous: boolean } Set if you should send this to the origin server\n * - response: { headers: Record<string, string> } Set if you can respond to the client with these cached headers\n */\n evaluateRequest(req) {\n this._assertRequestHasHeaders(req);\n\n // In all circumstances, a cache MUST NOT ignore the must-revalidate directive\n if (this._rescc['must-revalidate']) {\n return this._evaluateRequestMissResult(req);\n }\n\n if (!this._requestMatches(req, false)) {\n return this._evaluateRequestMissResult(req);\n }\n\n // When presented with a request, a cache MUST NOT reuse a stored response, unless:\n // the presented request does not contain the no-cache pragma (Section 5.4), nor the no-cache cache directive,\n // unless the stored response is successfully validated (Section 4.3), and\n const requestCC = parseCacheControl(req.headers['cache-control']);\n\n if (requestCC['no-cache'] || /no-cache/.test(req.headers.pragma)) {\n return this._evaluateRequestMissResult(req);\n }\n\n if (requestCC['max-age'] && this.age() > toNumberOrZero(requestCC['max-age'])) {\n return this._evaluateRequestMissResult(req);\n }\n\n if (requestCC['min-fresh'] && this.maxAge() - this.age() < toNumberOrZero(requestCC['min-fresh'])) {\n return this._evaluateRequestMissResult(req);\n }\n\n // the stored response is either:\n // fresh, or allowed to be served stale\n if (this.stale()) {\n // If a value is present, then the client is willing to accept a response that has\n // exceeded its freshness lifetime by no more than the specified number of seconds\n const allowsStaleWithoutRevalidation = 'max-stale' in requestCC &&\n (true === requestCC['max-stale'] || requestCC['max-stale'] > this.age() - this.maxAge());\n\n if (allowsStaleWithoutRevalidation) {\n return this._evaluateRequestHitResult(undefined);\n }\n\n if (this.useStaleWhileRevalidate()) {\n return this._evaluateRequestHitResult(this._evaluateRequestRevalidation(req, false));\n }\n\n return this._evaluateRequestMissResult(req);\n }\n\n return this._evaluateRequestHitResult(undefined);\n }\n\n /**\n * @param {HttpRequest} req - check if this is for the same cache entry\n * @param {boolean} allowHeadMethod - allow a HEAD method to match.\n * @returns {boolean} `true` if the request matches.\n */\n _requestMatches(req, allowHeadMethod) {\n // The presented effective request URI and that of the stored response match, and\n return !!(\n (!this._url || this._url === req.url) &&\n this._host === req.headers.host &&\n // the request method associated with the stored response allows it to be used for the presented request, and\n (!req.method ||\n this._method === req.method ||\n (allowHeadMethod && 'HEAD' === req.method)) &&\n // selecting header fields nominated by the stored response (if any) match those presented, and\n this._varyMatches(req)\n );\n }\n\n /**\n * Determines whether storing authenticated responses is allowed.\n * @returns {boolean} `true` if allowed.\n */\n _allowsStoringAuthenticated() {\n // following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage.\n return !!(\n this._rescc['must-revalidate'] ||\n this._rescc.public ||\n this._rescc['s-maxage']\n );\n }\n\n /**\n * Checks whether the Vary header in the response matches the new request.\n * @param {HttpRequest} req - incoming HTTP request\n * @returns {boolean} `true` if the vary headers match.\n */\n _varyMatches(req) {\n if (!this._resHeaders.vary) {\n return true;\n }\n\n // A Vary header field-value of \"*\" always fails to match\n if (this._resHeaders.vary === '*') {\n return false;\n }\n\n const fields = this._resHeaders.vary\n .trim()\n .toLowerCase()\n .split(/\\s*,\\s*/);\n for (const name of fields) {\n if (req.headers[name] !== this._reqHeaders[name]) return false;\n }\n return true;\n }\n\n /**\n * Creates a copy of the given headers without any hop-by-hop headers.\n * @param {Record<string, string>} inHeaders - old headers from the cached response\n * @returns {Record<string, string>} A new headers object without hop-by-hop headers.\n */\n _copyWithoutHopByHopHeaders(inHeaders) {\n /** @type {Record<string, string>} */\n const headers = {};\n for (const name in inHeaders) {\n if (hopByHopHeaders[name]) continue;\n headers[name] = inHeaders[name];\n }\n // 9.1. Connection\n if (inHeaders.connection) {\n const tokens = inHeaders.connection.trim().split(/\\s*,\\s*/);\n for (const name of tokens) {\n delete headers[name];\n }\n }\n if (headers.warning) {\n const warnings = headers.warning.split(/,/).filter(warning => {\n return !/^\\s*1[0-9][0-9]/.test(warning);\n });\n if (!warnings.length) {\n delete headers.warning;\n } else {\n headers.warning = warnings.join(',').trim();\n }\n }\n return headers;\n }\n\n /**\n * Returns the response headers adjusted for serving the cached response.\n * Removes hop-by-hop headers and updates the Age and Date headers.\n * @returns {Record<string, string>} The adjusted response headers.\n */\n responseHeaders() {\n const headers = this._copyWithoutHopByHopHeaders(this._resHeaders);\n const age = this.age();\n\n // A cache SHOULD generate 113 warning if it heuristically chose a freshness\n // lifetime greater than 24 hours and the response's age is greater than 24 hours.\n if (\n age > 3600 * 24 &&\n !this._hasExplicitExpiration() &&\n this.maxAge() > 3600 * 24\n ) {\n headers.warning =\n (headers.warning ? `${headers.warning}, ` : '') +\n '113 - \"rfc7234 5.5.4\"';\n }\n headers.age = `${Math.round(age)}`;\n headers.date = new Date(this.now()).toUTCString();\n return headers;\n }\n\n /**\n * Returns the Date header value from the response or the current time if invalid.\n * @returns {number} Timestamp (in milliseconds) representing the Date header or response time.\n */\n date() {\n const serverDate = Date.parse(this._resHeaders.date);\n if (isFinite(serverDate)) {\n return serverDate;\n }\n return this._responseTime;\n }\n\n /**\n * Value of the Age header, in seconds, updated for the current time.\n * May be fractional.\n * @returns {number} The age in seconds.\n */\n age() {\n let age = this._ageValue();\n\n const residentTime = (this.now() - this._responseTime) / 1000;\n return age + residentTime;\n }\n\n /**\n * @returns {number} The Age header value as a number.\n */\n _ageValue() {\n return toNumberOrZero(this._resHeaders.age);\n }\n\n /**\n * Possibly outdated value of applicable max-age (or heuristic equivalent) in seconds.\n * This counts since response's `Date`.\n *\n * For an up-to-date value, see `timeToLive()`.\n *\n * Returns the maximum age (freshness lifetime) of the response in seconds.\n * @returns {number} The max-age value in seconds.\n */\n maxAge() {\n if (!this.storable() || this._rescc['no-cache']) {\n return 0;\n }\n\n // Shared responses with cookies are cacheable according to the RFC, but IMHO it'd be unwise to do so by default\n // so this implementation requires explicit opt-in via public header\n if (\n this._isShared &&\n (this._resHeaders['set-cookie'] &&\n !this._rescc.public &&\n !this._rescc.immutable)\n ) {\n return 0;\n }\n\n if (this._resHeaders.vary === '*') {\n return 0;\n }\n\n if (this._isShared) {\n if (this._rescc['proxy-revalidate']) {\n return 0;\n }\n // if a response includes the s-maxage directive, a shared cache recipient MUST ignore the Expires field.\n if (this._rescc['s-maxage']) {\n return toNumberOrZero(this._rescc['s-maxage']);\n }\n }\n\n // If a response includes a Cache-Control field with the max-age directive, a recipient MUST ignore the Expires field.\n if (this._rescc['max-age']) {\n return toNumberOrZero(this._rescc['max-age']);\n }\n\n const defaultMinTtl = this._rescc.immutable ? this._immutableMinTtl : 0;\n\n const serverDate = this.date();\n if (this._resHeaders.expires) {\n const expires = Date.parse(this._resHeaders.expires);\n // A cache recipient MUST interpret invalid date formats, especially the value \"0\", as representing a time in the past (i.e., \"already expired\").\n if (Number.isNaN(expires) || expires < serverDate) {\n return 0;\n }\n return Math.max(defaultMinTtl, (expires - serverDate) / 1000);\n }\n\n if (this._resHeaders['last-modified']) {\n const lastModified = Date.parse(this._resHeaders['last-modified']);\n if (isFinite(lastModified) && serverDate > lastModified) {\n return Math.max(\n defaultMinTtl,\n ((serverDate - lastModified) / 1000) * this._cacheHeuristic\n );\n }\n }\n\n return defaultMinTtl;\n }\n\n /**\n * Remaining time this cache entry may be useful for, in *milliseconds*.\n * You can use this as an expiration time for your cache storage.\n *\n * Prefer this method over `maxAge()`, because it includes other factors like `age` and `stale-while-revalidate`.\n * @returns {number} Time-to-live in milliseconds.\n */\n timeToLive() {\n const age = this.maxAge() - this.age();\n const staleIfErrorAge = age + toNumberOrZero(this._rescc['stale-if-error']);\n const staleWhileRevalidateAge = age + toNumberOrZero(this._rescc['stale-while-revalidate']);\n return Math.round(Math.max(0, age, staleIfErrorAge, staleWhileRevalidateAge) * 1000);\n }\n\n /**\n * If true, this cache entry is past its expiration date.\n * Note that stale cache may be useful sometimes, see `evaluateRequest()`.\n * @returns {boolean} `false` doesn't mean it's fresh nor usable\n */\n stale() {\n return this.maxAge() <= this.age();\n }\n\n /**\n * @returns {boolean} `true` if `stale-if-error` condition allows use of a stale response.\n */\n _useStaleIfError() {\n return this.maxAge() + toNumberOrZero(this._rescc['stale-if-error']) > this.age();\n }\n\n /** See `evaluateRequest()` for a more complete solution\n * @returns {boolean} `true` if `stale-while-revalidate` is currently allowed.\n */\n useStaleWhileRevalidate() {\n const swr = toNumberOrZero(this._rescc['stale-while-revalidate']);\n return swr > 0 && this.maxAge() + swr > this.age();\n }\n\n /**\n * Creates a `CachePolicy` instance from a serialized object.\n * @param {Object} obj - The serialized object.\n * @returns {CachePolicy} A new CachePolicy instance.\n */\n static fromObject(obj) {\n return new this(undefined, undefined, { _fromObject: obj });\n }\n\n /**\n * @param {any} obj - The serialized object.\n * @throws {Error} If already initialized or if the object is invalid.\n */\n _fromObject(obj) {\n if (this._responseTime) throw Error('Reinitialized');\n if (!obj || obj.v !== 1) throw Error('Invalid serialization');\n\n this._responseTime = obj.t;\n this._isShared = obj.sh;\n this._cacheHeuristic = obj.ch;\n this._immutableMinTtl =\n obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000;\n this._ignoreCargoCult = !!obj.icc;\n this._status = obj.st;\n this._resHeaders = obj.resh;\n this._rescc = obj.rescc;\n this._method = obj.m;\n this._url = obj.u;\n this._host = obj.h;\n this._noAuthorization = obj.a;\n this._reqHeaders = obj.reqh;\n this._reqcc = obj.reqcc;\n }\n\n /**\n * Serializes the `CachePolicy` instance into a JSON-serializable object.\n * @returns {Object} The serialized object.\n */\n toObject() {\n return {\n v: 1,\n t: this._responseTime,\n sh: this._isShared,\n ch: this._cacheHeuristic,\n imm: this._immutableMinTtl,\n icc: this._ignoreCargoCult,\n st: this._status,\n resh: this._resHeaders,\n rescc: this._rescc,\n m: this._method,\n u: this._url,\n h: this._host,\n a: this._noAuthorization,\n reqh: this._reqHeaders,\n reqcc: this._reqcc,\n };\n }\n\n /**\n * Headers for sending to the origin server to revalidate stale response.\n * Allows server to return 304 to allow reuse of the previous response.\n *\n * Hop by hop headers are always stripped.\n * Revalidation headers may be added or removed, depending on request.\n * @param {HttpRequest} incomingReq - The incoming HTTP request.\n * @returns {Record<string, string>} The headers for the revalidation request.\n */\n revalidationHeaders(incomingReq) {\n this._assertRequestHasHeaders(incomingReq);\n const headers = this._copyWithoutHopByHopHeaders(incomingReq.headers);\n\n // This implementation does not understand range requests\n delete headers['if-range'];\n\n if (!this._requestMatches(incomingReq, true) || !this.storable()) {\n // revalidation allowed via HEAD\n // not for the same resource, or wasn't allowed to be cached anyway\n delete headers['if-none-match'];\n delete headers['if-modified-since'];\n return headers;\n }\n\n /* MUST send that entity-tag in any cache validation request (using If-Match or If-None-Match) if an entity-tag has been provided by the origin server. */\n if (this._resHeaders.etag) {\n headers['if-none-match'] = headers['if-none-match']\n ? `${headers['if-none-match']}, ${this._resHeaders.etag}`\n : this._resHeaders.etag;\n }\n\n // Clients MAY issue simple (non-subrange) GET requests with either weak validators or strong validators. Clients MUST NOT use weak validators in other forms of request.\n const forbidsWeakValidators =\n headers['accept-ranges'] ||\n headers['if-match'] ||\n headers['if-unmodified-since'] ||\n (this._method && this._method != 'GET');\n\n /* SHOULD send the Last-Modified value in non-subrange cache validation requests (using If-Modified-Since) if only a Last-Modified value has been provided by the origin server.\n Note: This implementation does not understand partial responses (206) */\n if (forbidsWeakValidators) {\n delete headers['if-modified-since'];\n\n if (headers['if-none-match']) {\n const etags = headers['if-none-match']\n .split(/,/)\n .filter(etag => {\n return !/^\\s*W\\//.test(etag);\n });\n if (!etags.length) {\n delete headers['if-none-match'];\n } else {\n headers['if-none-match'] = etags.join(',').trim();\n }\n }\n } else if (\n this._resHeaders['last-modified'] &&\n !headers['if-modified-since']\n ) {\n headers['if-modified-since'] = this._resHeaders['last-modified'];\n }\n\n return headers;\n }\n\n /**\n * Creates new CachePolicy with information combined from the previews response,\n * and the new revalidation response.\n *\n * Returns {policy, modified} where modified is a boolean indicating\n * whether the response body has been modified, and old cached body can't be used.\n *\n * @param {HttpRequest} request - The latest HTTP request asking for the cached entry.\n * @param {HttpResponse} response - The latest revalidation HTTP response from the origin server.\n * @returns {{policy: CachePolicy, modified: boolean, matches: boolean}} The updated policy and modification status.\n * @throws {Error} If the response headers are missing.\n */\n revalidatedPolicy(request, response) {\n this._assertRequestHasHeaders(request);\n\n if (this._useStaleIfError() && isErrorResponse(response)) {\n return {\n policy: this,\n modified: false,\n matches: true,\n };\n }\n\n if (!response || !response.headers) {\n throw Error('Response headers missing');\n }\n\n // These aren't going to be supported exactly, since one CachePolicy object\n // doesn't know about all the other cached objects.\n let matches = false;\n if (response.status !== undefined && response.status != 304) {\n matches = false;\n } else if (\n response.headers.etag &&\n !/^\\s*W\\//.test(response.headers.etag)\n ) {\n // \"All of the stored responses with the same strong validator are selected.\n // If none of the stored responses contain the same strong validator,\n // then the cache MUST NOT use the new response to update any stored responses.\"\n matches =\n this._resHeaders.etag &&\n this._resHeaders.etag.replace(/^\\s*W\\//, '') ===\n response.headers.etag;\n } else if (this._resHeaders.etag && response.headers.etag) {\n // \"If the new response contains a weak validator and that validator corresponds\n // to one of the cache's stored responses,\n // then the most recent of those matching stored responses is selected for update.\"\n matches =\n this._resHeaders.etag.replace(/^\\s*W\\//, '') ===\n response.headers.etag.replace(/^\\s*W\\//, '');\n } else if (this._resHeaders['last-modified']) {\n matches =\n this._resHeaders['last-modified'] ===\n response.headers['last-modified'];\n } else {\n // If the new response does not include any form of validator (such as in the case where\n // a client generates an If-Modified-Since request from a source other than the Last-Modified\n // response header field), and there is only one stored response, and that stored response also\n // lacks a validator, then that stored response is selected for update.\n if (\n !this._resHeaders.etag &&\n !this._resHeaders['last-modified'] &&\n !response.headers.etag &&\n !response.headers['last-modified']\n ) {\n matches = true;\n }\n }\n\n const optionsCopy = {\n shared: this._isShared,\n cacheHeuristic: this._cacheHeuristic,\n immutableMinTimeToLive: this._immutableMinTtl,\n ignoreCargoCult: this._ignoreCargoCult,\n };\n\n if (!matches) {\n return {\n policy: new this.constructor(request, response, optionsCopy),\n // Client receiving 304 without body, even if it's invalid/mismatched has no option\n // but to reuse a cached body. We don't have a good way to tell clients to do\n // error recovery in such case.\n modified: response.status != 304,\n matches: false,\n };\n }\n\n // use other header fields provided in the 304 (Not Modified) response to replace all instances\n // of the corresponding header fields in the stored response.\n const headers = {};\n for (const k in this._resHeaders) {\n headers[k] =\n k in response.headers && !excludedFromRevalidationUpdate[k]\n ? response.headers[k]\n : this._resHeaders[k];\n }\n\n const newResponse = Object.assign({}, response, {\n status: this._status,\n method: this._method,\n headers,\n });\n return {\n policy: new this.constructor(request, newResponse, optionsCopy),\n modified: false,\n matches: true,\n };\n }\n};\n","'use strict';\nmodule.exports = object => {\n\tconst result = {};\n\n\tfor (const [key, value] of Object.entries(object)) {\n\t\tresult[key.toLowerCase()] = value;\n\t}\n\n\treturn result;\n};\n","'use strict';\n\nconst Readable = require('stream').Readable;\nconst lowercaseKeys = require('lowercase-keys');\n\nclass Response extends Readable {\n\tconstructor(statusCode, headers, body, url) {\n\t\tif (typeof statusCode !== 'number') {\n\t\t\tthrow new TypeError('Argument `statusCode` should be a number');\n\t\t}\n\t\tif (typeof headers !== 'object') {\n\t\t\tthrow new TypeError('Argument `headers` should be an object');\n\t\t}\n\t\tif (!(body instanceof Buffer)) {\n\t\t\tthrow new TypeError('Argument `body` should be a buffer');\n\t\t}\n\t\tif (typeof url !== 'string') {\n\t\t\tthrow new TypeError('Argument `url` should be a string');\n\t\t}\n\n\t\tsuper();\n\t\tthis.statusCode = statusCode;\n\t\tthis.headers = lowercaseKeys(headers);\n\t\tthis.body = body;\n\t\tthis.url = url;\n\t}\n\n\t_read() {\n\t\tthis.push(this.body);\n\t\tthis.push(null);\n\t}\n}\n\nmodule.exports = Response;\n","'use strict';\n\n// We define these manually to ensure they're always copied\n// even if they would move up the prototype chain\n// https://nodejs.org/api/http.html#http_class_http_incomingmessage\nconst knownProps = [\n\t'destroy',\n\t'setTimeout',\n\t'socket',\n\t'headers',\n\t'trailers',\n\t'rawHeaders',\n\t'statusCode',\n\t'httpVersion',\n\t'httpVersionMinor',\n\t'httpVersionMajor',\n\t'rawTrailers',\n\t'statusMessage'\n];\n\nmodule.exports = (fromStream, toStream) => {\n\tconst fromProps = new Set(Object.keys(fromStream).concat(knownProps));\n\n\tfor (const prop of fromProps) {\n\t\t// Don't overwrite existing properties\n\t\tif (prop in toStream) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttoStream[prop] = typeof fromStream[prop] === 'function' ? fromStream[prop].bind(fromStream) : fromStream[prop];\n\t}\n};\n","'use strict';\n\nconst PassThrough = require('stream').PassThrough;\nconst mimicResponse = require('mimic-response');\n\nconst cloneResponse = response => {\n\tif (!(response && response.pipe)) {\n\t\tthrow new TypeError('Parameter `response` must be a response stream.');\n\t}\n\n\tconst clone = new PassThrough();\n\tmimicResponse(response, clone);\n\n\treturn response.pipe(clone);\n};\n\nmodule.exports = cloneResponse;\n","//TODO: handle reviver/dehydrate function like normal\n//and handle indentation, like normal.\n//if anyone needs this... please send pull request.\n\nexports.stringify = function stringify (o) {\n if('undefined' == typeof o) return o\n\n if(o && Buffer.isBuffer(o))\n return JSON.stringify(':base64:' + o.toString('base64'))\n\n if(o && o.toJSON)\n o = o.toJSON()\n\n if(o && 'object' === typeof o) {\n var s = ''\n var array = Array.isArray(o)\n s = array ? '[' : '{'\n var first = true\n\n for(var k in o) {\n var ignore = 'function' == typeof o[k] || (!array && 'undefined' === typeof o[k])\n if(Object.hasOwnProperty.call(o, k) && !ignore) {\n if(!first)\n s += ','\n first = false\n if (array) {\n if(o[k] == undefined)\n s += 'null'\n else\n s += stringify(o[k])\n } else if (o[k] !== void(0)) {\n s += stringify(k) + ':' + stringify(o[k])\n }\n }\n }\n\n s += array ? ']' : '}'\n\n return s\n } else if ('string' === typeof o) {\n return JSON.stringify(/^:/.test(o) ? ':' + o : o)\n } else if ('undefined' === typeof o) {\n return 'null';\n } else\n return JSON.stringify(o)\n}\n\nexports.parse = function (s) {\n return JSON.parse(s, function (key, value) {\n if('string' === typeof value) {\n if(/^:base64:/.test(value))\n return Buffer.from(value.substring(8), 'base64')\n else\n return /^:/.test(value) ? value.substring(1) : value \n }\n return value\n })\n}\n","'use strict';\n\nconst EventEmitter = require('events');\nconst JSONB = require('json-buffer');\n\nconst loadStore = options => {\n\tconst adapters = {\n\t\tredis: '@keyv/redis',\n\t\trediss: '@keyv/redis',\n\t\tmongodb: '@keyv/mongo',\n\t\tmongo: '@keyv/mongo',\n\t\tsqlite: '@keyv/sqlite',\n\t\tpostgresql: '@keyv/postgres',\n\t\tpostgres: '@keyv/postgres',\n\t\tmysql: '@keyv/mysql',\n\t\tetcd: '@keyv/etcd',\n\t\toffline: '@keyv/offline',\n\t\ttiered: '@keyv/tiered',\n\t};\n\tif (options.adapter || options.uri) {\n\t\tconst adapter = options.adapter || /^[^:+]*/.exec(options.uri)[0];\n\t\treturn new (require(adapters[adapter]))(options);\n\t}\n\n\treturn new Map();\n};\n\nconst iterableAdapters = [\n\t'sqlite',\n\t'postgres',\n\t'mysql',\n\t'mongo',\n\t'redis',\n\t'tiered',\n];\n\nclass Keyv extends EventEmitter {\n\tconstructor(uri, {emitErrors = true, ...options} = {}) {\n\t\tsuper();\n\t\tthis.opts = {\n\t\t\tnamespace: 'keyv',\n\t\t\tserialize: JSONB.stringify,\n\t\t\tdeserialize: JSONB.parse,\n\t\t\t...((typeof uri === 'string') ? {uri} : uri),\n\t\t\t...options,\n\t\t};\n\n\t\tif (!this.opts.store) {\n\t\t\tconst adapterOptions = {...this.opts};\n\t\t\tthis.opts.store = loadStore(adapterOptions);\n\t\t}\n\n\t\tif (this.opts.compression) {\n\t\t\tconst compression = this.opts.compression;\n\t\t\tthis.opts.serialize = compression.serialize.bind(compression);\n\t\t\tthis.opts.deserialize = compression.deserialize.bind(compression);\n\t\t}\n\n\t\tif (typeof this.opts.store.on === 'function' && emitErrors) {\n\t\t\tthis.opts.store.on('error', error => this.emit('error', error));\n\t\t}\n\n\t\tthis.opts.store.namespace = this.opts.namespace;\n\n\t\tconst generateIterator = iterator => async function * () {\n\t\t\tfor await (const [key, raw] of typeof iterator === 'function'\n\t\t\t\t? iterator(this.opts.store.namespace)\n\t\t\t\t: iterator) {\n\t\t\t\tconst data = await this.opts.deserialize(raw);\n\t\t\t\tif (this.opts.store.namespace && !key.includes(this.opts.store.namespace)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (typeof data.expires === 'number' && Date.now() > data.expires) {\n\t\t\t\t\tthis.delete(key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tyield [this._getKeyUnprefix(key), data.value];\n\t\t\t}\n\t\t};\n\n\t\t// Attach iterators\n\t\tif (typeof this.opts.store[Symbol.iterator] === 'function' && this.opts.store instanceof Map) {\n\t\t\tthis.iterator = generateIterator(this.opts.store);\n\t\t} else if (typeof this.opts.store.iterator === 'function' && this.opts.store.opts\n\t\t\t&& this._checkIterableAdaptar()) {\n\t\t\tthis.iterator = generateIterator(this.opts.store.iterator.bind(this.opts.store));\n\t\t}\n\t}\n\n\t_checkIterableAdaptar() {\n\t\treturn iterableAdapters.includes(this.opts.store.opts.dialect)\n\t\t\t|| iterableAdapters.findIndex(element => this.opts.store.opts.url.includes(element)) >= 0;\n\t}\n\n\t_getKeyPrefix(key) {\n\t\treturn `${this.opts.namespace}:${key}`;\n\t}\n\n\t_getKeyPrefixArray(keys) {\n\t\treturn keys.map(key => `${this.opts.namespace}:${key}`);\n\t}\n\n\t_getKeyUnprefix(key) {\n\t\treturn key\n\t\t\t.split(':')\n\t\t\t.splice(1)\n\t\t\t.join(':');\n\t}\n\n\tget(key, options) {\n\t\tconst {store} = this.opts;\n\t\tconst isArray = Array.isArray(key);\n\t\tconst keyPrefixed = isArray ? this._getKeyPrefixArray(key) : this._getKeyPrefix(key);\n\t\tif (isArray && store.getMany === undefined) {\n\t\t\tconst promises = [];\n\t\t\tfor (const key of keyPrefixed) {\n\t\t\t\tpromises.push(Promise.resolve()\n\t\t\t\t\t.then(() => store.get(key))\n\t\t\t\t\t.then(data => (typeof data === 'string') ? this.opts.deserialize(data) : (this.opts.compression ? this.opts.deserialize(data) : data))\n\t\t\t\t\t.then(data => {\n\t\t\t\t\t\tif (data === undefined || data === null) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof data.expires === 'number' && Date.now() > data.expires) {\n\t\t\t\t\t\t\treturn this.delete(key).then(() => undefined);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (options && options.raw) ? data : data.value;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn Promise.allSettled(promises)\n\t\t\t\t.then(values => {\n\t\t\t\t\tconst data = [];\n\t\t\t\t\tfor (const value of values) {\n\t\t\t\t\t\tdata.push(value.value);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn data;\n\t\t\t\t});\n\t\t}\n\n\t\treturn Promise.resolve()\n\t\t\t.then(() => isArray ? store.getMany(keyPrefixed) : store.get(keyPrefixed))\n\t\t\t.then(data => (typeof data === 'string') ? this.opts.deserialize(data) : (this.opts.compression ? this.opts.deserialize(data) : data))\n\t\t\t.then(data => {\n\t\t\t\tif (data === undefined || data === null) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tif (isArray) {\n\t\t\t\t\treturn data.map((row, index) => {\n\t\t\t\t\t\tif ((typeof row === 'string')) {\n\t\t\t\t\t\t\trow = this.opts.deserialize(row);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (row === undefined || row === null) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof row.expires === 'number' && Date.now() > row.expires) {\n\t\t\t\t\t\t\tthis.delete(key[index]).then(() => undefined);\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (options && options.raw) ? row : row.value;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (typeof data.expires === 'number' && Date.now() > data.expires) {\n\t\t\t\t\treturn this.delete(key).then(() => undefined);\n\t\t\t\t}\n\n\t\t\t\treturn (options && options.raw) ? data : data.value;\n\t\t\t});\n\t}\n\n\tset(key, value, ttl) {\n\t\tconst keyPrefixed = this._getKeyPrefix(key);\n\t\tif (typeof ttl === 'undefined') {\n\t\t\tttl = this.opts.ttl;\n\t\t}\n\n\t\tif (ttl === 0) {\n\t\t\tttl = undefined;\n\t\t}\n\n\t\tconst {store} = this.opts;\n\n\t\treturn Promise.resolve()\n\t\t\t.then(() => {\n\t\t\t\tconst expires = (typeof ttl === 'number') ? (Date.now() + ttl) : null;\n\t\t\t\tif (typeof value === 'symbol') {\n\t\t\t\t\tthis.emit('error', 'symbol cannot be serialized');\n\t\t\t\t}\n\n\t\t\t\tvalue = {value, expires};\n\t\t\t\treturn this.opts.serialize(value);\n\t\t\t})\n\t\t\t.then(value => store.set(keyPrefixed, value, ttl))\n\t\t\t.then(() => true);\n\t}\n\n\tdelete(key) {\n\t\tconst {store} = this.opts;\n\t\tif (Array.isArray(key)) {\n\t\t\tconst keyPrefixed = this._getKeyPrefixArray(key);\n\t\t\tif (store.deleteMany === undefined) {\n\t\t\t\tconst promises = [];\n\t\t\t\tfor (const key of keyPrefixed) {\n\t\t\t\t\tpromises.push(store.delete(key));\n\t\t\t\t}\n\n\t\t\t\treturn Promise.allSettled(promises)\n\t\t\t\t\t.then(values => values.every(x => x.value === true));\n\t\t\t}\n\n\t\t\treturn Promise.resolve()\n\t\t\t\t.then(() => store.deleteMany(keyPrefixed));\n\t\t}\n\n\t\tconst keyPrefixed = this._getKeyPrefix(key);\n\t\treturn Promise.resolve()\n\t\t\t.then(() => store.delete(keyPrefixed));\n\t}\n\n\tclear() {\n\t\tconst {store} = this.opts;\n\t\treturn Promise.resolve()\n\t\t\t.then(() => store.clear());\n\t}\n\n\thas(key) {\n\t\tconst keyPrefixed = this._getKeyPrefix(key);\n\t\tconst {store} = this.opts;\n\t\treturn Promise.resolve()\n\t\t\t.then(async () => {\n\t\t\t\tif (typeof store.has === 'function') {\n\t\t\t\t\treturn store.has(keyPrefixed);\n\t\t\t\t}\n\n\t\t\t\tconst value = await store.get(keyPrefixed);\n\t\t\t\treturn value !== undefined;\n\t\t\t});\n\t}\n\n\tdisconnect() {\n\t\tconst {store} = this.opts;\n\t\tif (typeof store.disconnect === 'function') {\n\t\t\treturn store.disconnect();\n\t\t}\n\t}\n}\n\nmodule.exports = Keyv;\n","'use strict';\n\nconst EventEmitter = require('events');\nconst urlLib = require('url');\nconst normalizeUrl = require('normalize-url');\nconst getStream = require('get-stream');\nconst CachePolicy = require('http-cache-semantics');\nconst Response = require('responselike');\nconst lowercaseKeys = require('lowercase-keys');\nconst cloneResponse = require('clone-response');\nconst Keyv = require('keyv');\n\nclass CacheableRequest {\n\tconstructor(request, cacheAdapter) {\n\t\tif (typeof request !== 'function') {\n\t\t\tthrow new TypeError('Parameter `request` must be a function');\n\t\t}\n\n\t\tthis.cache = new Keyv({\n\t\t\turi: typeof cacheAdapter === 'string' && cacheAdapter,\n\t\t\tstore: typeof cacheAdapter !== 'string' && cacheAdapter,\n\t\t\tnamespace: 'cacheable-request'\n\t\t});\n\n\t\treturn this.createCacheableRequest(request);\n\t}\n\n\tcreateCacheableRequest(request) {\n\t\treturn (opts, cb) => {\n\t\t\tlet url;\n\t\t\tif (typeof opts === 'string') {\n\t\t\t\turl = normalizeUrlObject(urlLib.parse(opts));\n\t\t\t\topts = {};\n\t\t\t} else if (opts instanceof urlLib.URL) {\n\t\t\t\turl = normalizeUrlObject(urlLib.parse(opts.toString()));\n\t\t\t\topts = {};\n\t\t\t} else {\n\t\t\t\tconst [pathname, ...searchParts] = (opts.path || '').split('?');\n\t\t\t\tconst search = searchParts.length > 0 ?\n\t\t\t\t\t`?${searchParts.join('?')}` :\n\t\t\t\t\t'';\n\t\t\t\turl = normalizeUrlObject({ ...opts, pathname, search });\n\t\t\t}\n\n\t\t\topts = {\n\t\t\t\theaders: {},\n\t\t\t\tmethod: 'GET',\n\t\t\t\tcache: true,\n\t\t\t\tstrictTtl: false,\n\t\t\t\tautomaticFailover: false,\n\t\t\t\t...opts,\n\t\t\t\t...urlObjectToRequestOptions(url)\n\t\t\t};\n\t\t\topts.headers = lowercaseKeys(opts.headers);\n\n\t\t\tconst ee = new EventEmitter();\n\t\t\tconst normalizedUrlString = normalizeUrl(\n\t\t\t\turlLib.format(url),\n\t\t\t\t{\n\t\t\t\t\tstripWWW: false,\n\t\t\t\t\tremoveTrailingSlash: false,\n\t\t\t\t\tstripAuthentication: false\n\t\t\t\t}\n\t\t\t);\n\t\t\tconst key = `${opts.method}:${normalizedUrlString}`;\n\t\t\tlet revalidate = false;\n\t\t\tlet madeRequest = false;\n\n\t\t\tconst makeRequest = opts => {\n\t\t\t\tmadeRequest = true;\n\t\t\t\tlet requestErrored = false;\n\t\t\t\tlet requestErrorCallback;\n\n\t\t\t\tconst requestErrorPromise = new Promise(resolve => {\n\t\t\t\t\trequestErrorCallback = () => {\n\t\t\t\t\t\tif (!requestErrored) {\n\t\t\t\t\t\t\trequestErrored = true;\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tconst handler = response => {\n\t\t\t\t\tif (revalidate && !opts.forceRefresh) {\n\t\t\t\t\t\tresponse.status = response.statusCode;\n\t\t\t\t\t\tconst revalidatedPolicy = CachePolicy.fromObject(revalidate.cachePolicy).revalidatedPolicy(opts, response);\n\t\t\t\t\t\tif (!revalidatedPolicy.modified) {\n\t\t\t\t\t\t\tconst headers = revalidatedPolicy.policy.responseHeaders();\n\t\t\t\t\t\t\tresponse = new Response(revalidate.statusCode, headers, revalidate.body, revalidate.url);\n\t\t\t\t\t\t\tresponse.cachePolicy = revalidatedPolicy.policy;\n\t\t\t\t\t\t\tresponse.fromCache = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!response.fromCache) {\n\t\t\t\t\t\tresponse.cachePolicy = new CachePolicy(opts, response, opts);\n\t\t\t\t\t\tresponse.fromCache = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet clonedResponse;\n\t\t\t\t\tif (opts.cache && response.cachePolicy.storable()) {\n\t\t\t\t\t\tclonedResponse = cloneResponse(response);\n\n\t\t\t\t\t\t(async () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst bodyPromise = getStream.buffer(response);\n\n\t\t\t\t\t\t\t\tawait Promise.race([\n\t\t\t\t\t\t\t\t\trequestErrorPromise,\n\t\t\t\t\t\t\t\t\tnew Promise(resolve => response.once('end', resolve))\n\t\t\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t\t\tif (requestErrored) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst body = await bodyPromise;\n\n\t\t\t\t\t\t\t\tconst value = {\n\t\t\t\t\t\t\t\t\tcachePolicy: response.cachePolicy.toObject(),\n\t\t\t\t\t\t\t\t\turl: response.url,\n\t\t\t\t\t\t\t\t\tstatusCode: response.fromCache ? revalidate.statusCode : response.statusCode,\n\t\t\t\t\t\t\t\t\tbody\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tlet ttl = opts.strictTtl ? response.cachePolicy.timeToLive() : undefined;\n\t\t\t\t\t\t\t\tif (opts.maxTtl) {\n\t\t\t\t\t\t\t\t\tttl = ttl ? Math.min(ttl, opts.maxTtl) : opts.maxTtl;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait this.cache.set(key, value, ttl);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})();\n\t\t\t\t\t} else if (opts.cache && revalidate) {\n\t\t\t\t\t\t(async () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait this.cache.delete(key);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})();\n\t\t\t\t\t}\n\n\t\t\t\t\tee.emit('response', clonedResponse || response);\n\t\t\t\t\tif (typeof cb === 'function') {\n\t\t\t\t\t\tcb(clonedResponse || response);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\ttry {\n\t\t\t\t\tconst req = request(opts, handler);\n\t\t\t\t\treq.once('error', requestErrorCallback);\n\t\t\t\t\treq.once('abort', requestErrorCallback);\n\t\t\t\t\tee.emit('request', req);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tee.emit('error', new CacheableRequest.RequestError(error));\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t(async () => {\n\t\t\t\tconst get = async opts => {\n\t\t\t\t\tawait Promise.resolve();\n\n\t\t\t\t\tconst cacheEntry = opts.cache ? await this.cache.get(key) : undefined;\n\t\t\t\t\tif (typeof cacheEntry === 'undefined') {\n\t\t\t\t\t\treturn makeRequest(opts);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst policy = CachePolicy.fromObject(cacheEntry.cachePolicy);\n\t\t\t\t\tif (policy.satisfiesWithoutRevalidation(opts) && !opts.forceRefresh) {\n\t\t\t\t\t\tconst headers = policy.responseHeaders();\n\t\t\t\t\t\tconst response = new Response(cacheEntry.statusCode, headers, cacheEntry.body, cacheEntry.url);\n\t\t\t\t\t\tresponse.cachePolicy = policy;\n\t\t\t\t\t\tresponse.fromCache = true;\n\n\t\t\t\t\t\tee.emit('response', response);\n\t\t\t\t\t\tif (typeof cb === 'function') {\n\t\t\t\t\t\t\tcb(response);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trevalidate = cacheEntry;\n\t\t\t\t\t\topts.headers = policy.revalidationHeaders(opts);\n\t\t\t\t\t\tmakeRequest(opts);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst errorHandler = error => ee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\tthis.cache.once('error', errorHandler);\n\t\t\t\tee.on('response', () => this.cache.removeListener('error', errorHandler));\n\n\t\t\t\ttry {\n\t\t\t\t\tawait get(opts);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (opts.automaticFailover && !madeRequest) {\n\t\t\t\t\t\tmakeRequest(opts);\n\t\t\t\t\t}\n\n\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\treturn ee;\n\t\t};\n\t}\n}\n\nfunction urlObjectToRequestOptions(url) {\n\tconst options = { ...url };\n\toptions.path = `${url.pathname || '/'}${url.search || ''}`;\n\tdelete options.pathname;\n\tdelete options.search;\n\treturn options;\n}\n\nfunction normalizeUrlObject(url) {\n\t// If url was parsed by url.parse or new URL:\n\t// - hostname will be set\n\t// - host will be hostname[:port]\n\t// - port will be set if it was explicit in the parsed string\n\t// Otherwise, url was from request options:\n\t// - hostname or host may be set\n\t// - host shall not have port encoded\n\treturn {\n\t\tprotocol: url.protocol,\n\t\tauth: url.auth,\n\t\thostname: url.hostname || url.host || 'localhost',\n\t\tport: url.port,\n\t\tpathname: url.pathname,\n\t\tsearch: url.search\n\t};\n}\n\nCacheableRequest.RequestError = class extends Error {\n\tconstructor(error) {\n\t\tsuper(error.message);\n\t\tthis.name = 'RequestError';\n\t\tObject.assign(this, error);\n\t}\n};\n\nCacheableRequest.CacheError = class extends Error {\n\tconstructor(error) {\n\t\tsuper(error.message);\n\t\tthis.name = 'CacheError';\n\t\tObject.assign(this, error);\n\t}\n};\n\nmodule.exports = CacheableRequest;\n","'use strict';\n\n// We define these manually to ensure they're always copied\n// even if they would move up the prototype chain\n// https://nodejs.org/api/http.html#http_class_http_incomingmessage\nconst knownProperties = [\n\t'aborted',\n\t'complete',\n\t'headers',\n\t'httpVersion',\n\t'httpVersionMinor',\n\t'httpVersionMajor',\n\t'method',\n\t'rawHeaders',\n\t'rawTrailers',\n\t'setTimeout',\n\t'socket',\n\t'statusCode',\n\t'statusMessage',\n\t'trailers',\n\t'url'\n];\n\nmodule.exports = (fromStream, toStream) => {\n\tif (toStream._readableState.autoDestroy) {\n\t\tthrow new Error('The second stream must have the `autoDestroy` option set to `false`');\n\t}\n\n\tconst fromProperties = new Set(Object.keys(fromStream).concat(knownProperties));\n\n\tconst properties = {};\n\n\tfor (const property of fromProperties) {\n\t\t// Don't overwrite existing properties.\n\t\tif (property in toStream) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tproperties[property] = {\n\t\t\tget() {\n\t\t\t\tconst value = fromStream[property];\n\t\t\t\tconst isFunction = typeof value === 'function';\n\n\t\t\t\treturn isFunction ? value.bind(fromStream) : value;\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tfromStream[property] = value;\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false\n\t\t};\n\t}\n\n\tObject.defineProperties(toStream, properties);\n\n\tfromStream.once('aborted', () => {\n\t\ttoStream.destroy();\n\n\t\ttoStream.emit('aborted');\n\t});\n\n\tfromStream.once('close', () => {\n\t\tif (fromStream.complete) {\n\t\t\tif (toStream.readable) {\n\t\t\t\ttoStream.once('end', () => {\n\t\t\t\t\ttoStream.emit('close');\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttoStream.emit('close');\n\t\t\t}\n\t\t} else {\n\t\t\ttoStream.emit('close');\n\t\t}\n\t});\n\n\treturn toStream;\n};\n","'use strict';\nconst {Transform, PassThrough} = require('stream');\nconst zlib = require('zlib');\nconst mimicResponse = require('mimic-response');\n\nmodule.exports = response => {\n\tconst contentEncoding = (response.headers['content-encoding'] || '').toLowerCase();\n\n\tif (!['gzip', 'deflate', 'br'].includes(contentEncoding)) {\n\t\treturn response;\n\t}\n\n\t// TODO: Remove this when targeting Node.js 12.\n\tconst isBrotli = contentEncoding === 'br';\n\tif (isBrotli && typeof zlib.createBrotliDecompress !== 'function') {\n\t\tresponse.destroy(new Error('Brotli is not supported on Node.js < 12'));\n\t\treturn response;\n\t}\n\n\tlet isEmpty = true;\n\n\tconst checker = new Transform({\n\t\ttransform(data, _encoding, callback) {\n\t\t\tisEmpty = false;\n\n\t\t\tcallback(null, data);\n\t\t},\n\n\t\tflush(callback) {\n\t\t\tcallback();\n\t\t}\n\t});\n\n\tconst finalStream = new PassThrough({\n\t\tautoDestroy: false,\n\t\tdestroy(error, callback) {\n\t\t\tresponse.destroy();\n\n\t\t\tcallback(error);\n\t\t}\n\t});\n\n\tconst decompressStream = isBrotli ? zlib.createBrotliDecompress() : zlib.createUnzip();\n\n\tdecompressStream.once('error', error => {\n\t\tif (isEmpty && !response.readable) {\n\t\t\tfinalStream.end();\n\t\t\treturn;\n\t\t}\n\n\t\tfinalStream.destroy(error);\n\t});\n\n\tmimicResponse(response, finalStream);\n\tresponse.pipe(checker).pipe(decompressStream).pipe(finalStream);\n\n\treturn finalStream;\n};\n","'use strict';\n\nclass QuickLRU {\n\tconstructor(options = {}) {\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tthis.maxSize = options.maxSize;\n\t\tthis.onEviction = options.onEviction;\n\t\tthis.cache = new Map();\n\t\tthis.oldCache = new Map();\n\t\tthis._size = 0;\n\t}\n\n\t_set(key, value) {\n\t\tthis.cache.set(key, value);\n\t\tthis._size++;\n\n\t\tif (this._size >= this.maxSize) {\n\t\t\tthis._size = 0;\n\n\t\t\tif (typeof this.onEviction === 'function') {\n\t\t\t\tfor (const [key, value] of this.oldCache.entries()) {\n\t\t\t\t\tthis.onEviction(key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.oldCache = this.cache;\n\t\t\tthis.cache = new Map();\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this.cache.get(key);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\tconst value = this.oldCache.get(key);\n\t\t\tthis.oldCache.delete(key);\n\t\t\tthis._set(key, value);\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tset(key, value) {\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.set(key, value);\n\t\t} else {\n\t\t\tthis._set(key, value);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\thas(key) {\n\t\treturn this.cache.has(key) || this.oldCache.has(key);\n\t}\n\n\tpeek(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this.cache.get(key);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn this.oldCache.get(key);\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis._size--;\n\t\t}\n\n\t\treturn this.oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.oldCache.clear();\n\t\tthis._size = 0;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.cache) {\n\t\t\tyield item;\n\t\t}\n\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget size() {\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.oldCache.keys()) {\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn Math.min(this._size + oldCacheSize, this.maxSize);\n\t}\n}\n\nmodule.exports = QuickLRU;\n","'use strict';\nconst EventEmitter = require('events');\nconst tls = require('tls');\nconst http2 = require('http2');\nconst QuickLRU = require('quick-lru');\n\nconst kCurrentStreamsCount = Symbol('currentStreamsCount');\nconst kRequest = Symbol('request');\nconst kOriginSet = Symbol('cachedOriginSet');\nconst kGracefullyClosing = Symbol('gracefullyClosing');\n\nconst nameKeys = [\n\t// `http2.connect()` options\n\t'maxDeflateDynamicTableSize',\n\t'maxSessionMemory',\n\t'maxHeaderListPairs',\n\t'maxOutstandingPings',\n\t'maxReservedRemoteStreams',\n\t'maxSendHeaderBlockLength',\n\t'paddingStrategy',\n\n\t// `tls.connect()` options\n\t'localAddress',\n\t'path',\n\t'rejectUnauthorized',\n\t'minDHSize',\n\n\t// `tls.createSecureContext()` options\n\t'ca',\n\t'cert',\n\t'clientCertEngine',\n\t'ciphers',\n\t'key',\n\t'pfx',\n\t'servername',\n\t'minVersion',\n\t'maxVersion',\n\t'secureProtocol',\n\t'crl',\n\t'honorCipherOrder',\n\t'ecdhCurve',\n\t'dhparam',\n\t'secureOptions',\n\t'sessionIdContext'\n];\n\nconst getSortedIndex = (array, value, compare) => {\n\tlet low = 0;\n\tlet high = array.length;\n\n\twhile (low < high) {\n\t\tconst mid = (low + high) >>> 1;\n\n\t\t/* istanbul ignore next */\n\t\tif (compare(array[mid], value)) {\n\t\t\t// This never gets called because we use descending sort. Better to have this anyway.\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid;\n\t\t}\n\t}\n\n\treturn low;\n};\n\nconst compareSessions = (a, b) => {\n\treturn a.remoteSettings.maxConcurrentStreams > b.remoteSettings.maxConcurrentStreams;\n};\n\n// See https://tools.ietf.org/html/rfc8336\nconst closeCoveredSessions = (where, session) => {\n\t// Clients SHOULD NOT emit new requests on any connection whose Origin\n\t// Set is a proper subset of another connection's Origin Set, and they\n\t// SHOULD close it once all outstanding requests are satisfied.\n\tfor (const coveredSession of where) {\n\t\tif (\n\t\t\t// The set is a proper subset when its length is less than the other set.\n\t\t\tcoveredSession[kOriginSet].length < session[kOriginSet].length &&\n\n\t\t\t// And the other set includes all elements of the subset.\n\t\t\tcoveredSession[kOriginSet].every(origin => session[kOriginSet].includes(origin)) &&\n\n\t\t\t// Makes sure that the session can handle all requests from the covered session.\n\t\t\tcoveredSession[kCurrentStreamsCount] + session[kCurrentStreamsCount] <= session.remoteSettings.maxConcurrentStreams\n\t\t) {\n\t\t\t// This allows pending requests to finish and prevents making new requests.\n\t\t\tgracefullyClose(coveredSession);\n\t\t}\n\t}\n};\n\n// This is basically inverted `closeCoveredSessions(...)`.\nconst closeSessionIfCovered = (where, coveredSession) => {\n\tfor (const session of where) {\n\t\tif (\n\t\t\tcoveredSession[kOriginSet].length < session[kOriginSet].length &&\n\t\t\tcoveredSession[kOriginSet].every(origin => session[kOriginSet].includes(origin)) &&\n\t\t\tcoveredSession[kCurrentStreamsCount] + session[kCurrentStreamsCount] <= session.remoteSettings.maxConcurrentStreams\n\t\t) {\n\t\t\tgracefullyClose(coveredSession);\n\t\t}\n\t}\n};\n\nconst getSessions = ({agent, isFree}) => {\n\tconst result = {};\n\n\t// eslint-disable-next-line guard-for-in\n\tfor (const normalizedOptions in agent.sessions) {\n\t\tconst sessions = agent.sessions[normalizedOptions];\n\n\t\tconst filtered = sessions.filter(session => {\n\t\t\tconst result = session[Agent.kCurrentStreamsCount] < session.remoteSettings.maxConcurrentStreams;\n\n\t\t\treturn isFree ? result : !result;\n\t\t});\n\n\t\tif (filtered.length !== 0) {\n\t\t\tresult[normalizedOptions] = filtered;\n\t\t}\n\t}\n\n\treturn result;\n};\n\nconst gracefullyClose = session => {\n\tsession[kGracefullyClosing] = true;\n\n\tif (session[kCurrentStreamsCount] === 0) {\n\t\tsession.close();\n\t}\n};\n\nclass Agent extends EventEmitter {\n\tconstructor({timeout = 60000, maxSessions = Infinity, maxFreeSessions = 10, maxCachedTlsSessions = 100} = {}) {\n\t\tsuper();\n\n\t\t// A session is considered busy when its current streams count\n\t\t// is equal to or greater than the `maxConcurrentStreams` value.\n\n\t\t// A session is considered free when its current streams count\n\t\t// is less than the `maxConcurrentStreams` value.\n\n\t\t// SESSIONS[NORMALIZED_OPTIONS] = [];\n\t\tthis.sessions = {};\n\n\t\t// The queue for creating new sessions. It looks like this:\n\t\t// QUEUE[NORMALIZED_OPTIONS][NORMALIZED_ORIGIN] = ENTRY_FUNCTION\n\t\t//\n\t\t// The entry function has `listeners`, `completed` and `destroyed` properties.\n\t\t// `listeners` is an array of objects containing `resolve` and `reject` functions.\n\t\t// `completed` is a boolean. It's set to true after ENTRY_FUNCTION is executed.\n\t\t// `destroyed` is a boolean. If it's set to true, the session will be destroyed if hasn't connected yet.\n\t\tthis.queue = {};\n\n\t\t// Each session will use this timeout value.\n\t\tthis.timeout = timeout;\n\n\t\t// Max sessions in total\n\t\tthis.maxSessions = maxSessions;\n\n\t\t// Max free sessions in total\n\t\t// TODO: decreasing `maxFreeSessions` should close some sessions\n\t\tthis.maxFreeSessions = maxFreeSessions;\n\n\t\tthis._freeSessionsCount = 0;\n\t\tthis._sessionsCount = 0;\n\n\t\t// We don't support push streams by default.\n\t\tthis.settings = {\n\t\t\tenablePush: false\n\t\t};\n\n\t\t// Reusing TLS sessions increases performance.\n\t\tthis.tlsSessionCache = new QuickLRU({maxSize: maxCachedTlsSessions});\n\t}\n\n\tstatic normalizeOrigin(url, servername) {\n\t\tif (typeof url === 'string') {\n\t\t\turl = new URL(url);\n\t\t}\n\n\t\tif (servername && url.hostname !== servername) {\n\t\t\turl.hostname = servername;\n\t\t}\n\n\t\treturn url.origin;\n\t}\n\n\tnormalizeOptions(options) {\n\t\tlet normalized = '';\n\n\t\tif (options) {\n\t\t\tfor (const key of nameKeys) {\n\t\t\t\tif (options[key]) {\n\t\t\t\t\tnormalized += `:${options[key]}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn normalized;\n\t}\n\n\t_tryToCreateNewSession(normalizedOptions, normalizedOrigin) {\n\t\tif (!(normalizedOptions in this.queue) || !(normalizedOrigin in this.queue[normalizedOptions])) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst item = this.queue[normalizedOptions][normalizedOrigin];\n\n\t\t// The entry function can be run only once.\n\t\t// BUG: The session may be never created when:\n\t\t// - the first condition is false AND\n\t\t// - this function is never called with the same arguments in the future.\n\t\tif (this._sessionsCount < this.maxSessions && !item.completed) {\n\t\t\titem.completed = true;\n\n\t\t\titem();\n\t\t}\n\t}\n\n\tgetSession(origin, options, listeners) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (Array.isArray(listeners)) {\n\t\t\t\tlisteners = [...listeners];\n\n\t\t\t\t// Resolve the current promise ASAP, we're just moving the listeners.\n\t\t\t\t// They will be executed at a different time.\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\tlisteners = [{resolve, reject}];\n\t\t\t}\n\n\t\t\tconst normalizedOptions = this.normalizeOptions(options);\n\t\t\tconst normalizedOrigin = Agent.normalizeOrigin(origin, options && options.servername);\n\n\t\t\tif (normalizedOrigin === undefined) {\n\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\treject(new TypeError('The `origin` argument needs to be a string or an URL object'));\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (normalizedOptions in this.sessions) {\n\t\t\t\tconst sessions = this.sessions[normalizedOptions];\n\n\t\t\t\tlet maxConcurrentStreams = -1;\n\t\t\t\tlet currentStreamsCount = -1;\n\t\t\t\tlet optimalSession;\n\n\t\t\t\t// We could just do this.sessions[normalizedOptions].find(...) but that isn't optimal.\n\t\t\t\t// Additionally, we are looking for session which has biggest current pending streams count.\n\t\t\t\tfor (const session of sessions) {\n\t\t\t\t\tconst sessionMaxConcurrentStreams = session.remoteSettings.maxConcurrentStreams;\n\n\t\t\t\t\tif (sessionMaxConcurrentStreams < maxConcurrentStreams) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (session[kOriginSet].includes(normalizedOrigin)) {\n\t\t\t\t\t\tconst sessionCurrentStreamsCount = session[kCurrentStreamsCount];\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tsessionCurrentStreamsCount >= sessionMaxConcurrentStreams ||\n\t\t\t\t\t\t\tsession[kGracefullyClosing] ||\n\t\t\t\t\t\t\t// Unfortunately the `close` event isn't called immediately,\n\t\t\t\t\t\t\t// so `session.destroyed` is `true`, but `session.closed` is `false`.\n\t\t\t\t\t\t\tsession.destroyed\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// We only need set this once.\n\t\t\t\t\t\tif (!optimalSession) {\n\t\t\t\t\t\t\tmaxConcurrentStreams = sessionMaxConcurrentStreams;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// We're looking for the session which has biggest current pending stream count,\n\t\t\t\t\t\t// in order to minimalize the amount of active sessions.\n\t\t\t\t\t\tif (sessionCurrentStreamsCount > currentStreamsCount) {\n\t\t\t\t\t\t\toptimalSession = session;\n\t\t\t\t\t\t\tcurrentStreamsCount = sessionCurrentStreamsCount;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (optimalSession) {\n\t\t\t\t\t/* istanbul ignore next: safety check */\n\t\t\t\t\tif (listeners.length !== 1) {\n\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\tconst error = new Error(\n\t\t\t\t\t\t\t\t`Expected the length of listeners to be 1, got ${listeners.length}.\\n` +\n\t\t\t\t\t\t\t\t'Please report this to https://github.com/szmarczak/http2-wrapper/'\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlisteners[0].resolve(optimalSession);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (normalizedOptions in this.queue) {\n\t\t\t\tif (normalizedOrigin in this.queue[normalizedOptions]) {\n\t\t\t\t\t// There's already an item in the queue, just attach ourselves to it.\n\t\t\t\t\tthis.queue[normalizedOptions][normalizedOrigin].listeners.push(...listeners);\n\n\t\t\t\t\t// This shouldn't be executed here.\n\t\t\t\t\t// See the comment inside _tryToCreateNewSession.\n\t\t\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.queue[normalizedOptions] = {};\n\t\t\t}\n\n\t\t\t// The entry must be removed from the queue IMMEDIATELY when:\n\t\t\t// 1. the session connects successfully,\n\t\t\t// 2. an error occurs.\n\t\t\tconst removeFromQueue = () => {\n\t\t\t\t// Our entry can be replaced. We cannot remove the new one.\n\t\t\t\tif (normalizedOptions in this.queue && this.queue[normalizedOptions][normalizedOrigin] === entry) {\n\t\t\t\t\tdelete this.queue[normalizedOptions][normalizedOrigin];\n\n\t\t\t\t\tif (Object.keys(this.queue[normalizedOptions]).length === 0) {\n\t\t\t\t\t\tdelete this.queue[normalizedOptions];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// The main logic is here\n\t\t\tconst entry = () => {\n\t\t\t\tconst name = `${normalizedOrigin}:${normalizedOptions}`;\n\t\t\t\tlet receivedSettings = false;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst session = http2.connect(origin, {\n\t\t\t\t\t\tcreateConnection: this.createConnection,\n\t\t\t\t\t\tsettings: this.settings,\n\t\t\t\t\t\tsession: this.tlsSessionCache.get(name),\n\t\t\t\t\t\t...options\n\t\t\t\t\t});\n\t\t\t\t\tsession[kCurrentStreamsCount] = 0;\n\t\t\t\t\tsession[kGracefullyClosing] = false;\n\n\t\t\t\t\tconst isFree = () => session[kCurrentStreamsCount] < session.remoteSettings.maxConcurrentStreams;\n\t\t\t\t\tlet wasFree = true;\n\n\t\t\t\t\tsession.socket.once('session', tlsSession => {\n\t\t\t\t\t\tthis.tlsSessionCache.set(name, tlsSession);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('error', error => {\n\t\t\t\t\t\t// Listeners are empty when the session successfully connected.\n\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// The connection got broken, purge the cache.\n\t\t\t\t\t\tthis.tlsSessionCache.delete(name);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.setTimeout(this.timeout, () => {\n\t\t\t\t\t\t// Terminates all streams owned by this session.\n\t\t\t\t\t\t// TODO: Maybe the streams should have a \"Session timed out\" error?\n\t\t\t\t\t\tsession.destroy();\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('close', () => {\n\t\t\t\t\t\tif (receivedSettings) {\n\t\t\t\t\t\t\t// 1. If it wasn't free then no need to decrease because\n\t\t\t\t\t\t\t// it has been decreased already in session.request().\n\t\t\t\t\t\t\t// 2. `stream.once('close')` won't increment the count\n\t\t\t\t\t\t\t// because the session is already closed.\n\t\t\t\t\t\t\tif (wasFree) {\n\t\t\t\t\t\t\t\tthis._freeSessionsCount--;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._sessionsCount--;\n\n\t\t\t\t\t\t\t// This cannot be moved to the stream logic,\n\t\t\t\t\t\t\t// because there may be a session that hadn't made a single request.\n\t\t\t\t\t\t\tconst where = this.sessions[normalizedOptions];\n\t\t\t\t\t\t\twhere.splice(where.indexOf(session), 1);\n\n\t\t\t\t\t\t\tif (where.length === 0) {\n\t\t\t\t\t\t\t\tdelete this.sessions[normalizedOptions];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Broken connection\n\t\t\t\t\t\t\tconst error = new Error('Session closed without receiving a SETTINGS frame');\n\t\t\t\t\t\t\terror.code = 'HTTP2WRAPPER_NOSETTINGS';\n\n\t\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tremoveFromQueue();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// There may be another session awaiting.\n\t\t\t\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Iterates over the queue and processes listeners.\n\t\t\t\t\tconst processListeners = () => {\n\t\t\t\t\t\tif (!(normalizedOptions in this.queue) || !isFree()) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const origin of session[kOriginSet]) {\n\t\t\t\t\t\t\tif (origin in this.queue[normalizedOptions]) {\n\t\t\t\t\t\t\t\tconst {listeners} = this.queue[normalizedOptions][origin];\n\n\t\t\t\t\t\t\t\t// Prevents session overloading.\n\t\t\t\t\t\t\t\twhile (listeners.length !== 0 && isFree()) {\n\t\t\t\t\t\t\t\t\t// We assume `resolve(...)` calls `request(...)` *directly*,\n\t\t\t\t\t\t\t\t\t// otherwise the session will get overloaded.\n\t\t\t\t\t\t\t\t\tlisteners.shift().resolve(session);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst where = this.queue[normalizedOptions];\n\t\t\t\t\t\t\t\tif (where[origin].listeners.length === 0) {\n\t\t\t\t\t\t\t\t\tdelete where[origin];\n\n\t\t\t\t\t\t\t\t\tif (Object.keys(where).length === 0) {\n\t\t\t\t\t\t\t\t\t\tdelete this.queue[normalizedOptions];\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// We're no longer free, no point in continuing.\n\t\t\t\t\t\t\t\tif (!isFree()) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// The Origin Set cannot shrink. No need to check if it suddenly became covered by another one.\n\t\t\t\t\tsession.on('origin', () => {\n\t\t\t\t\t\tsession[kOriginSet] = session.originSet;\n\n\t\t\t\t\t\tif (!isFree()) {\n\t\t\t\t\t\t\t// The session is full.\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprocessListeners();\n\n\t\t\t\t\t\t// Close covered sessions (if possible).\n\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('remoteSettings', () => {\n\t\t\t\t\t\t// Fix Node.js bug preventing the process from exiting\n\t\t\t\t\t\tsession.ref();\n\t\t\t\t\t\tsession.unref();\n\n\t\t\t\t\t\tthis._sessionsCount++;\n\n\t\t\t\t\t\t// The Agent could have been destroyed already.\n\t\t\t\t\t\tif (entry.destroyed) {\n\t\t\t\t\t\t\tconst error = new Error('Agent has been destroyed');\n\n\t\t\t\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\t\t\t\tlistener.reject(error);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsession.destroy();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsession[kOriginSet] = session.originSet;\n\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst where = this.sessions;\n\n\t\t\t\t\t\t\tif (normalizedOptions in where) {\n\t\t\t\t\t\t\t\tconst sessions = where[normalizedOptions];\n\t\t\t\t\t\t\t\tsessions.splice(getSortedIndex(sessions, session, compareSessions), 0, session);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twhere[normalizedOptions] = [session];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._freeSessionsCount += 1;\n\t\t\t\t\t\treceivedSettings = true;\n\n\t\t\t\t\t\tthis.emit('session', session);\n\n\t\t\t\t\t\tprocessListeners();\n\t\t\t\t\t\tremoveFromQueue();\n\n\t\t\t\t\t\t// TODO: Close last recently used (or least used?) session\n\t\t\t\t\t\tif (session[kCurrentStreamsCount] === 0 && this._freeSessionsCount > this.maxFreeSessions) {\n\t\t\t\t\t\t\tsession.close();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check if we haven't managed to execute all listeners.\n\t\t\t\t\t\tif (listeners.length !== 0) {\n\t\t\t\t\t\t\t// Request for a new session with predefined listeners.\n\t\t\t\t\t\t\tthis.getSession(normalizedOrigin, options, listeners);\n\t\t\t\t\t\t\tlisteners.length = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// `session.remoteSettings.maxConcurrentStreams` might get increased\n\t\t\t\t\t\tsession.on('remoteSettings', () => {\n\t\t\t\t\t\t\tprocessListeners();\n\n\t\t\t\t\t\t\t// In case the Origin Set changes\n\t\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\t// Shim `session.request()` in order to catch all streams\n\t\t\t\t\tsession[kRequest] = session.request;\n\t\t\t\t\tsession.request = (headers, streamOptions) => {\n\t\t\t\t\t\tif (session[kGracefullyClosing]) {\n\t\t\t\t\t\t\tthrow new Error('The session is gracefully closing. No new streams are allowed.');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst stream = session[kRequest](headers, streamOptions);\n\n\t\t\t\t\t\t// The process won't exit until the session is closed or all requests are gone.\n\t\t\t\t\t\tsession.ref();\n\n\t\t\t\t\t\t++session[kCurrentStreamsCount];\n\n\t\t\t\t\t\tif (session[kCurrentStreamsCount] === session.remoteSettings.maxConcurrentStreams) {\n\t\t\t\t\t\t\tthis._freeSessionsCount--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstream.once('close', () => {\n\t\t\t\t\t\t\twasFree = isFree();\n\n\t\t\t\t\t\t\t--session[kCurrentStreamsCount];\n\n\t\t\t\t\t\t\tif (!session.destroyed && !session.closed) {\n\t\t\t\t\t\t\t\tcloseSessionIfCovered(this.sessions[normalizedOptions], session);\n\n\t\t\t\t\t\t\t\tif (isFree() && !session.closed) {\n\t\t\t\t\t\t\t\t\tif (!wasFree) {\n\t\t\t\t\t\t\t\t\t\tthis._freeSessionsCount++;\n\n\t\t\t\t\t\t\t\t\t\twasFree = true;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst isEmpty = session[kCurrentStreamsCount] === 0;\n\n\t\t\t\t\t\t\t\t\tif (isEmpty) {\n\t\t\t\t\t\t\t\t\t\tsession.unref();\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tisEmpty &&\n\t\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t\tthis._freeSessionsCount > this.maxFreeSessions ||\n\t\t\t\t\t\t\t\t\t\t\tsession[kGracefullyClosing]\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tsession.close();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t\t\t\t\t\tprocessListeners();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn stream;\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\t\tlistener.reject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tremoveFromQueue();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tentry.listeners = listeners;\n\t\t\tentry.completed = false;\n\t\t\tentry.destroyed = false;\n\n\t\t\tthis.queue[normalizedOptions][normalizedOrigin] = entry;\n\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t});\n\t}\n\n\trequest(origin, options, headers, streamOptions) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.getSession(origin, options, [{\n\t\t\t\treject,\n\t\t\t\tresolve: session => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresolve(session.request(headers, streamOptions));\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}]);\n\t\t});\n\t}\n\n\tcreateConnection(origin, options) {\n\t\treturn Agent.connect(origin, options);\n\t}\n\n\tstatic connect(origin, options) {\n\t\toptions.ALPNProtocols = ['h2'];\n\n\t\tconst port = origin.port || 443;\n\t\tconst host = origin.hostname || origin.host;\n\n\t\tif (typeof options.servername === 'undefined') {\n\t\t\toptions.servername = host;\n\t\t}\n\n\t\treturn tls.connect(port, host, options);\n\t}\n\n\tcloseFreeSessions() {\n\t\tfor (const sessions of Object.values(this.sessions)) {\n\t\t\tfor (const session of sessions) {\n\t\t\t\tif (session[kCurrentStreamsCount] === 0) {\n\t\t\t\t\tsession.close();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy(reason) {\n\t\tfor (const sessions of Object.values(this.sessions)) {\n\t\t\tfor (const session of sessions) {\n\t\t\t\tsession.destroy(reason);\n\t\t\t}\n\t\t}\n\n\t\tfor (const entriesOfAuthority of Object.values(this.queue)) {\n\t\t\tfor (const entry of Object.values(entriesOfAuthority)) {\n\t\t\t\tentry.destroyed = true;\n\t\t\t}\n\t\t}\n\n\t\t// New requests should NOT attach to destroyed sessions\n\t\tthis.queue = {};\n\t}\n\n\tget freeSessions() {\n\t\treturn getSessions({agent: this, isFree: true});\n\t}\n\n\tget busySessions() {\n\t\treturn getSessions({agent: this, isFree: false});\n\t}\n}\n\nAgent.kCurrentStreamsCount = kCurrentStreamsCount;\nAgent.kGracefullyClosing = kGracefullyClosing;\n\nmodule.exports = {\n\tAgent,\n\tglobalAgent: new Agent()\n};\n","'use strict';\nconst {Readable} = require('stream');\n\nclass IncomingMessage extends Readable {\n\tconstructor(socket, highWaterMark) {\n\t\tsuper({\n\t\t\thighWaterMark,\n\t\t\tautoDestroy: false\n\t\t});\n\n\t\tthis.statusCode = null;\n\t\tthis.statusMessage = '';\n\t\tthis.httpVersion = '2.0';\n\t\tthis.httpVersionMajor = 2;\n\t\tthis.httpVersionMinor = 0;\n\t\tthis.headers = {};\n\t\tthis.trailers = {};\n\t\tthis.req = null;\n\n\t\tthis.aborted = false;\n\t\tthis.complete = false;\n\t\tthis.upgrade = null;\n\n\t\tthis.rawHeaders = [];\n\t\tthis.rawTrailers = [];\n\n\t\tthis.socket = socket;\n\t\tthis.connection = socket;\n\n\t\tthis._dumped = false;\n\t}\n\n\t_destroy(error) {\n\t\tthis.req._request.destroy(error);\n\t}\n\n\tsetTimeout(ms, callback) {\n\t\tthis.req.setTimeout(ms, callback);\n\t\treturn this;\n\t}\n\n\t_dump() {\n\t\tif (!this._dumped) {\n\t\t\tthis._dumped = true;\n\n\t\t\tthis.removeAllListeners('data');\n\t\t\tthis.resume();\n\t\t}\n\t}\n\n\t_read() {\n\t\tif (this.req) {\n\t\t\tthis.req._request.resume();\n\t\t}\n\t}\n}\n\nmodule.exports = IncomingMessage;\n","'use strict';\n/* istanbul ignore file: https://github.com/nodejs/node/blob/a91293d4d9ab403046ab5eb022332e4e3d249bd3/lib/internal/url.js#L1257 */\n\nmodule.exports = url => {\n\tconst options = {\n\t\tprotocol: url.protocol,\n\t\thostname: typeof url.hostname === 'string' && url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname,\n\t\thost: url.host,\n\t\thash: url.hash,\n\t\tsearch: url.search,\n\t\tpathname: url.pathname,\n\t\thref: url.href,\n\t\tpath: `${url.pathname || ''}${url.search || ''}`\n\t};\n\n\tif (typeof url.port === 'string' && url.port.length !== 0) {\n\t\toptions.port = Number(url.port);\n\t}\n\n\tif (url.username || url.password) {\n\t\toptions.auth = `${url.username || ''}:${url.password || ''}`;\n\t}\n\n\treturn options;\n};\n","'use strict';\n\nmodule.exports = (from, to, events) => {\n\tfor (const event of events) {\n\t\tfrom.on(event, (...args) => to.emit(event, ...args));\n\t}\n};\n","'use strict';\n\nmodule.exports = header => {\n\tswitch (header) {\n\t\tcase ':method':\n\t\tcase ':scheme':\n\t\tcase ':authority':\n\t\tcase ':path':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n","'use strict';\n/* istanbul ignore file: https://github.com/nodejs/node/blob/master/lib/internal/errors.js */\n\nconst makeError = (Base, key, getMessage) => {\n\tmodule.exports[key] = class NodeError extends Base {\n\t\tconstructor(...args) {\n\t\t\tsuper(typeof getMessage === 'string' ? getMessage : getMessage(args));\n\t\t\tthis.name = `${super.name} [${key}]`;\n\t\t\tthis.code = key;\n\t\t}\n\t};\n};\n\nmakeError(TypeError, 'ERR_INVALID_ARG_TYPE', args => {\n\tconst type = args[0].includes('.') ? 'property' : 'argument';\n\n\tlet valid = args[1];\n\tconst isManyTypes = Array.isArray(valid);\n\n\tif (isManyTypes) {\n\t\tvalid = `${valid.slice(0, -1).join(', ')} or ${valid.slice(-1)}`;\n\t}\n\n\treturn `The \"${args[0]}\" ${type} must be ${isManyTypes ? 'one of' : 'of'} type ${valid}. Received ${typeof args[2]}`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_PROTOCOL', args => {\n\treturn `Protocol \"${args[0]}\" not supported. Expected \"${args[1]}\"`;\n});\n\nmakeError(Error, 'ERR_HTTP_HEADERS_SENT', args => {\n\treturn `Cannot ${args[0]} headers after they are sent to the client`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_HTTP_TOKEN', args => {\n\treturn `${args[0]} must be a valid HTTP token [${args[1]}]`;\n});\n\nmakeError(TypeError, 'ERR_HTTP_INVALID_HEADER_VALUE', args => {\n\treturn `Invalid value \"${args[0]} for header \"${args[1]}\"`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_CHAR', args => {\n\treturn `Invalid character in ${args[0]} [${args[1]}]`;\n});\n","'use strict';\nconst http2 = require('http2');\nconst {Writable} = require('stream');\nconst {Agent, globalAgent} = require('./agent');\nconst IncomingMessage = require('./incoming-message');\nconst urlToOptions = require('./utils/url-to-options');\nconst proxyEvents = require('./utils/proxy-events');\nconst isRequestPseudoHeader = require('./utils/is-request-pseudo-header');\nconst {\n\tERR_INVALID_ARG_TYPE,\n\tERR_INVALID_PROTOCOL,\n\tERR_HTTP_HEADERS_SENT,\n\tERR_INVALID_HTTP_TOKEN,\n\tERR_HTTP_INVALID_HEADER_VALUE,\n\tERR_INVALID_CHAR\n} = require('./utils/errors');\n\nconst {\n\tHTTP2_HEADER_STATUS,\n\tHTTP2_HEADER_METHOD,\n\tHTTP2_HEADER_PATH,\n\tHTTP2_METHOD_CONNECT\n} = http2.constants;\n\nconst kHeaders = Symbol('headers');\nconst kOrigin = Symbol('origin');\nconst kSession = Symbol('session');\nconst kOptions = Symbol('options');\nconst kFlushedHeaders = Symbol('flushedHeaders');\nconst kJobs = Symbol('jobs');\n\nconst isValidHttpToken = /^[\\^`\\-\\w!#$%&*+.|~]+$/;\nconst isInvalidHeaderValue = /[^\\t\\u0020-\\u007E\\u0080-\\u00FF]/;\n\nclass ClientRequest extends Writable {\n\tconstructor(input, options, callback) {\n\t\tsuper({\n\t\t\tautoDestroy: false\n\t\t});\n\n\t\tconst hasInput = typeof input === 'string' || input instanceof URL;\n\t\tif (hasInput) {\n\t\t\tinput = urlToOptions(input instanceof URL ? input : new URL(input));\n\t\t}\n\n\t\tif (typeof options === 'function' || options === undefined) {\n\t\t\t// (options, callback)\n\t\t\tcallback = options;\n\t\t\toptions = hasInput ? input : {...input};\n\t\t} else {\n\t\t\t// (input, options, callback)\n\t\t\toptions = {...input, ...options};\n\t\t}\n\n\t\tif (options.h2session) {\n\t\t\tthis[kSession] = options.h2session;\n\t\t} else if (options.agent === false) {\n\t\t\tthis.agent = new Agent({maxFreeSessions: 0});\n\t\t} else if (typeof options.agent === 'undefined' || options.agent === null) {\n\t\t\tif (typeof options.createConnection === 'function') {\n\t\t\t\t// This is a workaround - we don't have to create the session on our own.\n\t\t\t\tthis.agent = new Agent({maxFreeSessions: 0});\n\t\t\t\tthis.agent.createConnection = options.createConnection;\n\t\t\t} else {\n\t\t\t\tthis.agent = globalAgent;\n\t\t\t}\n\t\t} else if (typeof options.agent.request === 'function') {\n\t\t\tthis.agent = options.agent;\n\t\t} else {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('options.agent', ['Agent-like Object', 'undefined', 'false'], options.agent);\n\t\t}\n\n\t\tif (options.protocol && options.protocol !== 'https:') {\n\t\t\tthrow new ERR_INVALID_PROTOCOL(options.protocol, 'https:');\n\t\t}\n\n\t\tconst port = options.port || options.defaultPort || (this.agent && this.agent.defaultPort) || 443;\n\t\tconst host = options.hostname || options.host || 'localhost';\n\n\t\t// Don't enforce the origin via options. It may be changed in an Agent.\n\t\tdelete options.hostname;\n\t\tdelete options.host;\n\t\tdelete options.port;\n\n\t\tconst {timeout} = options;\n\t\toptions.timeout = undefined;\n\n\t\tthis[kHeaders] = Object.create(null);\n\t\tthis[kJobs] = [];\n\n\t\tthis.socket = null;\n\t\tthis.connection = null;\n\n\t\tthis.method = options.method || 'GET';\n\t\tthis.path = options.path;\n\n\t\tthis.res = null;\n\t\tthis.aborted = false;\n\t\tthis.reusedSocket = false;\n\n\t\tif (options.headers) {\n\t\t\tfor (const [header, value] of Object.entries(options.headers)) {\n\t\t\t\tthis.setHeader(header, value);\n\t\t\t}\n\t\t}\n\n\t\tif (options.auth && !('authorization' in this[kHeaders])) {\n\t\t\tthis[kHeaders].authorization = 'Basic ' + Buffer.from(options.auth).toString('base64');\n\t\t}\n\n\t\toptions.session = options.tlsSession;\n\t\toptions.path = options.socketPath;\n\n\t\tthis[kOptions] = options;\n\n\t\t// Clients that generate HTTP/2 requests directly SHOULD use the :authority pseudo-header field instead of the Host header field.\n\t\tif (port === 443) {\n\t\t\tthis[kOrigin] = `https://${host}`;\n\n\t\t\tif (!(':authority' in this[kHeaders])) {\n\t\t\t\tthis[kHeaders][':authority'] = host;\n\t\t\t}\n\t\t} else {\n\t\t\tthis[kOrigin] = `https://${host}:${port}`;\n\n\t\t\tif (!(':authority' in this[kHeaders])) {\n\t\t\t\tthis[kHeaders][':authority'] = `${host}:${port}`;\n\t\t\t}\n\t\t}\n\n\t\tif (timeout) {\n\t\t\tthis.setTimeout(timeout);\n\t\t}\n\n\t\tif (callback) {\n\t\t\tthis.once('response', callback);\n\t\t}\n\n\t\tthis[kFlushedHeaders] = false;\n\t}\n\n\tget method() {\n\t\treturn this[kHeaders][HTTP2_HEADER_METHOD];\n\t}\n\n\tset method(value) {\n\t\tif (value) {\n\t\t\tthis[kHeaders][HTTP2_HEADER_METHOD] = value.toUpperCase();\n\t\t}\n\t}\n\n\tget path() {\n\t\treturn this[kHeaders][HTTP2_HEADER_PATH];\n\t}\n\n\tset path(value) {\n\t\tif (value) {\n\t\t\tthis[kHeaders][HTTP2_HEADER_PATH] = value;\n\t\t}\n\t}\n\n\tget _mustNotHaveABody() {\n\t\treturn this.method === 'GET' || this.method === 'HEAD' || this.method === 'DELETE';\n\t}\n\n\t_write(chunk, encoding, callback) {\n\t\t// https://github.com/nodejs/node/blob/654df09ae0c5e17d1b52a900a545f0664d8c7627/lib/internal/http2/util.js#L148-L156\n\t\tif (this._mustNotHaveABody) {\n\t\t\tcallback(new Error('The GET, HEAD and DELETE methods must NOT have a body'));\n\t\t\t/* istanbul ignore next: Node.js 12 throws directly */\n\t\t\treturn;\n\t\t}\n\n\t\tthis.flushHeaders();\n\n\t\tconst callWrite = () => this._request.write(chunk, encoding, callback);\n\t\tif (this._request) {\n\t\t\tcallWrite();\n\t\t} else {\n\t\t\tthis[kJobs].push(callWrite);\n\t\t}\n\t}\n\n\t_final(callback) {\n\t\tif (this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.flushHeaders();\n\n\t\tconst callEnd = () => {\n\t\t\t// For GET, HEAD and DELETE\n\t\t\tif (this._mustNotHaveABody) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._request.end(callback);\n\t\t};\n\n\t\tif (this._request) {\n\t\t\tcallEnd();\n\t\t} else {\n\t\t\tthis[kJobs].push(callEnd);\n\t\t}\n\t}\n\n\tabort() {\n\t\tif (this.res && this.res.complete) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.aborted) {\n\t\t\tprocess.nextTick(() => this.emit('abort'));\n\t\t}\n\n\t\tthis.aborted = true;\n\n\t\tthis.destroy();\n\t}\n\n\t_destroy(error, callback) {\n\t\tif (this.res) {\n\t\t\tthis.res._dump();\n\t\t}\n\n\t\tif (this._request) {\n\t\t\tthis._request.destroy();\n\t\t}\n\n\t\tcallback(error);\n\t}\n\n\tasync flushHeaders() {\n\t\tif (this[kFlushedHeaders] || this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis[kFlushedHeaders] = true;\n\n\t\tconst isConnectMethod = this.method === HTTP2_METHOD_CONNECT;\n\n\t\t// The real magic is here\n\t\tconst onStream = stream => {\n\t\t\tthis._request = stream;\n\n\t\t\tif (this.destroyed) {\n\t\t\t\tstream.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Forwards `timeout`, `continue`, `close` and `error` events to this instance.\n\t\t\tif (!isConnectMethod) {\n\t\t\t\tproxyEvents(stream, this, ['timeout', 'continue', 'close', 'error']);\n\t\t\t}\n\n\t\t\t// Wait for the `finish` event. We don't want to emit the `response` event\n\t\t\t// before `request.end()` is called.\n\t\t\tconst waitForEnd = fn => {\n\t\t\t\treturn (...args) => {\n\t\t\t\t\tif (!this.writable && !this.destroyed) {\n\t\t\t\t\t\tfn(...args);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.once('finish', () => {\n\t\t\t\t\t\t\tfn(...args);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t\t// This event tells we are ready to listen for the data.\n\t\t\tstream.once('response', waitForEnd((headers, flags, rawHeaders) => {\n\t\t\t\t// If we were to emit raw request stream, it would be as fast as the native approach.\n\t\t\t\t// Note that wrapping the raw stream in a Proxy instance won't improve the performance (already tested it).\n\t\t\t\tconst response = new IncomingMessage(this.socket, stream.readableHighWaterMark);\n\t\t\t\tthis.res = response;\n\n\t\t\t\tresponse.req = this;\n\t\t\t\tresponse.statusCode = headers[HTTP2_HEADER_STATUS];\n\t\t\t\tresponse.headers = headers;\n\t\t\t\tresponse.rawHeaders = rawHeaders;\n\n\t\t\t\tresponse.once('end', () => {\n\t\t\t\t\tif (this.aborted) {\n\t\t\t\t\t\tresponse.aborted = true;\n\t\t\t\t\t\tresponse.emit('aborted');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.complete = true;\n\n\t\t\t\t\t\t// Has no effect, just be consistent with the Node.js behavior\n\t\t\t\t\t\tresponse.socket = null;\n\t\t\t\t\t\tresponse.connection = null;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (isConnectMethod) {\n\t\t\t\t\tresponse.upgrade = true;\n\n\t\t\t\t\t// The HTTP1 API says the socket is detached here,\n\t\t\t\t\t// but we can't do that so we pass the original HTTP2 request.\n\t\t\t\t\tif (this.emit('connect', response, stream, Buffer.alloc(0))) {\n\t\t\t\t\t\tthis.emit('close');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No listeners attached, destroy the original request.\n\t\t\t\t\t\tstream.destroy();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Forwards data\n\t\t\t\t\tstream.on('data', chunk => {\n\t\t\t\t\t\tif (!response._dumped && !response.push(chunk)) {\n\t\t\t\t\t\t\tstream.pause();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.once('end', () => {\n\t\t\t\t\t\tresponse.push(null);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!this.emit('response', response)) {\n\t\t\t\t\t\t// No listeners attached, dump the response.\n\t\t\t\t\t\tresponse._dump();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\n\t\t\t// Emits `information` event\n\t\t\tstream.once('headers', waitForEnd(\n\t\t\t\theaders => this.emit('information', {statusCode: headers[HTTP2_HEADER_STATUS]})\n\t\t\t));\n\n\t\t\tstream.once('trailers', waitForEnd((trailers, flags, rawTrailers) => {\n\t\t\t\tconst {res} = this;\n\n\t\t\t\t// Assigns trailers to the response object.\n\t\t\t\tres.trailers = trailers;\n\t\t\t\tres.rawTrailers = rawTrailers;\n\t\t\t}));\n\n\t\t\tconst {socket} = stream.session;\n\t\t\tthis.socket = socket;\n\t\t\tthis.connection = socket;\n\n\t\t\tfor (const job of this[kJobs]) {\n\t\t\t\tjob();\n\t\t\t}\n\n\t\t\tthis.emit('socket', this.socket);\n\t\t};\n\n\t\t// Makes a HTTP2 request\n\t\tif (this[kSession]) {\n\t\t\ttry {\n\t\t\t\tonStream(this[kSession].request(this[kHeaders]));\n\t\t\t} catch (error) {\n\t\t\t\tthis.emit('error', error);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.reusedSocket = true;\n\n\t\t\ttry {\n\t\t\t\tonStream(await this.agent.request(this[kOrigin], this[kOptions], this[kHeaders]));\n\t\t\t} catch (error) {\n\t\t\t\tthis.emit('error', error);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetHeader(name) {\n\t\tif (typeof name !== 'string') {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('name', 'string', name);\n\t\t}\n\n\t\treturn this[kHeaders][name.toLowerCase()];\n\t}\n\n\tget headersSent() {\n\t\treturn this[kFlushedHeaders];\n\t}\n\n\tremoveHeader(name) {\n\t\tif (typeof name !== 'string') {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('name', 'string', name);\n\t\t}\n\n\t\tif (this.headersSent) {\n\t\t\tthrow new ERR_HTTP_HEADERS_SENT('remove');\n\t\t}\n\n\t\tdelete this[kHeaders][name.toLowerCase()];\n\t}\n\n\tsetHeader(name, value) {\n\t\tif (this.headersSent) {\n\t\t\tthrow new ERR_HTTP_HEADERS_SENT('set');\n\t\t}\n\n\t\tif (typeof name !== 'string' || (!isValidHttpToken.test(name) && !isRequestPseudoHeader(name))) {\n\t\t\tthrow new ERR_INVALID_HTTP_TOKEN('Header name', name);\n\t\t}\n\n\t\tif (typeof value === 'undefined') {\n\t\t\tthrow new ERR_HTTP_INVALID_HEADER_VALUE(value, name);\n\t\t}\n\n\t\tif (isInvalidHeaderValue.test(value)) {\n\t\t\tthrow new ERR_INVALID_CHAR('header content', name);\n\t\t}\n\n\t\tthis[kHeaders][name.toLowerCase()] = value;\n\t}\n\n\tsetNoDelay() {\n\t\t// HTTP2 sockets cannot be malformed, do nothing.\n\t}\n\n\tsetSocketKeepAlive() {\n\t\t// HTTP2 sockets cannot be malformed, do nothing.\n\t}\n\n\tsetTimeout(ms, callback) {\n\t\tconst applyTimeout = () => this._request.setTimeout(ms, callback);\n\n\t\tif (this._request) {\n\t\t\tapplyTimeout();\n\t\t} else {\n\t\t\tthis[kJobs].push(applyTimeout);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tget maxHeadersCount() {\n\t\tif (!this.destroyed && this._request) {\n\t\t\treturn this._request.session.localSettings.maxHeaderListSize;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tset maxHeadersCount(_value) {\n\t\t// Updating HTTP2 settings would affect all requests, do nothing.\n\t}\n}\n\nmodule.exports = ClientRequest;\n","'use strict';\nconst tls = require('tls');\n\nmodule.exports = (options = {}, connect = tls.connect) => new Promise((resolve, reject) => {\n\tlet timeout = false;\n\n\tlet socket;\n\n\tconst callback = async () => {\n\t\tawait socketPromise;\n\n\t\tsocket.off('timeout', onTimeout);\n\t\tsocket.off('error', reject);\n\n\t\tif (options.resolveSocket) {\n\t\t\tresolve({alpnProtocol: socket.alpnProtocol, socket, timeout});\n\n\t\t\tif (timeout) {\n\t\t\t\tawait Promise.resolve();\n\t\t\t\tsocket.emit('timeout');\n\t\t\t}\n\t\t} else {\n\t\t\tsocket.destroy();\n\t\t\tresolve({alpnProtocol: socket.alpnProtocol, timeout});\n\t\t}\n\t};\n\n\tconst onTimeout = async () => {\n\t\ttimeout = true;\n\t\tcallback();\n\t};\n\n\tconst socketPromise = (async () => {\n\t\ttry {\n\t\t\tsocket = await connect(options, callback);\n\n\t\t\tsocket.on('error', reject);\n\t\t\tsocket.once('timeout', onTimeout);\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t})();\n});\n","'use strict';\nconst net = require('net');\n/* istanbul ignore file: https://github.com/nodejs/node/blob/v13.0.1/lib/_http_agent.js */\n\nmodule.exports = options => {\n\tlet servername = options.host;\n\tconst hostHeader = options.headers && options.headers.host;\n\n\tif (hostHeader) {\n\t\tif (hostHeader.startsWith('[')) {\n\t\t\tconst index = hostHeader.indexOf(']');\n\t\t\tif (index === -1) {\n\t\t\t\tservername = hostHeader;\n\t\t\t} else {\n\t\t\t\tservername = hostHeader.slice(1, -1);\n\t\t\t}\n\t\t} else {\n\t\t\tservername = hostHeader.split(':', 1)[0];\n\t\t}\n\t}\n\n\tif (net.isIP(servername)) {\n\t\treturn '';\n\t}\n\n\treturn servername;\n};\n","'use strict';\nconst http = require('http');\nconst https = require('https');\nconst resolveALPN = require('resolve-alpn');\nconst QuickLRU = require('quick-lru');\nconst Http2ClientRequest = require('./client-request');\nconst calculateServerName = require('./utils/calculate-server-name');\nconst urlToOptions = require('./utils/url-to-options');\n\nconst cache = new QuickLRU({maxSize: 100});\nconst queue = new Map();\n\nconst installSocket = (agent, socket, options) => {\n\tsocket._httpMessage = {shouldKeepAlive: true};\n\n\tconst onFree = () => {\n\t\tagent.emit('free', socket, options);\n\t};\n\n\tsocket.on('free', onFree);\n\n\tconst onClose = () => {\n\t\tagent.removeSocket(socket, options);\n\t};\n\n\tsocket.on('close', onClose);\n\n\tconst onRemove = () => {\n\t\tagent.removeSocket(socket, options);\n\t\tsocket.off('close', onClose);\n\t\tsocket.off('free', onFree);\n\t\tsocket.off('agentRemove', onRemove);\n\t};\n\n\tsocket.on('agentRemove', onRemove);\n\n\tagent.emit('free', socket, options);\n};\n\nconst resolveProtocol = async options => {\n\tconst name = `${options.host}:${options.port}:${options.ALPNProtocols.sort()}`;\n\n\tif (!cache.has(name)) {\n\t\tif (queue.has(name)) {\n\t\t\tconst result = await queue.get(name);\n\t\t\treturn result.alpnProtocol;\n\t\t}\n\n\t\tconst {path, agent} = options;\n\t\toptions.path = options.socketPath;\n\n\t\tconst resultPromise = resolveALPN(options);\n\t\tqueue.set(name, resultPromise);\n\n\t\ttry {\n\t\t\tconst {socket, alpnProtocol} = await resultPromise;\n\t\t\tcache.set(name, alpnProtocol);\n\n\t\t\toptions.path = path;\n\n\t\t\tif (alpnProtocol === 'h2') {\n\t\t\t\t// https://github.com/nodejs/node/issues/33343\n\t\t\t\tsocket.destroy();\n\t\t\t} else {\n\t\t\t\tconst {globalAgent} = https;\n\t\t\t\tconst defaultCreateConnection = https.Agent.prototype.createConnection;\n\n\t\t\t\tif (agent) {\n\t\t\t\t\tif (agent.createConnection === defaultCreateConnection) {\n\t\t\t\t\t\tinstallSocket(agent, socket, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t}\n\t\t\t\t} else if (globalAgent.createConnection === defaultCreateConnection) {\n\t\t\t\t\tinstallSocket(globalAgent, socket, options);\n\t\t\t\t} else {\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tqueue.delete(name);\n\n\t\t\treturn alpnProtocol;\n\t\t} catch (error) {\n\t\t\tqueue.delete(name);\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\treturn cache.get(name);\n};\n\nmodule.exports = async (input, options, callback) => {\n\tif (typeof input === 'string' || input instanceof URL) {\n\t\tinput = urlToOptions(new URL(input));\n\t}\n\n\tif (typeof options === 'function') {\n\t\tcallback = options;\n\t\toptions = undefined;\n\t}\n\n\toptions = {\n\t\tALPNProtocols: ['h2', 'http/1.1'],\n\t\t...input,\n\t\t...options,\n\t\tresolveSocket: true\n\t};\n\n\tif (!Array.isArray(options.ALPNProtocols) || options.ALPNProtocols.length === 0) {\n\t\tthrow new Error('The `ALPNProtocols` option must be an Array with at least one entry');\n\t}\n\n\toptions.protocol = options.protocol || 'https:';\n\tconst isHttps = options.protocol === 'https:';\n\n\toptions.host = options.hostname || options.host || 'localhost';\n\toptions.session = options.tlsSession;\n\toptions.servername = options.servername || calculateServerName(options);\n\toptions.port = options.port || (isHttps ? 443 : 80);\n\toptions._defaultAgent = isHttps ? https.globalAgent : http.globalAgent;\n\n\tconst agents = options.agent;\n\n\tif (agents) {\n\t\tif (agents.addRequest) {\n\t\t\tthrow new Error('The `options.agent` object can contain only `http`, `https` or `http2` properties');\n\t\t}\n\n\t\toptions.agent = agents[isHttps ? 'https' : 'http'];\n\t}\n\n\tif (isHttps) {\n\t\tconst protocol = await resolveProtocol(options);\n\n\t\tif (protocol === 'h2') {\n\t\t\tif (agents) {\n\t\t\t\toptions.agent = agents.http2;\n\t\t\t}\n\n\t\t\treturn new Http2ClientRequest(options, callback);\n\t\t}\n\t}\n\n\treturn http.request(options, callback);\n};\n\nmodule.exports.protocolCache = cache;\n","'use strict';\nconst http2 = require('http2');\nconst agent = require('./agent');\nconst ClientRequest = require('./client-request');\nconst IncomingMessage = require('./incoming-message');\nconst auto = require('./auto');\n\nconst request = (url, options, callback) => {\n\treturn new ClientRequest(url, options, callback);\n};\n\nconst get = (url, options, callback) => {\n\t// eslint-disable-next-line unicorn/prevent-abbreviations\n\tconst req = new ClientRequest(url, options, callback);\n\treq.end();\n\n\treturn req;\n};\n\nmodule.exports = {\n\t...http2,\n\tClientRequest,\n\tIncomingMessage,\n\t...agent,\n\trequest,\n\tget,\n\tauto\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nexports.default = (body) => is_1.default.nodeStream(body) && is_1.default.function_(body.getBoundary);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs_1 = require(\"fs\");\nconst util_1 = require(\"util\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst is_form_data_1 = require(\"./is-form-data\");\nconst statAsync = util_1.promisify(fs_1.stat);\nexports.default = async (body, headers) => {\n if (headers && 'content-length' in headers) {\n return Number(headers['content-length']);\n }\n if (!body) {\n return 0;\n }\n if (is_1.default.string(body)) {\n return Buffer.byteLength(body);\n }\n if (is_1.default.buffer(body)) {\n return body.length;\n }\n if (is_form_data_1.default(body)) {\n return util_1.promisify(body.getLength.bind(body))();\n }\n if (body instanceof fs_1.ReadStream) {\n const { size } = await statAsync(body.path);\n if (size === 0) {\n return undefined;\n }\n return size;\n }\n return undefined;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction default_1(from, to, events) {\n const fns = {};\n for (const event of events) {\n fns[event] = (...args) => {\n to.emit(event, ...args);\n };\n from.on(event, fns[event]);\n }\n return () => {\n for (const event of events) {\n from.off(event, fns[event]);\n }\n };\n}\nexports.default = default_1;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// When attaching listeners, it's very easy to forget about them.\n// Especially if you do error handling and set timeouts.\n// So instead of checking if it's proper to throw an error on every timeout ever,\n// use this simple tool which will remove all listeners you have attached.\nexports.default = () => {\n const handlers = [];\n return {\n once(origin, event, fn) {\n origin.once(event, fn);\n handlers.push({ origin, event, fn });\n },\n unhandleAll() {\n for (const handler of handlers) {\n const { origin, event, fn } = handler;\n origin.removeListener(event, fn);\n }\n handlers.length = 0;\n }\n };\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TimeoutError = void 0;\nconst net = require(\"net\");\nconst unhandle_1 = require(\"./unhandle\");\nconst reentry = Symbol('reentry');\nconst noop = () => { };\nclass TimeoutError extends Error {\n constructor(threshold, event) {\n super(`Timeout awaiting '${event}' for ${threshold}ms`);\n this.event = event;\n this.name = 'TimeoutError';\n this.code = 'ETIMEDOUT';\n }\n}\nexports.TimeoutError = TimeoutError;\nexports.default = (request, delays, options) => {\n if (reentry in request) {\n return noop;\n }\n request[reentry] = true;\n const cancelers = [];\n const { once, unhandleAll } = unhandle_1.default();\n const addTimeout = (delay, callback, event) => {\n var _a;\n const timeout = setTimeout(callback, delay, delay, event);\n (_a = timeout.unref) === null || _a === void 0 ? void 0 : _a.call(timeout);\n const cancel = () => {\n clearTimeout(timeout);\n };\n cancelers.push(cancel);\n return cancel;\n };\n const { host, hostname } = options;\n const timeoutHandler = (delay, event) => {\n request.destroy(new TimeoutError(delay, event));\n };\n const cancelTimeouts = () => {\n for (const cancel of cancelers) {\n cancel();\n }\n unhandleAll();\n };\n request.once('error', error => {\n cancelTimeouts();\n // Save original behavior\n /* istanbul ignore next */\n if (request.listenerCount('error') === 0) {\n throw error;\n }\n });\n request.once('close', cancelTimeouts);\n once(request, 'response', (response) => {\n once(response, 'end', cancelTimeouts);\n });\n if (typeof delays.request !== 'undefined') {\n addTimeout(delays.request, timeoutHandler, 'request');\n }\n if (typeof delays.socket !== 'undefined') {\n const socketTimeoutHandler = () => {\n timeoutHandler(delays.socket, 'socket');\n };\n request.setTimeout(delays.socket, socketTimeoutHandler);\n // `request.setTimeout(0)` causes a memory leak.\n // We can just remove the listener and forget about the timer - it's unreffed.\n // See https://github.com/sindresorhus/got/issues/690\n cancelers.push(() => {\n request.removeListener('timeout', socketTimeoutHandler);\n });\n }\n once(request, 'socket', (socket) => {\n var _a;\n const { socketPath } = request;\n /* istanbul ignore next: hard to test */\n if (socket.connecting) {\n const hasPath = Boolean(socketPath !== null && socketPath !== void 0 ? socketPath : net.isIP((_a = hostname !== null && hostname !== void 0 ? hostname : host) !== null && _a !== void 0 ? _a : '') !== 0);\n if (typeof delays.lookup !== 'undefined' && !hasPath && typeof socket.address().address === 'undefined') {\n const cancelTimeout = addTimeout(delays.lookup, timeoutHandler, 'lookup');\n once(socket, 'lookup', cancelTimeout);\n }\n if (typeof delays.connect !== 'undefined') {\n const timeConnect = () => addTimeout(delays.connect, timeoutHandler, 'connect');\n if (hasPath) {\n once(socket, 'connect', timeConnect());\n }\n else {\n once(socket, 'lookup', (error) => {\n if (error === null) {\n once(socket, 'connect', timeConnect());\n }\n });\n }\n }\n if (typeof delays.secureConnect !== 'undefined' && options.protocol === 'https:') {\n once(socket, 'connect', () => {\n const cancelTimeout = addTimeout(delays.secureConnect, timeoutHandler, 'secureConnect');\n once(socket, 'secureConnect', cancelTimeout);\n });\n }\n }\n if (typeof delays.send !== 'undefined') {\n const timeRequest = () => addTimeout(delays.send, timeoutHandler, 'send');\n /* istanbul ignore next: hard to test */\n if (socket.connecting) {\n once(socket, 'connect', () => {\n once(request, 'upload-complete', timeRequest());\n });\n }\n else {\n once(request, 'upload-complete', timeRequest());\n }\n }\n });\n if (typeof delays.response !== 'undefined') {\n once(request, 'upload-complete', () => {\n const cancelTimeout = addTimeout(delays.response, timeoutHandler, 'response');\n once(request, 'response', cancelTimeout);\n });\n }\n return cancelTimeouts;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nexports.default = (url) => {\n // Cast to URL\n url = url;\n const options = {\n protocol: url.protocol,\n hostname: is_1.default.string(url.hostname) && url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname,\n host: url.host,\n hash: url.hash,\n search: url.search,\n pathname: url.pathname,\n href: url.href,\n path: `${url.pathname || ''}${url.search || ''}`\n };\n if (is_1.default.string(url.port) && url.port.length > 0) {\n options.port = Number(url.port);\n }\n if (url.username || url.password) {\n options.auth = `${url.username || ''}:${url.password || ''}`;\n }\n return options;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/* istanbul ignore file: deprecated */\nconst url_1 = require(\"url\");\nconst keys = [\n 'protocol',\n 'host',\n 'hostname',\n 'port',\n 'pathname',\n 'search'\n];\nexports.default = (origin, options) => {\n var _a, _b;\n if (options.path) {\n if (options.pathname) {\n throw new TypeError('Parameters `path` and `pathname` are mutually exclusive.');\n }\n if (options.search) {\n throw new TypeError('Parameters `path` and `search` are mutually exclusive.');\n }\n if (options.searchParams) {\n throw new TypeError('Parameters `path` and `searchParams` are mutually exclusive.');\n }\n }\n if (options.search && options.searchParams) {\n throw new TypeError('Parameters `search` and `searchParams` are mutually exclusive.');\n }\n if (!origin) {\n if (!options.protocol) {\n throw new TypeError('No URL protocol specified');\n }\n origin = `${options.protocol}//${(_b = (_a = options.hostname) !== null && _a !== void 0 ? _a : options.host) !== null && _b !== void 0 ? _b : ''}`;\n }\n const url = new url_1.URL(origin);\n if (options.path) {\n const searchIndex = options.path.indexOf('?');\n if (searchIndex === -1) {\n options.pathname = options.path;\n }\n else {\n options.pathname = options.path.slice(0, searchIndex);\n options.search = options.path.slice(searchIndex + 1);\n }\n delete options.path;\n }\n for (const key of keys) {\n if (options[key]) {\n url[key] = options[key].toString();\n }\n }\n return url;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass WeakableMap {\n constructor() {\n this.weakMap = new WeakMap();\n this.map = new Map();\n }\n set(key, value) {\n if (typeof key === 'object') {\n this.weakMap.set(key, value);\n }\n else {\n this.map.set(key, value);\n }\n }\n get(key) {\n if (typeof key === 'object') {\n return this.weakMap.get(key);\n }\n return this.map.get(key);\n }\n has(key) {\n if (typeof key === 'object') {\n return this.weakMap.has(key);\n }\n return this.map.has(key);\n }\n}\nexports.default = WeakableMap;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// TODO: Update https://github.com/sindresorhus/get-stream\nconst getBuffer = async (stream) => {\n const chunks = [];\n let length = 0;\n for await (const chunk of stream) {\n chunks.push(chunk);\n length += Buffer.byteLength(chunk);\n }\n if (Buffer.isBuffer(chunks[0])) {\n return Buffer.concat(chunks, length);\n }\n return Buffer.from(chunks.join(''));\n};\nexports.default = getBuffer;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.dnsLookupIpVersionToFamily = exports.isDnsLookupIpVersion = void 0;\nconst conversionTable = {\n auto: 0,\n ipv4: 4,\n ipv6: 6\n};\nexports.isDnsLookupIpVersion = (value) => {\n return value in conversionTable;\n};\nexports.dnsLookupIpVersionToFamily = (dnsLookupIpVersion) => {\n if (exports.isDnsLookupIpVersion(dnsLookupIpVersion)) {\n return conversionTable[dnsLookupIpVersion];\n }\n throw new Error('Invalid DNS lookup IP version');\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isResponseOk = void 0;\nexports.isResponseOk = (response) => {\n const { statusCode } = response;\n const limitStatusCode = response.request.options.followRedirect ? 299 : 399;\n return (statusCode >= 200 && statusCode <= limitStatusCode) || statusCode === 304;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst alreadyWarned = new Set();\nexports.default = (message) => {\n if (alreadyWarned.has(message)) {\n return;\n }\n alreadyWarned.add(message);\n // @ts-expect-error Missing types.\n process.emitWarning(`Got: ${message}`, {\n type: 'DeprecationWarning'\n });\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nconst normalizeArguments = (options, defaults) => {\n if (is_1.default.null_(options.encoding)) {\n throw new TypeError('To get a Buffer, set `options.responseType` to `buffer` instead');\n }\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.encoding);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.resolveBodyOnly);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.methodRewriting);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.isStream);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.responseType);\n // `options.responseType`\n if (options.responseType === undefined) {\n options.responseType = 'text';\n }\n // `options.retry`\n const { retry } = options;\n if (defaults) {\n options.retry = { ...defaults.retry };\n }\n else {\n options.retry = {\n calculateDelay: retryObject => retryObject.computedValue,\n limit: 0,\n methods: [],\n statusCodes: [],\n errorCodes: [],\n maxRetryAfter: undefined\n };\n }\n if (is_1.default.object(retry)) {\n options.retry = {\n ...options.retry,\n ...retry\n };\n options.retry.methods = [...new Set(options.retry.methods.map(method => method.toUpperCase()))];\n options.retry.statusCodes = [...new Set(options.retry.statusCodes)];\n options.retry.errorCodes = [...new Set(options.retry.errorCodes)];\n }\n else if (is_1.default.number(retry)) {\n options.retry.limit = retry;\n }\n if (is_1.default.undefined(options.retry.maxRetryAfter)) {\n options.retry.maxRetryAfter = Math.min(\n // TypeScript is not smart enough to handle `.filter(x => is.number(x))`.\n // eslint-disable-next-line unicorn/no-fn-reference-in-iterator\n ...[options.timeout.request, options.timeout.connect].filter(is_1.default.number));\n }\n // `options.pagination`\n if (is_1.default.object(options.pagination)) {\n if (defaults) {\n options.pagination = {\n ...defaults.pagination,\n ...options.pagination\n };\n }\n const { pagination } = options;\n if (!is_1.default.function_(pagination.transform)) {\n throw new Error('`options.pagination.transform` must be implemented');\n }\n if (!is_1.default.function_(pagination.shouldContinue)) {\n throw new Error('`options.pagination.shouldContinue` must be implemented');\n }\n if (!is_1.default.function_(pagination.filter)) {\n throw new TypeError('`options.pagination.filter` must be implemented');\n }\n if (!is_1.default.function_(pagination.paginate)) {\n throw new Error('`options.pagination.paginate` must be implemented');\n }\n }\n // JSON mode\n if (options.responseType === 'json' && options.headers.accept === undefined) {\n options.headers.accept = 'application/json';\n }\n return options;\n};\nexports.default = normalizeArguments;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.retryAfterStatusCodes = void 0;\nexports.retryAfterStatusCodes = new Set([413, 429, 503]);\nconst calculateRetryDelay = ({ attemptCount, retryOptions, error, retryAfter }) => {\n if (attemptCount > retryOptions.limit) {\n return 0;\n }\n const hasMethod = retryOptions.methods.includes(error.options.method);\n const hasErrorCode = retryOptions.errorCodes.includes(error.code);\n const hasStatusCode = error.response && retryOptions.statusCodes.includes(error.response.statusCode);\n if (!hasMethod || (!hasErrorCode && !hasStatusCode)) {\n return 0;\n }\n if (error.response) {\n if (retryAfter) {\n if (retryOptions.maxRetryAfter === undefined || retryAfter > retryOptions.maxRetryAfter) {\n return 0;\n }\n return retryAfter;\n }\n if (error.response.statusCode === 413) {\n return 0;\n }\n }\n const noise = Math.random() * 100;\n return ((2 ** (attemptCount - 1)) * 1000) + noise;\n};\nexports.default = calculateRetryDelay;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UnsupportedProtocolError = exports.ReadError = exports.TimeoutError = exports.UploadError = exports.CacheError = exports.HTTPError = exports.MaxRedirectsError = exports.RequestError = exports.setNonEnumerableProperties = exports.knownHookEvents = exports.withoutBody = exports.kIsNormalizedAlready = void 0;\nconst util_1 = require(\"util\");\nconst stream_1 = require(\"stream\");\nconst fs_1 = require(\"fs\");\nconst url_1 = require(\"url\");\nconst http = require(\"http\");\nconst http_1 = require(\"http\");\nconst https = require(\"https\");\nconst http_timer_1 = require(\"@szmarczak/http-timer\");\nconst cacheable_lookup_1 = require(\"cacheable-lookup\");\nconst CacheableRequest = require(\"cacheable-request\");\nconst decompressResponse = require(\"decompress-response\");\n// @ts-expect-error Missing types\nconst http2wrapper = require(\"http2-wrapper\");\nconst lowercaseKeys = require(\"lowercase-keys\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst get_body_size_1 = require(\"./utils/get-body-size\");\nconst is_form_data_1 = require(\"./utils/is-form-data\");\nconst proxy_events_1 = require(\"./utils/proxy-events\");\nconst timed_out_1 = require(\"./utils/timed-out\");\nconst url_to_options_1 = require(\"./utils/url-to-options\");\nconst options_to_url_1 = require(\"./utils/options-to-url\");\nconst weakable_map_1 = require(\"./utils/weakable-map\");\nconst get_buffer_1 = require(\"./utils/get-buffer\");\nconst dns_ip_version_1 = require(\"./utils/dns-ip-version\");\nconst is_response_ok_1 = require(\"./utils/is-response-ok\");\nconst deprecation_warning_1 = require(\"../utils/deprecation-warning\");\nconst normalize_arguments_1 = require(\"../as-promise/normalize-arguments\");\nconst calculate_retry_delay_1 = require(\"./calculate-retry-delay\");\nlet globalDnsCache;\nconst kRequest = Symbol('request');\nconst kResponse = Symbol('response');\nconst kResponseSize = Symbol('responseSize');\nconst kDownloadedSize = Symbol('downloadedSize');\nconst kBodySize = Symbol('bodySize');\nconst kUploadedSize = Symbol('uploadedSize');\nconst kServerResponsesPiped = Symbol('serverResponsesPiped');\nconst kUnproxyEvents = Symbol('unproxyEvents');\nconst kIsFromCache = Symbol('isFromCache');\nconst kCancelTimeouts = Symbol('cancelTimeouts');\nconst kStartedReading = Symbol('startedReading');\nconst kStopReading = Symbol('stopReading');\nconst kTriggerRead = Symbol('triggerRead');\nconst kBody = Symbol('body');\nconst kJobs = Symbol('jobs');\nconst kOriginalResponse = Symbol('originalResponse');\nconst kRetryTimeout = Symbol('retryTimeout');\nexports.kIsNormalizedAlready = Symbol('isNormalizedAlready');\nconst supportsBrotli = is_1.default.string(process.versions.brotli);\nexports.withoutBody = new Set(['GET', 'HEAD']);\nexports.knownHookEvents = [\n 'init',\n 'beforeRequest',\n 'beforeRedirect',\n 'beforeError',\n 'beforeRetry',\n // Promise-Only\n 'afterResponse'\n];\nfunction validateSearchParameters(searchParameters) {\n // eslint-disable-next-line guard-for-in\n for (const key in searchParameters) {\n const value = searchParameters[key];\n if (!is_1.default.string(value) && !is_1.default.number(value) && !is_1.default.boolean(value) && !is_1.default.null_(value) && !is_1.default.undefined(value)) {\n throw new TypeError(`The \\`searchParams\\` value '${String(value)}' must be a string, number, boolean or null`);\n }\n }\n}\nfunction isClientRequest(clientRequest) {\n return is_1.default.object(clientRequest) && !('statusCode' in clientRequest);\n}\nconst cacheableStore = new weakable_map_1.default();\nconst waitForOpenFile = async (file) => new Promise((resolve, reject) => {\n const onError = (error) => {\n reject(error);\n };\n // Node.js 12 has incomplete types\n if (!file.pending) {\n resolve();\n }\n file.once('error', onError);\n file.once('ready', () => {\n file.off('error', onError);\n resolve();\n });\n});\nconst redirectCodes = new Set([300, 301, 302, 303, 304, 307, 308]);\nconst nonEnumerableProperties = [\n 'context',\n 'body',\n 'json',\n 'form'\n];\nexports.setNonEnumerableProperties = (sources, to) => {\n // Non enumerable properties shall not be merged\n const properties = {};\n for (const source of sources) {\n if (!source) {\n continue;\n }\n for (const name of nonEnumerableProperties) {\n if (!(name in source)) {\n continue;\n }\n properties[name] = {\n writable: true,\n configurable: true,\n enumerable: false,\n // @ts-expect-error TS doesn't see the check above\n value: source[name]\n };\n }\n }\n Object.defineProperties(to, properties);\n};\n/**\nAn error to be thrown when a request fails.\nContains a `code` property with error class code, like `ECONNREFUSED`.\n*/\nclass RequestError extends Error {\n constructor(message, error, self) {\n var _a, _b;\n super(message);\n Error.captureStackTrace(this, this.constructor);\n this.name = 'RequestError';\n this.code = (_a = error.code) !== null && _a !== void 0 ? _a : 'ERR_GOT_REQUEST_ERROR';\n if (self instanceof Request) {\n Object.defineProperty(this, 'request', {\n enumerable: false,\n value: self\n });\n Object.defineProperty(this, 'response', {\n enumerable: false,\n value: self[kResponse]\n });\n Object.defineProperty(this, 'options', {\n // This fails because of TS 3.7.2 useDefineForClassFields\n // Ref: https://github.com/microsoft/TypeScript/issues/34972\n enumerable: false,\n value: self.options\n });\n }\n else {\n Object.defineProperty(this, 'options', {\n // This fails because of TS 3.7.2 useDefineForClassFields\n // Ref: https://github.com/microsoft/TypeScript/issues/34972\n enumerable: false,\n value: self\n });\n }\n this.timings = (_b = this.request) === null || _b === void 0 ? void 0 : _b.timings;\n // Recover the original stacktrace\n if (is_1.default.string(error.stack) && is_1.default.string(this.stack)) {\n const indexOfMessage = this.stack.indexOf(this.message) + this.message.length;\n const thisStackTrace = this.stack.slice(indexOfMessage).split('\\n').reverse();\n const errorStackTrace = error.stack.slice(error.stack.indexOf(error.message) + error.message.length).split('\\n').reverse();\n // Remove duplicated traces\n while (errorStackTrace.length !== 0 && errorStackTrace[0] === thisStackTrace[0]) {\n thisStackTrace.shift();\n }\n this.stack = `${this.stack.slice(0, indexOfMessage)}${thisStackTrace.reverse().join('\\n')}${errorStackTrace.reverse().join('\\n')}`;\n }\n }\n}\nexports.RequestError = RequestError;\n/**\nAn error to be thrown when the server redirects you more than ten times.\nIncludes a `response` property.\n*/\nclass MaxRedirectsError extends RequestError {\n constructor(request) {\n super(`Redirected ${request.options.maxRedirects} times. Aborting.`, {}, request);\n this.name = 'MaxRedirectsError';\n this.code = 'ERR_TOO_MANY_REDIRECTS';\n }\n}\nexports.MaxRedirectsError = MaxRedirectsError;\n/**\nAn error to be thrown when the server response code is not 2xx nor 3xx if `options.followRedirect` is `true`, but always except for 304.\nIncludes a `response` property.\n*/\nclass HTTPError extends RequestError {\n constructor(response) {\n super(`Response code ${response.statusCode} (${response.statusMessage})`, {}, response.request);\n this.name = 'HTTPError';\n this.code = 'ERR_NON_2XX_3XX_RESPONSE';\n }\n}\nexports.HTTPError = HTTPError;\n/**\nAn error to be thrown when a cache method fails.\nFor example, if the database goes down or there's a filesystem error.\n*/\nclass CacheError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'CacheError';\n this.code = this.code === 'ERR_GOT_REQUEST_ERROR' ? 'ERR_CACHE_ACCESS' : this.code;\n }\n}\nexports.CacheError = CacheError;\n/**\nAn error to be thrown when the request body is a stream and an error occurs while reading from that stream.\n*/\nclass UploadError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'UploadError';\n this.code = this.code === 'ERR_GOT_REQUEST_ERROR' ? 'ERR_UPLOAD' : this.code;\n }\n}\nexports.UploadError = UploadError;\n/**\nAn error to be thrown when the request is aborted due to a timeout.\nIncludes an `event` and `timings` property.\n*/\nclass TimeoutError extends RequestError {\n constructor(error, timings, request) {\n super(error.message, error, request);\n this.name = 'TimeoutError';\n this.event = error.event;\n this.timings = timings;\n }\n}\nexports.TimeoutError = TimeoutError;\n/**\nAn error to be thrown when reading from response stream fails.\n*/\nclass ReadError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'ReadError';\n this.code = this.code === 'ERR_GOT_REQUEST_ERROR' ? 'ERR_READING_RESPONSE_STREAM' : this.code;\n }\n}\nexports.ReadError = ReadError;\n/**\nAn error to be thrown when given an unsupported protocol.\n*/\nclass UnsupportedProtocolError extends RequestError {\n constructor(options) {\n super(`Unsupported protocol \"${options.url.protocol}\"`, {}, options);\n this.name = 'UnsupportedProtocolError';\n this.code = 'ERR_UNSUPPORTED_PROTOCOL';\n }\n}\nexports.UnsupportedProtocolError = UnsupportedProtocolError;\nconst proxiedRequestEvents = [\n 'socket',\n 'connect',\n 'continue',\n 'information',\n 'upgrade',\n 'timeout'\n];\nclass Request extends stream_1.Duplex {\n constructor(url, options = {}, defaults) {\n super({\n // This must be false, to enable throwing after destroy\n // It is used for retry logic in Promise API\n autoDestroy: false,\n // It needs to be zero because we're just proxying the data to another stream\n highWaterMark: 0\n });\n this[kDownloadedSize] = 0;\n this[kUploadedSize] = 0;\n this.requestInitialized = false;\n this[kServerResponsesPiped] = new Set();\n this.redirects = [];\n this[kStopReading] = false;\n this[kTriggerRead] = false;\n this[kJobs] = [];\n this.retryCount = 0;\n // TODO: Remove this when targeting Node.js >= 12\n this._progressCallbacks = [];\n const unlockWrite = () => this._unlockWrite();\n const lockWrite = () => this._lockWrite();\n this.on('pipe', (source) => {\n source.prependListener('data', unlockWrite);\n source.on('data', lockWrite);\n source.prependListener('end', unlockWrite);\n source.on('end', lockWrite);\n });\n this.on('unpipe', (source) => {\n source.off('data', unlockWrite);\n source.off('data', lockWrite);\n source.off('end', unlockWrite);\n source.off('end', lockWrite);\n });\n this.on('pipe', source => {\n if (source instanceof http_1.IncomingMessage) {\n this.options.headers = {\n ...source.headers,\n ...this.options.headers\n };\n }\n });\n const { json, body, form } = options;\n if (json || body || form) {\n this._lockWrite();\n }\n if (exports.kIsNormalizedAlready in options) {\n this.options = options;\n }\n else {\n try {\n // @ts-expect-error Common TypeScript bug saying that `this.constructor` is not accessible\n this.options = this.constructor.normalizeArguments(url, options, defaults);\n }\n catch (error) {\n // TODO: Move this to `_destroy()`\n if (is_1.default.nodeStream(options.body)) {\n options.body.destroy();\n }\n this.destroy(error);\n return;\n }\n }\n (async () => {\n var _a;\n try {\n if (this.options.body instanceof fs_1.ReadStream) {\n await waitForOpenFile(this.options.body);\n }\n const { url: normalizedURL } = this.options;\n if (!normalizedURL) {\n throw new TypeError('Missing `url` property');\n }\n this.requestUrl = normalizedURL.toString();\n decodeURI(this.requestUrl);\n await this._finalizeBody();\n await this._makeRequest();\n if (this.destroyed) {\n (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.destroy();\n return;\n }\n // Queued writes etc.\n for (const job of this[kJobs]) {\n job();\n }\n // Prevent memory leak\n this[kJobs].length = 0;\n this.requestInitialized = true;\n }\n catch (error) {\n if (error instanceof RequestError) {\n this._beforeError(error);\n return;\n }\n // This is a workaround for https://github.com/nodejs/node/issues/33335\n if (!this.destroyed) {\n this.destroy(error);\n }\n }\n })();\n }\n static normalizeArguments(url, options, defaults) {\n var _a, _b, _c, _d, _e;\n const rawOptions = options;\n if (is_1.default.object(url) && !is_1.default.urlInstance(url)) {\n options = { ...defaults, ...url, ...options };\n }\n else {\n if (url && options && options.url !== undefined) {\n throw new TypeError('The `url` option is mutually exclusive with the `input` argument');\n }\n options = { ...defaults, ...options };\n if (url !== undefined) {\n options.url = url;\n }\n if (is_1.default.urlInstance(options.url)) {\n options.url = new url_1.URL(options.url.toString());\n }\n }\n // TODO: Deprecate URL options in Got 12.\n // Support extend-specific options\n if (options.cache === false) {\n options.cache = undefined;\n }\n if (options.dnsCache === false) {\n options.dnsCache = undefined;\n }\n // Nice type assertions\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.method);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.headers);\n is_1.assert.any([is_1.default.string, is_1.default.urlInstance, is_1.default.undefined], options.prefixUrl);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.cookieJar);\n is_1.assert.any([is_1.default.object, is_1.default.string, is_1.default.undefined], options.searchParams);\n is_1.assert.any([is_1.default.object, is_1.default.string, is_1.default.undefined], options.cache);\n is_1.assert.any([is_1.default.object, is_1.default.number, is_1.default.undefined], options.timeout);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.context);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.hooks);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.decompress);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.ignoreInvalidCookies);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.followRedirect);\n is_1.assert.any([is_1.default.number, is_1.default.undefined], options.maxRedirects);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.throwHttpErrors);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.http2);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.allowGetBody);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.localAddress);\n is_1.assert.any([dns_ip_version_1.isDnsLookupIpVersion, is_1.default.undefined], options.dnsLookupIpVersion);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.https);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.rejectUnauthorized);\n if (options.https) {\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.https.rejectUnauthorized);\n is_1.assert.any([is_1.default.function_, is_1.default.undefined], options.https.checkServerIdentity);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.certificateAuthority);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.key);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.certificate);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.https.passphrase);\n is_1.assert.any([is_1.default.string, is_1.default.buffer, is_1.default.array, is_1.default.undefined], options.https.pfx);\n }\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.cacheOptions);\n // `options.method`\n if (is_1.default.string(options.method)) {\n options.method = options.method.toUpperCase();\n }\n else {\n options.method = 'GET';\n }\n // `options.headers`\n if (options.headers === (defaults === null || defaults === void 0 ? void 0 : defaults.headers)) {\n options.headers = { ...options.headers };\n }\n else {\n options.headers = lowercaseKeys({ ...(defaults === null || defaults === void 0 ? void 0 : defaults.headers), ...options.headers });\n }\n // Disallow legacy `url.Url`\n if ('slashes' in options) {\n throw new TypeError('The legacy `url.Url` has been deprecated. Use `URL` instead.');\n }\n // `options.auth`\n if ('auth' in options) {\n throw new TypeError('Parameter `auth` is deprecated. Use `username` / `password` instead.');\n }\n // `options.searchParams`\n if ('searchParams' in options) {\n if (options.searchParams && options.searchParams !== (defaults === null || defaults === void 0 ? void 0 : defaults.searchParams)) {\n let searchParameters;\n if (is_1.default.string(options.searchParams) || (options.searchParams instanceof url_1.URLSearchParams)) {\n searchParameters = new url_1.URLSearchParams(options.searchParams);\n }\n else {\n validateSearchParameters(options.searchParams);\n searchParameters = new url_1.URLSearchParams();\n // eslint-disable-next-line guard-for-in\n for (const key in options.searchParams) {\n const value = options.searchParams[key];\n if (value === null) {\n searchParameters.append(key, '');\n }\n else if (value !== undefined) {\n searchParameters.append(key, value);\n }\n }\n }\n // `normalizeArguments()` is also used to merge options\n (_a = defaults === null || defaults === void 0 ? void 0 : defaults.searchParams) === null || _a === void 0 ? void 0 : _a.forEach((value, key) => {\n // Only use default if one isn't already defined\n if (!searchParameters.has(key)) {\n searchParameters.append(key, value);\n }\n });\n options.searchParams = searchParameters;\n }\n }\n // `options.username` & `options.password`\n options.username = (_b = options.username) !== null && _b !== void 0 ? _b : '';\n options.password = (_c = options.password) !== null && _c !== void 0 ? _c : '';\n // `options.prefixUrl` & `options.url`\n if (is_1.default.undefined(options.prefixUrl)) {\n options.prefixUrl = (_d = defaults === null || defaults === void 0 ? void 0 : defaults.prefixUrl) !== null && _d !== void 0 ? _d : '';\n }\n else {\n options.prefixUrl = options.prefixUrl.toString();\n if (options.prefixUrl !== '' && !options.prefixUrl.endsWith('/')) {\n options.prefixUrl += '/';\n }\n }\n if (is_1.default.string(options.url)) {\n if (options.url.startsWith('/')) {\n throw new Error('`input` must not start with a slash when using `prefixUrl`');\n }\n options.url = options_to_url_1.default(options.prefixUrl + options.url, options);\n }\n else if ((is_1.default.undefined(options.url) && options.prefixUrl !== '') || options.protocol) {\n options.url = options_to_url_1.default(options.prefixUrl, options);\n }\n if (options.url) {\n if ('port' in options) {\n delete options.port;\n }\n // Make it possible to change `options.prefixUrl`\n let { prefixUrl } = options;\n Object.defineProperty(options, 'prefixUrl', {\n set: (value) => {\n const url = options.url;\n if (!url.href.startsWith(value)) {\n throw new Error(`Cannot change \\`prefixUrl\\` from ${prefixUrl} to ${value}: ${url.href}`);\n }\n options.url = new url_1.URL(value + url.href.slice(prefixUrl.length));\n prefixUrl = value;\n },\n get: () => prefixUrl\n });\n // Support UNIX sockets\n let { protocol } = options.url;\n if (protocol === 'unix:') {\n protocol = 'http:';\n options.url = new url_1.URL(`http://unix${options.url.pathname}${options.url.search}`);\n }\n // Set search params\n if (options.searchParams) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n options.url.search = options.searchParams.toString();\n }\n // Protocol check\n if (protocol !== 'http:' && protocol !== 'https:') {\n throw new UnsupportedProtocolError(options);\n }\n // Update `username`\n if (options.username === '') {\n options.username = options.url.username;\n }\n else {\n options.url.username = options.username;\n }\n // Update `password`\n if (options.password === '') {\n options.password = options.url.password;\n }\n else {\n options.url.password = options.password;\n }\n }\n // `options.cookieJar`\n const { cookieJar } = options;\n if (cookieJar) {\n let { setCookie, getCookieString } = cookieJar;\n is_1.assert.function_(setCookie);\n is_1.assert.function_(getCookieString);\n /* istanbul ignore next: Horrible `tough-cookie` v3 check */\n if (setCookie.length === 4 && getCookieString.length === 0) {\n setCookie = util_1.promisify(setCookie.bind(options.cookieJar));\n getCookieString = util_1.promisify(getCookieString.bind(options.cookieJar));\n options.cookieJar = {\n setCookie,\n getCookieString: getCookieString\n };\n }\n }\n // `options.cache`\n const { cache } = options;\n if (cache) {\n if (!cacheableStore.has(cache)) {\n cacheableStore.set(cache, new CacheableRequest(((requestOptions, handler) => {\n const result = requestOptions[kRequest](requestOptions, handler);\n // TODO: remove this when `cacheable-request` supports async request functions.\n if (is_1.default.promise(result)) {\n // @ts-expect-error\n // We only need to implement the error handler in order to support HTTP2 caching.\n // The result will be a promise anyway.\n result.once = (event, handler) => {\n if (event === 'error') {\n result.catch(handler);\n }\n else if (event === 'abort') {\n // The empty catch is needed here in case when\n // it rejects before it's `await`ed in `_makeRequest`.\n (async () => {\n try {\n const request = (await result);\n request.once('abort', handler);\n }\n catch (_a) { }\n })();\n }\n else {\n /* istanbul ignore next: safety check */\n throw new Error(`Unknown HTTP2 promise event: ${event}`);\n }\n return result;\n };\n }\n return result;\n }), cache));\n }\n }\n // `options.cacheOptions`\n options.cacheOptions = { ...options.cacheOptions };\n // `options.dnsCache`\n if (options.dnsCache === true) {\n if (!globalDnsCache) {\n globalDnsCache = new cacheable_lookup_1.default();\n }\n options.dnsCache = globalDnsCache;\n }\n else if (!is_1.default.undefined(options.dnsCache) && !options.dnsCache.lookup) {\n throw new TypeError(`Parameter \\`dnsCache\\` must be a CacheableLookup instance or a boolean, got ${is_1.default(options.dnsCache)}`);\n }\n // `options.timeout`\n if (is_1.default.number(options.timeout)) {\n options.timeout = { request: options.timeout };\n }\n else if (defaults && options.timeout !== defaults.timeout) {\n options.timeout = {\n ...defaults.timeout,\n ...options.timeout\n };\n }\n else {\n options.timeout = { ...options.timeout };\n }\n // `options.context`\n if (!options.context) {\n options.context = {};\n }\n // `options.hooks`\n const areHooksDefault = options.hooks === (defaults === null || defaults === void 0 ? void 0 : defaults.hooks);\n options.hooks = { ...options.hooks };\n for (const event of exports.knownHookEvents) {\n if (event in options.hooks) {\n if (is_1.default.array(options.hooks[event])) {\n // See https://github.com/microsoft/TypeScript/issues/31445#issuecomment-576929044\n options.hooks[event] = [...options.hooks[event]];\n }\n else {\n throw new TypeError(`Parameter \\`${event}\\` must be an Array, got ${is_1.default(options.hooks[event])}`);\n }\n }\n else {\n options.hooks[event] = [];\n }\n }\n if (defaults && !areHooksDefault) {\n for (const event of exports.knownHookEvents) {\n const defaultHooks = defaults.hooks[event];\n if (defaultHooks.length > 0) {\n // See https://github.com/microsoft/TypeScript/issues/31445#issuecomment-576929044\n options.hooks[event] = [\n ...defaults.hooks[event],\n ...options.hooks[event]\n ];\n }\n }\n }\n // DNS options\n if ('family' in options) {\n deprecation_warning_1.default('\"options.family\" was never documented, please use \"options.dnsLookupIpVersion\"');\n }\n // HTTPS options\n if (defaults === null || defaults === void 0 ? void 0 : defaults.https) {\n options.https = { ...defaults.https, ...options.https };\n }\n if ('rejectUnauthorized' in options) {\n deprecation_warning_1.default('\"options.rejectUnauthorized\" is now deprecated, please use \"options.https.rejectUnauthorized\"');\n }\n if ('checkServerIdentity' in options) {\n deprecation_warning_1.default('\"options.checkServerIdentity\" was never documented, please use \"options.https.checkServerIdentity\"');\n }\n if ('ca' in options) {\n deprecation_warning_1.default('\"options.ca\" was never documented, please use \"options.https.certificateAuthority\"');\n }\n if ('key' in options) {\n deprecation_warning_1.default('\"options.key\" was never documented, please use \"options.https.key\"');\n }\n if ('cert' in options) {\n deprecation_warning_1.default('\"options.cert\" was never documented, please use \"options.https.certificate\"');\n }\n if ('passphrase' in options) {\n deprecation_warning_1.default('\"options.passphrase\" was never documented, please use \"options.https.passphrase\"');\n }\n if ('pfx' in options) {\n deprecation_warning_1.default('\"options.pfx\" was never documented, please use \"options.https.pfx\"');\n }\n // Other options\n if ('followRedirects' in options) {\n throw new TypeError('The `followRedirects` option does not exist. Use `followRedirect` instead.');\n }\n if (options.agent) {\n for (const key in options.agent) {\n if (key !== 'http' && key !== 'https' && key !== 'http2') {\n throw new TypeError(`Expected the \\`options.agent\\` properties to be \\`http\\`, \\`https\\` or \\`http2\\`, got \\`${key}\\``);\n }\n }\n }\n options.maxRedirects = (_e = options.maxRedirects) !== null && _e !== void 0 ? _e : 0;\n // Set non-enumerable properties\n exports.setNonEnumerableProperties([defaults, rawOptions], options);\n return normalize_arguments_1.default(options, defaults);\n }\n _lockWrite() {\n const onLockedWrite = () => {\n throw new TypeError('The payload has been already provided');\n };\n this.write = onLockedWrite;\n this.end = onLockedWrite;\n }\n _unlockWrite() {\n this.write = super.write;\n this.end = super.end;\n }\n async _finalizeBody() {\n const { options } = this;\n const { headers } = options;\n const isForm = !is_1.default.undefined(options.form);\n const isJSON = !is_1.default.undefined(options.json);\n const isBody = !is_1.default.undefined(options.body);\n const hasPayload = isForm || isJSON || isBody;\n const cannotHaveBody = exports.withoutBody.has(options.method) && !(options.method === 'GET' && options.allowGetBody);\n this._cannotHaveBody = cannotHaveBody;\n if (hasPayload) {\n if (cannotHaveBody) {\n throw new TypeError(`The \\`${options.method}\\` method cannot be used with a body`);\n }\n if ([isBody, isForm, isJSON].filter(isTrue => isTrue).length > 1) {\n throw new TypeError('The `body`, `json` and `form` options are mutually exclusive');\n }\n if (isBody &&\n !(options.body instanceof stream_1.Readable) &&\n !is_1.default.string(options.body) &&\n !is_1.default.buffer(options.body) &&\n !is_form_data_1.default(options.body)) {\n throw new TypeError('The `body` option must be a stream.Readable, string or Buffer');\n }\n if (isForm && !is_1.default.object(options.form)) {\n throw new TypeError('The `form` option must be an Object');\n }\n {\n // Serialize body\n const noContentType = !is_1.default.string(headers['content-type']);\n if (isBody) {\n // Special case for https://github.com/form-data/form-data\n if (is_form_data_1.default(options.body) && noContentType) {\n headers['content-type'] = `multipart/form-data; boundary=${options.body.getBoundary()}`;\n }\n this[kBody] = options.body;\n }\n else if (isForm) {\n if (noContentType) {\n headers['content-type'] = 'application/x-www-form-urlencoded';\n }\n this[kBody] = (new url_1.URLSearchParams(options.form)).toString();\n }\n else {\n if (noContentType) {\n headers['content-type'] = 'application/json';\n }\n this[kBody] = options.stringifyJson(options.json);\n }\n const uploadBodySize = await get_body_size_1.default(this[kBody], options.headers);\n // See https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD send a Content-Length in a request message when\n // no Transfer-Encoding is sent and the request method defines a meaning\n // for an enclosed payload body. For example, a Content-Length header\n // field is normally sent in a POST request even when the value is 0\n // (indicating an empty payload body). A user agent SHOULD NOT send a\n // Content-Length header field when the request message does not contain\n // a payload body and the method semantics do not anticipate such a\n // body.\n if (is_1.default.undefined(headers['content-length']) && is_1.default.undefined(headers['transfer-encoding'])) {\n if (!cannotHaveBody && !is_1.default.undefined(uploadBodySize)) {\n headers['content-length'] = String(uploadBodySize);\n }\n }\n }\n }\n else if (cannotHaveBody) {\n this._lockWrite();\n }\n else {\n this._unlockWrite();\n }\n this[kBodySize] = Number(headers['content-length']) || undefined;\n }\n async _onResponseBase(response) {\n const { options } = this;\n const { url } = options;\n this[kOriginalResponse] = response;\n if (options.decompress) {\n response = decompressResponse(response);\n }\n const statusCode = response.statusCode;\n const typedResponse = response;\n typedResponse.statusMessage = typedResponse.statusMessage ? typedResponse.statusMessage : http.STATUS_CODES[statusCode];\n typedResponse.url = options.url.toString();\n typedResponse.requestUrl = this.requestUrl;\n typedResponse.redirectUrls = this.redirects;\n typedResponse.request = this;\n typedResponse.isFromCache = response.fromCache || false;\n typedResponse.ip = this.ip;\n typedResponse.retryCount = this.retryCount;\n this[kIsFromCache] = typedResponse.isFromCache;\n this[kResponseSize] = Number(response.headers['content-length']) || undefined;\n this[kResponse] = response;\n response.once('end', () => {\n this[kResponseSize] = this[kDownloadedSize];\n this.emit('downloadProgress', this.downloadProgress);\n });\n response.once('error', (error) => {\n // Force clean-up, because some packages don't do this.\n // TODO: Fix decompress-response\n response.destroy();\n this._beforeError(new ReadError(error, this));\n });\n response.once('aborted', () => {\n this._beforeError(new ReadError({\n name: 'Error',\n message: 'The server aborted pending request',\n code: 'ECONNRESET'\n }, this));\n });\n this.emit('downloadProgress', this.downloadProgress);\n const rawCookies = response.headers['set-cookie'];\n if (is_1.default.object(options.cookieJar) && rawCookies) {\n let promises = rawCookies.map(async (rawCookie) => options.cookieJar.setCookie(rawCookie, url.toString()));\n if (options.ignoreInvalidCookies) {\n promises = promises.map(async (p) => p.catch(() => { }));\n }\n try {\n await Promise.all(promises);\n }\n catch (error) {\n this._beforeError(error);\n return;\n }\n }\n if (options.followRedirect && response.headers.location && redirectCodes.has(statusCode)) {\n // We're being redirected, we don't care about the response.\n // It'd be best to abort the request, but we can't because\n // we would have to sacrifice the TCP connection. We don't want that.\n response.resume();\n if (this[kRequest]) {\n this[kCancelTimeouts]();\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this[kRequest];\n this[kUnproxyEvents]();\n }\n const shouldBeGet = statusCode === 303 && options.method !== 'GET' && options.method !== 'HEAD';\n if (shouldBeGet || !options.methodRewriting) {\n // Server responded with \"see other\", indicating that the resource exists at another location,\n // and the client should request it from that location via GET or HEAD.\n options.method = 'GET';\n if ('body' in options) {\n delete options.body;\n }\n if ('json' in options) {\n delete options.json;\n }\n if ('form' in options) {\n delete options.form;\n }\n this[kBody] = undefined;\n delete options.headers['content-length'];\n }\n if (this.redirects.length >= options.maxRedirects) {\n this._beforeError(new MaxRedirectsError(this));\n return;\n }\n try {\n // Do not remove. See https://github.com/sindresorhus/got/pull/214\n const redirectBuffer = Buffer.from(response.headers.location, 'binary').toString();\n // Handles invalid URLs. See https://github.com/sindresorhus/got/issues/604\n const redirectUrl = new url_1.URL(redirectBuffer, url);\n const redirectString = redirectUrl.toString();\n decodeURI(redirectString);\n // eslint-disable-next-line no-inner-declarations\n function isUnixSocketURL(url) {\n return url.protocol === 'unix:' || url.hostname === 'unix';\n }\n if (!isUnixSocketURL(url) && isUnixSocketURL(redirectUrl)) {\n this._beforeError(new RequestError('Cannot redirect to UNIX socket', {}, this));\n return;\n }\n // Redirecting to a different site, clear sensitive data.\n if (redirectUrl.hostname !== url.hostname || redirectUrl.port !== url.port) {\n if ('host' in options.headers) {\n delete options.headers.host;\n }\n if ('cookie' in options.headers) {\n delete options.headers.cookie;\n }\n if ('authorization' in options.headers) {\n delete options.headers.authorization;\n }\n if (options.username || options.password) {\n options.username = '';\n options.password = '';\n }\n }\n else {\n redirectUrl.username = options.username;\n redirectUrl.password = options.password;\n }\n this.redirects.push(redirectString);\n options.url = redirectUrl;\n for (const hook of options.hooks.beforeRedirect) {\n // eslint-disable-next-line no-await-in-loop\n await hook(options, typedResponse);\n }\n this.emit('redirect', typedResponse, options);\n await this._makeRequest();\n }\n catch (error) {\n this._beforeError(error);\n return;\n }\n return;\n }\n if (options.isStream && options.throwHttpErrors && !is_response_ok_1.isResponseOk(typedResponse)) {\n this._beforeError(new HTTPError(typedResponse));\n return;\n }\n response.on('readable', () => {\n if (this[kTriggerRead]) {\n this._read();\n }\n });\n this.on('resume', () => {\n response.resume();\n });\n this.on('pause', () => {\n response.pause();\n });\n response.once('end', () => {\n this.push(null);\n });\n this.emit('response', response);\n for (const destination of this[kServerResponsesPiped]) {\n if (destination.headersSent) {\n continue;\n }\n // eslint-disable-next-line guard-for-in\n for (const key in response.headers) {\n const isAllowed = options.decompress ? key !== 'content-encoding' : true;\n const value = response.headers[key];\n if (isAllowed) {\n destination.setHeader(key, value);\n }\n }\n destination.statusCode = statusCode;\n }\n }\n async _onResponse(response) {\n try {\n await this._onResponseBase(response);\n }\n catch (error) {\n /* istanbul ignore next: better safe than sorry */\n this._beforeError(error);\n }\n }\n _onRequest(request) {\n const { options } = this;\n const { timeout, url } = options;\n http_timer_1.default(request);\n this[kCancelTimeouts] = timed_out_1.default(request, timeout, url);\n const responseEventName = options.cache ? 'cacheableResponse' : 'response';\n request.once(responseEventName, (response) => {\n void this._onResponse(response);\n });\n request.once('error', (error) => {\n var _a;\n // Force clean-up, because some packages (e.g. nock) don't do this.\n request.destroy();\n // Node.js <= 12.18.2 mistakenly emits the response `end` first.\n (_a = request.res) === null || _a === void 0 ? void 0 : _a.removeAllListeners('end');\n error = error instanceof timed_out_1.TimeoutError ? new TimeoutError(error, this.timings, this) : new RequestError(error.message, error, this);\n this._beforeError(error);\n });\n this[kUnproxyEvents] = proxy_events_1.default(request, this, proxiedRequestEvents);\n this[kRequest] = request;\n this.emit('uploadProgress', this.uploadProgress);\n // Send body\n const body = this[kBody];\n const currentRequest = this.redirects.length === 0 ? this : request;\n if (is_1.default.nodeStream(body)) {\n body.pipe(currentRequest);\n body.once('error', (error) => {\n this._beforeError(new UploadError(error, this));\n });\n }\n else {\n this._unlockWrite();\n if (!is_1.default.undefined(body)) {\n this._writeRequest(body, undefined, () => { });\n currentRequest.end();\n this._lockWrite();\n }\n else if (this._cannotHaveBody || this._noPipe) {\n currentRequest.end();\n this._lockWrite();\n }\n }\n this.emit('request', request);\n }\n async _createCacheableRequest(url, options) {\n return new Promise((resolve, reject) => {\n // TODO: Remove `utils/url-to-options.ts` when `cacheable-request` is fixed\n Object.assign(options, url_to_options_1.default(url));\n // `http-cache-semantics` checks this\n // TODO: Fix this ignore.\n // @ts-expect-error\n delete options.url;\n let request;\n // This is ugly\n const cacheRequest = cacheableStore.get(options.cache)(options, async (response) => {\n // TODO: Fix `cacheable-response`\n response._readableState.autoDestroy = false;\n if (request) {\n (await request).emit('cacheableResponse', response);\n }\n resolve(response);\n });\n // Restore options\n options.url = url;\n cacheRequest.once('error', reject);\n cacheRequest.once('request', async (requestOrPromise) => {\n request = requestOrPromise;\n resolve(request);\n });\n });\n }\n async _makeRequest() {\n var _a, _b, _c, _d, _e;\n const { options } = this;\n const { headers } = options;\n for (const key in headers) {\n if (is_1.default.undefined(headers[key])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete headers[key];\n }\n else if (is_1.default.null_(headers[key])) {\n throw new TypeError(`Use \\`undefined\\` instead of \\`null\\` to delete the \\`${key}\\` header`);\n }\n }\n if (options.decompress && is_1.default.undefined(headers['accept-encoding'])) {\n headers['accept-encoding'] = supportsBrotli ? 'gzip, deflate, br' : 'gzip, deflate';\n }\n // Set cookies\n if (options.cookieJar) {\n const cookieString = await options.cookieJar.getCookieString(options.url.toString());\n if (is_1.default.nonEmptyString(cookieString)) {\n options.headers.cookie = cookieString;\n }\n }\n for (const hook of options.hooks.beforeRequest) {\n // eslint-disable-next-line no-await-in-loop\n const result = await hook(options);\n if (!is_1.default.undefined(result)) {\n // @ts-expect-error Skip the type mismatch to support abstract responses\n options.request = () => result;\n break;\n }\n }\n if (options.body && this[kBody] !== options.body) {\n this[kBody] = options.body;\n }\n const { agent, request, timeout, url } = options;\n if (options.dnsCache && !('lookup' in options)) {\n options.lookup = options.dnsCache.lookup;\n }\n // UNIX sockets\n if (url.hostname === 'unix') {\n const matches = /(?<socketPath>.+?):(?<path>.+)/.exec(`${url.pathname}${url.search}`);\n if (matches === null || matches === void 0 ? void 0 : matches.groups) {\n const { socketPath, path } = matches.groups;\n Object.assign(options, {\n socketPath,\n path,\n host: ''\n });\n }\n }\n const isHttps = url.protocol === 'https:';\n // Fallback function\n let fallbackFn;\n if (options.http2) {\n fallbackFn = http2wrapper.auto;\n }\n else {\n fallbackFn = isHttps ? https.request : http.request;\n }\n const realFn = (_a = options.request) !== null && _a !== void 0 ? _a : fallbackFn;\n // Cache support\n const fn = options.cache ? this._createCacheableRequest : realFn;\n // Pass an agent directly when HTTP2 is disabled\n if (agent && !options.http2) {\n options.agent = agent[isHttps ? 'https' : 'http'];\n }\n // Prepare plain HTTP request options\n options[kRequest] = realFn;\n delete options.request;\n // TODO: Fix this ignore.\n // @ts-expect-error\n delete options.timeout;\n const requestOptions = options;\n requestOptions.shared = (_b = options.cacheOptions) === null || _b === void 0 ? void 0 : _b.shared;\n requestOptions.cacheHeuristic = (_c = options.cacheOptions) === null || _c === void 0 ? void 0 : _c.cacheHeuristic;\n requestOptions.immutableMinTimeToLive = (_d = options.cacheOptions) === null || _d === void 0 ? void 0 : _d.immutableMinTimeToLive;\n requestOptions.ignoreCargoCult = (_e = options.cacheOptions) === null || _e === void 0 ? void 0 : _e.ignoreCargoCult;\n // If `dnsLookupIpVersion` is not present do not override `family`\n if (options.dnsLookupIpVersion !== undefined) {\n try {\n requestOptions.family = dns_ip_version_1.dnsLookupIpVersionToFamily(options.dnsLookupIpVersion);\n }\n catch (_f) {\n throw new Error('Invalid `dnsLookupIpVersion` option value');\n }\n }\n // HTTPS options remapping\n if (options.https) {\n if ('rejectUnauthorized' in options.https) {\n requestOptions.rejectUnauthorized = options.https.rejectUnauthorized;\n }\n if (options.https.checkServerIdentity) {\n requestOptions.checkServerIdentity = options.https.checkServerIdentity;\n }\n if (options.https.certificateAuthority) {\n requestOptions.ca = options.https.certificateAuthority;\n }\n if (options.https.certificate) {\n requestOptions.cert = options.https.certificate;\n }\n if (options.https.key) {\n requestOptions.key = options.https.key;\n }\n if (options.https.passphrase) {\n requestOptions.passphrase = options.https.passphrase;\n }\n if (options.https.pfx) {\n requestOptions.pfx = options.https.pfx;\n }\n }\n try {\n let requestOrResponse = await fn(url, requestOptions);\n if (is_1.default.undefined(requestOrResponse)) {\n requestOrResponse = fallbackFn(url, requestOptions);\n }\n // Restore options\n options.request = request;\n options.timeout = timeout;\n options.agent = agent;\n // HTTPS options restore\n if (options.https) {\n if ('rejectUnauthorized' in options.https) {\n delete requestOptions.rejectUnauthorized;\n }\n if (options.https.checkServerIdentity) {\n // @ts-expect-error - This one will be removed when we remove the alias.\n delete requestOptions.checkServerIdentity;\n }\n if (options.https.certificateAuthority) {\n delete requestOptions.ca;\n }\n if (options.https.certificate) {\n delete requestOptions.cert;\n }\n if (options.https.key) {\n delete requestOptions.key;\n }\n if (options.https.passphrase) {\n delete requestOptions.passphrase;\n }\n if (options.https.pfx) {\n delete requestOptions.pfx;\n }\n }\n if (isClientRequest(requestOrResponse)) {\n this._onRequest(requestOrResponse);\n // Emit the response after the stream has been ended\n }\n else if (this.writable) {\n this.once('finish', () => {\n void this._onResponse(requestOrResponse);\n });\n this._unlockWrite();\n this.end();\n this._lockWrite();\n }\n else {\n void this._onResponse(requestOrResponse);\n }\n }\n catch (error) {\n if (error instanceof CacheableRequest.CacheError) {\n throw new CacheError(error, this);\n }\n throw new RequestError(error.message, error, this);\n }\n }\n async _error(error) {\n try {\n for (const hook of this.options.hooks.beforeError) {\n // eslint-disable-next-line no-await-in-loop\n error = await hook(error);\n }\n }\n catch (error_) {\n error = new RequestError(error_.message, error_, this);\n }\n this.destroy(error);\n }\n _beforeError(error) {\n if (this[kStopReading]) {\n return;\n }\n const { options } = this;\n const retryCount = this.retryCount + 1;\n this[kStopReading] = true;\n if (!(error instanceof RequestError)) {\n error = new RequestError(error.message, error, this);\n }\n const typedError = error;\n const { response } = typedError;\n void (async () => {\n if (response && !response.body) {\n response.setEncoding(this._readableState.encoding);\n try {\n response.rawBody = await get_buffer_1.default(response);\n response.body = response.rawBody.toString();\n }\n catch (_a) { }\n }\n if (this.listenerCount('retry') !== 0) {\n let backoff;\n try {\n let retryAfter;\n if (response && 'retry-after' in response.headers) {\n retryAfter = Number(response.headers['retry-after']);\n if (Number.isNaN(retryAfter)) {\n retryAfter = Date.parse(response.headers['retry-after']) - Date.now();\n if (retryAfter <= 0) {\n retryAfter = 1;\n }\n }\n else {\n retryAfter *= 1000;\n }\n }\n backoff = await options.retry.calculateDelay({\n attemptCount: retryCount,\n retryOptions: options.retry,\n error: typedError,\n retryAfter,\n computedValue: calculate_retry_delay_1.default({\n attemptCount: retryCount,\n retryOptions: options.retry,\n error: typedError,\n retryAfter,\n computedValue: 0\n })\n });\n }\n catch (error_) {\n void this._error(new RequestError(error_.message, error_, this));\n return;\n }\n if (backoff) {\n const retry = async () => {\n try {\n for (const hook of this.options.hooks.beforeRetry) {\n // eslint-disable-next-line no-await-in-loop\n await hook(this.options, typedError, retryCount);\n }\n }\n catch (error_) {\n void this._error(new RequestError(error_.message, error, this));\n return;\n }\n // Something forced us to abort the retry\n if (this.destroyed) {\n return;\n }\n this.destroy();\n this.emit('retry', retryCount, error);\n };\n this[kRetryTimeout] = setTimeout(retry, backoff);\n return;\n }\n }\n void this._error(typedError);\n })();\n }\n _read() {\n this[kTriggerRead] = true;\n const response = this[kResponse];\n if (response && !this[kStopReading]) {\n // We cannot put this in the `if` above\n // because `.read()` also triggers the `end` event\n if (response.readableLength) {\n this[kTriggerRead] = false;\n }\n let data;\n while ((data = response.read()) !== null) {\n this[kDownloadedSize] += data.length;\n this[kStartedReading] = true;\n const progress = this.downloadProgress;\n if (progress.percent < 1) {\n this.emit('downloadProgress', progress);\n }\n this.push(data);\n }\n }\n }\n // Node.js 12 has incorrect types, so the encoding must be a string\n _write(chunk, encoding, callback) {\n const write = () => {\n this._writeRequest(chunk, encoding, callback);\n };\n if (this.requestInitialized) {\n write();\n }\n else {\n this[kJobs].push(write);\n }\n }\n _writeRequest(chunk, encoding, callback) {\n if (this[kRequest].destroyed) {\n // Probably the `ClientRequest` instance will throw\n return;\n }\n this._progressCallbacks.push(() => {\n this[kUploadedSize] += Buffer.byteLength(chunk, encoding);\n const progress = this.uploadProgress;\n if (progress.percent < 1) {\n this.emit('uploadProgress', progress);\n }\n });\n // TODO: What happens if it's from cache? Then this[kRequest] won't be defined.\n this[kRequest].write(chunk, encoding, (error) => {\n if (!error && this._progressCallbacks.length > 0) {\n this._progressCallbacks.shift()();\n }\n callback(error);\n });\n }\n _final(callback) {\n const endRequest = () => {\n // FIX: Node.js 10 calls the write callback AFTER the end callback!\n while (this._progressCallbacks.length !== 0) {\n this._progressCallbacks.shift()();\n }\n // We need to check if `this[kRequest]` is present,\n // because it isn't when we use cache.\n if (!(kRequest in this)) {\n callback();\n return;\n }\n if (this[kRequest].destroyed) {\n callback();\n return;\n }\n this[kRequest].end((error) => {\n if (!error) {\n this[kBodySize] = this[kUploadedSize];\n this.emit('uploadProgress', this.uploadProgress);\n this[kRequest].emit('upload-complete');\n }\n callback(error);\n });\n };\n if (this.requestInitialized) {\n endRequest();\n }\n else {\n this[kJobs].push(endRequest);\n }\n }\n _destroy(error, callback) {\n var _a;\n this[kStopReading] = true;\n // Prevent further retries\n clearTimeout(this[kRetryTimeout]);\n if (kRequest in this) {\n this[kCancelTimeouts]();\n // TODO: Remove the next `if` when these get fixed:\n // - https://github.com/nodejs/node/issues/32851\n if (!((_a = this[kResponse]) === null || _a === void 0 ? void 0 : _a.complete)) {\n this[kRequest].destroy();\n }\n }\n if (error !== null && !is_1.default.undefined(error) && !(error instanceof RequestError)) {\n error = new RequestError(error.message, error, this);\n }\n callback(error);\n }\n get _isAboutToError() {\n return this[kStopReading];\n }\n /**\n The remote IP address.\n */\n get ip() {\n var _a;\n return (_a = this.socket) === null || _a === void 0 ? void 0 : _a.remoteAddress;\n }\n /**\n Indicates whether the request has been aborted or not.\n */\n get aborted() {\n var _a, _b, _c;\n return ((_b = (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.destroyed) !== null && _b !== void 0 ? _b : this.destroyed) && !((_c = this[kOriginalResponse]) === null || _c === void 0 ? void 0 : _c.complete);\n }\n get socket() {\n var _a, _b;\n return (_b = (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.socket) !== null && _b !== void 0 ? _b : undefined;\n }\n /**\n Progress event for downloading (receiving a response).\n */\n get downloadProgress() {\n let percent;\n if (this[kResponseSize]) {\n percent = this[kDownloadedSize] / this[kResponseSize];\n }\n else if (this[kResponseSize] === this[kDownloadedSize]) {\n percent = 1;\n }\n else {\n percent = 0;\n }\n return {\n percent,\n transferred: this[kDownloadedSize],\n total: this[kResponseSize]\n };\n }\n /**\n Progress event for uploading (sending a request).\n */\n get uploadProgress() {\n let percent;\n if (this[kBodySize]) {\n percent = this[kUploadedSize] / this[kBodySize];\n }\n else if (this[kBodySize] === this[kUploadedSize]) {\n percent = 1;\n }\n else {\n percent = 0;\n }\n return {\n percent,\n transferred: this[kUploadedSize],\n total: this[kBodySize]\n };\n }\n /**\n The object contains the following properties:\n\n - `start` - Time when the request started.\n - `socket` - Time when a socket was assigned to the request.\n - `lookup` - Time when the DNS lookup finished.\n - `connect` - Time when the socket successfully connected.\n - `secureConnect` - Time when the socket securely connected.\n - `upload` - Time when the request finished uploading.\n - `response` - Time when the request fired `response` event.\n - `end` - Time when the response fired `end` event.\n - `error` - Time when the request fired `error` event.\n - `abort` - Time when the request fired `abort` event.\n - `phases`\n - `wait` - `timings.socket - timings.start`\n - `dns` - `timings.lookup - timings.socket`\n - `tcp` - `timings.connect - timings.lookup`\n - `tls` - `timings.secureConnect - timings.connect`\n - `request` - `timings.upload - (timings.secureConnect || timings.connect)`\n - `firstByte` - `timings.response - timings.upload`\n - `download` - `timings.end - timings.response`\n - `total` - `(timings.end || timings.error || timings.abort) - timings.start`\n\n If something has not been measured yet, it will be `undefined`.\n\n __Note__: The time is a `number` representing the milliseconds elapsed since the UNIX epoch.\n */\n get timings() {\n var _a;\n return (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.timings;\n }\n /**\n Whether the response was retrieved from the cache.\n */\n get isFromCache() {\n return this[kIsFromCache];\n }\n pipe(destination, options) {\n if (this[kStartedReading]) {\n throw new Error('Failed to pipe. The response has been emitted already.');\n }\n if (destination instanceof http_1.ServerResponse) {\n this[kServerResponsesPiped].add(destination);\n }\n return super.pipe(destination, options);\n }\n unpipe(destination) {\n if (destination instanceof http_1.ServerResponse) {\n this[kServerResponsesPiped].delete(destination);\n }\n super.unpipe(destination);\n return this;\n }\n}\nexports.default = Request;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancelError = exports.ParseError = void 0;\nconst core_1 = require(\"../core\");\n/**\nAn error to be thrown when server response code is 2xx, and parsing body fails.\nIncludes a `response` property.\n*/\nclass ParseError extends core_1.RequestError {\n constructor(error, response) {\n const { options } = response.request;\n super(`${error.message} in \"${options.url.toString()}\"`, error, response.request);\n this.name = 'ParseError';\n this.code = this.code === 'ERR_GOT_REQUEST_ERROR' ? 'ERR_BODY_PARSE_FAILURE' : this.code;\n }\n}\nexports.ParseError = ParseError;\n/**\nAn error to be thrown when the request is aborted with `.cancel()`.\n*/\nclass CancelError extends core_1.RequestError {\n constructor(request) {\n super('Promise was canceled', {}, request);\n this.name = 'CancelError';\n this.code = 'ERR_CANCELED';\n }\n get isCanceled() {\n return true;\n }\n}\nexports.CancelError = CancelError;\n__exportStar(require(\"../core\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst types_1 = require(\"./types\");\nconst parseBody = (response, responseType, parseJson, encoding) => {\n const { rawBody } = response;\n try {\n if (responseType === 'text') {\n return rawBody.toString(encoding);\n }\n if (responseType === 'json') {\n return rawBody.length === 0 ? '' : parseJson(rawBody.toString());\n }\n if (responseType === 'buffer') {\n return rawBody;\n }\n throw new types_1.ParseError({\n message: `Unknown body type '${responseType}'`,\n name: 'Error'\n }, response);\n }\n catch (error) {\n throw new types_1.ParseError(error, response);\n }\n};\nexports.default = parseBody;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst PCancelable = require(\"p-cancelable\");\nconst types_1 = require(\"./types\");\nconst parse_body_1 = require(\"./parse-body\");\nconst core_1 = require(\"../core\");\nconst proxy_events_1 = require(\"../core/utils/proxy-events\");\nconst get_buffer_1 = require(\"../core/utils/get-buffer\");\nconst is_response_ok_1 = require(\"../core/utils/is-response-ok\");\nconst proxiedRequestEvents = [\n 'request',\n 'response',\n 'redirect',\n 'uploadProgress',\n 'downloadProgress'\n];\nfunction asPromise(normalizedOptions) {\n let globalRequest;\n let globalResponse;\n const emitter = new events_1.EventEmitter();\n const promise = new PCancelable((resolve, reject, onCancel) => {\n const makeRequest = (retryCount) => {\n const request = new core_1.default(undefined, normalizedOptions);\n request.retryCount = retryCount;\n request._noPipe = true;\n onCancel(() => request.destroy());\n onCancel.shouldReject = false;\n onCancel(() => reject(new types_1.CancelError(request)));\n globalRequest = request;\n request.once('response', async (response) => {\n var _a;\n response.retryCount = retryCount;\n if (response.request.aborted) {\n // Canceled while downloading - will throw a `CancelError` or `TimeoutError` error\n return;\n }\n // Download body\n let rawBody;\n try {\n rawBody = await get_buffer_1.default(request);\n response.rawBody = rawBody;\n }\n catch (_b) {\n // The same error is caught below.\n // See request.once('error')\n return;\n }\n if (request._isAboutToError) {\n return;\n }\n // Parse body\n const contentEncoding = ((_a = response.headers['content-encoding']) !== null && _a !== void 0 ? _a : '').toLowerCase();\n const isCompressed = ['gzip', 'deflate', 'br'].includes(contentEncoding);\n const { options } = request;\n if (isCompressed && !options.decompress) {\n response.body = rawBody;\n }\n else {\n try {\n response.body = parse_body_1.default(response, options.responseType, options.parseJson, options.encoding);\n }\n catch (error) {\n // Fallback to `utf8`\n response.body = rawBody.toString();\n if (is_response_ok_1.isResponseOk(response)) {\n request._beforeError(error);\n return;\n }\n }\n }\n try {\n for (const [index, hook] of options.hooks.afterResponse.entries()) {\n // @ts-expect-error TS doesn't notice that CancelableRequest is a Promise\n // eslint-disable-next-line no-await-in-loop\n response = await hook(response, async (updatedOptions) => {\n const typedOptions = core_1.default.normalizeArguments(undefined, {\n ...updatedOptions,\n retry: {\n calculateDelay: () => 0\n },\n throwHttpErrors: false,\n resolveBodyOnly: false\n }, options);\n // Remove any further hooks for that request, because we'll call them anyway.\n // The loop continues. We don't want duplicates (asPromise recursion).\n typedOptions.hooks.afterResponse = typedOptions.hooks.afterResponse.slice(0, index);\n for (const hook of typedOptions.hooks.beforeRetry) {\n // eslint-disable-next-line no-await-in-loop\n await hook(typedOptions);\n }\n const promise = asPromise(typedOptions);\n onCancel(() => {\n promise.catch(() => { });\n promise.cancel();\n });\n return promise;\n });\n }\n }\n catch (error) {\n request._beforeError(new types_1.RequestError(error.message, error, request));\n return;\n }\n globalResponse = response;\n if (!is_response_ok_1.isResponseOk(response)) {\n request._beforeError(new types_1.HTTPError(response));\n return;\n }\n request.destroy();\n resolve(request.options.resolveBodyOnly ? response.body : response);\n });\n const onError = (error) => {\n if (promise.isCanceled) {\n return;\n }\n const { options } = request;\n if (error instanceof types_1.HTTPError && !options.throwHttpErrors) {\n const { response } = error;\n resolve(request.options.resolveBodyOnly ? response.body : response);\n return;\n }\n reject(error);\n };\n request.once('error', onError);\n const previousBody = request.options.body;\n request.once('retry', (newRetryCount, error) => {\n var _a, _b;\n if (previousBody === ((_a = error.request) === null || _a === void 0 ? void 0 : _a.options.body) && is_1.default.nodeStream((_b = error.request) === null || _b === void 0 ? void 0 : _b.options.body)) {\n onError(error);\n return;\n }\n makeRequest(newRetryCount);\n });\n proxy_events_1.default(request, emitter, proxiedRequestEvents);\n };\n makeRequest(0);\n });\n promise.on = (event, fn) => {\n emitter.on(event, fn);\n return promise;\n };\n const shortcut = (responseType) => {\n const newPromise = (async () => {\n // Wait until downloading has ended\n await promise;\n const { options } = globalResponse.request;\n return parse_body_1.default(globalResponse, responseType, options.parseJson, options.encoding);\n })();\n Object.defineProperties(newPromise, Object.getOwnPropertyDescriptors(promise));\n return newPromise;\n };\n promise.json = () => {\n const { headers } = globalRequest.options;\n if (!globalRequest.writableFinished && headers.accept === undefined) {\n headers.accept = 'application/json';\n }\n return shortcut('json');\n };\n promise.buffer = () => shortcut('buffer');\n promise.text = () => shortcut('text');\n return promise;\n}\nexports.default = asPromise;\n__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst types_1 = require(\"./types\");\nfunction createRejection(error, ...beforeErrorGroups) {\n const promise = (async () => {\n if (error instanceof types_1.RequestError) {\n try {\n for (const hooks of beforeErrorGroups) {\n if (hooks) {\n for (const hook of hooks) {\n // eslint-disable-next-line no-await-in-loop\n error = await hook(error);\n }\n }\n }\n }\n catch (error_) {\n error = error_;\n }\n }\n throw error;\n })();\n const returnPromise = () => promise;\n promise.json = returnPromise;\n promise.text = returnPromise;\n promise.buffer = returnPromise;\n promise.on = returnPromise;\n return promise;\n}\nexports.default = createRejection;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nfunction deepFreeze(object) {\n for (const value of Object.values(object)) {\n if (is_1.default.plainObject(value) || is_1.default.array(value)) {\n deepFreeze(value);\n }\n }\n return Object.freeze(object);\n}\nexports.default = deepFreeze;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultHandler = void 0;\nconst is_1 = require(\"@sindresorhus/is\");\nconst as_promise_1 = require(\"./as-promise\");\nconst create_rejection_1 = require(\"./as-promise/create-rejection\");\nconst core_1 = require(\"./core\");\nconst deep_freeze_1 = require(\"./utils/deep-freeze\");\nconst errors = {\n RequestError: as_promise_1.RequestError,\n CacheError: as_promise_1.CacheError,\n ReadError: as_promise_1.ReadError,\n HTTPError: as_promise_1.HTTPError,\n MaxRedirectsError: as_promise_1.MaxRedirectsError,\n TimeoutError: as_promise_1.TimeoutError,\n ParseError: as_promise_1.ParseError,\n CancelError: as_promise_1.CancelError,\n UnsupportedProtocolError: as_promise_1.UnsupportedProtocolError,\n UploadError: as_promise_1.UploadError\n};\n// The `delay` package weighs 10KB (!)\nconst delay = async (ms) => new Promise(resolve => {\n setTimeout(resolve, ms);\n});\nconst { normalizeArguments } = core_1.default;\nconst mergeOptions = (...sources) => {\n let mergedOptions;\n for (const source of sources) {\n mergedOptions = normalizeArguments(undefined, source, mergedOptions);\n }\n return mergedOptions;\n};\nconst getPromiseOrStream = (options) => options.isStream ? new core_1.default(undefined, options) : as_promise_1.default(options);\nconst isGotInstance = (value) => ('defaults' in value && 'options' in value.defaults);\nconst aliases = [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'head',\n 'delete'\n];\nexports.defaultHandler = (options, next) => next(options);\nconst callInitHooks = (hooks, options) => {\n if (hooks) {\n for (const hook of hooks) {\n hook(options);\n }\n }\n};\nconst create = (defaults) => {\n // Proxy properties from next handlers\n defaults._rawHandlers = defaults.handlers;\n defaults.handlers = defaults.handlers.map(fn => ((options, next) => {\n // This will be assigned by assigning result\n let root;\n const result = fn(options, newOptions => {\n root = next(newOptions);\n return root;\n });\n if (result !== root && !options.isStream && root) {\n const typedResult = result;\n const { then: promiseThen, catch: promiseCatch, finally: promiseFianlly } = typedResult;\n Object.setPrototypeOf(typedResult, Object.getPrototypeOf(root));\n Object.defineProperties(typedResult, Object.getOwnPropertyDescriptors(root));\n // These should point to the new promise\n // eslint-disable-next-line promise/prefer-await-to-then\n typedResult.then = promiseThen;\n typedResult.catch = promiseCatch;\n typedResult.finally = promiseFianlly;\n }\n return result;\n }));\n // Got interface\n const got = ((url, options = {}, _defaults) => {\n var _a, _b;\n let iteration = 0;\n const iterateHandlers = (newOptions) => {\n return defaults.handlers[iteration++](newOptions, iteration === defaults.handlers.length ? getPromiseOrStream : iterateHandlers);\n };\n // TODO: Remove this in Got 12.\n if (is_1.default.plainObject(url)) {\n const mergedOptions = {\n ...url,\n ...options\n };\n core_1.setNonEnumerableProperties([url, options], mergedOptions);\n options = mergedOptions;\n url = undefined;\n }\n try {\n // Call `init` hooks\n let initHookError;\n try {\n callInitHooks(defaults.options.hooks.init, options);\n callInitHooks((_a = options.hooks) === null || _a === void 0 ? void 0 : _a.init, options);\n }\n catch (error) {\n initHookError = error;\n }\n // Normalize options & call handlers\n const normalizedOptions = normalizeArguments(url, options, _defaults !== null && _defaults !== void 0 ? _defaults : defaults.options);\n normalizedOptions[core_1.kIsNormalizedAlready] = true;\n if (initHookError) {\n throw new as_promise_1.RequestError(initHookError.message, initHookError, normalizedOptions);\n }\n return iterateHandlers(normalizedOptions);\n }\n catch (error) {\n if (options.isStream) {\n throw error;\n }\n else {\n return create_rejection_1.default(error, defaults.options.hooks.beforeError, (_b = options.hooks) === null || _b === void 0 ? void 0 : _b.beforeError);\n }\n }\n });\n got.extend = (...instancesOrOptions) => {\n const optionsArray = [defaults.options];\n let handlers = [...defaults._rawHandlers];\n let isMutableDefaults;\n for (const value of instancesOrOptions) {\n if (isGotInstance(value)) {\n optionsArray.push(value.defaults.options);\n handlers.push(...value.defaults._rawHandlers);\n isMutableDefaults = value.defaults.mutableDefaults;\n }\n else {\n optionsArray.push(value);\n if ('handlers' in value) {\n handlers.push(...value.handlers);\n }\n isMutableDefaults = value.mutableDefaults;\n }\n }\n handlers = handlers.filter(handler => handler !== exports.defaultHandler);\n if (handlers.length === 0) {\n handlers.push(exports.defaultHandler);\n }\n return create({\n options: mergeOptions(...optionsArray),\n handlers,\n mutableDefaults: Boolean(isMutableDefaults)\n });\n };\n // Pagination\n const paginateEach = (async function* (url, options) {\n // TODO: Remove this `@ts-expect-error` when upgrading to TypeScript 4.\n // Error: Argument of type 'Merge<Options, PaginationOptions<T, R>> | undefined' is not assignable to parameter of type 'Options | undefined'.\n // @ts-expect-error\n let normalizedOptions = normalizeArguments(url, options, defaults.options);\n normalizedOptions.resolveBodyOnly = false;\n const pagination = normalizedOptions.pagination;\n if (!is_1.default.object(pagination)) {\n throw new TypeError('`options.pagination` must be implemented');\n }\n const all = [];\n let { countLimit } = pagination;\n let numberOfRequests = 0;\n while (numberOfRequests < pagination.requestLimit) {\n if (numberOfRequests !== 0) {\n // eslint-disable-next-line no-await-in-loop\n await delay(pagination.backoff);\n }\n // @ts-expect-error FIXME!\n // TODO: Throw when result is not an instance of Response\n // eslint-disable-next-line no-await-in-loop\n const result = (await got(undefined, undefined, normalizedOptions));\n // eslint-disable-next-line no-await-in-loop\n const parsed = await pagination.transform(result);\n const current = [];\n for (const item of parsed) {\n if (pagination.filter(item, all, current)) {\n if (!pagination.shouldContinue(item, all, current)) {\n return;\n }\n yield item;\n if (pagination.stackAllItems) {\n all.push(item);\n }\n current.push(item);\n if (--countLimit <= 0) {\n return;\n }\n }\n }\n const optionsToMerge = pagination.paginate(result, all, current);\n if (optionsToMerge === false) {\n return;\n }\n if (optionsToMerge === result.request.options) {\n normalizedOptions = result.request.options;\n }\n else if (optionsToMerge !== undefined) {\n normalizedOptions = normalizeArguments(undefined, optionsToMerge, normalizedOptions);\n }\n numberOfRequests++;\n }\n });\n got.paginate = paginateEach;\n got.paginate.all = (async (url, options) => {\n const results = [];\n for await (const item of paginateEach(url, options)) {\n results.push(item);\n }\n return results;\n });\n // For those who like very descriptive names\n got.paginate.each = paginateEach;\n // Stream API\n got.stream = ((url, options) => got(url, { ...options, isStream: true }));\n // Shortcuts\n for (const method of aliases) {\n got[method] = ((url, options) => got(url, { ...options, method }));\n got.stream[method] = ((url, options) => {\n return got(url, { ...options, method, isStream: true });\n });\n }\n Object.assign(got, errors);\n Object.defineProperty(got, 'defaults', {\n value: defaults.mutableDefaults ? defaults : deep_freeze_1.default(defaults),\n writable: defaults.mutableDefaults,\n configurable: defaults.mutableDefaults,\n enumerable: true\n });\n got.mergeOptions = mergeOptions;\n return got;\n};\nexports.default = create;\n__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst url_1 = require(\"url\");\nconst create_1 = require(\"./create\");\nconst defaults = {\n options: {\n method: 'GET',\n retry: {\n limit: 2,\n methods: [\n 'GET',\n 'PUT',\n 'HEAD',\n 'DELETE',\n 'OPTIONS',\n 'TRACE'\n ],\n statusCodes: [\n 408,\n 413,\n 429,\n 500,\n 502,\n 503,\n 504,\n 521,\n 522,\n 524\n ],\n errorCodes: [\n 'ETIMEDOUT',\n 'ECONNRESET',\n 'EADDRINUSE',\n 'ECONNREFUSED',\n 'EPIPE',\n 'ENOTFOUND',\n 'ENETUNREACH',\n 'EAI_AGAIN'\n ],\n maxRetryAfter: undefined,\n calculateDelay: ({ computedValue }) => computedValue\n },\n timeout: {},\n headers: {\n 'user-agent': 'got (https://github.com/sindresorhus/got)'\n },\n hooks: {\n init: [],\n beforeRequest: [],\n beforeRedirect: [],\n beforeRetry: [],\n beforeError: [],\n afterResponse: []\n },\n cache: undefined,\n dnsCache: undefined,\n decompress: true,\n throwHttpErrors: true,\n followRedirect: true,\n isStream: false,\n responseType: 'text',\n resolveBodyOnly: false,\n maxRedirects: 10,\n prefixUrl: '',\n methodRewriting: true,\n ignoreInvalidCookies: false,\n context: {},\n // TODO: Set this to `true` when Got 12 gets released\n http2: false,\n allowGetBody: false,\n https: undefined,\n pagination: {\n transform: (response) => {\n if (response.request.options.responseType === 'json') {\n return response.body;\n }\n return JSON.parse(response.body);\n },\n paginate: response => {\n if (!Reflect.has(response.headers, 'link')) {\n return false;\n }\n const items = response.headers.link.split(',');\n let next;\n for (const item of items) {\n const parsed = item.split(';');\n if (parsed[1].includes('next')) {\n next = parsed[0].trimStart().trim();\n next = next.slice(1, -1);\n break;\n }\n }\n if (next) {\n const options = {\n url: new url_1.URL(next)\n };\n return options;\n }\n return false;\n },\n filter: () => true,\n shouldContinue: () => true,\n countLimit: Infinity,\n backoff: 0,\n requestLimit: 10000,\n stackAllItems: true\n },\n parseJson: (text) => JSON.parse(text),\n stringifyJson: (object) => JSON.stringify(object),\n cacheOptions: {}\n },\n handlers: [create_1.defaultHandler],\n mutableDefaults: false\n};\nconst got = create_1.default(defaults);\nexports.default = got;\n// For CommonJS default export support\nmodule.exports = got;\nmodule.exports.default = got;\nmodule.exports.__esModule = true; // Workaround for TS issue: https://github.com/sindresorhus/got/pull/1267\n__exportStar(require(\"./create\"), exports);\n__exportStar(require(\"./as-promise\"), exports);\n","var Buffer = require('buffer').Buffer\n\nvar version = ((process || {}).version || 'v0.0.0').slice(1).split('.')[0]\n\nmodule.exports = (\n Number(version) < 6\n ? function from(source, encoding) { return new Buffer(source, encoding) }\n : function from(source, encoding) { return Buffer.from(source, encoding) }\n)\n","module.exports = function(source, encoding) {\n return source.toString(encoding)\n}\n","var Buffer = require('buffer').Buffer\n\nmodule.exports = function(buffer) {\n return Buffer.isBuffer(buffer);\n}\n","module.exports = function(source, from, to) {\n return arguments.length === 2 ?\n source.slice(from) :\n source.slice(from, to)\n}\n","var Buffer = require('buffer').Buffer\n\nmodule.exports = function(targets, hint) {\n return hint !== undefined ?\n Buffer.concat(targets, hint) :\n Buffer.concat(targets)\n}\n","module.exports = copy\n\nfunction copy(source, target, target_start, source_start, source_end) {\n return source.copy(target, target_start, source_start, source_end)\n}\n","var Buffer = require('buffer').Buffer\n\nvar version = ((process || {}).version || 'v0.0.0').slice(1).split('.')[0]\n\nmodule.exports = (\n Number(version) < 6\n ? function create(size) { return new Buffer(size) }\n : function create(size) { return Buffer.alloc(size) }\n)\n","var proto = {}\n , rex = /read.+/\n , buildFn\n\nbuildFn = function(key) {\n var code = '' +\n 'return buf.' + key + '(' + ['a', 'b', 'c'].join(',' ) + ')'\n\n return new Function(['buf', 'a', 'b', 'c'], code)\n}\n\nmodule.exports = proto\n\nfor(var key in Buffer.prototype) {\n if(rex.test(key)) {\n proto[key] = buildFn(key)\n }\n}\n","var Buffer = require('buffer').Buffer\n\nvar proto = {}\n , rex = /write.+/\n , buildFn\n\nbuildFn = function(key) {\n var code = '' +\n 'return buf.' + key + '(' + ['a', 'b', 'c'].join(',' ) + ')'\n\n return new Function(['buf', 'a', 'b', 'c'], code)\n}\n\nmodule.exports = proto\n\nfor(var key in Buffer.prototype) {\n if(rex.test(key)) {\n proto[key] = buildFn(key)\n }\n}\n","var proto = {}\nmodule.exports = proto\n\nproto.from = require('./from.js')\nproto.to = require('./to.js')\nproto.is = require('./is.js')\nproto.subarray = require('./subarray.js')\nproto.join = require('./join.js')\nproto.copy = require('./copy.js')\nproto.create = require('./create.js')\n\nmix(require('./read.js'), proto)\nmix(require('./write.js'), proto)\n\nfunction mix(from, into) {\n for(var key in from) {\n into[key] = from[key]\n }\n}\n","\"use strict\";\n\nvar bops = require('bops');\n\nexports.encode = function (value, sparse) {\n var size = sizeof(value, sparse)\n if(size == 0)\n return undefined\n var buffer = bops.create(size);\n encode(value, buffer, 0, sparse);\n return buffer;\n};\n\nexports.decode = decode;\n\nvar SH_L_32 = (1 << 16) * (1 << 16), SH_R_32 = 1 / SH_L_32;\nfunction readInt64BE(buf, offset) {\n\toffset = offset || 0;\n\treturn buf.readInt32BE(offset + 0) * SH_L_32 + buf.readUInt32BE(offset + 4);\n}\n\nfunction readUInt64BE(buf, offset) {\n\toffset = offset || 0;\n\treturn buf.readUInt32BE(offset + 0) * SH_L_32 + buf.readUInt32BE(offset + 4);\n}\n\nfunction writeInt64BE(buf, val, offset) {\n if (val < 0x8000000000000000) {\n buf.writeInt32BE(Math.floor(val * SH_R_32), offset);\n buf.writeInt32BE(val & -1, offset + 4);\n } else {\n buf.writeUInt32BE(0x7fffffff, offset);\n buf.writeUInt32BE(0xffffffff, offset + 4);\n }\n}\n\nfunction writeUInt64BE(buf, val, offset) {\n if (val < 0x10000000000000000) {\n buf.writeUInt32BE(Math.floor(val * SH_R_32), offset);\n buf.writeInt32BE(val & -1, offset + 4);\n } else {\n buf.writeUInt32BE(0xffffffff, offset);\n buf.writeUInt32BE(0xffffffff, offset + 4);\n }\n}\n\n// https://gist.github.com/frsyuki/5432559 - v5 spec\n//\n// I've used one extension point from `fixext 1` to store `undefined`. On the wire this\n// should translate to exactly 0xd40000 \n//\n// +--------+--------+--------+\n// | 0xd4 | 0x00 | 0x00 |\n// +--------+--------+--------+\n// ^ fixext | ^ value part unused (fixed to be 0)\n// ^ indicates undefined value\n//\n\nfunction Decoder(buffer, offset) {\n this.offset = offset || 0;\n this.buffer = buffer;\n this.bufferLength = buffer.length\n}\nDecoder.prototype.map = function (length) {\n /* minimal map: every key and value is one byte */\n if((length * 2) > this.bufferLength) {\n throw new Error(`malformed messagepack detected: buffer size was ${this.bufferLength}, but referenced a map of length ${length})`);\n }\n var value = {};\n for (var i = 0; i < length; i++) {\n var key = this.parse();\n value[key] = this.parse();\n }\n return value;\n};\nDecoder.prototype.bin = Decoder.prototype.buf = function (length) {\n if(length > this.bufferLength) {\n throw new Error(`malformed messagepack detected: buffer size was ${this.bufferLength}, but referenced a binary of length ${length})`);\n }\n var value = bops.subarray(this.buffer, this.offset, this.offset + length);\n this.offset += length;\n return value;\n};\nDecoder.prototype.str = function (length) {\n if(length > this.bufferLength) {\n throw new Error(`malformed messagepack detected: buffer size was ${this.bufferLength}, but referenced a string of length ${length})`);\n }\n var value = bops.to(bops.subarray(this.buffer, this.offset, this.offset + length));\n this.offset += length;\n return value;\n};\nDecoder.prototype.array = function (length) {\n if(length > this.bufferLength) {\n throw new Error(`malformed messagepack detected: buffer size was ${this.bufferLength}, but referenced an array of length ${length})`);\n }\n var value = new Array(length);\n for (var i = 0; i < length; i++) {\n value[i] = this.parse();\n }\n return value;\n};\nDecoder.prototype.parse = function () {\n var type = this.buffer[this.offset];\n var value, length, extType;\n\n if (type === undefined) {\n throw new Error('malformed messagepack (referenced offset is outside buffer)');\n }\n\n // Positive FixInt\n if ((type & 0x80) === 0x00) {\n this.offset++;\n return type;\n }\n // FixMap\n if ((type & 0xf0) === 0x80) {\n length = type & 0x0f;\n this.offset++;\n return this.map(length);\n }\n // FixArray\n if ((type & 0xf0) === 0x90) {\n length = type & 0x0f;\n this.offset++;\n return this.array(length);\n }\n // FixStr\n if ((type & 0xe0) === 0xa0) {\n length = type & 0x1f;\n this.offset++;\n return this.str(length);\n }\n // Negative FixInt\n if ((type & 0xe0) === 0xe0) {\n value = bops.readInt8(this.buffer, this.offset);\n this.offset++;\n return value;\n }\n switch (type) {\n // nil\n case 0xc0:\n this.offset++;\n return null;\n // 0xc1: (never used)\n // false\n case 0xc2:\n this.offset++;\n return false;\n // true\n case 0xc3:\n this.offset++;\n return true;\n // bin 8\n case 0xc4:\n length = bops.readUInt8(this.buffer, this.offset + 1);\n this.offset += 2;\n return this.bin(length);\n // bin 16\n case 0xc5:\n length = bops.readUInt16BE(this.buffer, this.offset + 1);\n this.offset += 3;\n return this.bin(length);\n // bin 32\n case 0xc6:\n length = bops.readUInt32BE(this.buffer, this.offset + 1);\n this.offset += 5;\n return this.bin(length);\n // ext 8\n case 0xc7:\n length = bops.readUInt8(this.buffer, this.offset + 1);\n extType = bops.readUInt8(this.buffer, this.offset + 2);\n this.offset += 3;\n return [extType, this.bin(length)];\n // ext 16\n case 0xc8:\n length = bops.readUInt16BE(this.buffer, this.offset + 1);\n extType = bops.readUInt8(this.buffer, this.offset + 3);\n this.offset += 4;\n return [extType, this.bin(length)];\n // ext 32\n case 0xc9:\n length = bops.readUInt32BE(this.buffer, this.offset + 1);\n extType = bops.readUInt8(this.buffer, this.offset + 5);\n this.offset += 6;\n return [extType, this.bin(length)];\n // float 32\n case 0xca:\n value = bops.readFloatBE(this.buffer, this.offset + 1);\n this.offset += 5;\n return value;\n // float 64 / double\n case 0xcb:\n value = bops.readDoubleBE(this.buffer, this.offset + 1);\n this.offset += 9;\n return value;\n // uint8\n case 0xcc:\n value = this.buffer[this.offset + 1];\n this.offset += 2;\n return value;\n // uint 16\n case 0xcd:\n value = bops.readUInt16BE(this.buffer, this.offset + 1);\n this.offset += 3;\n return value;\n // uint 32\n case 0xce:\n value = bops.readUInt32BE(this.buffer, this.offset + 1);\n this.offset += 5;\n return value;\n // uint64\n case 0xcf:\n value = readUInt64BE(this.buffer, this.offset + 1);\n this.offset += 9;\n return value;\n // int 8\n case 0xd0:\n value = bops.readInt8(this.buffer, this.offset + 1);\n this.offset += 2;\n return value;\n // int 16\n case 0xd1:\n value = bops.readInt16BE(this.buffer, this.offset + 1);\n this.offset += 3;\n return value;\n // int 32\n case 0xd2:\n value = bops.readInt32BE(this.buffer, this.offset + 1);\n this.offset += 5;\n return value;\n // int 64\n case 0xd3:\n value = readInt64BE(this.buffer, this.offset + 1);\n this.offset += 9;\n return value;\n\n // fixext 1 / undefined\n case 0xd4:\n extType = bops.readUInt8(this.buffer, this.offset + 1);\n value = bops.readUInt8(this.buffer, this.offset + 2);\n this.offset += 3;\n return (extType === 0 && value === 0) ? undefined : [extType, value];\n // fixext 2\n case 0xd5:\n extType = bops.readUInt8(this.buffer, this.offset + 1);\n this.offset += 2;\n return [extType, this.bin(2)];\n // fixext 4\n case 0xd6:\n extType = bops.readUInt8(this.buffer, this.offset + 1);\n this.offset += 2;\n return [extType, this.bin(4)];\n // fixext 8\n case 0xd7:\n extType = bops.readUInt8(this.buffer, this.offset + 1);\n this.offset += 2;\n return [extType, this.bin(8)];\n // fixext 16\n case 0xd8:\n extType = bops.readUInt8(this.buffer, this.offset + 1);\n this.offset += 2;\n return [extType, this.bin(16)];\n // str 8\n case 0xd9:\n length = bops.readUInt8(this.buffer, this.offset + 1);\n this.offset += 2;\n return this.str(length);\n // str 16\n case 0xda:\n length = bops.readUInt16BE(this.buffer, this.offset + 1);\n this.offset += 3;\n return this.str(length);\n // str 32\n case 0xdb:\n length = bops.readUInt32BE(this.buffer, this.offset + 1);\n this.offset += 5;\n return this.str(length);\n // array 16\n case 0xdc:\n length = bops.readUInt16BE(this.buffer, this.offset + 1);\n this.offset += 3;\n return this.array(length);\n // array 32\n case 0xdd:\n length = bops.readUInt32BE(this.buffer, this.offset + 1);\n this.offset += 5;\n return this.array(length);\n // map 16:\n case 0xde:\n length = bops.readUInt16BE(this.buffer, this.offset + 1);\n this.offset += 3;\n return this.map(length);\n // map 32\n case 0xdf:\n length = bops.readUInt32BE(this.buffer, this.offset + 1);\n this.offset += 5;\n return this.map(length);\n }\n\n throw new Error(\"Unknown type 0x\" + type.toString(16));\n};\nfunction decode(buffer) {\n var decoder = new Decoder(buffer);\n var value = decoder.parse();\n if (decoder.offset !== buffer.length) throw new Error((buffer.length - decoder.offset) + \" trailing bytes\");\n return value;\n}\n\nfunction encodeableKeys (value, sparse) {\n return Object.keys(value).filter(function (e) {\n var val = value[e], type = typeof(val);\n return (!sparse || (val !== undefined && val !== null)) && ('function' !== type || !!val.toJSON);\n })\n}\n\nfunction encode(value, buffer, offset, sparse, isMapElement) {\n var type = typeof value;\n var length, size;\n\n // Strings Bytes\n if (type === \"string\") {\n value = bops.from(value);\n length = value.length;\n // fixstr\n if (length < 0x20) {\n buffer[offset] = length | 0xa0;\n bops.copy(value, buffer, offset + 1);\n return 1 + length;\n }\n // str 8\n if (length < 0x100) {\n buffer[offset] = 0xd9;\n bops.writeUInt8(buffer, length, offset + 1);\n bops.copy(value, buffer, offset + 2);\n return 2 + length;\n }\n // str 16\n if (length < 0x10000) {\n buffer[offset] = 0xda;\n bops.writeUInt16BE(buffer, length, offset + 1);\n bops.copy(value, buffer, offset + 3);\n return 3 + length;\n }\n // str 32\n if (length < 0x100000000) {\n buffer[offset] = 0xdb;\n bops.writeUInt32BE(buffer, length, offset + 1);\n bops.copy(value, buffer, offset + 5);\n return 5 + length;\n }\n }\n\n if (bops.is(value)) {\n length = value.length;\n // bin 8\n if (length < 0x100) {\n buffer[offset] = 0xc4;\n bops.writeUInt8(buffer, length, offset + 1);\n bops.copy(value, buffer, offset + 2);\n return 2 + length;\n }\n // bin 16\n if (length < 0x10000) {\n buffer[offset] = 0xc5;\n bops.writeUInt16BE(buffer, length, offset + 1);\n bops.copy(value, buffer, offset + 3);\n return 3 + length;\n }\n // bin 32\n if (length < 0x100000000) {\n buffer[offset] = 0xc6;\n bops.writeUInt32BE(buffer, length, offset + 1);\n bops.copy(value, buffer, offset + 5);\n return 5 + length;\n }\n }\n\n if (type === \"number\") {\n // Floating Point\n if (Math.floor(value) !== value) {\n buffer[offset] = 0xcb;\n bops.writeDoubleBE(buffer, value, offset + 1);\n return 9;\n }\n\n // Integers\n if (value >=0) {\n // positive fixnum\n if (value < 0x80) {\n buffer[offset] = value;\n return 1;\n }\n // uint 8\n if (value < 0x100) {\n buffer[offset] = 0xcc;\n buffer[offset + 1] = value;\n return 2;\n }\n // uint 16\n if (value < 0x10000) {\n buffer[offset] = 0xcd;\n bops.writeUInt16BE(buffer, value, offset + 1);\n return 3;\n }\n // uint 32\n if (value < 0x100000000) {\n buffer[offset] = 0xce;\n bops.writeUInt32BE(buffer, value, offset + 1);\n return 5;\n }\n // uint 64\n if (value < 0x10000000000000000) {\n buffer[offset] = 0xcf;\n writeUInt64BE(buffer, value, offset + 1);\n return 9;\n }\n throw new Error(\"Number too big 0x\" + value.toString(16));\n }\n // negative fixnum\n if (value >= -0x20) {\n bops.writeInt8(buffer, value, offset);\n return 1;\n }\n // int 8\n if (value >= -0x80) {\n buffer[offset] = 0xd0;\n bops.writeInt8(buffer, value, offset + 1);\n return 2;\n }\n // int 16\n if (value >= -0x8000) {\n buffer[offset] = 0xd1;\n bops.writeInt16BE(buffer, value, offset + 1);\n return 3;\n }\n // int 32\n if (value >= -0x80000000) {\n buffer[offset] = 0xd2;\n bops.writeInt32BE(buffer, value, offset + 1);\n return 5;\n }\n // int 64\n if (value >= -0x8000000000000000) {\n buffer[offset] = 0xd3;\n writeInt64BE(buffer, value, offset + 1);\n return 9;\n }\n throw new Error(\"Number too small -0x\" + value.toString(16).substr(1));\n }\n\n if (type === \"undefined\") {\n if(sparse && isMapElement) return 0;\n buffer[offset] = 0xd4;\n buffer[offset + 1] = 0x00; // fixext special type/value\n buffer[offset + 2] = 0x00;\n return 3;\n }\n\n // null\n if (value === null) {\n if(sparse && isMapElement) return 0;\n buffer[offset] = 0xc0;\n return 1;\n }\n\n // Boolean\n if (type === \"boolean\") {\n buffer[offset] = value ? 0xc3 : 0xc2;\n return 1;\n }\n\n if('function' === typeof value.toJSON)\n return encode(value.toJSON(), buffer, offset, sparse)\n\n // Container Types\n if (type === \"object\") {\n\n size = 0;\n var isArray = Array.isArray(value);\n\n if (isArray) {\n length = value.length;\n }\n else {\n var keys = encodeableKeys(value, sparse)\n length = keys.length;\n }\n\n // fixarray\n if (length < 0x10) {\n buffer[offset] = length | (isArray ? 0x90 : 0x80);\n size = 1;\n }\n // array 16 / map 16\n else if (length < 0x10000) {\n buffer[offset] = isArray ? 0xdc : 0xde;\n bops.writeUInt16BE(buffer, length, offset + 1);\n size = 3;\n }\n // array 32 / map 32\n else if (length < 0x100000000) {\n buffer[offset] = isArray ? 0xdd : 0xdf;\n bops.writeUInt32BE(buffer, length, offset + 1);\n size = 5;\n }\n\n if (isArray) {\n for (var i = 0; i < length; i++) {\n size += encode(value[i], buffer, offset + size, sparse);\n }\n }\n else {\n for (var i = 0; i < length; i++) {\n var key = keys[i];\n size += encode(key, buffer, offset + size);\n size += encode(value[key], buffer, offset + size, sparse, true);\n }\n }\n\n return size;\n }\n if(type === \"function\")\n return undefined\n throw new Error(\"Unknown type \" + type);\n}\n\nfunction sizeof(value, sparse, isMapElement) {\n var type = typeof value;\n var length, size;\n\n // Raw Bytes\n if (type === \"string\") {\n // TODO: this creates a throw-away buffer which is probably expensive on browsers.\n length = bops.from(value).length;\n if (length < 0x20) {\n return 1 + length;\n }\n if (length < 0x100) {\n return 2 + length;\n }\n if (length < 0x10000) {\n return 3 + length;\n }\n if (length < 0x100000000) {\n return 5 + length;\n }\n }\n\n if (bops.is(value)) {\n length = value.length;\n if (length < 0x100) {\n return 2 + length;\n }\n if (length < 0x10000) {\n return 3 + length;\n }\n if (length < 0x100000000) {\n return 5 + length;\n }\n }\n\n if (type === \"number\") {\n // Floating Point\n // double\n if (Math.floor(value) !== value) return 9;\n\n // Integers\n if (value >=0) {\n // positive fixnum\n if (value < 0x80) return 1;\n // uint 8\n if (value < 0x100) return 2;\n // uint 16\n if (value < 0x10000) return 3;\n // uint 32\n if (value < 0x100000000) return 5;\n // uint 64\n if (value < 0x10000000000000000) return 9;\n throw new Error(\"Number too big 0x\" + value.toString(16));\n }\n // negative fixnum\n if (value >= -0x20) return 1;\n // int 8\n if (value >= -0x80) return 2;\n // int 16\n if (value >= -0x8000) return 3;\n // int 32\n if (value >= -0x80000000) return 5;\n // int 64\n if (value >= -0x8000000000000000) return 9;\n throw new Error(\"Number too small -0x\" + value.toString(16).substr(1));\n }\n\n // Boolean\n if (type === \"boolean\") return 1;\n\n // undefined, null\n if (value === null) return (sparse && isMapElement) ? 0 : 1;\n if (value === undefined) return (sparse && isMapElement) ? 0 : 3;\n\n if('function' === typeof value.toJSON)\n return sizeof(value.toJSON(), sparse)\n\n // Container Types\n if (type === \"object\") {\n\n size = 0;\n if (Array.isArray(value)) {\n length = value.length;\n for (var i = 0; i < length; i++) {\n size += sizeof(value[i], sparse);\n }\n }\n else {\n var keys = encodeableKeys(value, sparse)\n length = keys.length;\n for (var i = 0; i < length; i++) {\n var key = keys[i];\n size += sizeof(key) + sizeof(value[key], sparse, true);\n }\n }\n if (length < 0x10) {\n return 1 + size;\n }\n if (length < 0x10000) {\n return 3 + size;\n }\n if (length < 0x100000000) {\n return 5 + size;\n }\n throw new Error(\"Array or object too long 0x\" + length.toString(16));\n }\n if(type === \"function\")\n return 0\n throw new Error(\"Unknown type \" + type);\n}\n\n\n","import { IPlatformConfig } from './types/IPlatformConfig';\nimport { IPlatformHttpStatic } from './types/http';\nimport IDefaults from './types/IDefaults';\nimport IWebStorage from './types/IWebStorage';\nimport IBufferUtils from './types/IBufferUtils';\nimport * as WebBufferUtils from '../platform/web/lib/util/bufferutils';\nimport * as NodeBufferUtils from '../platform/nodejs/lib/util/bufferutils';\nimport { IUntypedCryptoStatic } from '../common/types/ICryptoStatic';\nimport TransportName from './constants/TransportName';\nimport { TransportCtor } from './lib/transport/transport';\n\nexport type Bufferlike = WebBufferUtils.Bufferlike | NodeBufferUtils.Bufferlike;\ntype BufferUtilsOutput = WebBufferUtils.Output | NodeBufferUtils.Output;\ntype ToBufferOutput = WebBufferUtils.ToBufferOutput | NodeBufferUtils.ToBufferOutput;\n\nexport type TransportImplementations = Partial<Record<TransportName, TransportCtor>>;\n\nexport default class Platform {\n static Config: IPlatformConfig;\n /*\n What we actually _want_ is for Platform to be a generic class\n parameterised by Bufferlike etc, but that requires far-reaching changes to\n components that make use of Platform. So instead we have to advertise a\n BufferUtils object that accepts a broader range of data types than it\n can in reality handle.\n */\n static BufferUtils: IBufferUtils<Bufferlike, BufferUtilsOutput, ToBufferOutput>;\n /*\n We’d like this to be ICryptoStatic with the correct generic arguments,\n but Platform doesn’t currently allow that, as described in the BufferUtils\n comment above.\n */\n static Crypto: IUntypedCryptoStatic | null;\n static Http: IPlatformHttpStatic;\n static Transports: {\n order: TransportName[];\n // Transport implementations that always come with this platform\n bundledImplementations: TransportImplementations;\n };\n static Defaults: IDefaults;\n static WebStorage: IWebStorage | null;\n}\n","import Platform from 'common/platform';\n\nexport type LoggerOptions = {\n handler: LoggerFunction;\n level: LogLevels;\n};\ntype LoggerFunction = (...args: string[]) => void;\n\n// Workaround for salesforce lightning locker compatibility\n// This is a shorthand version of Utils.getGlobalObject (which we can't use here without creating a circular import)\nlet globalObject = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : self;\n\nenum LogLevels {\n None = 0,\n Error = 1,\n Major = 2,\n Minor = 3,\n Micro = 4,\n}\n\nfunction pad(timeSegment: number, three?: number) {\n return `${timeSegment}`.padStart(three ? 3 : 2, '0');\n}\n\nfunction getHandler(logger: Function): Function {\n return Platform.Config.logTimestamps\n ? function (msg: unknown) {\n const time = new Date();\n logger(\n pad(time.getHours()) +\n ':' +\n pad(time.getMinutes()) +\n ':' +\n pad(time.getSeconds()) +\n '.' +\n pad(time.getMilliseconds(), 1) +\n ' ' +\n msg,\n );\n }\n : function (msg: string) {\n logger(msg);\n };\n}\n\nconst getDefaultLoggers = (): [Function, Function] => {\n let consoleLogger;\n let errorLogger;\n\n // we expect ably-js to be run in environments which have `console` object available with its `log` function\n if (typeof globalObject?.console?.log === 'function') {\n consoleLogger = function (...args: unknown[]) {\n console.log.apply(console, args);\n };\n\n errorLogger = console.warn\n ? function (...args: unknown[]) {\n console.warn.apply(console, args);\n }\n : consoleLogger;\n } else {\n // otherwise we should fallback to noop for log functions\n consoleLogger = errorLogger = function () {};\n }\n\n return [consoleLogger, errorLogger].map(getHandler) as [Function, Function];\n};\n\nclass Logger {\n private static defaultLogLevel: LogLevels = LogLevels.Error;\n private static defaultLogHandler: Function;\n private static defaultLogErrorHandler: Function;\n\n private logLevel: LogLevels;\n private logHandler: Function;\n private logErrorHandler: Function;\n\n // public constants\n static readonly LOG_NONE: LogLevels = LogLevels.None;\n static readonly LOG_ERROR: LogLevels = LogLevels.Error;\n static readonly LOG_MAJOR: LogLevels = LogLevels.Major;\n static readonly LOG_MINOR: LogLevels = LogLevels.Minor;\n static readonly LOG_MICRO: LogLevels = LogLevels.Micro;\n\n /**\n * This logger instance should only be used when there is no more appropriate logger to use, for example when implementing a public static method or function whose API doesn’t accept any logging configuration.\n */\n static defaultLogger: Logger;\n\n static initLogHandlers() {\n const [logHandler, logErrorHandler] = getDefaultLoggers();\n this.defaultLogHandler = logHandler;\n this.defaultLogErrorHandler = logErrorHandler;\n this.defaultLogger = new Logger();\n }\n\n constructor() {\n this.logLevel = Logger.defaultLogLevel;\n this.logHandler = Logger.defaultLogHandler;\n this.logErrorHandler = Logger.defaultLogErrorHandler;\n }\n\n /* public static functions */\n /**\n * In the modular variant of the SDK, the `stripLogs` esbuild plugin strips out all calls to this method (when invoked as `Logger.logAction(...)`) except when called with level `Logger.LOG_ERROR`. If you wish for a log statement to never be stripped, use the {@link logActionNoStrip} method instead.\n *\n * The aforementioned plugin expects `level` to be an expression of the form `Logger.LOG_*`; that is, you can’t dynamically specify the log level.\n */\n static logAction = (logger: Logger, level: LogLevels, action: string, message?: string) => {\n this.logActionNoStrip(logger, level, action, message);\n };\n\n /**\n * Calls to this method are never stripped by the `stripLogs` esbuild plugin. Use it for log statements that you wish to always be included in the modular variant of the SDK.\n */\n static logActionNoStrip(logger: Logger, level: LogLevels, action: string, message?: string) {\n logger.logAction(level, action, message);\n }\n\n private logAction(level: LogLevels, action: string, message?: string) {\n if (this.shouldLog(level)) {\n (level === LogLevels.Error ? this.logErrorHandler : this.logHandler)('Ably: ' + action + ': ' + message, level);\n }\n }\n\n deprecated = (description: string, msg: string) => {\n this.deprecationWarning(`${description} is deprecated and will be removed in a future version. ${msg}`);\n };\n\n renamedClientOption(oldName: string, newName: string) {\n this.deprecationWarning(\n `The \\`${oldName}\\` client option has been renamed to \\`${newName}\\`. Please update your code to use \\`${newName}\\` instead. \\`${oldName}\\` will be removed in a future version.`,\n );\n }\n\n renamedMethod(className: string, oldName: string, newName: string) {\n this.deprecationWarning(\n `\\`${className}\\`’s \\`${oldName}\\` method has been renamed to \\`${newName}\\`. Please update your code to use \\`${newName}\\` instead. \\`${oldName}\\` will be removed in a future version.`,\n );\n }\n\n deprecationWarning(message: string) {\n if (this.shouldLog(LogLevels.Error)) {\n this.logErrorHandler(`Ably: Deprecation warning - ${message}`, LogLevels.Error);\n }\n }\n\n /* Where a logging operation is expensive, such as serialisation of data, use shouldLog will prevent\n\t the object being serialised if the log level will not output the message */\n shouldLog = (level: LogLevels) => {\n return level <= this.logLevel;\n };\n\n setLog = (level: LogLevels | undefined, handler: Function | undefined) => {\n if (level !== undefined) this.logLevel = level;\n if (handler !== undefined) this.logHandler = this.logErrorHandler = handler;\n };\n}\n\nexport default Logger;\n","import Platform, { Bufferlike } from 'common/platform';\nimport ErrorInfo, { PartialErrorInfo } from 'common/lib/types/errorinfo';\nimport { ModularPlugins } from '../client/modularplugins';\nimport { MsgPack } from 'common/types/msgpack';\n\nfunction randomPosn(arrOrStr: Array<unknown> | string) {\n return Math.floor(Math.random() * arrOrStr.length);\n}\n\n/**\n * Add a set of properties to a target object\n *\n * @param target the target object\n * @param args objects, which enumerable properties are added to target, by reference only\n * @returns target object with added properties\n */\nexport function mixin(\n target: Record<string, unknown>,\n ...args: Array<object | undefined | null>\n): Record<string, unknown> {\n for (let i = 0; i < args.length; i++) {\n const source = args[i];\n if (!source) {\n break;\n }\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = (source as Record<string, unknown>)[key];\n }\n }\n }\n return target;\n}\n\n/**\n * Creates a copy of enumerable properties of the source object\n *\n * @param src object to copy\n * @returns copy of src\n */\nexport function copy<T = Record<string, unknown>>(src: T | Record<string, unknown> | null | undefined): T {\n return mixin({}, src as Record<string, unknown>) as T;\n}\n\n/*\n * Ensures that an Array object is always returned\n * returning the original Array of obj is an Array\n * else wrapping the obj in a single element Array\n */\nexport function ensureArray(obj: Record<string, unknown>): unknown[] {\n if (isNil(obj)) {\n return [];\n }\n if (Array.isArray(obj)) {\n return obj;\n }\n return [obj];\n}\n\nexport function isObject(ob: unknown): ob is Record<string, unknown> {\n return Object.prototype.toString.call(ob) == '[object Object]';\n}\n\n/*\n * Determine whether or not an object contains\n * any enumerable properties.\n * ob: the object\n */\nexport function isEmpty(ob: Record<string, unknown> | unknown[]): boolean {\n for (const prop in ob) return false;\n return true;\n}\n\n/**\n * Checks if `value` is `null` or `undefined`.\n *\n * Source: https://github.com/lodash/lodash/blob/main/src/isNil.ts\n */\nexport function isNil(arg: unknown): arg is null | undefined {\n return arg == null;\n}\n\n/*\n * Perform a simple shallow clone of an object.\n * Result is an object irrespective of whether\n * the input is an object or array. All\n * enumerable properties are copied.\n * ob: the object\n */\nexport function shallowClone(ob: Record<string, unknown>): Record<string, unknown> {\n const result = new Object() as Record<string, unknown>;\n for (const prop in ob) result[prop] = ob[prop];\n return result;\n}\n\n/*\n * Clone an object by creating a new object with the\n * given object as its prototype. Optionally\n * a set of additional own properties can be\n * supplied to be added to the newly created clone.\n * ob: the object to be cloned\n * ownProperties: optional object with additional\n * properties to add\n */\nexport function prototypicalClone(\n ob: Record<string, unknown>,\n ownProperties: Record<string, unknown>,\n): Record<string, unknown> {\n class F {}\n F.prototype = ob;\n const result = new F() as Record<string, unknown>;\n if (ownProperties) mixin(result, ownProperties);\n return result;\n}\n\n/*\n * Declare a constructor to represent a subclass\n * of another constructor\n * If platform has a built-in version we use that from Platform, else we\n * define here (so can make use of other Utils fns)\n * See node.js util.inherits\n */\nexport const inherits = function (ctor: any, superCtor: Function) {\n if (Platform.Config.inherits) {\n Platform.Config.inherits(ctor, superCtor);\n return;\n }\n ctor.super_ = superCtor;\n ctor.prototype = prototypicalClone(superCtor.prototype, { constructor: ctor });\n};\n\n/*\n * Determine whether or not an object has an enumerable\n * property whose value equals a given value.\n * ob: the object\n * val: the value to find\n */\nexport function containsValue(ob: Record<string, unknown>, val: unknown): boolean {\n for (const i in ob) {\n if (ob[i] == val) return true;\n }\n return false;\n}\n\nexport function intersect<K extends string, T>(arr: Array<K>, ob: K[] | Partial<Record<K, T>>): K[] {\n return Array.isArray(ob) ? arrIntersect(arr, ob) : arrIntersectOb(arr, ob);\n}\n\nexport function arrIntersect<T>(arr1: Array<T>, arr2: Array<T>): Array<T> {\n const result = [];\n for (let i = 0; i < arr1.length; i++) {\n const member = arr1[i];\n if (arr2.indexOf(member) != -1) result.push(member);\n }\n return result;\n}\n\nexport function arrIntersectOb<K extends string>(arr: Array<K>, ob: Partial<Record<K, unknown>>): K[] {\n const result = [];\n for (let i = 0; i < arr.length; i++) {\n const member = arr[i];\n if (member in ob) result.push(member);\n }\n return result;\n}\n\nexport function arrDeleteValue<T>(arr: Array<T>, val: T): boolean {\n const idx = arr.indexOf(val);\n const res = idx != -1;\n if (res) arr.splice(idx, 1);\n return res;\n}\n\nexport function arrWithoutValue<T>(arr: Array<T>, val: T): Array<T> {\n const newArr = arr.slice();\n arrDeleteValue(newArr, val);\n return newArr;\n}\n\n/*\n * Construct an array of the keys of the enumerable\n * properties of a given object, optionally limited\n * to only the own properties.\n * ob: the object\n * ownOnly: boolean, get own properties only\n */\nexport function keysArray(ob: Record<string, unknown>, ownOnly?: boolean): Array<string> {\n const result = [];\n for (const prop in ob) {\n if (ownOnly && !Object.prototype.hasOwnProperty.call(ob, prop)) continue;\n result.push(prop);\n }\n return result;\n}\n\n/*\n * Construct an array of the values of the enumerable\n * properties of a given object, optionally limited\n * to only the own properties.\n * ob: the object\n * ownOnly: boolean, get own properties only\n */\nexport function valuesArray<T>(ob: Record<string, T>, ownOnly?: boolean): T[] {\n const result = [];\n for (const prop in ob) {\n if (ownOnly && !Object.prototype.hasOwnProperty.call(ob, prop)) continue;\n result.push(ob[prop]);\n }\n return result;\n}\n\nexport function forInOwnNonNullProperties(ob: Record<string, unknown>, fn: (prop: string) => void): void {\n for (const prop in ob) {\n if (Object.prototype.hasOwnProperty.call(ob, prop) && ob[prop]) {\n fn(prop);\n }\n }\n}\n\nexport function allSame(arr: Array<Record<string, unknown>>, prop: string): boolean {\n if (arr.length === 0) {\n return true;\n }\n const first = arr[0][prop];\n return arr.every(function (item) {\n return item[prop] === first;\n });\n}\n\nexport enum Format {\n msgpack = 'msgpack',\n json = 'json',\n}\n\nexport function arrPopRandomElement<T>(arr: Array<T>): T {\n return arr.splice(randomPosn(arr), 1)[0];\n}\n\nexport function toQueryString(params?: Record<string, string> | null): string {\n const parts = [];\n if (params) {\n for (const key in params) parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));\n }\n return parts.length ? '?' + parts.join('&') : '';\n}\n\nexport function stringifyValues(params: Record<string, any>): Record<string, string> {\n return Object.fromEntries(Object.entries(params).map(([k, v]) => [k, String(v)]));\n}\n\nexport function parseQueryString(query: string): Record<string, string> {\n let match;\n const search = /([^?&=]+)=?([^&]*)/g;\n const result: Record<string, string> = {};\n\n while ((match = search.exec(query))) result[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);\n\n return result;\n}\n\nexport function isErrorInfoOrPartialErrorInfo(err: unknown): err is ErrorInfo | PartialErrorInfo {\n return typeof err == 'object' && err !== null && (err instanceof ErrorInfo || err instanceof PartialErrorInfo);\n}\n\nexport function inspectError(err: unknown): string {\n if (\n err instanceof Error ||\n (err as ErrorInfo)?.constructor?.name === 'ErrorInfo' ||\n (err as PartialErrorInfo)?.constructor?.name === 'PartialErrorInfo'\n )\n return (err as Error).toString();\n return Platform.Config.inspect(err);\n}\n\nexport function inspectBody(body: unknown): string {\n if (Platform.BufferUtils.isBuffer(body)) {\n return (body as any).toString();\n } else if (typeof body === 'string') {\n return body;\n } else {\n return Platform.Config.inspect(body);\n }\n}\n\n/**\n * Data is assumed to be either a string, a number, a boolean or a buffer.\n *\n * Returns the byte size of the provided data based on the spec:\n * - TM6a - size of the string is byte length of the string\n * - TM6c - size of the buffer is its size in bytes\n * - OD3d - size of a number is 8 bytes\n * - OD3b - size of a boolean is 1 byte\n */\nexport function dataSizeBytes(data: string | number | boolean | Bufferlike): number {\n if (Platform.BufferUtils.isBuffer(data)) {\n return Platform.BufferUtils.byteLength(data);\n }\n if (typeof data === 'string') {\n return Platform.Config.stringByteSize(data);\n }\n if (typeof data === 'number') {\n return 8;\n }\n if (typeof data === 'boolean') {\n return 1;\n }\n throw new Error(\n `Expected input of Utils.dataSizeBytes to be a string, a number, a boolean or a buffer, but was: ${typeof data}`,\n );\n}\n\nexport function cheapRandStr(): string {\n return String(Math.random()).substr(2);\n}\n\n/* Takes param the minimum number of bytes of entropy the string must\n * include, not the length of the string. String length produced is not\n * guaranteed. */\nexport const randomString = async (numBytes: number): Promise<string> => {\n const buffer = await Platform.Config.getRandomArrayBuffer(numBytes);\n return Platform.BufferUtils.base64Encode(buffer);\n};\n\n/* Pick n elements at random without replacement from an array */\nexport function arrChooseN<T>(arr: Array<T>, n: number): Array<T> {\n const numItems = Math.min(n, arr.length),\n mutableArr = arr.slice(),\n result: Array<T> = [];\n for (let i = 0; i < numItems; i++) {\n result.push(arrPopRandomElement(mutableArr));\n }\n return result;\n}\n\n/**\n * Uses a callback to communicate the result of a `Promise`. The first argument passed to the callback will be either an error (when the promise is rejected) or `null` (when the promise is fulfilled). In the case where the promise is fulfilled, the resulting value will be passed to the callback as a second argument.\n */\nexport function whenPromiseSettles<T, E = unknown>(\n promise: Promise<T>,\n callback?: (err: E | null, result?: T) => void,\n) {\n promise\n .then((result) => {\n callback?.(null, result);\n })\n .catch((err: unknown) => {\n // We make no guarantees about the type of the error that gets passed to the callback. Issue https://github.com/ably/ably-js/issues/1617 will think about how to correctly handle error types.\n callback?.(err as E);\n });\n}\n\nexport function decodeBody<T>(body: unknown, MsgPack: MsgPack | null, format?: Format | null): T {\n if (format == 'msgpack') {\n if (!MsgPack) {\n throwMissingPluginError('MsgPack');\n }\n return MsgPack.decode(body as Buffer);\n }\n\n return JSON.parse(String(body));\n}\n\nexport function encodeBody(body: unknown, MsgPack: MsgPack | null, format?: Format): string | Buffer {\n if (format == 'msgpack') {\n if (!MsgPack) {\n throwMissingPluginError('MsgPack');\n }\n return MsgPack.encode(body, true) as Buffer;\n }\n\n return JSON.stringify(body);\n}\n\nexport function allToLowerCase(arr: Array<string>): Array<string> {\n return arr.map(function (element) {\n return element && element.toLowerCase();\n });\n}\n\nexport function allToUpperCase(arr: Array<string>): Array<string> {\n return arr.map(function (element) {\n return element && element.toUpperCase();\n });\n}\n\nexport function getBackoffCoefficient(count: number) {\n return Math.min((count + 2) / 3, 2);\n}\n\nexport function getJitterCoefficient() {\n return 1 - Math.random() * 0.2;\n}\n\n/**\n *\n * @param initialTimeout initial timeout value\n * @param retryAttempt integer indicating retryAttempt\n * @returns RetryTimeout value for given timeout and retryAttempt.\n * If x is the value generated then,\n * Upper bound = min((retryAttempt + 2) / 3, 2) * initialTimeout,\n * Lower bound = 0.8 * Upper bound,\n * Lower bound < x < Upper bound\n */\nexport function getRetryTime(initialTimeout: number, retryAttempt: number) {\n return initialTimeout * getBackoffCoefficient(retryAttempt) * getJitterCoefficient();\n}\n\nexport function getGlobalObject() {\n if (typeof global !== 'undefined') {\n return global;\n }\n\n if (typeof window !== 'undefined') {\n return window;\n }\n\n return self;\n}\n\nexport function shallowEquals(source: Record<string, unknown>, target: Record<string, unknown>) {\n return (\n Object.keys(source).every((key) => source[key] === target[key]) &&\n Object.keys(target).every((key) => target[key] === source[key])\n );\n}\n\nexport function matchDerivedChannel(name: string) {\n /**\n * This regex check is to retain existing channel params if any e.g [?rewind=1]foo to\n * [filter=xyz?rewind=1]foo. This is to keep channel compatibility around use of\n * channel params that work with derived channels.\n *\n * This eslint unsafe regex warning is triggered because the RegExp uses nested quantifiers,\n * but it does not create any situation where the regex engine has to\n * explore a large number of possible matches so it’s safe to ignore\n */\n const regex = /^(\\[([^?]*)(?:(.*))\\])?(.+)$/; // eslint-disable-line\n const match = name.match(regex);\n if (!match || !match.length || match.length < 5) {\n throw new ErrorInfo('regex match failed', 400, 40010);\n }\n // Fail if there is already a channel qualifier, eg [meta]foo should fail instead of just overriding with [filter=xyz]foo\n if (match![2]) {\n throw new ErrorInfo(`cannot use a derived option with a ${match[2]} channel`, 400, 40010);\n }\n // Return match values to be added to derive channel quantifier.\n return {\n qualifierParam: match[3] || '',\n channelName: match[4],\n };\n}\n\nexport function toBase64(str: string) {\n const bufferUtils = Platform.BufferUtils;\n const textBuffer = bufferUtils.utf8Encode(str);\n return bufferUtils.base64Encode(textBuffer);\n}\n\nexport function arrEquals(a: any[], b: any[]) {\n return (\n a.length === b.length &&\n a.every(function (val, i) {\n return val === b[i];\n })\n );\n}\n\nexport function createMissingPluginError(pluginName: keyof ModularPlugins): ErrorInfo {\n return new ErrorInfo(`${pluginName} plugin not provided`, 40019, 400);\n}\n\nexport function throwMissingPluginError(pluginName: keyof ModularPlugins): never {\n throw createMissingPluginError(pluginName);\n}\n\nexport async function withTimeoutAsync<A>(promise: Promise<A>, timeout = 5000, err = 'Timeout expired'): Promise<A> {\n const e = new ErrorInfo(err, 50000, 500);\n return Promise.race([promise, new Promise<A>((_resolve, reject) => setTimeout(() => reject(e), timeout))]);\n}\n\ntype NonFunctionKeyNames<A> = { [P in keyof A]: A[P] extends Function ? never : P }[keyof A];\nexport type Properties<A> = Pick<A, NonFunctionKeyNames<A>>;\n\n/**\n * A subscription function that registers the provided listener and returns a function to deregister it.\n */\nexport type RegisterListenerFunction<T> = (listener: (event: T) => void) => () => void;\n\n/**\n * Converts a listener-based event emitter API into an async iterator\n * that can be consumed using a `for await...of` loop.\n *\n * @param registerListener - A function that registers a listener and returns a function to remove it\n * @returns An async iterator that yields events from the listener\n */\nexport async function* listenerToAsyncIterator<T>(\n registerListener: RegisterListenerFunction<T>,\n): AsyncIterableIterator<T> {\n const eventQueue: T[] = [];\n let resolveNext: ((event: T) => void) | null = null;\n\n const removeListener = registerListener((event: T) => {\n if (resolveNext) {\n // If we have a waiting promise, resolve it immediately\n const resolve = resolveNext;\n resolveNext = null;\n resolve(event);\n } else {\n // Otherwise, queue the event for later consumption\n eventQueue.push(event);\n }\n });\n\n try {\n while (true) {\n if (eventQueue.length > 0) {\n // If we have queued events, yield the next one\n yield eventQueue.shift()!;\n } else {\n if (resolveNext) {\n throw new ErrorInfo('Concurrent next() calls are not supported', 40000, 400);\n }\n\n // Otherwise wait for the next event to arrive\n const event = await new Promise<T>((resolve) => {\n resolveNext = resolve;\n });\n yield event;\n }\n }\n } finally {\n // Clean up when iterator is done or abandoned\n removeListener();\n }\n}\n","import Platform from 'common/platform';\r\nimport * as Utils from '../util/utils';\r\nimport * as API from '../../../../ably';\r\n\r\nexport interface IPartialErrorInfo extends Error {\r\n code: number | null;\r\n statusCode?: number;\r\n cause?: ErrorInfo | PartialErrorInfo;\r\n href?: string;\r\n detail?: Record<string, string>;\r\n}\r\n\r\nfunction toString(err: ErrorInfo | PartialErrorInfo) {\r\n let result = '[' + err.constructor.name;\r\n if (err.message) result += ': ' + err.message;\r\n if (err.statusCode) result += '; statusCode=' + err.statusCode;\r\n if (err.code) result += '; code=' + err.code;\r\n if (err.cause) result += '; cause=' + Utils.inspectError(err.cause);\r\n if (err.detail && Object.keys(err.detail).length > 0) result += '; detail=' + JSON.stringify(err.detail);\r\n if (err.href && !(err.message && err.message.indexOf('help.ably.io') > -1)) result += '; see ' + err.href + ' ';\r\n result += ']';\r\n return result;\r\n}\r\n\r\nexport interface IConvertibleToErrorInfo {\r\n message: string;\r\n code: number;\r\n statusCode: number;\r\n detail?: Record<string, string>;\r\n}\r\n\r\nexport interface IConvertibleToPartialErrorInfo {\r\n message: string;\r\n code: number | null;\r\n statusCode?: number;\r\n detail?: Record<string, string>;\r\n}\r\n\r\nexport default class ErrorInfo extends Error implements IPartialErrorInfo, API.ErrorInfo {\r\n code: number;\r\n statusCode: number;\r\n cause?: ErrorInfo;\r\n href?: string;\r\n detail?: Record<string, string>;\r\n\r\n constructor(message: string, code: number, statusCode: number, cause?: ErrorInfo, detail?: Record<string, string>) {\r\n super(message);\r\n if (typeof Object.setPrototypeOf !== 'undefined') {\r\n Object.setPrototypeOf(this, ErrorInfo.prototype);\r\n }\r\n this.code = code;\r\n this.statusCode = statusCode;\r\n this.cause = cause;\r\n this.detail = detail;\r\n }\r\n\r\n toString(): string {\r\n return toString(this);\r\n }\r\n\r\n static fromValues(values: IConvertibleToErrorInfo): ErrorInfo {\r\n const { message, code, statusCode, detail } = values;\r\n if (\r\n typeof message !== 'string' ||\r\n typeof code !== 'number' ||\r\n typeof statusCode !== 'number' ||\r\n (!Utils.isNil(detail) && (typeof detail !== 'object' || Array.isArray(detail)))\r\n ) {\r\n throw new Error('ErrorInfo.fromValues(): invalid values: ' + Platform.Config.inspect(values));\r\n }\r\n const result = Object.assign(new ErrorInfo(message, code, statusCode, undefined, detail), values);\r\n if (result.code && !result.href) {\r\n result.href = 'https://help.ably.io/error/' + result.code;\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nexport class PartialErrorInfo extends Error implements IPartialErrorInfo {\r\n code: number | null;\r\n statusCode?: number;\r\n cause?: ErrorInfo | PartialErrorInfo;\r\n href?: string;\r\n detail?: Record<string, string>;\r\n\r\n constructor(\r\n message: string,\r\n code: number | null,\r\n statusCode?: number,\r\n cause?: ErrorInfo | PartialErrorInfo,\r\n detail?: Record<string, string>,\r\n ) {\r\n super(message);\r\n if (typeof Object.setPrototypeOf !== 'undefined') {\r\n Object.setPrototypeOf(this, PartialErrorInfo.prototype);\r\n }\r\n this.code = code;\r\n this.statusCode = statusCode;\r\n this.cause = cause;\r\n this.detail = detail;\r\n }\r\n\r\n toString(): string {\r\n return toString(this);\r\n }\r\n\r\n static fromValues(values: IConvertibleToPartialErrorInfo): PartialErrorInfo {\r\n const { message, code, statusCode, detail } = values;\r\n if (\r\n typeof message !== 'string' ||\r\n (!Utils.isNil(code) && typeof code !== 'number') ||\r\n (!Utils.isNil(statusCode) && typeof statusCode !== 'number') ||\r\n (!Utils.isNil(detail) && (typeof detail !== 'object' || Array.isArray(detail)))\r\n ) {\r\n throw new Error('PartialErrorInfo.fromValues(): invalid values: ' + Platform.Config.inspect(values));\r\n }\r\n const result = Object.assign(new PartialErrorInfo(message, code, statusCode, undefined, detail), values);\r\n if (result.code && !result.href) {\r\n result.href = 'https://help.ably.io/error/' + result.code;\r\n }\r\n return result;\r\n }\r\n}\r\n","{\r\n \"name\": \"ably\",\r\n \"description\": \"Realtime client library for Ably, the realtime messaging service\",\r\n \"version\": \"2.21.0\",\r\n \"license\": \"Apache-2.0\",\r\n \"bugs\": {\r\n \"url\": \"https://github.com/ably/ably-js/issues\",\r\n \"email\": \"support@ably.com\"\r\n },\r\n \"main\": \"./build/ably-node.js\",\r\n \"browser\": \"./build/ably.js\",\r\n \"react-native\": \"./build/ably-reactnative.js\",\r\n \"typings\": \"./ably.d.ts\",\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./ably.d.ts\",\r\n \"node\": \"./build/ably-node.js\",\r\n \"react-native\": \"./build/ably-reactnative.js\",\r\n \"default\": \"./build/ably.js\"\r\n },\r\n \"./modular\": {\r\n \"types\": \"./modular.d.ts\",\r\n \"import\": \"./build/modular/index.mjs\"\r\n },\r\n \"./react\": {\r\n \"require\": \"./react/cjs/index.js\",\r\n \"import\": \"./react/mjs/index.js\"\r\n },\r\n \"./push\": {\r\n \"types\": \"./push.d.ts\",\r\n \"import\": \"./build/push.js\"\r\n },\r\n \"./liveobjects\": {\r\n \"import\": {\r\n \"types\": \"./liveobjects.d.mts\",\r\n \"default\": \"./build/liveobjects.mjs\"\r\n },\r\n \"require\": {\r\n \"types\": \"./liveobjects.d.ts\",\r\n \"default\": \"./build/liveobjects.js\"\r\n }\r\n }\r\n },\r\n \"files\": [\r\n \"build/**\",\r\n \"ably.d.ts\",\r\n \"liveobjects.d.ts\",\r\n \"liveobjects.d.mts\",\r\n \"modular.d.ts\",\r\n \"push.d.ts\",\r\n \"resources/**\",\r\n \"src/**\",\r\n \"react/**\"\r\n ],\r\n \"dependencies\": {\r\n \"@ably/msgpack-js\": \"^0.4.0\",\r\n \"dequal\": \"^2.0.3\",\r\n \"fastestsmallesttextencoderdecoder\": \"^1.0.22\",\r\n \"got\": \"^11.8.5\",\r\n \"ulid\": \"^2.3.0\",\r\n \"ws\": \"^8.17.1\"\r\n },\r\n \"peerDependencies\": {\r\n \"react\": \">=16.8.0\",\r\n \"react-dom\": \">=16.8.0\"\r\n },\r\n \"peerDependenciesMeta\": {\r\n \"react\": {\r\n \"optional\": true\r\n },\r\n \"react-dom\": {\r\n \"optional\": true\r\n }\r\n },\r\n \"devDependencies\": {\r\n \"@ably/vcdiff-decoder\": \"1.0.6\",\r\n \"@arethetypeswrong/cli\": \"^0.13.1\",\r\n \"@babel/generator\": \"^7.23.6\",\r\n \"@babel/parser\": \"^7.23.6\",\r\n \"@babel/traverse\": \"^7.23.7\",\r\n \"@testing-library/react\": \"^13.3.0\",\r\n \"@types/cli-table\": \"^0.3.4\",\r\n \"@types/jmespath\": \"^0.15.2\",\r\n \"@types/node\": \"^18.0.0\",\r\n \"@types/request\": \"^2.48.7\",\r\n \"@types/ws\": \"^8.2.0\",\r\n \"@typescript-eslint/eslint-plugin\": \"^5.59.6\",\r\n \"@typescript-eslint/parser\": \"^5.59.6\",\r\n \"@vitejs/plugin-react\": \"^1.3.2\",\r\n \"async\": \"ably-forks/async#requirejs\",\r\n \"aws-sdk\": \"^2.1413.0\",\r\n \"chai\": \"^4.2.0\",\r\n \"cli-table\": \"^0.3.11\",\r\n \"cors\": \"^2.8.5\",\r\n \"csv\": \"^6.3.9\",\r\n \"dox\": \"^1.0.0\",\r\n \"esbuild\": \"^0.18.10\",\r\n \"esbuild-plugin-umd-wrapper\": \"ably-forks/esbuild-plugin-umd-wrapper#1.0.7-optional-amd-named-module\",\r\n \"esbuild-runner\": \"^2.2.2\",\r\n \"eslint\": \"^7.13.0\",\r\n \"eslint-plugin-import\": \"^2.28.0\",\r\n \"eslint-plugin-jsdoc\": \"^40.0.0\",\r\n \"eslint-plugin-react\": \"^7.32.2\",\r\n \"eslint-plugin-react-hooks\": \"^4.6.0\",\r\n \"eslint-plugin-security\": \"^1.4.0\",\r\n \"express\": \"^4.17.1\",\r\n \"glob\": \"^10.4.2\",\r\n \"grunt\": \"^1.6.1\",\r\n \"grunt-cli\": \"~1.2.0\",\r\n \"grunt-shell\": \"~1.1\",\r\n \"grunt-webpack\": \"^5.0.0\",\r\n \"hexy\": \"~0.2\",\r\n \"jmespath\": \"^0.16.0\",\r\n \"jsdom\": \"^20.0.0\",\r\n \"minimist\": \"^1.2.5\",\r\n \"mocha\": \"^8.1.3\",\r\n \"mocha-junit-reporter\": \"^2.2.1\",\r\n \"path-browserify\": \"^1.0.1\",\r\n \"playwright\": \"^1.39.0\",\r\n \"prettier\": \"^3.3.3\",\r\n \"process\": \"^0.11.10\",\r\n \"react\": \">=18.1.0\",\r\n \"react-dom\": \">=18.1.0\",\r\n \"requirejs\": \"~2.1\",\r\n \"shelljs\": \"~0.8\",\r\n \"source-map-explorer\": \"^2.5.2\",\r\n \"source-map-support\": \"^0.5.21\",\r\n \"stream-browserify\": \"^3.0.0\",\r\n \"ts-loader\": \"^9.4.2\",\r\n \"tsconfig-paths-webpack-plugin\": \"^4.0.1\",\r\n \"tslib\": \"^2.3.1\",\r\n \"typedoc\": \"^0.24.7\",\r\n \"typescript\": \"^4.9.5\",\r\n \"vite\": \"^4.4.9\",\r\n \"vitest\": \"^0.18.0\",\r\n \"webpack\": \"^5.79.0\",\r\n \"webpack-cli\": \"^5.0.1\"\r\n },\r\n \"engines\": {\r\n \"node\": \">=16\"\r\n },\r\n \"repository\": \"ably/ably-js\",\r\n \"jspm\": {\r\n \"registry\": \"npm\",\r\n \"directories\": {\r\n \"lib\": \"build\"\r\n },\r\n \"main\": \"ably\"\r\n },\r\n \"scripts\": {\r\n \"start:react\": \"npx vite serve\",\r\n \"grunt\": \"grunt\",\r\n \"test\": \"npm run test:node\",\r\n \"test:node\": \"npm run build:node && npm run build:push && npm run build:liveobjects && mocha\",\r\n \"test:grep\": \"npm run build:node && npm run build:push && npm run build:liveobjects && mocha --grep\",\r\n \"test:node:skip-build\": \"mocha\",\r\n \"test:webserver\": \"grunt test:webserver\",\r\n \"test:playwright\": \"node test/support/runPlaywrightTests.js\",\r\n \"test:react\": \"vitest run\",\r\n \"test:package\": \"grunt test:package\",\r\n \"concat\": \"grunt concat\",\r\n \"build\": \"grunt build:all && npm run build:react\",\r\n \"build:node\": \"grunt build:node\",\r\n \"build:browser\": \"grunt build:browser\",\r\n \"build:react\": \"npm run build:react:mjs && npm run build:react:cjs && cp src/platform/react-hooks/res/package.react.json react/package.json\",\r\n \"build:react:mjs\": \"tsc --project src/platform/react-hooks/tsconfig.mjs.json && cp src/platform/react-hooks/res/package.mjs.json react/mjs/package.json\",\r\n \"build:react:cjs\": \"tsc --project src/platform/react-hooks/tsconfig.cjs.json && cp src/platform/react-hooks/res/package.cjs.json react/cjs/package.json\",\r\n \"build:push\": \"grunt build:push\",\r\n \"build:liveobjects\": \"grunt build:liveobjects\",\r\n \"requirejs\": \"grunt requirejs\",\r\n \"lint\": \"eslint .\",\r\n \"lint:fix\": \"eslint --fix .\",\r\n \"prepare\": \"npm run build\",\r\n \"format\": \"prettier --write .\",\r\n \"format:check\": \"prettier --check .\",\r\n \"sourcemap\": \"source-map-explorer build/ably.min.js\",\r\n \"modulereport\": \"tsc --noEmit --esModuleInterop scripts/moduleReport.ts && esr scripts/moduleReport.ts\",\r\n \"speccoveragereport\": \"tsc --noEmit --esModuleInterop --target ES2017 --moduleResolution node scripts/specCoverageReport.ts && esr scripts/specCoverageReport.ts\",\r\n \"process-private-api-data\": \"tsc --noEmit --esModuleInterop --strictNullChecks scripts/processPrivateApiData/run.ts && esr scripts/processPrivateApiData/run.ts\",\r\n \"docs\": \"typedoc\"\r\n }\r\n}\r\n","import Platform from 'common/platform';\r\nimport * as Utils from './utils';\r\nimport Logger from './logger';\r\nimport ErrorInfo from 'common/lib/types/errorinfo';\r\nimport { version } from '../../../../package.json';\r\nimport ClientOptions, { NormalisedClientOptions } from 'common/types/ClientOptions';\r\nimport IDefaults from '../../types/IDefaults';\r\nimport { MsgPack } from 'common/types/msgpack';\r\nimport { IUntypedCryptoStatic } from 'common/types/ICryptoStatic';\r\nimport { ChannelOptions } from 'common/types/channel';\r\nimport { ModularPlugins } from '../client/modularplugins';\r\n\r\nlet agent = 'ably-js/' + version;\r\n\r\ntype CompleteDefaults = IDefaults & {\r\n ENDPOINT: string;\r\n ENVIRONMENT: string;\r\n REST_HOST: string;\r\n REALTIME_HOST: string;\r\n FALLBACK_HOSTS: string[];\r\n PORT: number;\r\n TLS_PORT: number;\r\n TIMEOUTS: {\r\n disconnectedRetryTimeout: number;\r\n suspendedRetryTimeout: number;\r\n httpRequestTimeout: number;\r\n httpMaxRetryDuration: number;\r\n channelRetryTimeout: number;\r\n fallbackRetryTimeout: number;\r\n connectionStateTtl: number;\r\n realtimeRequestTimeout: number;\r\n recvTimeout: number;\r\n webSocketConnectTimeout: number;\r\n webSocketSlowTimeout: number;\r\n };\r\n httpMaxRetryCount: number;\r\n maxMessageSize: number;\r\n version: string;\r\n protocolVersion: number;\r\n agent: string;\r\n getPort(options: ClientOptions, tls?: boolean): number | undefined;\r\n getHttpScheme(options: ClientOptions): string;\r\n getPrimaryDomainFromEndpoint(endpoint: string): string;\r\n getEndpointFallbackHosts(endpoint: string): string[];\r\n getFallbackHosts(options: NormalisedClientOptions): string[];\r\n getHosts(options: NormalisedClientOptions, ws?: boolean): string[];\r\n checkHost(host: string): void;\r\n objectifyOptions(\r\n options: undefined | ClientOptions | string,\r\n allowKeyOrToken: boolean,\r\n sourceForErrorMessage: string,\r\n logger: Logger,\r\n modularPluginsToInclude?: ModularPlugins,\r\n ): ClientOptions;\r\n normaliseOptions(options: ClientOptions, MsgPack: MsgPack | null, logger: Logger | null): NormalisedClientOptions;\r\n defaultGetHeaders(options: NormalisedClientOptions, headersOptions?: HeadersOptions): Record<string, string>;\r\n defaultPostHeaders(options: NormalisedClientOptions, headersOptions?: HeadersOptions): Record<string, string>;\r\n};\r\n\r\nconst Defaults = {\r\n ENDPOINT: 'main',\r\n ENVIRONMENT: '',\r\n REST_HOST: 'rest.ably.io',\r\n REALTIME_HOST: 'realtime.ably.io',\r\n FALLBACK_HOSTS: [\r\n 'main.a.fallback.ably-realtime.com',\r\n 'main.b.fallback.ably-realtime.com',\r\n 'main.c.fallback.ably-realtime.com',\r\n 'main.d.fallback.ably-realtime.com',\r\n 'main.e.fallback.ably-realtime.com',\r\n ],\r\n PORT: 80,\r\n TLS_PORT: 443,\r\n TIMEOUTS: {\r\n /* Documented as options params: */\r\n disconnectedRetryTimeout: 15000,\r\n suspendedRetryTimeout: 30000,\r\n /* Undocumented, but part of the api and can be used by customers: */\r\n httpRequestTimeout: 10000,\r\n httpMaxRetryDuration: 15000,\r\n channelRetryTimeout: 15000,\r\n fallbackRetryTimeout: 600000,\r\n /* For internal / test use only: */\r\n connectionStateTtl: 120000,\r\n realtimeRequestTimeout: 10000,\r\n recvTimeout: 90000,\r\n webSocketConnectTimeout: 10000,\r\n webSocketSlowTimeout: 4000,\r\n },\r\n httpMaxRetryCount: 3,\r\n maxMessageSize: 65536,\r\n\r\n version,\r\n protocolVersion: 6,\r\n agent,\r\n getPort,\r\n getHttpScheme,\r\n getPrimaryDomainFromEndpoint,\r\n getEndpointFallbackHosts,\r\n getFallbackHosts,\r\n getHosts,\r\n checkHost,\r\n objectifyOptions,\r\n normaliseOptions,\r\n defaultGetHeaders,\r\n defaultPostHeaders,\r\n};\r\n\r\nexport function getPort(options: ClientOptions, tls?: boolean): number | undefined {\r\n return tls || options.tls ? options.tlsPort : options.port;\r\n}\r\n\r\nexport function getHttpScheme(options: ClientOptions): string {\r\n return options.tls ? 'https://' : 'http://';\r\n}\r\n\r\n/**\r\n * REC1b2\r\n */\r\nfunction isFqdnIpOrLocalhost(endpoint: string): boolean {\r\n return endpoint.includes('.') || endpoint.includes('::') || endpoint === 'localhost';\r\n}\r\n\r\n/**\r\n * REC1b\r\n */\r\nexport function getPrimaryDomainFromEndpoint(endpoint: string): string {\r\n // REC1b2 (endpoint is a valid hostname)\r\n if (isFqdnIpOrLocalhost(endpoint)) return endpoint;\r\n\r\n // REC1b3 (endpoint in form \"nonprod:[id]\")\r\n if (endpoint.startsWith('nonprod:')) {\r\n const routingPolicyId = endpoint.replace('nonprod:', '');\r\n return `${routingPolicyId}.realtime.ably-nonprod.net`;\r\n }\r\n\r\n // REC1b4 (endpoint in form \"[id]\")\r\n return `${endpoint}.realtime.ably.net`;\r\n}\r\n\r\n/**\r\n * REC2c\r\n *\r\n * @returns default callbacks based on endpoint client option\r\n */\r\nexport function getEndpointFallbackHosts(endpoint: string): string[] {\r\n // REC2c2\r\n if (isFqdnIpOrLocalhost(endpoint)) return [];\r\n\r\n // REC2c3\r\n if (endpoint.startsWith('nonprod:')) {\r\n const routingPolicyId = endpoint.replace('nonprod:', '');\r\n return endpointFallbacks(routingPolicyId, 'ably-realtime-nonprod.com');\r\n }\r\n\r\n // REC2c1\r\n return endpointFallbacks(endpoint, 'ably-realtime.com');\r\n}\r\n\r\nexport function endpointFallbacks(routingPolicyId: string, domain: string): string[] {\r\n return ['a', 'b', 'c', 'd', 'e'].map((id) => `${routingPolicyId}.${id}.fallback.${domain}`);\r\n}\r\n\r\nexport function getFallbackHosts(options: NormalisedClientOptions): string[] {\r\n const fallbackHosts = options.fallbackHosts,\r\n httpMaxRetryCount =\r\n typeof options.httpMaxRetryCount !== 'undefined' ? options.httpMaxRetryCount : Defaults.httpMaxRetryCount;\r\n\r\n return fallbackHosts ? Utils.arrChooseN(fallbackHosts, httpMaxRetryCount) : [];\r\n}\r\n\r\nexport function getHosts(options: NormalisedClientOptions): string[] {\r\n return [options.primaryDomain].concat(getFallbackHosts(options));\r\n}\r\n\r\nfunction checkHost(host: string): void {\r\n if (typeof host !== 'string') {\r\n throw new ErrorInfo('host must be a string; was a ' + typeof host, 40000, 400);\r\n }\r\n if (!host.length) {\r\n throw new ErrorInfo('host must not be zero-length', 40000, 400);\r\n }\r\n}\r\n\r\nfunction getTimeouts(options: ClientOptions) {\r\n /* Allow values passed in options to override default timeouts */\r\n const timeouts: Record<string, number> = {};\r\n for (const prop in Defaults.TIMEOUTS) {\r\n timeouts[prop] = (options as Record<string, number>)[prop] || (Defaults.TIMEOUTS as Record<string, number>)[prop];\r\n }\r\n return timeouts;\r\n}\r\n\r\nexport function getAgentString(options: ClientOptions): string {\r\n let agentStr = Defaults.agent;\r\n if (options.agents) {\r\n for (var agent in options.agents) {\r\n agentStr += ' ' + agent + '/' + options.agents[agent];\r\n }\r\n }\r\n return agentStr;\r\n}\r\n\r\nexport function objectifyOptions(\r\n options: undefined | ClientOptions | string,\r\n allowKeyOrToken: boolean,\r\n sourceForErrorMessage: string,\r\n logger: Logger,\r\n modularPluginsToInclude?: ModularPlugins,\r\n): ClientOptions {\r\n if (options === undefined) {\r\n const msg = allowKeyOrToken\r\n ? `${sourceForErrorMessage} must be initialized with either a client options object, an Ably API key, or an Ably Token`\r\n : `${sourceForErrorMessage} must be initialized with a client options object`;\r\n Logger.logAction(logger, Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg);\r\n throw new Error(msg);\r\n }\r\n\r\n let optionsObj: ClientOptions;\r\n\r\n if (typeof options === 'string') {\r\n if (options.indexOf(':') == -1) {\r\n if (!allowKeyOrToken) {\r\n const msg = `${sourceForErrorMessage} cannot be initialized with just an Ably Token; you must provide a client options object with a \\`plugins\\` property. (Set this Ably Token as the object’s \\`token\\` property.)`;\r\n Logger.logAction(logger, Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg);\r\n throw new Error(msg);\r\n }\r\n\r\n optionsObj = { token: options };\r\n } else {\r\n if (!allowKeyOrToken) {\r\n const msg = `${sourceForErrorMessage} cannot be initialized with just an Ably API key; you must provide a client options object with a \\`plugins\\` property. (Set this Ably API key as the object’s \\`key\\` property.)`;\r\n Logger.logAction(logger, Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg);\r\n throw new Error(msg);\r\n }\r\n\r\n optionsObj = { key: options };\r\n }\r\n } else {\r\n optionsObj = options;\r\n }\r\n\r\n if (modularPluginsToInclude) {\r\n optionsObj = { ...optionsObj, plugins: { ...modularPluginsToInclude, ...optionsObj.plugins } };\r\n }\r\n\r\n return optionsObj;\r\n}\r\n\r\nfunction checkIfClientOptionsAreValid(options: ClientOptions) {\r\n // REC1b\r\n if (options.endpoint && (options.environment || options.restHost || options.realtimeHost)) {\r\n // RSC1b\r\n throw new ErrorInfo(\r\n 'The `endpoint` option cannot be used in conjunction with the `environment`, `restHost`, or `realtimeHost` options.',\r\n 40106,\r\n 400,\r\n );\r\n }\r\n\r\n // REC1c\r\n if (options.environment && (options.restHost || options.realtimeHost)) {\r\n // RSC1b\r\n throw new ErrorInfo(\r\n 'The `environment` option cannot be used in conjunction with the `restHost`, or `realtimeHost` options.',\r\n 40106,\r\n 400,\r\n );\r\n }\r\n}\r\n\r\nexport function normaliseOptions(\r\n options: ClientOptions,\r\n MsgPack: MsgPack | null,\r\n logger: Logger | null, // should only be omitted by tests\r\n): NormalisedClientOptions {\r\n const loggerToUse = logger ?? Logger.defaultLogger;\r\n\r\n // Deprecated options\r\n if (options.environment) {\r\n loggerToUse.deprecated('The `environment` client option', 'Use the `endpoint` client option instead.');\r\n }\r\n if (options.restHost) {\r\n loggerToUse.deprecated('The `restHost` client option', 'Use the `endpoint` client option instead.');\r\n }\r\n if (options.realtimeHost) {\r\n loggerToUse.deprecated('The `realtimeHost` client option', 'Use the `endpoint` client option instead.');\r\n }\r\n\r\n checkIfClientOptionsAreValid(options);\r\n\r\n if (typeof options.recover === 'function' && options.closeOnUnload === true) {\r\n Logger.logAction(\r\n loggerToUse,\r\n Logger.LOG_ERROR,\r\n 'Defaults.normaliseOptions',\r\n 'closeOnUnload was true and a session recovery function was set - these are mutually exclusive, so unsetting the latter',\r\n );\r\n options.recover = undefined;\r\n }\r\n\r\n if (!('closeOnUnload' in options)) {\r\n /* Have closeOnUnload default to true unless we have any indication that\r\n * the user may want to recover the connection */\r\n options.closeOnUnload = !options.recover;\r\n }\r\n\r\n if (!('queueMessages' in options)) options.queueMessages = true;\r\n\r\n /* infer hosts and fallbacks based on the specified endpoint */\r\n const endpoint = options.endpoint || Defaults.ENDPOINT;\r\n\r\n if (!options.fallbackHosts && !options.restHost && !options.realtimeHost && !options.port && !options.tlsPort) {\r\n options.fallbackHosts = getEndpointFallbackHosts(options.environment || endpoint);\r\n }\r\n\r\n const primaryDomainFromEnvironment = options.environment && `${options.environment}.realtime.ably.net`;\r\n const primaryDomainFromLegacyOptions = options.restHost || options.realtimeHost || primaryDomainFromEnvironment;\r\n\r\n const primaryDomain = primaryDomainFromLegacyOptions || getPrimaryDomainFromEndpoint(endpoint);\r\n\r\n (options.fallbackHosts || []).concat(primaryDomain).forEach(checkHost);\r\n\r\n options.port = options.port || Defaults.PORT;\r\n options.tlsPort = options.tlsPort || Defaults.TLS_PORT;\r\n if (!('tls' in options)) options.tls = true;\r\n\r\n const timeouts = getTimeouts(options);\r\n\r\n if (MsgPack) {\r\n if ('useBinaryProtocol' in options) {\r\n options.useBinaryProtocol = Platform.Config.supportsBinary && options.useBinaryProtocol;\r\n } else {\r\n options.useBinaryProtocol = Platform.Config.preferBinary;\r\n }\r\n } else {\r\n options.useBinaryProtocol = false;\r\n }\r\n\r\n const headers: Record<string, string> = {};\r\n if (options.clientId) {\r\n headers['X-Ably-ClientId'] = Platform.BufferUtils.base64Encode(Platform.BufferUtils.utf8Encode(options.clientId));\r\n }\r\n\r\n if (!('idempotentRestPublishing' in options)) {\r\n options.idempotentRestPublishing = true;\r\n }\r\n\r\n let connectivityCheckParams = null;\r\n let connectivityCheckUrl = options.connectivityCheckUrl;\r\n if (options.connectivityCheckUrl) {\r\n let [uri, qs] = options.connectivityCheckUrl.split('?');\r\n connectivityCheckParams = qs ? Utils.parseQueryString(qs) : {};\r\n if (uri.indexOf('://') === -1) {\r\n uri = 'https://' + uri;\r\n }\r\n connectivityCheckUrl = uri;\r\n }\r\n\r\n let wsConnectivityCheckUrl = options.wsConnectivityCheckUrl;\r\n if (wsConnectivityCheckUrl && wsConnectivityCheckUrl.indexOf('://') === -1) {\r\n wsConnectivityCheckUrl = 'wss://' + wsConnectivityCheckUrl;\r\n }\r\n\r\n return {\r\n ...options,\r\n primaryDomain: primaryDomain,\r\n maxMessageSize: options.maxMessageSize || Defaults.maxMessageSize,\r\n timeouts,\r\n connectivityCheckParams,\r\n connectivityCheckUrl,\r\n wsConnectivityCheckUrl,\r\n headers,\r\n };\r\n}\r\n\r\nexport function normaliseChannelOptions(Crypto: IUntypedCryptoStatic | null, logger: Logger, options?: ChannelOptions) {\r\n const channelOptions = options || {};\r\n if (channelOptions.cipher) {\r\n if (!Crypto) Utils.throwMissingPluginError('Crypto');\r\n const cipher = Crypto.getCipher(channelOptions.cipher, logger);\r\n channelOptions.cipher = cipher.cipherParams;\r\n channelOptions.channelCipher = cipher.cipher;\r\n } else if ('cipher' in channelOptions) {\r\n /* Don't deactivate an existing cipher unless options\r\n * has a 'cipher' key that's falsey */\r\n channelOptions.cipher = undefined;\r\n channelOptions.channelCipher = null;\r\n }\r\n return channelOptions;\r\n}\r\n\r\nconst contentTypes = {\r\n json: 'application/json',\r\n xml: 'application/xml',\r\n html: 'text/html',\r\n msgpack: 'application/x-msgpack',\r\n text: 'text/plain',\r\n};\r\n\r\nexport interface HeadersOptions {\r\n format?: Utils.Format | 'xml' | 'html' | 'text';\r\n protocolVersion?: number;\r\n}\r\n\r\nconst defaultHeadersOptions: Required<HeadersOptions> = {\r\n format: Utils.Format.json,\r\n protocolVersion: Defaults.protocolVersion,\r\n};\r\n\r\nexport function defaultGetHeaders(\r\n options: NormalisedClientOptions,\r\n { format, protocolVersion = defaultHeadersOptions.protocolVersion }: HeadersOptions = {},\r\n): Record<string, string> {\r\n const accept = contentTypes[format ?? (options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json)];\r\n return {\r\n accept: accept,\r\n 'X-Ably-Version': protocolVersion.toString(),\r\n 'Ably-Agent': getAgentString(options),\r\n };\r\n}\r\n\r\nexport function defaultPostHeaders(\r\n options: NormalisedClientOptions,\r\n { format, protocolVersion = defaultHeadersOptions.protocolVersion }: HeadersOptions = {},\r\n): Record<string, string> {\r\n const accept = contentTypes[format ?? (options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json)];\r\n const contentType = accept;\r\n return {\r\n accept: accept,\r\n 'content-type': contentType,\r\n 'X-Ably-Version': protocolVersion.toString(),\r\n 'Ably-Agent': getAgentString(options),\r\n };\r\n}\r\n\r\nexport default Defaults as CompleteDefaults;\r\n\r\nexport function getDefaults(platformDefaults: IDefaults) {\r\n return Object.assign(Defaults, platformDefaults);\r\n}\r\n","import { StandardCallback } from 'common/types/utils';\nimport ErrorInfo from 'common/lib/types/errorinfo';\nimport Logger from './logger';\n\nexport interface MulticasterInstance<T> extends Function {\n (err?: ErrorInfo | null, result?: T): void;\n push: (fn: StandardCallback<T>) => void;\n /**\n * Creates a promise that will be resolved or rejected when this instance is called.\n */\n createPromise: () => Promise<T>;\n /**\n * Syntatic sugar for when working in a context that uses promises; equivalent to calling as a function with arguments (null, result).\n */\n resolveAll(result: T): void;\n /**\n * Syntatic sugar for when working in a context that uses promises; equivalent to calling as a function with arguments (err).\n */\n rejectAll(err: ErrorInfo): void;\n}\n\nclass Multicaster<T> {\n members: Array<StandardCallback<T>>;\n\n // Private constructor; use static Multicaster.create instead\n private constructor(\n private readonly logger: Logger,\n members?: Array<StandardCallback<T> | undefined>,\n ) {\n this.members = (members as Array<StandardCallback<T>>) || [];\n }\n\n private call(err?: ErrorInfo | null, result?: T): void {\n for (const member of this.members) {\n if (member) {\n try {\n member(err, result);\n } catch (e) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Multicaster multiple callback handler',\n 'Unexpected exception: ' + e + '; stack = ' + (e as Error).stack,\n );\n }\n }\n }\n }\n\n push(...args: Array<StandardCallback<T>>): void {\n this.members.push(...args);\n }\n\n createPromise(): Promise<T> {\n return new Promise((resolve, reject) => {\n this.push((err, result) => {\n err ? reject(err) : resolve(result!);\n });\n });\n }\n\n resolveAll(result: T) {\n this.call(null, result);\n }\n\n rejectAll(err: ErrorInfo) {\n this.call(err);\n }\n\n static create<T>(logger: Logger, members?: Array<StandardCallback<T> | undefined>): MulticasterInstance<T> {\n const instance = new Multicaster(logger, members);\n return Object.assign((err?: ErrorInfo | null, result?: T) => instance.call(err, result), {\n push: (fn: StandardCallback<T>) => instance.push(fn),\n createPromise: () => instance.createPromise(),\n resolveAll: (result: T) => instance.resolveAll(result),\n rejectAll: (err: ErrorInfo) => instance.rejectAll(err),\n });\n }\n}\n\nexport default Multicaster;\n","enum HttpMethods {\n Get = 'get',\n Delete = 'delete',\n Post = 'post',\n Put = 'put',\n Patch = 'patch',\n}\n\nexport default HttpMethods;\n","enum HttpStatusCodes {\n Success = 200,\n NoContent = 204,\n BadRequest = 400,\n Unauthorized = 401,\n Forbidden = 403,\n RequestTimeout = 408,\n InternalServerError = 500,\n}\n\nexport function isSuccessCode(statusCode: number) {\n return statusCode >= HttpStatusCodes.Success && statusCode < HttpStatusCodes.BadRequest;\n}\n\nexport default HttpStatusCodes;\n","import Logger from '../util/logger';\nimport * as Utils from '../util/utils';\nimport Multicaster, { MulticasterInstance } from '../util/multicaster';\nimport ErrorInfo, { IPartialErrorInfo } from '../types/errorinfo';\nimport { RequestResultError, RequestParams, RequestResult } from '../../types/http';\nimport * as API from '../../../../ably';\nimport BaseClient from './baseclient';\nimport BaseRealtime from './baserealtime';\nimport ClientOptions from '../../types/ClientOptions';\nimport HttpMethods from '../../constants/HttpMethods';\nimport HttpStatusCodes from 'common/constants/HttpStatusCodes';\nimport Platform, { Bufferlike } from '../../platform';\nimport Defaults from '../util/defaults';\n\ntype BatchResult<T> = API.BatchResult<T>;\ntype TokenRevocationTargetSpecifier = API.TokenRevocationTargetSpecifier;\ntype TokenRevocationOptions = API.TokenRevocationOptions;\ntype TokenRevocationSuccessResult = API.TokenRevocationSuccessResult;\ntype TokenRevocationFailureResult = API.TokenRevocationFailureResult;\ntype TokenRevocationResult = BatchResult<TokenRevocationSuccessResult | TokenRevocationFailureResult>;\n\nconst MAX_TOKEN_LENGTH = Math.pow(2, 17);\nfunction random() {\n return ('000000' + Math.floor(Math.random() * 1e16)).slice(-16);\n}\n\nfunction isRealtime(client: BaseClient): client is BaseRealtime {\n return !!(client as BaseRealtime).connection;\n}\n\n/* A client auth callback may give errors in any number of formats; normalise to an ErrorInfo or PartialErrorInfo */\nfunction normaliseAuthcallbackError(err: any) {\n if (!Utils.isErrorInfoOrPartialErrorInfo(err)) {\n return new ErrorInfo(Utils.inspectError(err), err.code || 40170, err.statusCode || 401);\n }\n /* network errors will not have an inherent error code */\n if (!err.code) {\n if (err.statusCode === 403) {\n err.code = 40300;\n } else {\n err.code = 40170;\n /* normalise statusCode to 401 per RSA4e */\n err.statusCode = 401;\n }\n }\n return err;\n}\n\nlet hmac = (text: string, key: string): string => {\n const bufferUtils = Platform.BufferUtils;\n\n const textBuffer = bufferUtils.utf8Encode(text);\n const keyBuffer = bufferUtils.utf8Encode(key);\n\n const digest = bufferUtils.hmacSha256(textBuffer, keyBuffer);\n\n return bufferUtils.base64Encode(digest);\n};\n\nfunction c14n(capability?: string | Record<string, Array<string>>) {\n if (!capability) return '';\n\n if (typeof capability == 'string') capability = JSON.parse(capability);\n\n const c14nCapability: Record<string, Array<string>> = Object.create(null);\n const keys = Utils.keysArray(capability as Record<string, Array<string>>, true);\n if (!keys) return '';\n keys.sort();\n for (let i = 0; i < keys.length; i++) {\n c14nCapability[keys[i]] = (capability as Record<string, Array<string>>)[keys[i]].sort();\n }\n return JSON.stringify(c14nCapability);\n}\n\nfunction logAndValidateTokenAuthMethod(authOptions: AuthOptions, logger: Logger) {\n if (authOptions.authCallback) {\n Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with authCallback');\n } else if (authOptions.authUrl) {\n Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with authUrl');\n } else if (authOptions.key) {\n Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with client-side signing');\n } else if (authOptions.tokenDetails) {\n Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with supplied token only');\n } else {\n const msg = 'authOptions must include valid authentication parameters';\n Logger.logAction(logger, Logger.LOG_ERROR, 'Auth()', msg);\n throw new Error(msg);\n }\n}\n\nfunction basicAuthForced(options: ClientOptions) {\n return 'useTokenAuth' in options && !options.useTokenAuth;\n}\n\n/* RSA4 */\nexport function useTokenAuth(options: ClientOptions) {\n return (\n options.useTokenAuth ||\n (!basicAuthForced(options) && (options.authCallback || options.authUrl || options.token || options.tokenDetails))\n );\n}\n\n/* RSA4a */\nfunction noWayToRenew(options: ClientOptions) {\n return !options.key && !options.authCallback && !options.authUrl;\n}\n\nlet trId = 0;\nfunction getTokenRequestId() {\n return trId++;\n}\n\n/**\n * Auth options used only for testing.\n */\ntype PrivateAuthOptions = {\n requestHeaders?: Record<string, string>;\n suppressMaxLengthCheck?: boolean;\n};\n\ntype AuthOptions = API.AuthOptions & PrivateAuthOptions;\n\nclass Auth {\n client: BaseClient;\n tokenParams: API.TokenParams;\n currentTokenRequestId: number | null;\n waitingForTokenRequest: MulticasterInstance<API.TokenDetails> | null;\n // This initialization is always overwritten and only used to prevent a TypeScript compiler error\n authOptions: AuthOptions = {} as AuthOptions;\n tokenDetails?: API.TokenDetails | null;\n method?: string;\n key?: string;\n basicKey?: string;\n clientId?: string | null;\n\n constructor(client: BaseClient, options: ClientOptions) {\n this.client = client;\n this.tokenParams = options.defaultTokenParams || {};\n /* The id of the current token request if one is in progress, else null */\n this.currentTokenRequestId = null;\n this.waitingForTokenRequest = null;\n\n if (useTokenAuth(options)) {\n /* Token auth */\n if (noWayToRenew(options)) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Auth()',\n 'Warning: library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help',\n );\n }\n this._saveTokenOptions(options.defaultTokenParams as API.TokenDetails, options);\n logAndValidateTokenAuthMethod(this.authOptions, this.logger);\n } else {\n /* Basic auth */\n if (!options.key) {\n const msg =\n 'No authentication options provided; need one of: key, authUrl, or authCallback (or for testing only, token or tokenDetails)';\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth()', msg);\n throw new ErrorInfo(msg, 40160, 401);\n }\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth()', 'anonymous, using basic auth');\n this._saveBasicOptions(options);\n }\n }\n\n get logger(): Logger {\n return this.client.logger;\n }\n\n /**\n * Instructs the library to get a token immediately and ensures Token Auth\n * is used for all future requests, storing the tokenParams and authOptions\n * given as the new defaults for subsequent use.\n */\n async authorize(): Promise<API.TokenDetails>;\n\n /**\n * Instructs the library to get a token immediately and ensures Token Auth\n * is used for all future requests, storing the tokenParams and authOptions\n * given as the new defaults for subsequent use.\n *\n * @param tokenParams\n * an object containing the parameters for the requested token:\n *\n * - ttl: (optional) the requested life of any new token in ms. If none\n * is specified a default of 1 hour is provided. The maximum lifetime\n * is 24hours; any request exceeding that lifetime will be rejected\n * with an error.\n *\n * - capability: (optional) the capability to associate with the access token.\n * If none is specified, a token will be requested with all of the\n * capabilities of the specified key.\n *\n * - clientId: (optional) a client ID to associate with the token\n *\n * - timestamp: (optional) the time in ms since the epoch. If none is specified,\n * the system will be queried for a time value to use.\n */\n async authorize(tokenParams: API.TokenParams | null): Promise<API.TokenDetails>;\n\n /**\n * Instructs the library to get a token immediately and ensures Token Auth\n * is used for all future requests, storing the tokenParams and authOptions\n * given as the new defaults for subsequent use.\n *\n * @param tokenParams\n * an object containing the parameters for the requested token:\n *\n * - ttl: (optional) the requested life of any new token in ms. If none\n * is specified a default of 1 hour is provided. The maximum lifetime\n * is 24hours; any request exceeding that lifetime will be rejected\n * with an error.\n *\n * - capability: (optional) the capability to associate with the access token.\n * If none is specified, a token will be requested with all of the\n * capabilities of the specified key.\n *\n * - clientId: (optional) a client ID to associate with the token\n *\n * - timestamp: (optional) the time in ms since the epoch. If none is specified,\n * the system will be queried for a time value to use.\n *\n * @param authOptions\n * an object containing auth options relevant to token auth:\n *\n * - queryTime (optional) boolean indicating that the Ably system should be\n * queried for the current time when none is specified explicitly.\n *\n * - tokenDetails: (optional) object: An authenticated TokenDetails object.\n *\n * - token: (optional) string: the `token` property of a tokenDetails object\n *\n * - authCallback: (optional) a JavaScript callback to be called to get auth information.\n * authCallback should be a function of (tokenParams, callback) that calls\n * the callback with (err, result), where result is any of:\n * - a tokenRequest object (ie the result of a rest.auth.createTokenRequest call),\n * - a tokenDetails object (ie the result of a rest.auth.requestToken call),\n * - a token string\n *\n * - authUrl: (optional) a URL to be used to GET or POST a set of token request\n * params, to obtain a signed token request.\n *\n * - authHeaders: (optional) a set of application-specific headers to be added to any request\n * made to the authUrl.\n *\n * - authParams: (optional) a set of application-specific query params to be added to any\n * request made to the authUrl.\n *\n *\n * - requestHeaders (optional, unsupported, for testing only) extra headers to add to the\n * requestToken request\n */\n async authorize(tokenParams: API.TokenParams | null, authOptions: AuthOptions | null): Promise<API.TokenDetails>;\n\n async authorize(\n tokenParams?: Record<string, any> | null,\n authOptions?: AuthOptions | null,\n ): Promise<API.TokenDetails> {\n /* RSA10a: authorize() call implies token auth. If a key is passed it, we\n * just check if it doesn't clash and assume we're generating a token from it */\n if (authOptions && authOptions.key && this.authOptions.key !== authOptions.key) {\n throw new ErrorInfo('Unable to update auth options with incompatible key', 40102, 401);\n }\n\n try {\n let tokenDetails = await this._forceNewToken(tokenParams ?? null, authOptions ?? null);\n\n /* RTC8\n * - When authorize called by an end user and have a realtime connection,\n * don't call back till new token has taken effect.\n * - Use this.client.connection as a proxy for (this.client instanceof BaseRealtime),\n * which doesn't work in node as BaseRealtime isn't part of the vm context for Rest clients */\n if (isRealtime(this.client)) {\n return new Promise((resolve, reject) => {\n (this.client as BaseRealtime).connection.connectionManager.onAuthUpdated(\n tokenDetails,\n (err: unknown, tokenDetails?: API.TokenDetails) => (err ? reject(err) : resolve(tokenDetails!)),\n );\n });\n } else {\n return tokenDetails;\n }\n } catch (err) {\n if ((this.client as BaseRealtime).connection && (err as ErrorInfo).statusCode === HttpStatusCodes.Forbidden) {\n /* Per RSA4d & RSA4d1, if the auth server explicitly repudiates our right to\n * stay connecticed by returning a 403, we actively disconnect the connection\n * even though we may well still have time left in the old token. */\n (this.client as BaseRealtime).connection.connectionManager.actOnErrorFromAuthorize(err as ErrorInfo);\n }\n throw err;\n }\n }\n\n /* For internal use, eg by connectionManager - useful when want to call back\n * as soon as we have the new token, rather than waiting for it to take\n * effect on the connection as #authorize does */\n async _forceNewToken(\n tokenParams: API.TokenParams | null,\n authOptions: AuthOptions | null,\n ): Promise<API.TokenDetails> {\n /* get rid of current token even if still valid */\n this.tokenDetails = null;\n\n /* _save normalises the tokenParams and authOptions and updates the auth\n * object. All subsequent operations should use the values on `this`,\n * not the passed in ones. */\n this._saveTokenOptions(tokenParams, authOptions);\n\n logAndValidateTokenAuthMethod(this.authOptions, this.logger);\n\n try {\n return this._ensureValidAuthCredentials(true);\n } finally {\n /* RSA10g */\n delete this.tokenParams.timestamp;\n delete this.authOptions.queryTime;\n }\n }\n\n /**\n * Request an access token\n */\n async requestToken(): Promise<API.TokenDetails>;\n\n /**\n * Request an access token\n * @param tokenParams\n * an object containing the parameters for the requested token:\n * - ttl: (optional) the requested life of the token in milliseconds. If none is specified\n * a default of 1 hour is provided. The maximum lifetime is 24hours; any request\n * exceeding that lifetime will be rejected with an error.\n *\n * - capability: (optional) the capability to associate with the access token.\n * If none is specified, a token will be requested with all of the\n * capabilities of the specified key.\n *\n * - clientId: (optional) a client ID to associate with the token; if not\n * specified, a clientId passed in constructing the Rest interface will be used\n *\n * - timestamp: (optional) the time in ms since the epoch. If none is specified,\n * the system will be queried for a time value to use.\n */\n async requestToken(tokenParams: API.TokenParams | null): Promise<API.TokenDetails>;\n\n /**\n * Request an access token\n * @param tokenParams\n * an object containing the parameters for the requested token:\n * - ttl: (optional) the requested life of the token in milliseconds. If none is specified\n * a default of 1 hour is provided. The maximum lifetime is 24hours; any request\n * exceeding that lifetime will be rejected with an error.\n *\n * - capability: (optional) the capability to associate with the access token.\n * If none is specified, a token will be requested with all of the\n * capabilities of the specified key.\n *\n * - clientId: (optional) a client ID to associate with the token; if not\n * specified, a clientId passed in constructing the Rest interface will be used\n *\n * - timestamp: (optional) the time in ms since the epoch. If none is specified,\n * the system will be queried for a time value to use.\n *\n * @param authOptions\n * an object containing the request options:\n * - key: the key to use.\n *\n * - authCallback: (optional) a JavaScript callback to be called to get auth information.\n * authCallback should be a function of (tokenParams, callback) that calls\n * the callback with (err, result), where result is any of:\n * - a tokenRequest object (ie the result of a rest.auth.createTokenRequest call),\n * - a tokenDetails object (ie the result of a rest.auth.requestToken call),\n * - a token string\n *\n * - authUrl: (optional) a URL to be used to GET or POST a set of token request\n * params, to obtain a signed token request.\n *\n * - authHeaders: (optional) a set of application-specific headers to be added to any request\n * made to the authUrl.\n *\n * - authParams: (optional) a set of application-specific query params to be added to any\n * request made to the authUrl.\n *\n * - queryTime (optional) boolean indicating that the ably system should be\n * queried for the current time when none is specified explicitly\n *\n * - requestHeaders (optional, unsupported, for testing only) extra headers to add to the\n * requestToken request\n */\n async requestToken(tokenParams: API.TokenParams | null, authOptions: AuthOptions): Promise<API.TokenDetails>;\n\n async requestToken(tokenParams?: API.TokenParams | null, authOptions?: AuthOptions): Promise<API.TokenDetails> {\n /* RSA8e: if authOptions passed in, they're used instead of stored, don't merge them */\n const resolvedAuthOptions = authOptions || this.authOptions;\n const resolvedTokenParams = tokenParams || Utils.copy(this.tokenParams);\n\n /* first set up whatever callback will be used to get signed\n * token requests */\n let tokenRequestCallback: (\n data: API.TokenParams,\n callback: (\n error: API.ErrorInfo | RequestResultError | string | null,\n tokenRequestOrDetails: API.TokenDetails | API.TokenRequest | string | null,\n contentType?: string,\n ) => void,\n ) => void,\n client = this.client;\n\n if (resolvedAuthOptions.authCallback) {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.requestToken()', 'using token auth with authCallback');\n tokenRequestCallback = resolvedAuthOptions.authCallback;\n } else if (resolvedAuthOptions.authUrl) {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.requestToken()', 'using token auth with authUrl');\n tokenRequestCallback = (params, cb) => {\n const authHeaders = Utils.mixin(\n { accept: 'application/json, text/plain' },\n resolvedAuthOptions.authHeaders,\n ) as Record<string, string>;\n const usePost = resolvedAuthOptions.authMethod && resolvedAuthOptions.authMethod.toLowerCase() === 'post';\n let providedQsParams;\n /* Combine authParams with any qs params given in the authUrl */\n const queryIdx = resolvedAuthOptions.authUrl!.indexOf('?');\n if (queryIdx > -1) {\n providedQsParams = Utils.parseQueryString(resolvedAuthOptions.authUrl!.slice(queryIdx));\n resolvedAuthOptions.authUrl = resolvedAuthOptions.authUrl!.slice(0, queryIdx);\n if (!usePost) {\n /* In case of conflict, authParams take precedence over qs params in the authUrl */\n resolvedAuthOptions.authParams = Utils.mixin(\n providedQsParams,\n resolvedAuthOptions.authParams,\n ) as typeof resolvedAuthOptions.authParams;\n }\n }\n /* RSA8c2 */\n const authParams = Utils.mixin({}, resolvedAuthOptions.authParams || {}, params) as RequestParams;\n const authUrlRequestCallback = (result: RequestResult) => {\n let body = (result.body ?? null) as string | Bufferlike | API.TokenDetails | API.TokenRequest | null;\n\n let contentType: string | null = null;\n if (result.error) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Auth.requestToken().tokenRequestCallback',\n 'Received Error: ' + Utils.inspectError(result.error),\n );\n } else {\n const contentTypeHeaderOrHeaders = result.headers!['content-type'] ?? null;\n if (Array.isArray(contentTypeHeaderOrHeaders)) {\n // Combine multiple header values into a comma-separated list per https://datatracker.ietf.org/doc/html/rfc9110#section-5.2; see https://github.com/ably/ably-js/issues/1616 for doing this consistently across the codebase.\n contentType = contentTypeHeaderOrHeaders.join(', ');\n } else {\n contentType = contentTypeHeaderOrHeaders;\n }\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Auth.requestToken().tokenRequestCallback',\n 'Received; content-type: ' + contentType + '; body: ' + Utils.inspectBody(body),\n );\n }\n if (result.error) {\n cb(result.error, null);\n return;\n }\n if (result.unpacked) {\n cb(null, body as Exclude<typeof body, Bufferlike>);\n return;\n }\n if (Platform.BufferUtils.isBuffer(body)) body = body.toString();\n if (!contentType) {\n cb(new ErrorInfo('authUrl response is missing a content-type header', 40170, 401), null);\n return;\n }\n const json = contentType.indexOf('application/json') > -1,\n text = contentType.indexOf('text/plain') > -1 || contentType.indexOf('application/jwt') > -1;\n if (!json && !text) {\n cb(\n new ErrorInfo(\n 'authUrl responded with unacceptable content-type ' +\n contentType +\n ', should be either text/plain, application/jwt or application/json',\n 40170,\n 401,\n ),\n null,\n );\n return;\n }\n if (json) {\n if ((body as string).length > MAX_TOKEN_LENGTH) {\n cb(new ErrorInfo('authUrl response exceeded max permitted length', 40170, 401), null);\n return;\n }\n try {\n body = JSON.parse(body as string);\n } catch (e) {\n cb(\n new ErrorInfo(\n 'Unexpected error processing authURL response; err = ' + (e as Error).message,\n 40170,\n 401,\n ),\n null,\n );\n return;\n }\n }\n cb(null, body as Exclude<typeof body, Bufferlike>, contentType);\n };\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Auth.requestToken().tokenRequestCallback',\n 'Requesting token from ' +\n resolvedAuthOptions.authUrl +\n '; Params: ' +\n JSON.stringify(authParams) +\n '; method: ' +\n (usePost ? 'POST' : 'GET'),\n );\n if (usePost) {\n /* send body form-encoded */\n const headers = authHeaders || {};\n headers['content-type'] = 'application/x-www-form-urlencoded';\n const body = Utils.toQueryString(authParams).slice(1); /* slice is to remove the initial '?' */\n Utils.whenPromiseSettles(\n this.client.http.doUri(\n HttpMethods.Post,\n resolvedAuthOptions.authUrl!,\n headers,\n body,\n providedQsParams as Record<string, string>,\n ),\n (err: any, result) =>\n err\n ? authUrlRequestCallback(err) // doUri isn’t meant to throw an error, but handle any just in case\n : authUrlRequestCallback(result!),\n );\n } else {\n Utils.whenPromiseSettles(\n this.client.http.doUri(HttpMethods.Get, resolvedAuthOptions.authUrl!, authHeaders || {}, null, authParams),\n (err: any, result) =>\n err\n ? authUrlRequestCallback(err) // doUri isn’t meant to throw an error, but handle any just in case\n : authUrlRequestCallback(result!),\n );\n }\n };\n } else if (resolvedAuthOptions.key) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'Auth.requestToken()',\n 'using token auth with client-side signing',\n );\n tokenRequestCallback = (params, cb) => {\n Utils.whenPromiseSettles(this.createTokenRequest(params, resolvedAuthOptions), (err, result) =>\n cb(err as string | ErrorInfo | null, result ?? null),\n );\n };\n } else {\n const msg =\n 'Need a new token, but authOptions does not include any way to request one (no authUrl, authCallback, or key)';\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Auth()',\n 'library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help',\n );\n throw new ErrorInfo(msg, 40171, 403);\n }\n\n /* normalise token params */\n if ('capability' in (resolvedTokenParams as Record<string, any>))\n (resolvedTokenParams as Record<string, any>).capability = c14n(\n (resolvedTokenParams as Record<string, any>).capability,\n );\n\n const tokenRequest = (\n signedTokenParams: Record<string, any>,\n tokenCb: (err: RequestResultError | null, tokenResponse?: API.TokenDetails | string, unpacked?: boolean) => void,\n ) => {\n const keyName = signedTokenParams.keyName,\n path = '/keys/' + keyName + '/requestToken',\n tokenUri = function (host: string) {\n return client.baseUri(host) + path;\n };\n\n const requestHeaders = Defaults.defaultPostHeaders(this.client.options, { format: Utils.Format.json });\n if (resolvedAuthOptions.requestHeaders) Utils.mixin(requestHeaders, resolvedAuthOptions.requestHeaders);\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Auth.requestToken().requestToken',\n 'Sending POST to ' + path + '; Token params: ' + JSON.stringify(signedTokenParams),\n );\n Utils.whenPromiseSettles(\n this.client.http.do(HttpMethods.Post, tokenUri, requestHeaders, JSON.stringify(signedTokenParams), null),\n (err: any, result) =>\n err\n ? tokenCb(err) // doUri isn’t meant to throw an error, but handle any just in case\n : tokenCb(result!.error, result!.body as API.TokenDetails | string | undefined, result!.unpacked),\n );\n };\n\n return new Promise((resolve, reject) => {\n let tokenRequestCallbackTimeoutExpired = false,\n timeoutLength = this.client.options.timeouts.realtimeRequestTimeout,\n tokenRequestCallbackTimeout = setTimeout(() => {\n tokenRequestCallbackTimeoutExpired = true;\n const msg = 'Token request callback timed out after ' + timeoutLength / 1000 + ' seconds';\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', msg);\n reject(new ErrorInfo(msg, 40170, 401));\n }, timeoutLength);\n\n tokenRequestCallback!(resolvedTokenParams, (err, tokenRequestOrDetails, contentType) => {\n if (tokenRequestCallbackTimeoutExpired) return;\n clearTimeout(tokenRequestCallbackTimeout);\n\n if (err) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Auth.requestToken()',\n 'token request signing call returned error; err = ' + Utils.inspectError(err),\n );\n reject(normaliseAuthcallbackError(err));\n return;\n }\n /* the response from the callback might be a token string, a signed request or a token details */\n if (typeof tokenRequestOrDetails === 'string') {\n if (tokenRequestOrDetails.length === 0) {\n reject(new ErrorInfo('Token string is empty', 40170, 401));\n } else if (tokenRequestOrDetails.length > MAX_TOKEN_LENGTH) {\n reject(\n new ErrorInfo(\n 'Token string exceeded max permitted length (was ' + tokenRequestOrDetails.length + ' bytes)',\n 40170,\n 401,\n ),\n );\n } else if (tokenRequestOrDetails === 'undefined' || tokenRequestOrDetails === 'null') {\n /* common failure mode with poorly-implemented authCallbacks */\n reject(new ErrorInfo('Token string was literal null/undefined', 40170, 401));\n } else if (\n tokenRequestOrDetails[0] === '{' &&\n !(contentType && contentType.indexOf('application/jwt') > -1)\n ) {\n reject(\n new ErrorInfo(\n \"Token was double-encoded; make sure you're not JSON-encoding an already encoded token request or details\",\n 40170,\n 401,\n ),\n );\n } else {\n resolve({ token: tokenRequestOrDetails } as API.TokenDetails);\n }\n return;\n }\n if (typeof tokenRequestOrDetails !== 'object' || tokenRequestOrDetails === null) {\n const msg =\n 'Expected token request callback to call back with a token string or token request/details object, but got a ' +\n typeof tokenRequestOrDetails;\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', msg);\n reject(new ErrorInfo(msg, 40170, 401));\n return;\n }\n const objectSize = JSON.stringify(tokenRequestOrDetails).length;\n if (objectSize > MAX_TOKEN_LENGTH && !resolvedAuthOptions.suppressMaxLengthCheck) {\n reject(\n new ErrorInfo(\n 'Token request/details object exceeded max permitted stringified size (was ' + objectSize + ' bytes)',\n 40170,\n 401,\n ),\n );\n return;\n }\n if ('issued' in tokenRequestOrDetails) {\n /* a tokenDetails object */\n resolve(tokenRequestOrDetails);\n return;\n }\n if (!('keyName' in tokenRequestOrDetails)) {\n const msg =\n 'Expected token request callback to call back with a token string, token request object, or token details object';\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', msg);\n reject(new ErrorInfo(msg, 40170, 401));\n return;\n }\n /* it's a token request, so make the request */\n tokenRequest(tokenRequestOrDetails, (err, tokenResponse, unpacked) => {\n if (err) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Auth.requestToken()',\n 'token request API call returned error; err = ' + Utils.inspectError(err),\n );\n reject(normaliseAuthcallbackError(err));\n return;\n }\n if (!unpacked) tokenResponse = JSON.parse(tokenResponse as string);\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.getToken()', 'token received');\n resolve(tokenResponse as API.TokenDetails);\n });\n });\n });\n }\n\n /**\n * Create and sign a token request based on the given options.\n * NOTE this can only be used when the key value is available locally.\n * Otherwise, signed token requests must be obtained from the key\n * owner (either using the token request callback or url).\n *\n * @param authOptions\n * an object containing the request options:\n * - key: the key to use. If not specified, a key passed in constructing\n * the Rest interface will be used\n *\n * - queryTime (optional) boolean indicating that the ably system should be\n * queried for the current time when none is specified explicitly\n *\n * - requestHeaders (optional, unsupported, for testing only) extra headers to add to the\n * requestToken request\n *\n * @param tokenParams\n * an object containing the parameters for the requested token:\n * - ttl: (optional) the requested life of the token in ms. If none is specified\n * a default of 1 hour is provided. The maximum lifetime is 24hours; any request\n * exceeding that lifetime will be rejected with an error.\n *\n * - capability: (optional) the capability to associate with the access token.\n * If none is specified, a token will be requested with all of the\n * capabilities of the specified key.\n *\n * - clientId: (optional) a client ID to associate with the token; if not\n * specified, a clientId passed in constructing the Rest interface will be used\n *\n * - timestamp: (optional) the time in ms since the epoch. If none is specified,\n * the system will be queried for a time value to use.\n */\n async createTokenRequest(tokenParams: API.TokenParams | null, authOptions: any): Promise<API.TokenRequest> {\n /* RSA9h: if authOptions passed in, they're used instead of stored, don't merge them */\n authOptions = authOptions || this.authOptions;\n tokenParams = tokenParams || Utils.copy<API.TokenParams>(this.tokenParams);\n\n const key = authOptions.key;\n if (!key) {\n throw new ErrorInfo('No key specified', 40101, 403);\n }\n const keyParts = key.split(':'),\n keyName = keyParts[0],\n keySecret = keyParts[1];\n\n if (!keySecret) {\n throw new ErrorInfo('Invalid key specified', 40101, 403);\n }\n\n if (tokenParams.clientId === '') {\n throw new ErrorInfo('clientId can’t be an empty string', 40012, 400);\n }\n\n if ('capability' in tokenParams) {\n tokenParams.capability = c14n(tokenParams.capability);\n }\n\n const request: Partial<API.TokenRequest> = Utils.mixin({ keyName: keyName }, tokenParams),\n clientId = tokenParams.clientId || '',\n ttl = tokenParams.ttl || '',\n capability = tokenParams.capability || '';\n\n if (!request.timestamp) {\n request.timestamp = await this._getTimestamp(authOptions && authOptions.queryTime);\n }\n\n /* nonce */\n /* NOTE: there is no expectation that the client\n * specifies the nonce; this is done by the library\n * However, this can be overridden by the client\n * simply for testing purposes. */\n const nonce = request.nonce || (request.nonce = random()),\n timestamp = request.timestamp;\n\n const signText =\n request.keyName + '\\n' + ttl + '\\n' + capability + '\\n' + clientId + '\\n' + timestamp + '\\n' + nonce + '\\n';\n\n /* mac */\n /* NOTE: there is no expectation that the client\n * specifies the mac; this is done by the library\n * However, this can be overridden by the client\n * simply for testing purposes. */\n request.mac = request.mac || hmac(signText, keySecret);\n\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.getTokenRequest()', 'generated signed request');\n\n return request as API.TokenRequest;\n }\n\n /**\n * Get the auth query params to use for a websocket connection,\n * based on the current auth parameters\n */\n async getAuthParams(): Promise<Record<string, string>> {\n if (this.method == 'basic') return { key: this.key! };\n else {\n let tokenDetails = await this._ensureValidAuthCredentials(false);\n if (!tokenDetails) {\n throw new Error('Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails');\n }\n return { access_token: tokenDetails.token };\n }\n }\n\n /**\n * Get the authorization header to use for a REST or comet request,\n * based on the current auth parameters\n */\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.method == 'basic') {\n return { authorization: 'Basic ' + this.basicKey };\n } else {\n const tokenDetails = await this._ensureValidAuthCredentials(false);\n if (!tokenDetails) {\n throw new Error('Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails');\n }\n return { authorization: 'Bearer ' + Utils.toBase64(tokenDetails.token) };\n }\n }\n\n _saveBasicOptions(authOptions: AuthOptions) {\n this.method = 'basic';\n this.key = authOptions.key;\n this.basicKey = Utils.toBase64(authOptions.key as string);\n this.authOptions = authOptions || {};\n if ('clientId' in authOptions) {\n this._userSetClientId(authOptions.clientId);\n }\n }\n\n _saveTokenOptions(tokenParams: API.TokenParams | null, authOptions: AuthOptions | null) {\n this.method = 'token';\n\n if (tokenParams) {\n /* We temporarily persist tokenParams.timestamp in case a new token needs\n * to be requested, then null it out in the callback of\n * _ensureValidAuthCredentials for RSA10g compliance */\n this.tokenParams = tokenParams;\n }\n\n if (authOptions) {\n /* normalise */\n if (authOptions.token) {\n /* options.token may contain a token string or, for convenience, a TokenDetails */\n authOptions.tokenDetails =\n typeof authOptions.token === 'string'\n ? ({ token: authOptions.token } as API.TokenDetails)\n : authOptions.token;\n }\n\n if (authOptions.tokenDetails) {\n this.tokenDetails = authOptions.tokenDetails;\n }\n\n if ('clientId' in authOptions) {\n this._userSetClientId(authOptions.clientId);\n }\n\n this.authOptions = authOptions;\n }\n }\n\n /* @param forceSupersede: force a new token request even if there's one in\n * progress, making all pending callbacks wait for the new one */\n async _ensureValidAuthCredentials(forceSupersede: boolean): Promise<API.TokenDetails> {\n const token = this.tokenDetails;\n\n if (token) {\n if (this._tokenClientIdMismatch(token.clientId)) {\n /* 403 to trigger a permanently failed client - RSA15c */\n throw new ErrorInfo(\n 'Mismatch between clientId in token (' + token.clientId + ') and current clientId (' + this.clientId + ')',\n 40102,\n 403,\n );\n }\n /* RSA4b1 -- if we have a server time offset set already, we can\n * automatically remove expired tokens. Else just use the cached token. If it is\n * expired Ably will tell us and we'll discard it then. */\n if (!this.client.isTimeOffsetSet() || !token.expires || token.expires >= this.client.getTimestampUsingOffset()) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'Auth.getToken()',\n 'using cached token; expires = ' + token.expires,\n );\n return token;\n }\n /* expired, so remove and fallthrough to getting a new one */\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.getToken()', 'deleting expired token');\n this.tokenDetails = null;\n }\n\n const promise = (\n this.waitingForTokenRequest || (this.waitingForTokenRequest = Multicaster.create(this.logger))\n ).createPromise();\n if (this.currentTokenRequestId !== null && !forceSupersede) {\n return promise;\n }\n\n /* Request a new token */\n const tokenRequestId = (this.currentTokenRequestId = getTokenRequestId());\n\n let tokenResponse: API.TokenDetails,\n caughtError: ErrorInfo | null = null;\n try {\n tokenResponse = await this.requestToken(this.tokenParams, this.authOptions);\n } catch (err) {\n caughtError = err as ErrorInfo;\n }\n\n if ((this.currentTokenRequestId as number) > tokenRequestId) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'Auth._ensureValidAuthCredentials()',\n 'Discarding token request response; overtaken by newer one',\n );\n return promise;\n }\n\n this.currentTokenRequestId = null;\n const multicaster = this.waitingForTokenRequest;\n this.waitingForTokenRequest = null;\n if (caughtError) {\n multicaster?.rejectAll(caughtError);\n return promise;\n }\n multicaster?.resolveAll((this.tokenDetails = tokenResponse!));\n\n return promise;\n }\n\n /* User-set: check types, '*' is disallowed, throw any errors */\n _userSetClientId(clientId: string | undefined) {\n if (!(typeof clientId === 'string' || clientId === null)) {\n throw new ErrorInfo('clientId must be either a string or null', 40012, 400);\n } else if (clientId === '*') {\n throw new ErrorInfo(\n 'Can’t use \"*\" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, instantiate the library with {defaultTokenParams: {clientId: \"*\"}}), or if calling authorize(), pass it in as a tokenParam: authorize({clientId: \"*\"}, authOptions)',\n 40012,\n 400,\n );\n } else {\n const err = this._uncheckedSetClientId(clientId);\n if (err) throw err;\n }\n }\n\n /* Ably-set: no typechecking, '*' is allowed but not set on this.clientId), return errors to the caller */\n _uncheckedSetClientId(clientId: string | undefined) {\n if (this._tokenClientIdMismatch(clientId)) {\n /* Should never happen in normal circumstances as realtime should\n * recognise mismatch and return an error */\n const msg = 'Unexpected clientId mismatch: client has ' + this.clientId + ', requested ' + clientId;\n const err = new ErrorInfo(msg, 40102, 401);\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth._uncheckedSetClientId()', msg);\n return err;\n } else {\n /* RSA7a4: if options.clientId is provided and is not\n * null, it overrides defaultTokenParams.clientId */\n this.clientId = this.tokenParams.clientId = clientId;\n return null;\n }\n }\n\n _tokenClientIdMismatch(tokenClientId?: string | null): boolean {\n return !!(\n this.clientId &&\n this.clientId !== '*' &&\n tokenClientId &&\n tokenClientId !== '*' &&\n this.clientId !== tokenClientId\n );\n }\n\n static isTokenErr(error: IPartialErrorInfo) {\n return error.code && error.code >= 40140 && error.code < 40150;\n }\n\n revokeTokens(\n specifiers: TokenRevocationTargetSpecifier[],\n options?: TokenRevocationOptions,\n ): Promise<TokenRevocationResult> {\n return this.client.rest.revokeTokens(specifiers, options);\n }\n\n /**\n * Same as {@link BaseClient.getTimestamp} but also takes into account {@link Auth.authOptions}\n */\n private async _getTimestamp(queryTime: boolean): Promise<number> {\n return this.client.getTimestamp(queryTime || !!this.authOptions.queryTime);\n }\n}\n\nexport default Auth;\n","import Defaults from 'common/lib/util/defaults';\nimport Platform from 'common/platform';\nimport BaseRealtime from 'common/lib/client/baserealtime';\nimport HttpMethods from '../constants/HttpMethods';\nimport BaseClient from '../lib/client/baseclient';\nimport ErrorInfo, { IPartialErrorInfo } from '../lib/types/errorinfo';\nimport Logger from 'common/lib/util/logger';\nimport * as Utils from 'common/lib/util/utils';\n\nexport type PathParameter = string | ((host: string) => string);\nexport type ResponseHeaders = Partial<Record<string, string | string[]>>;\nexport type RequestResultError = ErrnoException | IPartialErrorInfo;\n\n/**\n * The `body`, `headers`, `unpacked`, and `statusCode` properties of a `RequestResult` may be populated even if its `error` property is non-null.\n */\nexport type RequestResult = {\n error: RequestResultError | null;\n body?: unknown;\n headers?: ResponseHeaders;\n unpacked?: boolean;\n statusCode?: number;\n};\n\nexport type RequestParams = Record<string, string> | null;\nexport type RequestBody =\n | Buffer // only on Node\n | ArrayBuffer // only on web\n | string;\n\nexport interface IPlatformHttpStatic {\n new (client?: BaseClient): IPlatformHttp;\n methods: Array<HttpMethods>;\n methodsWithBody: Array<HttpMethods>;\n methodsWithoutBody: Array<HttpMethods>;\n}\n\nexport interface IPlatformHttp {\n supportsAuthHeaders: boolean;\n supportsLinkHeaders: boolean;\n\n /**\n * This method should not throw any errors; rather, it should communicate any error by populating the {@link RequestResult.error} property of the returned {@link RequestResult}.\n */\n doUri(\n method: HttpMethods,\n uri: string,\n headers: Record<string, string> | null,\n body: RequestBody | null,\n params: RequestParams,\n ): Promise<RequestResult>;\n\n checkConnectivity?: () => Promise<boolean>;\n\n /**\n * @param error An error from the {@link RequestResult.error} property of a result returned by {@link doUri}.\n */\n shouldFallback(error: RequestResultError): boolean;\n}\n\nexport function paramString(params: Record<string, any> | null) {\n const paramPairs = [];\n if (params) {\n for (const needle in params) {\n paramPairs.push(needle + '=' + params[needle]);\n }\n }\n return paramPairs.join('&');\n}\n\nexport function appendingParams(uri: string, params: Record<string, any> | null) {\n return uri + (params ? '?' : '') + paramString(params);\n}\n\nfunction logResult(\n result: RequestResult,\n method: HttpMethods,\n uri: string,\n params: Record<string, string> | null,\n logger: Logger,\n) {\n if (result.error) {\n Logger.logActionNoStrip(\n logger,\n Logger.LOG_MICRO,\n 'Http.' + method + '()',\n 'Received Error; ' + appendingParams(uri, params) + '; Error: ' + Utils.inspectError(result.error),\n );\n } else {\n Logger.logActionNoStrip(\n logger,\n Logger.LOG_MICRO,\n 'Http.' + method + '()',\n 'Received; ' +\n appendingParams(uri, params) +\n '; Headers: ' +\n paramString(result.headers as Record<string, any>) +\n '; StatusCode: ' +\n result.statusCode +\n '; Body' +\n (Platform.BufferUtils.isBuffer(result.body)\n ? ' (Base64): ' + Platform.BufferUtils.base64Encode(result.body)\n : ': ' + result.body),\n );\n }\n}\n\nfunction logRequest(method: HttpMethods, uri: string, body: RequestBody | null, params: RequestParams, logger: Logger) {\n if (logger.shouldLog(Logger.LOG_MICRO)) {\n Logger.logActionNoStrip(\n logger,\n Logger.LOG_MICRO,\n 'Http.' + method + '()',\n 'Sending; ' +\n appendingParams(uri, params) +\n '; Body' +\n (Platform.BufferUtils.isBuffer(body) ? ' (Base64): ' + Platform.BufferUtils.base64Encode(body) : ': ' + body),\n );\n }\n}\n\nexport class Http {\n private readonly platformHttp: IPlatformHttp;\n checkConnectivity?: () => Promise<boolean>;\n\n constructor(private readonly client?: BaseClient) {\n this.platformHttp = new Platform.Http(client);\n\n this.checkConnectivity = this.platformHttp.checkConnectivity\n ? () => this.platformHttp.checkConnectivity!()\n : undefined;\n }\n\n get logger(): Logger {\n return this.client?.logger ?? Logger.defaultLogger;\n }\n\n get supportsAuthHeaders() {\n return this.platformHttp.supportsAuthHeaders;\n }\n\n get supportsLinkHeaders() {\n return this.platformHttp.supportsLinkHeaders;\n }\n\n _getHosts(client: BaseClient) {\n /* If we're a connected realtime client, try the endpoint we're connected\n * to first -- but still have fallbacks, being connected is not an absolute\n * guarantee that a datacenter has free capacity to service REST requests. */\n const connection = (client as BaseRealtime).connection,\n connectionHost = connection && connection.connectionManager.host;\n\n if (connectionHost) {\n return [connectionHost].concat(Defaults.getFallbackHosts(client.options));\n }\n\n return Defaults.getHosts(client.options);\n }\n\n /**\n * This method will not throw any errors; rather, it will communicate any error by populating the {@link RequestResult.error} property of the returned {@link RequestResult}.\n */\n async do(\n method: HttpMethods,\n path: PathParameter,\n headers: Record<string, string> | null,\n body: RequestBody | null,\n params: RequestParams,\n ): Promise<RequestResult> {\n try {\n /* Unlike for doUri, the presence of `this.client` here is mandatory, as it's used to generate the hosts */\n const client = this.client;\n if (!client) {\n return { error: new ErrorInfo('http.do called without client', 50000, 500) };\n }\n\n const uriFromHost =\n typeof path === 'function'\n ? path\n : function (host: string) {\n return client.baseUri(host) + path;\n };\n\n const currentFallback = client._currentFallback;\n if (currentFallback) {\n if (currentFallback.validUntil > Date.now()) {\n /* Use stored fallback */\n const result = await this.doUri(method, uriFromHost(currentFallback.host), headers, body, params);\n if (result.error && this.platformHttp.shouldFallback(result.error as ErrnoException)) {\n /* unstore the fallback and start from the top with the default sequence */\n client._currentFallback = null;\n return this.do(method, path, headers, body, params);\n }\n return result;\n } else {\n /* Fallback expired; remove it and fallthrough to normal sequence */\n client._currentFallback = null;\n }\n }\n\n const hosts = this._getHosts(client);\n\n /* see if we have one or more than one host */\n if (hosts.length === 1) {\n return this.doUri(method, uriFromHost(hosts[0]), headers, body, params);\n }\n\n let tryAHostStartedAt: Date | null = null;\n const tryAHost = async (candidateHosts: Array<string>, persistOnSuccess?: boolean): Promise<RequestResult> => {\n const host = candidateHosts.shift();\n tryAHostStartedAt = tryAHostStartedAt ?? new Date();\n const result = await this.doUri(method, uriFromHost(host as string), headers, body, params);\n if (result.error && this.platformHttp.shouldFallback(result.error as ErrnoException) && candidateHosts.length) {\n // TO3l6\n const elapsedTime = Date.now() - tryAHostStartedAt.getTime();\n if (elapsedTime > client.options.timeouts.httpMaxRetryDuration) {\n return {\n error: new ErrorInfo(\n `Timeout for trying fallback hosts retries. Total elapsed time exceeded the ${client.options.timeouts.httpMaxRetryDuration}ms limit`,\n 50003,\n 500,\n ),\n };\n }\n\n return tryAHost(candidateHosts, true);\n }\n if (persistOnSuccess) {\n /* RSC15f */\n client._currentFallback = {\n host: host as string,\n validUntil: Date.now() + client.options.timeouts.fallbackRetryTimeout,\n };\n }\n return result;\n };\n return tryAHost(hosts);\n } catch (err) {\n // Handle any unexpected error, to ensure we always meet our contract of not throwing any errors\n return { error: new ErrorInfo(`Unexpected error in Http.do: ${Utils.inspectError(err)}`, 500, 50000) };\n }\n }\n\n /**\n * This method will not throw any errors; rather, it will communicate any error by populating the {@link RequestResult.error} property of the returned {@link RequestResult}.\n */\n async doUri(\n method: HttpMethods,\n uri: string,\n headers: Record<string, string> | null,\n body: RequestBody | null,\n params: RequestParams,\n ): Promise<RequestResult> {\n try {\n logRequest(method, uri, body, params, this.logger);\n\n const result = await this.platformHttp.doUri(method, uri, headers, body, params);\n\n if (this.logger.shouldLog(Logger.LOG_MICRO)) {\n logResult(result, method, uri, params, this.logger);\n }\n\n return result;\n } catch (err) {\n // Handle any unexpected error, to ensure we always meet our contract of not throwing any errors\n return { error: new ErrorInfo(`Unexpected error in Http.doUri: ${Utils.inspectError(err)}`, 500, 50000) };\n }\n }\n}\n\nexport interface ErrnoException extends Error {\n errno?: number;\n code?: string;\n path?: string;\n syscall?: string;\n stack?: string;\n statusCode: number;\n}\n","import * as Utils from './utils';\nimport Logger from './logger';\nimport Platform from 'common/platform';\n\n/* Call the listener, catch any exceptions and log, but continue operation*/\nfunction callListener(logger: Logger, eventThis: { event: string }, listener: Function, args: unknown[]) {\n try {\n listener.apply(eventThis, args);\n } catch (e) {\n Logger.logAction(\n logger,\n Logger.LOG_ERROR,\n 'EventEmitter.emit()',\n 'Unexpected listener exception: ' + e + '; stack = ' + (e && (e as Error).stack),\n );\n }\n}\n\n/**\n * Remove listeners that match listener\n * @param targetListeners is an array of listener arrays or event objects with arrays of listeners\n * @param listener the listener callback to remove\n * @param eventFilter (optional) event name instructing the function to only remove listeners for the specified event\n */\nfunction removeListener(targetListeners: any, listener: Function, eventFilter?: string) {\n let listeners: Record<string, unknown>;\n let index;\n let eventName;\n\n for (let targetListenersIndex = 0; targetListenersIndex < targetListeners.length; targetListenersIndex++) {\n listeners = targetListeners[targetListenersIndex];\n if (eventFilter) {\n listeners = listeners[eventFilter] as Record<string, unknown>;\n }\n\n if (Array.isArray(listeners)) {\n while ((index = listeners.indexOf(listener)) !== -1) {\n listeners.splice(index, 1);\n }\n /* If events object has an event name key with no listeners then\n\t\t\t\t\tremove the key to stop the list growing indefinitely */\n if (eventFilter && listeners.length === 0) {\n delete targetListeners[targetListenersIndex][eventFilter];\n }\n } else if (Utils.isObject(listeners)) {\n /* events */\n for (eventName in listeners) {\n if (Object.prototype.hasOwnProperty.call(listeners, eventName) && Array.isArray(listeners[eventName])) {\n removeListener([listeners], listener, eventName);\n }\n }\n }\n }\n}\n\nclass EventEmitter {\n any: Array<Function>;\n events: Record<string, Array<Function>>;\n anyOnce: Array<Function>;\n eventsOnce: Record<string, Array<Function>>;\n\n constructor(readonly logger: Logger) {\n this.any = [];\n this.events = Object.create(null);\n this.anyOnce = [];\n this.eventsOnce = Object.create(null);\n }\n\n /**\n * Add an event listener\n * @param listener the listener to be called\n */\n on(listener: Function): void;\n\n /**\n * Add an event listener\n * @param event (optional) the name of the event to listen to\n * @param listener the listener to be called\n */\n on(event: null | string | string[], listener: Function): void;\n\n on(...args: unknown[]) {\n if (args.length === 1) {\n const listener = args[0];\n if (typeof listener === 'function') {\n this.any.push(listener);\n } else {\n throw new Error('EventListener.on(): Invalid arguments: ' + Platform.Config.inspect(args));\n }\n }\n if (args.length === 2) {\n const [event, listener] = args;\n if (typeof listener !== 'function') {\n throw new Error('EventListener.on(): Invalid arguments: ' + Platform.Config.inspect(args));\n }\n if (Utils.isNil(event)) {\n this.any.push(listener);\n } else if (Array.isArray(event)) {\n event.forEach((eventName) => {\n this.on(eventName, listener);\n });\n } else {\n if (typeof event !== 'string') {\n throw new Error('EventListener.on(): Invalid arguments: ' + Platform.Config.inspect(args));\n }\n const listeners = this.events[event] || (this.events[event] = []);\n listeners.push(listener);\n }\n }\n }\n\n /**\n * Remove one or more event listeners\n * @param listener (optional) the listener to remove. If not\n * supplied, all listeners are removed.\n */\n off(listener?: Function): void;\n\n /**\n * Remove one or more event listeners\n * @param event (optional) the name of the event whose listener\n * is to be removed. If not supplied, the listener is\n * treated as an 'any' listener\n * @param listener (optional) the listener to remove. If not\n * supplied, all listeners are removed.\n */\n off(event: string | string[] | null, listener?: Function | null): void;\n\n off(...args: unknown[]) {\n if (args.length == 0 || (Utils.isNil(args[0]) && Utils.isNil(args[1]))) {\n this.any = [];\n this.events = Object.create(null);\n this.anyOnce = [];\n this.eventsOnce = Object.create(null);\n return;\n }\n const [firstArg, secondArg] = args;\n let listener: Function | null = null;\n let event: unknown = null;\n if (args.length === 1 || !secondArg) {\n if (typeof firstArg === 'function') {\n /* we take this to be the listener and treat the event as \"any\" .. */\n listener = firstArg;\n } else {\n event = firstArg;\n }\n /* ... or we take event to be the actual event name and listener to be all */\n } else {\n if (typeof secondArg !== 'function') {\n throw new Error('EventEmitter.off(): invalid arguments:' + Platform.Config.inspect(args));\n }\n [event, listener] = [firstArg, secondArg];\n }\n\n if (listener && Utils.isNil(event)) {\n removeListener([this.any, this.events, this.anyOnce, this.eventsOnce], listener);\n return;\n }\n\n if (Array.isArray(event)) {\n event.forEach((eventName) => {\n this.off(eventName, listener);\n });\n return;\n }\n\n /* \"normal\" case where event is an actual event */\n if (typeof event !== 'string') {\n throw new Error('EventEmitter.off(): invalid arguments:' + Platform.Config.inspect(args));\n }\n if (listener) {\n removeListener([this.events, this.eventsOnce], listener, event);\n } else {\n delete this.events[event];\n delete this.eventsOnce[event];\n }\n }\n\n /**\n * Get the array of listeners for a given event; excludes once events\n * @param event (optional) the name of the event, or none for 'any'\n * @return array of events, or null if none\n */\n listeners(event: string) {\n if (event) {\n const listeners = this.events[event] || [];\n if (this.eventsOnce[event]) Array.prototype.push.apply(listeners, this.eventsOnce[event]);\n return listeners.length ? listeners : null;\n }\n return this.any.length ? this.any : null;\n }\n\n /**\n * Emit an event\n * @param event the event name\n * @param args the arguments to pass to the listener\n */\n emit(event: string, ...args: unknown[] /* , args... */) {\n const eventThis = { event };\n const listeners: Function[] = [];\n\n if (this.anyOnce.length) {\n Array.prototype.push.apply(listeners, this.anyOnce);\n this.anyOnce = [];\n }\n if (this.any.length) {\n Array.prototype.push.apply(listeners, this.any);\n }\n const eventsOnceListeners = this.eventsOnce[event];\n if (eventsOnceListeners) {\n Array.prototype.push.apply(listeners, eventsOnceListeners);\n delete this.eventsOnce[event];\n }\n const eventsListeners = this.events[event];\n if (eventsListeners) {\n Array.prototype.push.apply(listeners, eventsListeners);\n }\n\n listeners.forEach((listener) => {\n callListener(this.logger, eventThis, listener, args);\n });\n }\n\n /**\n * Listen for a single occurrence of an event\n * @param event the name of the event to listen to\n */\n once(event: string): Promise<void>;\n\n /**\n * Listen for a single occurrence of any event\n * @param listener the listener to be called\n */\n once(listener: Function): void;\n\n /**\n * Listen for a single occurrence of an event\n * @param event the name of the event to listen to\n * @param listener the listener to be called\n */\n once(event?: string | string[] | null, listener?: Function): void;\n\n once(...args: unknown[]): void | Promise<void> {\n const argCount = args.length;\n if (argCount === 0 || (argCount === 1 && typeof args[0] !== 'function')) {\n const event = args[0];\n return new Promise((resolve) => {\n this.once(event as string | string[] | null, resolve);\n });\n }\n\n const [firstArg, secondArg] = args;\n if (args.length === 1 && typeof firstArg === 'function') {\n this.anyOnce.push(firstArg);\n } else if (Utils.isNil(firstArg)) {\n if (typeof secondArg !== 'function') {\n throw new Error('EventEmitter.once(): Invalid arguments:' + Platform.Config.inspect(args));\n }\n this.anyOnce.push(secondArg);\n } else if (Array.isArray(firstArg)) {\n const self = this;\n const listenerWrapper = function (this: any) {\n const innerArgs = Array.prototype.slice.call(arguments);\n firstArg.forEach(function (eventName) {\n self.off(eventName, listenerWrapper);\n });\n if (typeof secondArg !== 'function') {\n throw new Error('EventEmitter.once(): Invalid arguments:' + Platform.Config.inspect(args));\n }\n secondArg.apply(this, innerArgs);\n };\n firstArg.forEach(function (eventName) {\n self.on(eventName, listenerWrapper);\n });\n } else {\n if (typeof firstArg !== 'string') {\n throw new Error('EventEmitter.once(): Invalid arguments:' + Platform.Config.inspect(args));\n }\n const listeners = this.eventsOnce[firstArg] || (this.eventsOnce[firstArg] = []);\n if (secondArg) {\n if (typeof secondArg !== 'function') {\n throw new Error('EventEmitter.once(): Invalid arguments:' + Platform.Config.inspect(args));\n }\n listeners.push(secondArg);\n }\n }\n }\n\n /**\n * Listen for a single occurrence of a state event and fire immediately if currentState matches targetState\n * @param targetState the name of the state event to listen to\n * @param currentState the name of the current state of this object\n */\n async whenState(targetState: string, currentState: string) {\n if (typeof targetState !== 'string' || typeof currentState !== 'string') {\n throw new Error('whenState requires a valid state String argument');\n }\n if (targetState === currentState) {\n return null;\n } else {\n return this.once(targetState);\n }\n }\n}\n\nexport default EventEmitter;\n","// constant definitions that can be imported by anyone without worrying about circular\n// deps\n\n// TR2\nexport const actions = {\n HEARTBEAT: 0,\n ACK: 1,\n NACK: 2,\n CONNECT: 3,\n CONNECTED: 4,\n DISCONNECT: 5,\n DISCONNECTED: 6,\n CLOSE: 7,\n CLOSED: 8,\n ERROR: 9,\n ATTACH: 10,\n ATTACHED: 11,\n DETACH: 12,\n DETACHED: 13,\n PRESENCE: 14,\n MESSAGE: 15,\n SYNC: 16,\n AUTH: 17,\n ACTIVATE: 18,\n OBJECT: 19,\n OBJECT_SYNC: 20,\n ANNOTATION: 21,\n};\n\nexport const ActionName: string[] = [];\nObject.keys(actions).forEach(function (name) {\n ActionName[(actions as { [key: string]: number })[name]] = name;\n});\n\n// TR3\nexport const flags: { [key: string]: number } = {\n /* Channel attach state flags */\n HAS_PRESENCE: 1 << 0,\n HAS_BACKLOG: 1 << 1,\n RESUMED: 1 << 2,\n TRANSIENT: 1 << 4,\n ATTACH_RESUME: 1 << 5,\n HAS_OBJECTS: 1 << 7,\n /* Channel mode flags */\n PRESENCE: 1 << 16,\n PUBLISH: 1 << 17,\n SUBSCRIBE: 1 << 18,\n PRESENCE_SUBSCRIBE: 1 << 19,\n ANNOTATION_PUBLISH: 1 << 21,\n ANNOTATION_SUBSCRIBE: 1 << 22,\n OBJECT_SUBSCRIBE: 1 << 24,\n OBJECT_PUBLISH: 1 << 25,\n};\n\nexport const flagNames = Object.keys(flags);\n\nflags.MODE_ALL =\n flags.PRESENCE |\n flags.PUBLISH |\n flags.SUBSCRIBE |\n flags.PRESENCE_SUBSCRIBE |\n flags.ANNOTATION_PUBLISH |\n flags.ANNOTATION_SUBSCRIBE |\n flags.OBJECT_SUBSCRIBE |\n flags.OBJECT_PUBLISH;\n\nexport const channelModes = [\n 'PRESENCE',\n 'PUBLISH',\n 'SUBSCRIBE',\n 'PRESENCE_SUBSCRIBE',\n 'ANNOTATION_PUBLISH',\n 'ANNOTATION_SUBSCRIBE',\n 'OBJECT_SUBSCRIBE',\n 'OBJECT_PUBLISH',\n];\n","import Platform from 'common/platform';\nimport * as API from '../../../../ably';\nimport { Bufferlike as BrowserBufferlike } from '../../../platform/web/lib/util/bufferutils';\nimport Logger from '../util/logger';\nimport * as Utils from '../util/utils';\nimport ErrorInfo from './errorinfo';\nimport { actions } from './protocolmessagecommon';\n\nimport type { IUntypedCryptoStatic } from 'common/types/ICryptoStatic';\nimport type { ChannelOptions } from '../../types/channel';\nimport type ProtocolMessage from './protocolmessage';\n\nexport type CipherOptions = {\n channelCipher: {\n encrypt: Function;\n algorithm: 'aes';\n };\n cipher?: {\n channelCipher: {\n encrypt: Function;\n algorithm: 'aes';\n };\n };\n};\n\nexport type EncodingDecodingContext = {\n channelOptions: ChannelOptions;\n plugins: {\n vcdiff?: {\n decode: (delta: Uint8Array, source: Uint8Array) => Uint8Array;\n };\n };\n baseEncodedPreviousPayload?: Buffer | BrowserBufferlike;\n};\n\nfunction normaliseContext(context: CipherOptions | EncodingDecodingContext | ChannelOptions): EncodingDecodingContext {\n if (!context || !(context as EncodingDecodingContext).channelOptions) {\n return {\n channelOptions: context as ChannelOptions,\n plugins: {},\n baseEncodedPreviousPayload: undefined,\n };\n }\n return context as EncodingDecodingContext;\n}\n\nexport function normalizeCipherOptions(\n Crypto: IUntypedCryptoStatic | null,\n logger: Logger,\n options: API.ChannelOptions | null,\n): ChannelOptions {\n if (options && options.cipher) {\n if (!Crypto) Utils.throwMissingPluginError('Crypto');\n const cipher = Crypto.getCipher(options.cipher, logger);\n return {\n cipher: cipher.cipherParams,\n channelCipher: cipher.cipher,\n };\n }\n return options ?? {};\n}\n\nasync function encrypt<T extends BaseMessage>(msg: T, cipherOptions: CipherOptions): Promise<T> {\n const { data, encoding } = await encryptData(msg.data, msg.encoding, cipherOptions);\n msg.data = data;\n msg.encoding = encoding;\n return msg;\n}\n\nexport async function encryptData(\n data: any,\n encoding: string | null | undefined,\n cipherOptions: CipherOptions,\n): Promise<{ data: any; encoding: string | null | undefined }> {\n let cipher = cipherOptions.channelCipher;\n let dataToEncrypt = data;\n let finalEncoding = encoding ? encoding + '/' : '';\n\n if (!Platform.BufferUtils.isBuffer(dataToEncrypt)) {\n dataToEncrypt = Platform.BufferUtils.utf8Encode(String(dataToEncrypt));\n finalEncoding = finalEncoding + 'utf-8/';\n }\n\n const ciphertext = await cipher.encrypt(dataToEncrypt);\n finalEncoding = finalEncoding + 'cipher+' + cipher.algorithm;\n\n return {\n data: ciphertext,\n encoding: finalEncoding,\n };\n}\n\n/**\n * Encodes and encrypts message's payload. Mutates the message object.\n * Implements RSL4 and RSL5.\n */\nexport async function encode<T extends BaseMessage>(msg: T, options: unknown): Promise<T> {\n const { data, encoding } = encodeData(msg.data, msg.encoding);\n\n msg.data = data;\n msg.encoding = encoding;\n\n if (options != null && (options as CipherOptions).cipher) {\n return encrypt(msg, options as CipherOptions);\n } else {\n return msg;\n }\n}\n\nexport function encodeData(\n data: any,\n encoding: string | null | undefined,\n): { data: any; encoding: string | null | undefined } {\n // RSL4a, supported types\n const nativeDataType =\n typeof data == 'string' || Platform.BufferUtils.isBuffer(data) || data === null || data === undefined;\n\n if (nativeDataType) {\n // nothing to do with the native data types at this point\n return {\n data,\n encoding,\n };\n }\n\n if (Utils.isObject(data) || Array.isArray(data)) {\n // RSL4c3 and RSL4d3, encode objects and arrays as strings\n return {\n data: JSON.stringify(data),\n encoding: encoding ? encoding + '/json' : 'json',\n };\n }\n\n // RSL4a, throw an error for unsupported types\n throw new ErrorInfo('Data type is unsupported', 40013, 400);\n}\n\nexport async function decode<T extends BaseMessage>(\n message: T,\n inputContext: CipherOptions | EncodingDecodingContext | ChannelOptions,\n): Promise<void> {\n // data can be decoded partially and throw an error on a later decoding step.\n // so we need to reassign the data and encoding values we got, and only then throw an error if there is one\n const { data, encoding, error } = await decodeData(message.data, message.encoding, inputContext);\n message.data = data;\n message.encoding = encoding;\n\n if (error) {\n throw error;\n }\n}\n\n/**\n * Implements RSL6\n */\nexport async function decodeData(\n data: any,\n encoding: string | null | undefined,\n inputContext: CipherOptions | EncodingDecodingContext | ChannelOptions,\n): Promise<{\n error?: ErrorInfo;\n data: any;\n encoding: string | null | undefined;\n}> {\n const context = normaliseContext(inputContext);\n let lastPayload = data;\n let decodedData = data;\n let finalEncoding = encoding;\n let decodingError: ErrorInfo | undefined;\n\n if (encoding) {\n const xforms = encoding.split('/');\n let lastProcessedEncodingIndex;\n let encodingsToProcess = xforms.length;\n let xform = '';\n\n try {\n while ((lastProcessedEncodingIndex = encodingsToProcess) > 0) {\n // eslint-disable-next-line security/detect-unsafe-regex\n const match = xforms[--encodingsToProcess].match(/([-\\w]+)(\\+([\\w-]+))?/);\n if (!match) break;\n xform = match[1];\n switch (xform) {\n case 'base64':\n decodedData = Platform.BufferUtils.base64Decode(String(decodedData));\n if (lastProcessedEncodingIndex == xforms.length) {\n lastPayload = decodedData;\n }\n continue;\n case 'utf-8':\n decodedData = Platform.BufferUtils.utf8Decode(decodedData);\n continue;\n case 'json':\n decodedData = JSON.parse(decodedData);\n continue;\n case 'cipher':\n if (\n context.channelOptions != null &&\n context.channelOptions.cipher &&\n context.channelOptions.channelCipher\n ) {\n const xformAlgorithm = match[3],\n cipher = context.channelOptions.channelCipher;\n /* don't attempt to decrypt unless the cipher params are compatible */\n if (xformAlgorithm != cipher.algorithm) {\n throw new Error('Unable to decrypt message with given cipher; incompatible cipher params');\n }\n decodedData = await cipher.decrypt(decodedData);\n continue;\n } else {\n throw new Error('Unable to decrypt message; not an encrypted channel');\n }\n case 'vcdiff':\n if (!context.plugins || !context.plugins.vcdiff) {\n throw new ErrorInfo('Missing Vcdiff decoder (https://github.com/ably-forks/vcdiff-decoder)', 40019, 400);\n }\n if (typeof Uint8Array === 'undefined') {\n throw new ErrorInfo(\n 'Delta decoding not supported on this browser (need ArrayBuffer & Uint8Array)',\n 40020,\n 400,\n );\n }\n try {\n let deltaBase = context.baseEncodedPreviousPayload;\n if (typeof deltaBase === 'string') {\n deltaBase = Platform.BufferUtils.utf8Encode(deltaBase);\n }\n\n // vcdiff expects Uint8Arrays, can't copy with ArrayBuffers.\n const deltaBaseBuffer = Platform.BufferUtils.toBuffer(deltaBase as Buffer);\n decodedData = Platform.BufferUtils.toBuffer(decodedData);\n\n decodedData = Platform.BufferUtils.arrayBufferViewToBuffer(\n context.plugins.vcdiff.decode(decodedData, deltaBaseBuffer),\n );\n lastPayload = decodedData;\n } catch (e) {\n throw new ErrorInfo('Vcdiff delta decode failed with ' + e, 40018, 400);\n }\n continue;\n default:\n throw new Error('Unknown encoding');\n }\n }\n } catch (e) {\n const err = e as ErrorInfo;\n decodingError = new ErrorInfo(\n `Error processing the ${xform} encoding, decoder returned ‘${err.message}’`,\n err.code || 40013,\n 400,\n );\n } finally {\n finalEncoding =\n (lastProcessedEncodingIndex as number) <= 0 ? null : xforms.slice(0, lastProcessedEncodingIndex).join('/');\n }\n }\n\n if (decodingError) {\n return {\n error: decodingError,\n data: decodedData,\n encoding: finalEncoding,\n };\n }\n\n context.baseEncodedPreviousPayload = lastPayload;\n return {\n data: decodedData,\n encoding: finalEncoding,\n };\n}\n\nexport function wireToJSON(this: BaseMessage, ...args: any[]): any {\n // encode message data for wire transmission. we can infer the format used by client by inspecting with what arguments this method was called.\n // if JSON encoding is being used, the JSON.stringify() will be called and this toJSON() method will have a non-empty arguments list.\n // MSGPack encoding implementation also calls toJSON(), but with an empty arguments list.\n const format = args.length > 0 ? Utils.Format.json : Utils.Format.msgpack;\n const { data, encoding } = encodeDataForWire(this.data, this.encoding, format);\n\n return Object.assign({}, this, { encoding, data });\n}\n\n/**\n * Prepares the payload data to be transmitted over the wire to Ably.\n * Encodes the data depending on the selected protocol format.\n *\n * Implements RSL4c1 and RSL4d1\n */\nexport function encodeDataForWire(\n data: any,\n encoding: string | null | undefined,\n format: Utils.Format,\n): { data: any; encoding: string | null | undefined } {\n if (!data || !Platform.BufferUtils.isBuffer(data)) {\n // no encoding required for non-buffer payloads\n return {\n data,\n encoding,\n };\n }\n\n if (format === Utils.Format.msgpack) {\n // RSL4c1\n // BufferUtils.toBuffer returns a datatype understandable by that platform's msgpack implementation:\n // Buffer in node, Uint8Array in browsers\n return {\n data: Platform.BufferUtils.toBuffer(data),\n encoding,\n };\n }\n\n // RSL4d1, encode binary payload as base64 string\n return {\n data: Platform.BufferUtils.base64Encode(data),\n encoding: encoding ? encoding + '/base64' : 'base64',\n };\n}\n\nexport const MessageEncoding = {\n encryptData,\n encodeData,\n encodeDataForWire,\n decodeData,\n};\n\n// in-place, generally called on the protocol message before decoding\nexport function populateFieldsFromParent(parent: ProtocolMessage) {\n const { id, connectionId, timestamp } = parent;\n\n let msgs: BaseMessage[];\n switch (parent.action) {\n case actions.MESSAGE: {\n msgs = parent.messages!;\n break;\n }\n case actions.PRESENCE:\n case actions.SYNC:\n msgs = parent.presence!;\n break;\n case actions.ANNOTATION:\n msgs = parent.annotations!;\n break;\n case actions.OBJECT:\n case actions.OBJECT_SYNC:\n msgs = parent.state!;\n break;\n default:\n throw new ErrorInfo('Unexpected action ' + parent.action, 40000, 400);\n }\n\n for (let i = 0; i < msgs.length; i++) {\n const msg = msgs[i];\n if (!msg.connectionId) {\n msg.connectionId = connectionId;\n }\n if (!msg.timestamp) {\n msg.timestamp = timestamp;\n }\n if (id && !msg.id) {\n msg.id = id + ':' + i;\n }\n }\n}\n\nexport function strMsg(m: any, cls: string) {\n let result = '[' + cls;\n for (const attr in m) {\n if (attr === 'data') {\n if (typeof m.data == 'string') {\n result += '; data=' + m.data;\n } else if (Platform.BufferUtils.isBuffer(m.data)) {\n result += '; data (buffer)=' + Platform.BufferUtils.base64Encode(m.data);\n } else if (typeof m.data !== 'undefined') {\n result += '; data (json)=' + JSON.stringify(m.data);\n }\n } else if (attr && (attr === 'extras' || attr === 'operation')) {\n result += '; ' + attr + '=' + JSON.stringify(m[attr]);\n } else if (attr === 'version') {\n result += '; version=' + JSON.stringify(m[attr]);\n } else if (attr === 'annotations') {\n result += '; annotations=' + JSON.stringify(m[attr]);\n } else if (m[attr] !== undefined) {\n result += '; ' + attr + '=' + m[attr];\n }\n }\n result += ']';\n return result;\n}\n\nexport abstract class BaseMessage {\n id?: string;\n timestamp?: number;\n clientId?: string;\n connectionId?: string;\n data?: any;\n encoding?: string | null;\n extras?: any;\n size?: number;\n}\n","import Logger, { LoggerOptions } from '../util/logger';\r\nimport Defaults from '../util/defaults';\r\nimport Auth from './auth';\r\nimport { HttpPaginatedResponse, PaginatedResult } from './paginatedresource';\r\nimport ErrorInfo from '../types/errorinfo';\r\nimport Stats from '../types/stats';\r\nimport { Http, RequestParams } from '../../types/http';\r\nimport ClientOptions, { NormalisedClientOptions } from '../../types/ClientOptions';\r\nimport * as API from '../../../../ably';\r\nimport * as Utils from '../util/utils';\r\n\r\nimport Platform from '../../platform';\r\nimport { Rest } from './rest';\r\nimport { IUntypedCryptoStatic } from 'common/types/ICryptoStatic';\r\nimport { AnnotationsPlugin } from './modularplugins';\r\nimport { throwMissingPluginError } from '../util/utils';\r\nimport { MsgPack } from 'common/types/msgpack';\r\nimport { HTTPRequestImplementations } from 'platform/web/lib/http/http';\r\nimport { FilteredSubscriptions } from './filteredsubscriptions';\r\nimport type { LocalDevice } from 'plugins/push/pushactivation';\r\nimport EventEmitter from '../util/eventemitter';\r\nimport { MessageEncoding } from '../types/basemessage';\r\nimport type * as LiveObjectsPlugin from 'plugins/liveobjects';\r\n\r\ntype BatchResult<T> = API.BatchResult<T>;\r\ntype BatchPublishSpec = API.BatchPublishSpec;\r\ntype BatchPublishSuccessResult = API.BatchPublishSuccessResult;\r\ntype BatchPublishFailureResult = API.BatchPublishFailureResult;\r\ntype BatchPublishResult = BatchResult<BatchPublishSuccessResult | BatchPublishFailureResult>;\r\ntype BatchPresenceSuccessResult = API.BatchPresenceSuccessResult;\r\ntype BatchPresenceFailureResult = API.BatchPresenceFailureResult;\r\ntype BatchPresenceResult = BatchResult<BatchPresenceSuccessResult | BatchPresenceFailureResult>;\r\n\r\n/**\r\n `BaseClient` acts as the base class for all of the client classes exported by the SDK. It is an implementation detail and this class is not advertised publicly.\r\n */\r\nclass BaseClient {\r\n options: NormalisedClientOptions;\r\n _currentFallback: null | {\r\n host: string;\r\n validUntil: number;\r\n };\r\n serverTimeOffset: number | null;\r\n http: Http;\r\n auth: Auth;\r\n\r\n private readonly _rest: Rest | null;\r\n readonly _Crypto: IUntypedCryptoStatic | null;\r\n readonly _MsgPack: MsgPack | null;\r\n // Extra HTTP request implementations available to this client, in addition to those in web’s Http.bundledRequestImplementations\r\n readonly _additionalHTTPRequestImplementations: HTTPRequestImplementations | null;\r\n private readonly __FilteredSubscriptions: typeof FilteredSubscriptions | null;\r\n readonly _Annotations: AnnotationsPlugin | null;\r\n readonly _liveObjectsPlugin: typeof LiveObjectsPlugin | null;\r\n readonly logger: Logger;\r\n _device?: LocalDevice;\r\n\r\n constructor(options: ClientOptions) {\r\n this._additionalHTTPRequestImplementations = options.plugins ?? null;\r\n\r\n this.logger = new Logger();\r\n this.logger.setLog(options.logLevel, options.logHandler);\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'BaseClient()',\r\n 'initialized with clientOptions ' + Platform.Config.inspect(options),\r\n );\r\n\r\n this._MsgPack = options.plugins?.MsgPack ?? null;\r\n const normalOptions = (this.options = Defaults.normaliseOptions(options, this._MsgPack, this.logger));\r\n\r\n /* process options */\r\n if (normalOptions.key) {\r\n const keyMatch = normalOptions.key.match(/^([^:\\s]+):([^:.\\s]+)$/);\r\n if (!keyMatch) {\r\n const msg = 'invalid key parameter';\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'BaseClient()', msg);\r\n throw new ErrorInfo(msg, 40400, 404);\r\n }\r\n normalOptions.keyName = keyMatch[1];\r\n normalOptions.keySecret = keyMatch[2];\r\n }\r\n\r\n if ('clientId' in normalOptions) {\r\n if (!(typeof normalOptions.clientId === 'string' || normalOptions.clientId === null))\r\n throw new ErrorInfo('clientId must be either a string or null', 40012, 400);\r\n else if (normalOptions.clientId === '*')\r\n throw new ErrorInfo(\r\n 'Can’t use \"*\" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, use {defaultTokenParams: {clientId: \"*\"}})',\r\n 40012,\r\n 400,\r\n );\r\n }\r\n\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'BaseClient()', 'started; version = ' + Defaults.version);\r\n\r\n this._currentFallback = null;\r\n\r\n this.serverTimeOffset = null;\r\n this.http = new Http(this);\r\n this.auth = new Auth(this, normalOptions);\r\n\r\n this._rest = options.plugins?.Rest ? new options.plugins.Rest(this) : null;\r\n this._Crypto = options.plugins?.Crypto ?? null;\r\n this.__FilteredSubscriptions = options.plugins?.MessageInteractions ?? null;\r\n this._Annotations = options.plugins?.Annotations ?? null;\r\n this._liveObjectsPlugin = options.plugins?.LiveObjects ?? null;\r\n }\r\n\r\n get rest(): Rest {\r\n if (!this._rest) {\r\n throwMissingPluginError('Rest');\r\n }\r\n return this._rest;\r\n }\r\n\r\n get _FilteredSubscriptions(): typeof FilteredSubscriptions {\r\n if (!this.__FilteredSubscriptions) {\r\n throwMissingPluginError('MessageInteractions');\r\n }\r\n return this.__FilteredSubscriptions;\r\n }\r\n\r\n get channels() {\r\n return this.rest.channels;\r\n }\r\n\r\n get push() {\r\n return this.rest.push;\r\n }\r\n\r\n /** RSH8 */\r\n device(): LocalDevice & API.LocalDevice {\r\n if (!this.options.plugins?.Push || !this.push.LocalDevice) {\r\n throwMissingPluginError('Push');\r\n }\r\n if (!this._device) {\r\n this._device = this.push.LocalDevice.load(this);\r\n }\r\n return this._device;\r\n }\r\n\r\n baseUri(host: string) {\r\n return Defaults.getHttpScheme(this.options) + host + ':' + Defaults.getPort(this.options, false);\r\n }\r\n\r\n async stats(params: RequestParams): Promise<PaginatedResult<Stats>> {\r\n return this.rest.stats(params);\r\n }\r\n\r\n async time(params?: RequestParams): Promise<number> {\r\n return this.rest.time(params);\r\n }\r\n\r\n async request(\r\n method: string,\r\n path: string,\r\n version: number,\r\n params: RequestParams,\r\n body: unknown,\r\n customHeaders: Record<string, string>,\r\n ): Promise<HttpPaginatedResponse<unknown>> {\r\n return this.rest.request(method, path, version, params, body, customHeaders);\r\n }\r\n\r\n batchPublish<T extends BatchPublishSpec | BatchPublishSpec[]>(\r\n specOrSpecs: T,\r\n ): Promise<T extends BatchPublishSpec ? BatchPublishResult : BatchPublishResult[]> {\r\n return this.rest.batchPublish(specOrSpecs);\r\n }\r\n\r\n batchPresence(channels: string[]): Promise<BatchPresenceResult> {\r\n return this.rest.batchPresence(channels);\r\n }\r\n\r\n setLog(logOptions: LoggerOptions): void {\r\n this.logger.setLog(logOptions.level, logOptions.handler);\r\n }\r\n\r\n /**\r\n * Get the current time based on the local clock,\r\n * or if the option queryTime is true, return the server time.\r\n * The server time offset from the local time is stored so that\r\n * only one request to the server to get the time is ever needed\r\n */\r\n async getTimestamp(queryTime: boolean): Promise<number> {\r\n if (!this.isTimeOffsetSet() && queryTime) {\r\n return this.time();\r\n }\r\n\r\n return this.getTimestampUsingOffset();\r\n }\r\n\r\n getTimestampUsingOffset(): number {\r\n return Date.now() + (this.serverTimeOffset || 0);\r\n }\r\n\r\n isTimeOffsetSet(): boolean {\r\n return this.serverTimeOffset !== null;\r\n }\r\n\r\n static Platform = Platform;\r\n\r\n /**\r\n * These exports are for use by UMD plugins; reason being so that constructors and static methods can be accessed by these plugins without needing to import the classes directly and result in the class existing in both the plugin and the core library.\r\n */\r\n Platform = Platform;\r\n ErrorInfo = ErrorInfo;\r\n Logger = Logger;\r\n Defaults = Defaults;\r\n Utils = Utils;\r\n EventEmitter = EventEmitter;\r\n MessageEncoding = MessageEncoding;\r\n}\r\n\r\nexport default BaseClient;\r\n","import { MsgPack } from 'common/types/msgpack';\nimport type { LocalDevice } from 'plugins/push/pushactivation';\nimport * as Utils from '../util/utils';\nimport ErrorInfo, { IConvertibleToErrorInfo } from './errorinfo';\n\nexport enum DeviceFormFactor {\n Phone = 'phone',\n Tablet = 'tablet',\n Desktop = 'desktop',\n TV = 'tv',\n Watch = 'watch',\n Car = 'car',\n Embedded = 'embedded',\n Other = 'other',\n}\n\nexport enum DevicePlatform {\n Android = 'android',\n IOS = 'ios',\n Browser = 'browser',\n}\n\ntype DevicePushState = 'ACTIVE' | 'FAILING' | 'FAILED';\n\ninterface WebPushEncryptionKey {\n p256dh: string;\n auth: string;\n}\n\ninterface WebPushRecipient {\n transportType: 'web';\n targetUrl: string;\n encryptionKey: WebPushEncryptionKey;\n publicVapidKey: string;\n}\n\ninterface PushChannelRecipient {\n transportType: 'ablyChannel';\n channel: string;\n ablyKey: string;\n ablyUrl: string;\n}\n\ntype PushRecipient = WebPushRecipient | PushChannelRecipient;\n\nexport type DevicePushDetails = {\n error?: ErrorInfo;\n recipient?: PushRecipient;\n state?: DevicePushState;\n metadata?: string;\n};\n\nclass DeviceDetails {\n id?: string;\n clientId?: string;\n deviceSecret?: string;\n formFactor?: DeviceFormFactor;\n platform?: DevicePlatform;\n push?: DevicePushDetails;\n metadata?: string;\n deviceIdentityToken?: string;\n\n toJSON(): DeviceDetails {\n return {\n id: this.id,\n deviceSecret: this.deviceSecret,\n platform: this.platform,\n formFactor: this.formFactor,\n clientId: this.clientId,\n metadata: this.metadata,\n deviceIdentityToken: this.deviceIdentityToken,\n push: {\n recipient: this.push?.recipient,\n state: this.push?.state,\n error: this.push?.error,\n },\n } as DeviceDetails;\n }\n\n toString(): string {\n let result = '[DeviceDetails';\n if (this.id) result += '; id=' + this.id;\n if (this.platform) result += '; platform=' + this.platform;\n if (this.formFactor) result += '; formFactor=' + this.formFactor;\n if (this.clientId) result += '; clientId=' + this.clientId;\n if (this.metadata) result += '; metadata=' + this.metadata;\n if (this.deviceIdentityToken) result += '; deviceIdentityToken=' + JSON.stringify(this.deviceIdentityToken);\n if (this.push?.recipient) result += '; push.recipient=' + JSON.stringify(this.push.recipient);\n if (this.push?.state) result += '; push.state=' + this.push.state;\n if (this.push?.error) result += '; push.error=' + JSON.stringify(this.push.error);\n if (this.push?.metadata) result += '; push.metadata=' + this.push.metadata;\n result += ']';\n return result;\n }\n\n static toRequestBody(body: unknown, MsgPack: MsgPack | null, format?: Utils.Format) {\n return Utils.encodeBody(body, MsgPack, format);\n }\n\n static fromResponseBody(\n body: Array<Record<string, unknown>> | Record<string, unknown>,\n MsgPack: MsgPack | null,\n format?: Utils.Format,\n ): DeviceDetails | DeviceDetails[] {\n if (format) {\n body = Utils.decodeBody(body, MsgPack, format);\n }\n\n if (Array.isArray(body)) {\n return DeviceDetails.fromValuesArray(body);\n } else {\n return DeviceDetails.fromValues(body);\n }\n }\n\n static fromValues(values: Record<string, unknown>): DeviceDetails {\n values.error = values.error && ErrorInfo.fromValues(values.error as IConvertibleToErrorInfo);\n return Object.assign(new DeviceDetails(), values);\n }\n\n static fromLocalDevice(device: LocalDevice): DeviceDetails {\n return Object.assign(new DeviceDetails(), device);\n }\n\n static fromValuesArray(values: Array<Record<string, unknown>>): DeviceDetails[] {\n const count = values.length,\n result = new Array(count);\n for (let i = 0; i < count; i++) result[i] = DeviceDetails.fromValues(values[i]);\n return result;\n }\n}\n\nexport default DeviceDetails;\n","import Platform from '../../platform';\nimport * as Utils from '../util/utils';\nimport Logger from '../util/logger';\nimport Auth from './auth';\nimport HttpMethods from '../../constants/HttpMethods';\nimport ErrorInfo, { IPartialErrorInfo, PartialErrorInfo } from '../types/errorinfo';\nimport BaseClient from './baseclient';\nimport { MsgPack } from 'common/types/msgpack';\nimport { RequestBody, ResponseHeaders, appendingParams as urlFromPathAndParams, paramString } from 'common/types/http';\nimport httpStatusCodes from '../../constants/HttpStatusCodes';\n\nasync function withAuthDetails<T>(\n client: BaseClient,\n headers: ResponseHeaders | undefined,\n params: Record<string, any>,\n opCallback: Function,\n): Promise<ResourceResult<T>> {\n if (client.http.supportsAuthHeaders) {\n const authHeaders = await client.auth.getAuthHeaders();\n return opCallback(Utils.mixin(authHeaders!, headers), params);\n } else {\n const authParams = await client.auth.getAuthParams();\n return opCallback(headers, Utils.mixin(authParams!, params));\n }\n}\n\nfunction unenvelope<T>(\n result: ResourceResult<T>,\n MsgPack: MsgPack | null,\n format: Utils.Format | null,\n): ResourceResult<T> {\n if (result.err && !result.body) {\n return { err: result.err };\n }\n\n if (result.statusCode === httpStatusCodes.NoContent) {\n return { ...result, body: [] as any, unpacked: true };\n }\n\n let body = result.body;\n\n if (!result.unpacked) {\n try {\n body = Utils.decodeBody(body, MsgPack, format);\n } catch (e) {\n if (Utils.isErrorInfoOrPartialErrorInfo(e)) {\n return { err: e };\n } else {\n return { err: new PartialErrorInfo(Utils.inspectError(e), null) };\n }\n }\n }\n\n if (!body) {\n return { err: new PartialErrorInfo('unenvelope(): Response body is missing', null) };\n }\n\n const { statusCode: wrappedStatusCode, response, headers: wrappedHeaders } = body as Record<string, any>;\n\n if (wrappedStatusCode === undefined) {\n /* Envelope already unwrapped by the transport */\n return { ...result, body, unpacked: true };\n }\n\n if (wrappedStatusCode < 200 || wrappedStatusCode >= 300) {\n /* handle wrapped errors */\n let wrappedErr = (response && response.error) || result.err;\n if (!wrappedErr) {\n wrappedErr = new Error('Error in unenveloping ' + body);\n wrappedErr.statusCode = wrappedStatusCode;\n }\n return { err: wrappedErr, body: response, headers: wrappedHeaders, unpacked: true, statusCode: wrappedStatusCode };\n }\n\n return { err: result.err, body: response, headers: wrappedHeaders, unpacked: true, statusCode: wrappedStatusCode };\n}\n\nfunction logResult<T>(\n result: ResourceResult<T>,\n method: HttpMethods,\n path: string,\n params: Record<string, string>,\n logger: Logger,\n) {\n if (result.err) {\n Logger.logAction(\n logger,\n Logger.LOG_MICRO,\n 'Resource.' + method + '()',\n 'Received Error; ' + urlFromPathAndParams(path, params) + '; Error: ' + Utils.inspectError(result.err),\n );\n } else {\n Logger.logAction(\n logger,\n Logger.LOG_MICRO,\n 'Resource.' + method + '()',\n 'Received; ' +\n urlFromPathAndParams(path, params) +\n '; Headers: ' +\n paramString(result.headers as Record<string, any>) +\n '; StatusCode: ' +\n result.statusCode +\n '; Body: ' +\n (Platform.BufferUtils.isBuffer(result.body)\n ? ' (Base64): ' + Platform.BufferUtils.base64Encode(result.body)\n : ': ' + Platform.Config.inspect(result.body)),\n );\n }\n}\n\nexport interface ResourceResponse<T> {\n body?: T;\n headers?: ResponseHeaders;\n unpacked?: boolean;\n statusCode?: number;\n}\n\nexport interface ResourceResult<T> extends ResourceResponse<T> {\n /**\n * Any error returned by the underlying HTTP client.\n */\n err: IPartialErrorInfo | null;\n}\n\nclass Resource {\n /**\n * @param throwError Whether to throw any error returned by the underlying HTTP client.\n *\n * If you specify `true`, then this method will return a `ResourceResponse<T>`, and if the underlying HTTP client returns an error, this method call will throw that error. If you specify `false`, then it will return a `ResourceResult<T>`, whose `err` property contains any error that was returned by the underlying HTTP client.\n */\n static async get<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: true,\n ): Promise<ResourceResponse<T>>;\n static async get<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: false,\n ): Promise<ResourceResult<T>>;\n static async get<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n return Resource.do(HttpMethods.Get, client, path, null, headers, params, envelope, throwError ?? false);\n }\n\n /**\n * @param throwError Whether to throw any error returned by the underlying HTTP client.\n *\n * If you specify `true`, then this method will return a `ResourceResponse<T>`, and if the underlying HTTP client returns an error, this method call will throw that error. If you specify `false`, then it will return a `ResourceResult<T>`, whose `err` property contains any error that was returned by the underlying HTTP client.\n */\n static async delete<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: true,\n ): Promise<ResourceResponse<T>>;\n static async delete<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: false,\n ): Promise<ResourceResult<T>>;\n static async delete<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n return Resource.do(HttpMethods.Delete, client, path, null, headers, params, envelope, throwError);\n }\n\n /**\n * @param throwError Whether to throw any error returned by the underlying HTTP client.\n *\n * If you specify `true`, then this method will return a `ResourceResponse<T>`, and if the underlying HTTP client returns an error, this method call will throw that error. If you specify `false`, then it will return a `ResourceResult<T>`, whose `err` property contains any error that was returned by the underlying HTTP client.\n */\n static async post<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: true,\n ): Promise<ResourceResponse<T>>;\n static async post<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: false,\n ): Promise<ResourceResult<T>>;\n static async post<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n return Resource.do(HttpMethods.Post, client, path, body, headers, params, envelope, throwError);\n }\n\n /**\n * @param throwError Whether to throw any error returned by the underlying HTTP client.\n *\n * If you specify `true`, then this method will return a `ResourceResponse<T>`, and if the underlying HTTP client returns an error, this method call will throw that error. If you specify `false`, then it will return a `ResourceResult<T>`, whose `err` property contains any error that was returned by the underlying HTTP client.\n */\n static async patch<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: true,\n ): Promise<ResourceResponse<T>>;\n static async patch<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: false,\n ): Promise<ResourceResult<T>>;\n static async patch<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n return Resource.do(HttpMethods.Patch, client, path, body, headers, params, envelope, throwError);\n }\n\n /**\n * @param throwError Whether to throw any error returned by the underlying HTTP client.\n *\n * If you specify `true`, then this method will return a `ResourceResponse<T>`, and if the underlying HTTP client returns an error, this method call will throw that error. If you specify `false`, then it will return a `ResourceResult<T>`, whose `err` property contains any error that was returned by the underlying HTTP client.\n */\n static async put<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: true,\n ): Promise<ResourceResponse<T>>;\n static async put<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: false,\n ): Promise<ResourceResult<T>>;\n static async put<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n return Resource.do(HttpMethods.Put, client, path, body, headers, params, envelope, throwError);\n }\n\n static async do<T>(\n method: HttpMethods,\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n if (envelope) {\n (params = params || {})['envelope'] = envelope;\n }\n\n const logger = client.logger;\n\n async function doRequest(\n this: any,\n headers: Record<string, string>,\n params: Record<string, any>,\n ): Promise<ResourceResult<T>> {\n if (logger.shouldLog(Logger.LOG_MICRO)) {\n let decodedBody = body;\n if (headers['content-type']?.indexOf('msgpack') > 0) {\n try {\n if (!client._MsgPack) {\n Utils.throwMissingPluginError('MsgPack');\n }\n decodedBody = client._MsgPack.decode(body as Buffer);\n } catch (decodeErr) {\n Logger.logAction(\n logger,\n Logger.LOG_MICRO,\n 'Resource.' + method + '()',\n 'Sending MsgPack Decoding Error: ' + Utils.inspectError(decodeErr),\n );\n }\n }\n Logger.logAction(\n logger,\n Logger.LOG_MICRO,\n 'Resource.' + method + '()',\n 'Sending; ' + urlFromPathAndParams(path, params) + '; Body: ' + decodedBody,\n );\n }\n\n const httpResult = await client.http.do(method, path, headers, body, params);\n\n if (httpResult.error && Auth.isTokenErr(httpResult.error as ErrorInfo)) {\n /* token has expired, so get a new one */\n await client.auth.authorize(null, null);\n /* retry ... */\n return withAuthDetails(client, headers, params, doRequest);\n }\n\n return {\n err: httpResult.error as ErrorInfo,\n body: httpResult.body as T | undefined,\n headers: httpResult.headers,\n unpacked: httpResult.unpacked,\n statusCode: httpResult.statusCode,\n };\n }\n\n let result = await withAuthDetails<T>(client, headers, params, doRequest);\n\n if (envelope) {\n result = unenvelope(result, client._MsgPack, envelope);\n }\n\n if (logger.shouldLog(Logger.LOG_MICRO)) {\n logResult(result, method, path, params, logger);\n }\n\n if (throwError) {\n if (result.err) {\n throw result.err;\n } else {\n const response: Omit<ResourceResult<T>, 'err'> & Pick<Partial<ResourceResult<T>>, 'err'> = { ...result };\n delete response.err;\n return response;\n }\n }\n\n return result;\n }\n}\n\nexport default Resource;\n","import * as Utils from '../util/utils';\r\nimport Logger from '../util/logger';\r\nimport Resource, { ResourceResult } from './resource';\r\nimport ErrorInfo, { IPartialErrorInfo } from '../types/errorinfo';\r\nimport BaseClient from './baseclient';\r\nimport { RequestBody, ResponseHeaders } from 'common/types/http';\r\nimport HttpStatusCodes from '../../constants/HttpStatusCodes';\r\n\r\nexport type BodyHandler = (body: unknown, headers: ResponseHeaders, unpacked?: boolean) => Promise<any>;\r\n\r\nfunction getRelParams(linkUrl: string) {\r\n const urlMatch = linkUrl.match(/^\\.\\/(\\w+)\\?(.*)$/);\r\n return urlMatch && urlMatch[2] && Utils.parseQueryString(urlMatch[2]);\r\n}\r\n\r\nfunction parseRelLinks(linkHeader: string | Array<string>) {\r\n if (typeof linkHeader == 'string') linkHeader = linkHeader.split(',');\r\n\r\n const relParams: Record<string, Record<string, string>> = {};\r\n for (let i = 0; i < linkHeader.length; i++) {\r\n const linkMatch = linkHeader[i].match(/^\\s*<(.+)>;\\s*rel=\"(\\w+)\"$/);\r\n if (linkMatch) {\r\n const params = getRelParams(linkMatch[1]);\r\n if (params) relParams[linkMatch[2]] = params;\r\n }\r\n }\r\n return relParams;\r\n}\r\n\r\nfunction returnErrOnly(err: IPartialErrorInfo, body: unknown, useHPR?: boolean) {\r\n /* If using httpPaginatedResponse, errors from Ably are returned as part of\r\n * the HPR, only throw `err` for network errors etc. which don't\r\n * return a body and/or have no ably-originated error code (non-numeric\r\n * error codes originate from node) */\r\n return !(useHPR && (body || typeof err.code === 'number'));\r\n}\r\n\r\nclass PaginatedResource {\r\n client: BaseClient;\r\n path: string;\r\n headers: Record<string, string>;\r\n envelope: Utils.Format | null;\r\n bodyHandler: BodyHandler;\r\n useHttpPaginatedResponse: boolean;\r\n\r\n constructor(\r\n client: BaseClient,\r\n path: string,\r\n headers: Record<string, string>,\r\n envelope: Utils.Format | undefined,\r\n bodyHandler: BodyHandler,\r\n useHttpPaginatedResponse?: boolean,\r\n ) {\r\n this.client = client;\r\n this.path = path;\r\n this.headers = headers;\r\n this.envelope = envelope ?? null;\r\n this.bodyHandler = bodyHandler;\r\n this.useHttpPaginatedResponse = useHttpPaginatedResponse || false;\r\n }\r\n\r\n get logger(): Logger {\r\n return this.client.logger;\r\n }\r\n\r\n async get<T1, T2>(params: Record<string, T2>): Promise<PaginatedResult<T1>> {\r\n const result = await Resource.get<T1>(this.client, this.path, this.headers, params, this.envelope, false);\r\n return this.handlePage(result);\r\n }\r\n\r\n async delete<T1, T2>(params: Record<string, T2>): Promise<PaginatedResult<T1>> {\r\n const result = await Resource.delete<T1>(this.client, this.path, this.headers, params, this.envelope, false);\r\n return this.handlePage(result);\r\n }\r\n\r\n async post<T1, T2>(params: Record<string, T2>, body: RequestBody | null): Promise<PaginatedResult<T1>> {\r\n const result = await Resource.post<T1>(this.client, this.path, body, this.headers, params, this.envelope, false);\r\n return this.handlePage(result);\r\n }\r\n\r\n async put<T1, T2>(params: Record<string, T2>, body: RequestBody | null): Promise<PaginatedResult<T1>> {\r\n const result = await Resource.put<T1>(this.client, this.path, body, this.headers, params, this.envelope, false);\r\n return this.handlePage(result);\r\n }\r\n\r\n async patch<T1, T2>(params: Record<string, T2>, body: RequestBody | null): Promise<PaginatedResult<T1>> {\r\n const result = await Resource.patch<T1>(this.client, this.path, body, this.headers, params, this.envelope, false);\r\n return this.handlePage(result);\r\n }\r\n\r\n async handlePage<T>(result: ResourceResult<T>): Promise<PaginatedResult<T>> {\r\n if (result.err && returnErrOnly(result.err, result.body, this.useHttpPaginatedResponse)) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_ERROR,\r\n 'PaginatedResource.handlePage()',\r\n 'Unexpected error getting resource: err = ' + Utils.inspectError(result.err),\r\n );\r\n throw result.err;\r\n }\r\n\r\n let items, linkHeader, relParams;\r\n\r\n try {\r\n items =\r\n result.statusCode == HttpStatusCodes.NoContent\r\n ? []\r\n : await this.bodyHandler(result.body, result.headers || {}, result.unpacked);\r\n } catch (e) {\r\n /* If we got an error, the failure to parse the body is almost certainly\r\n * due to that, so throw that in preference over the parse error */\r\n throw result.err || e;\r\n }\r\n\r\n if (result.headers && (linkHeader = result.headers['Link'] || result.headers['link'])) {\r\n relParams = parseRelLinks(linkHeader);\r\n }\r\n\r\n if (this.useHttpPaginatedResponse) {\r\n return new HttpPaginatedResponse(\r\n this,\r\n items,\r\n result.headers || {},\r\n result.statusCode as number,\r\n relParams,\r\n result.err,\r\n );\r\n } else {\r\n return new PaginatedResult(this, items, relParams);\r\n }\r\n }\r\n}\r\n\r\nexport class PaginatedResult<T> {\r\n resource: PaginatedResource;\r\n items: T[];\r\n private _relParams?: Record<string, any>;\r\n\r\n constructor(resource: PaginatedResource, items: T[], relParams?: Record<string, any>) {\r\n this.resource = resource;\r\n this.items = items;\r\n this._relParams = relParams;\r\n }\r\n\r\n async first(): Promise<PaginatedResult<T>> {\r\n if (this.hasFirst()) {\r\n return this.get(this._relParams!.first);\r\n }\r\n\r\n throw new ErrorInfo('No link to the first page of results', 40400, 404);\r\n }\r\n\r\n async current(): Promise<PaginatedResult<T>> {\r\n if (this.hasCurrent()) {\r\n return this.get(this._relParams!.current);\r\n }\r\n\r\n throw new ErrorInfo('No link to the current page of results', 40400, 404);\r\n }\r\n\r\n async next(): Promise<PaginatedResult<T> | null> {\r\n if (this.hasNext()) {\r\n return this.get(this._relParams!.next);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n hasFirst(): boolean {\r\n return this._relParams != null && 'first' in this._relParams;\r\n }\r\n\r\n hasCurrent(): boolean {\r\n return this._relParams != null && 'current' in this._relParams;\r\n }\r\n\r\n hasNext(): boolean {\r\n return this._relParams != null && 'next' in this._relParams;\r\n }\r\n\r\n isLast(): boolean {\r\n return !this.hasNext();\r\n }\r\n\r\n /* We assume that only the initial request can be a POST, and that accessing\r\n * the rest of a multipage set of results can always be done with GET */\r\n async get(params: any): Promise<PaginatedResult<T>> {\r\n const res = this.resource;\r\n const result = await Resource.get<T>(res.client, res.path, res.headers, params, res.envelope, false);\r\n return res.handlePage(result);\r\n }\r\n}\r\n\r\nexport class HttpPaginatedResponse<T> extends PaginatedResult<T> {\r\n statusCode: number;\r\n success: boolean;\r\n headers: ResponseHeaders;\r\n errorCode?: number | null;\r\n errorMessage?: string | null;\r\n errorDetail?: Record<string, string>;\r\n\r\n constructor(\r\n resource: PaginatedResource,\r\n items: T[],\r\n headers: ResponseHeaders,\r\n statusCode: number,\r\n relParams: any,\r\n err: IPartialErrorInfo | null,\r\n ) {\r\n super(resource, items, relParams);\r\n this.statusCode = statusCode;\r\n this.success = statusCode < 300 && statusCode >= 200;\r\n this.headers = headers;\r\n this.errorCode = err && err.code;\r\n this.errorMessage = err && err.message;\r\n this.errorDetail = err?.detail;\r\n }\r\n\r\n toJSON() {\r\n return {\r\n items: this.items,\r\n statusCode: this.statusCode,\r\n success: this.success,\r\n headers: this.headers,\r\n errorCode: this.errorCode,\r\n errorMessage: this.errorMessage,\r\n errorDetail: this.errorDetail,\r\n };\r\n }\r\n}\r\n\r\nexport default PaginatedResource;\r\n","import { MsgPack } from 'common/types/msgpack';\nimport * as Utils from '../util/utils';\n\ntype PushChannelSubscriptionObject = {\n channel: string;\n deviceId?: string;\n clientId?: string;\n};\n\nclass PushChannelSubscription {\n /** PCS4, the channel name associated with this subscription */\n channel!: string;\n /** PCS2, optional, populated for subscriptions made for a specific device registration */\n deviceId?: string;\n /** PCS3, optional, populated for subscriptions made for a specific clientId */\n clientId?: string;\n\n /**\n * Overload toJSON() to intercept JSON.stringify()\n * @return {*}\n */\n toJSON(): PushChannelSubscriptionObject {\n return {\n channel: this.channel,\n deviceId: this.deviceId,\n clientId: this.clientId,\n };\n }\n\n toString(): string {\n let result = '[PushChannelSubscription';\n if (this.channel) result += '; channel=' + this.channel;\n if (this.deviceId) result += '; deviceId=' + this.deviceId;\n if (this.clientId) result += '; clientId=' + this.clientId;\n result += ']';\n return result;\n }\n\n static toRequestBody = Utils.encodeBody;\n\n static fromResponseBody(\n body: Array<Record<string, unknown>> | Record<string, unknown>,\n MsgPack: MsgPack | null,\n format?: Utils.Format,\n ): PushChannelSubscription | PushChannelSubscription[] {\n if (format) {\n body = Utils.decodeBody(body, MsgPack, format) as Record<string, unknown>;\n }\n\n if (Array.isArray(body)) {\n return PushChannelSubscription.fromValuesArray(body);\n } else {\n return PushChannelSubscription.fromValues(body);\n }\n }\n\n static fromValues(values: Record<string, unknown>): PushChannelSubscription {\n return Object.assign(new PushChannelSubscription(), values);\n }\n\n static fromValuesArray(values: Array<Record<string, unknown>>): PushChannelSubscription[] {\n const count = values.length,\n result = new Array(count);\n for (let i = 0; i < count; i++) result[i] = PushChannelSubscription.fromValues(values[i]);\n return result;\n }\n}\n\nexport default PushChannelSubscription;\n","import * as Utils from '../util/utils';\nimport DeviceDetails from '../types/devicedetails';\nimport Resource from './resource';\nimport PaginatedResource, { PaginatedResult } from './paginatedresource';\nimport ErrorInfo from '../types/errorinfo';\nimport PushChannelSubscription from '../types/pushchannelsubscription';\nimport BaseClient from './baseclient';\nimport Defaults from '../util/defaults';\nimport type {\n ActivationStateMachine,\n DeregisterCallback,\n LocalDeviceFactory,\n RegisterCallback,\n} from 'plugins/push/pushactivation';\nimport Platform from 'common/platform';\nimport type { ErrCallback } from 'common/types/utils';\n\nclass Push {\n client: BaseClient;\n admin: Admin;\n stateMachine?: ActivationStateMachine;\n LocalDevice?: LocalDeviceFactory;\n\n constructor(client: BaseClient) {\n this.client = client;\n this.admin = new Admin(client);\n if (Platform.Config.push && client.options.plugins?.Push) {\n this.stateMachine = new client.options.plugins.Push.ActivationStateMachine(client);\n this.LocalDevice = client.options.plugins.Push.localDeviceFactory(DeviceDetails);\n }\n }\n\n async activate(registerCallback?: RegisterCallback, updateFailedCallback?: ErrCallback) {\n await new Promise<void>((resolve, reject) => {\n if (!this.client.options.plugins?.Push) {\n reject(Utils.createMissingPluginError('Push'));\n return;\n }\n if (!this.stateMachine) {\n reject(new ErrorInfo('This platform is not supported as a target of push notifications', 40000, 400));\n return;\n }\n if (this.stateMachine.activatedCallback) {\n reject(new ErrorInfo('Activation already in progress', 40000, 400));\n return;\n }\n this.stateMachine.activatedCallback = (err: ErrorInfo) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n };\n this.stateMachine.updateFailedCallback = updateFailedCallback;\n this.stateMachine.handleEvent(\n new this.client.options.plugins.Push.CalledActivate(this.stateMachine, registerCallback),\n );\n });\n }\n\n async deactivate(deregisterCallback: DeregisterCallback) {\n await new Promise<void>((resolve, reject) => {\n if (!this.client.options.plugins?.Push) {\n reject(Utils.createMissingPluginError('Push'));\n return;\n }\n if (!this.stateMachine) {\n reject(new ErrorInfo('This platform is not supported as a target of push notifications', 40000, 400));\n return;\n }\n if (this.stateMachine.deactivatedCallback) {\n reject(new ErrorInfo('Deactivation already in progress', 40000, 400));\n return;\n }\n this.stateMachine.deactivatedCallback = (err: ErrorInfo) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n };\n this.stateMachine.handleEvent(\n new this.client.options.plugins.Push.CalledDeactivate(this.stateMachine, deregisterCallback),\n );\n });\n }\n}\n\nclass Admin {\n client: BaseClient;\n deviceRegistrations: DeviceRegistrations;\n channelSubscriptions: ChannelSubscriptions;\n\n constructor(client: BaseClient) {\n this.client = client;\n this.deviceRegistrations = new DeviceRegistrations(client);\n this.channelSubscriptions = new ChannelSubscriptions(client);\n }\n\n async publish(recipient: any, payload: any): Promise<void> {\n const client = this.client;\n const format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(client.options),\n params = {};\n const body = Utils.mixin({ recipient: recipient }, payload);\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n const requestBody = Utils.encodeBody(body, client._MsgPack, format);\n await Resource.post(client, '/push/publish', requestBody, headers, params, null, true);\n }\n}\n\nclass DeviceRegistrations {\n client: BaseClient;\n\n constructor(client: BaseClient) {\n this.client = client;\n }\n\n async save(device: any): Promise<DeviceDetails> {\n const client = this.client;\n const body = DeviceDetails.fromValues(device);\n const format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(client.options),\n params = {};\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n const requestBody = Utils.encodeBody(body, client._MsgPack, format);\n const response = await Resource.put(\n client,\n '/push/deviceRegistrations/' + encodeURIComponent(device.id),\n requestBody,\n headers,\n params,\n null,\n true,\n );\n\n return DeviceDetails.fromResponseBody(\n response.body as Record<string, unknown>,\n client._MsgPack,\n response.unpacked ? undefined : format,\n ) as DeviceDetails;\n }\n\n async get(deviceIdOrDetails: any): Promise<DeviceDetails> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultGetHeaders(client.options),\n deviceId = deviceIdOrDetails.id || deviceIdOrDetails;\n\n if (typeof deviceId !== 'string' || !deviceId.length) {\n throw new ErrorInfo(\n 'First argument to DeviceRegistrations#get must be a deviceId string or DeviceDetails',\n 40000,\n 400,\n );\n }\n\n Utils.mixin(headers, client.options.headers);\n\n const response = await Resource.get(\n client,\n '/push/deviceRegistrations/' + encodeURIComponent(deviceId),\n headers,\n {},\n null,\n true,\n );\n\n return DeviceDetails.fromResponseBody(\n response.body as Record<string, unknown>,\n client._MsgPack,\n response.unpacked ? undefined : format,\n ) as DeviceDetails;\n }\n\n async list(params: any): Promise<PaginatedResult<unknown>> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = this.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options);\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(client, '/push/deviceRegistrations', headers, envelope, async function (\n body,\n headers,\n unpacked,\n ) {\n return DeviceDetails.fromResponseBody(\n body as Record<string, unknown>[],\n client._MsgPack,\n unpacked ? undefined : format,\n );\n }).get(params);\n }\n\n async remove(deviceIdOrDetails: any): Promise<void> {\n const client = this.client,\n headers = Defaults.defaultGetHeaders(client.options),\n params = {},\n deviceId = deviceIdOrDetails.id || deviceIdOrDetails;\n\n if (typeof deviceId !== 'string' || !deviceId.length) {\n throw new ErrorInfo(\n 'First argument to DeviceRegistrations#remove must be a deviceId string or DeviceDetails',\n 40000,\n 400,\n );\n }\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n await Resource['delete'](\n client,\n '/push/deviceRegistrations/' + encodeURIComponent(deviceId),\n headers,\n params,\n null,\n true,\n );\n }\n\n async removeWhere(params: any): Promise<void> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n await Resource['delete'](client, '/push/deviceRegistrations', headers, params, null, true);\n }\n}\n\nclass ChannelSubscriptions {\n client: BaseClient;\n\n constructor(client: BaseClient) {\n this.client = client;\n }\n\n async save(subscription: Record<string, unknown>): Promise<PushChannelSubscription> {\n const client = this.client;\n const body = PushChannelSubscription.fromValues(subscription);\n const format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(client.options),\n params = {};\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n const requestBody = Utils.encodeBody(body, client._MsgPack, format);\n const response = await Resource.post(\n client,\n '/push/channelSubscriptions',\n requestBody,\n headers,\n params,\n null,\n true,\n );\n\n return PushChannelSubscription.fromResponseBody(\n response.body as Record<string, any>,\n client._MsgPack,\n response.unpacked ? undefined : format,\n ) as PushChannelSubscription;\n }\n\n async list(params: any): Promise<PaginatedResult<unknown>> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = this.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options);\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(client, '/push/channelSubscriptions', headers, envelope, async function (\n body,\n headers,\n unpacked,\n ) {\n return PushChannelSubscription.fromResponseBody(\n body as Record<string, unknown>[],\n client._MsgPack,\n unpacked ? undefined : format,\n );\n }).get(params);\n }\n\n async removeWhere(params: any): Promise<void> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n await Resource['delete'](client, '/push/channelSubscriptions', headers, params, null, true);\n }\n\n /* ChannelSubscriptions have no unique id; removing one is equivalent to removeWhere by its properties */\n remove = ChannelSubscriptions.prototype.removeWhere;\n\n async listChannels(params: any): Promise<PaginatedResult<unknown>> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = this.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options);\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n return new PaginatedResource(client, '/push/channels', headers, envelope, async function (body, headers, unpacked) {\n const parsedBody = (\n !unpacked && format ? Utils.decodeBody(body, client._MsgPack, format) : body\n ) as Array<string>;\n\n for (let i = 0; i < parsedBody.length; i++) {\n parsedBody[i] = String(parsedBody[i]);\n }\n return parsedBody;\n }).get(params);\n }\n}\n\nexport default Push;\n","import Logger from '../util/logger';\nimport { BaseMessage, encode, decode, wireToJSON, normalizeCipherOptions, CipherOptions, strMsg } from './basemessage';\nimport * as API from '../../../../ably';\nimport * as Utils from '../util/utils';\n\nimport type { IUntypedCryptoStatic } from 'common/types/ICryptoStatic';\nimport type { Properties } from '../util/utils';\nimport type RestChannel from '../client/restchannel';\nimport type RealtimeChannel from '../client/realtimechannel';\nimport type { ChannelOptions } from '../../types/channel';\ntype Channel = RestChannel | RealtimeChannel;\n\nconst actions = ['absent', 'present', 'enter', 'leave', 'update'];\n\nexport async function fromEncoded(\n logger: Logger,\n Crypto: IUntypedCryptoStatic | null,\n encoded: WirePresenceMessage,\n inputOptions?: API.ChannelOptions,\n): Promise<PresenceMessage> {\n const options = normalizeCipherOptions(Crypto, logger, inputOptions ?? null);\n const wpm = WirePresenceMessage.fromValues(encoded);\n return wpm.decode(options, logger);\n}\n\nexport async function fromEncodedArray(\n logger: Logger,\n Crypto: IUntypedCryptoStatic | null,\n encodedArray: WirePresenceMessage[],\n options?: API.ChannelOptions,\n): Promise<PresenceMessage[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return fromEncoded(logger, Crypto, encoded, options);\n }),\n );\n}\n\n// these forms of the functions are used internally when we have a channel instance\n// already, so don't need to normalise channel options\nexport async function _fromEncoded(\n encoded: Properties<WirePresenceMessage>,\n channel: Channel,\n): Promise<PresenceMessage> {\n return WirePresenceMessage.fromValues(encoded).decode(channel.channelOptions, channel.logger);\n}\n\nexport async function _fromEncodedArray(\n encodedArray: Properties<WirePresenceMessage>[],\n channel: Channel,\n): Promise<PresenceMessage[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return _fromEncoded(encoded, channel);\n }),\n );\n}\n\n// for tree-shakability\nexport function fromValues(values: Properties<PresenceMessage>) {\n return PresenceMessage.fromValues(values);\n}\n\nclass PresenceMessage extends BaseMessage {\n action?: string;\n\n /* Returns whether this presenceMessage is synthesized, i.e. was not actually\n * sent by the connection (usually means a leave event sent 15s after a\n * disconnection). This is useful because synthesized messages cannot be\n * compared for newness by id lexicographically - RTP2b1\n */\n isSynthesized(): boolean {\n if (!this.id || !this.connectionId) {\n return true;\n }\n return this.id.substring(this.connectionId.length, 0) !== this.connectionId;\n }\n\n /* RTP2b2 */\n parseId(): { connectionId: string; msgSerial: number; index: number } {\n if (!this.id) throw new Error('parseId(): Presence message does not contain an id');\n const parts = this.id.split(':');\n return {\n connectionId: parts[0],\n msgSerial: parseInt(parts[1], 10),\n index: parseInt(parts[2], 10),\n };\n }\n\n async encode(options: CipherOptions): Promise<WirePresenceMessage> {\n const res = Object.assign(new WirePresenceMessage(), this, {\n action: actions.indexOf(this.action || 'present'),\n });\n return encode(res, options);\n }\n\n static fromValues(values: Properties<PresenceMessage>): PresenceMessage {\n return Object.assign(new PresenceMessage(), values);\n }\n\n static fromValuesArray(values: Properties<PresenceMessage>[]): PresenceMessage[] {\n return values.map((v) => PresenceMessage.fromValues(v));\n }\n\n static fromData(data: any): PresenceMessage {\n if (data instanceof PresenceMessage) {\n return data;\n }\n return PresenceMessage.fromValues({\n data,\n });\n }\n\n toString() {\n return strMsg(this, 'PresenceMessage');\n }\n}\n\nexport class WirePresenceMessage extends BaseMessage {\n action?: number;\n\n toJSON(...args: any[]) {\n return wireToJSON.call(this, ...args);\n }\n\n static fromValues(values: Properties<WirePresenceMessage>): WirePresenceMessage {\n return Object.assign(new WirePresenceMessage(), values);\n }\n\n static fromValuesArray(values: Properties<WirePresenceMessage>[]): WirePresenceMessage[] {\n return values.map((v) => WirePresenceMessage.fromValues(v));\n }\n\n async decode(channelOptions: ChannelOptions, logger: Logger): Promise<PresenceMessage> {\n const res = Object.assign(new PresenceMessage(), {\n ...this,\n action: actions[this.action!],\n });\n try {\n await decode(res, channelOptions);\n } catch (e) {\n Logger.logAction(logger, Logger.LOG_ERROR, 'WirePresenceMessage.decode()', Utils.inspectError(e));\n }\n return res;\n }\n\n toString() {\n return strMsg(this, 'WirePresenceMessage');\n }\n}\n\nexport default PresenceMessage;\n","import * as Utils from '../util/utils';\nimport Logger from '../util/logger';\nimport PaginatedResource, { PaginatedResult } from './paginatedresource';\nimport PresenceMessage, { WirePresenceMessage, _fromEncodedArray } from '../types/presencemessage';\nimport RestChannel from './restchannel';\nimport Defaults from '../util/defaults';\n\nclass RestPresence {\n channel: RestChannel;\n\n constructor(channel: RestChannel) {\n this.channel = channel;\n }\n\n get logger(): Logger {\n return this.channel.logger;\n }\n\n async get(params: any): Promise<PaginatedResult<PresenceMessage>> {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestPresence.get()', 'channel = ' + this.channel.name);\n const client = this.channel.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = this.channel.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options);\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(\n client,\n this.channel.client.rest.presenceMixin.basePath(this),\n headers,\n envelope,\n async (body, headers, unpacked) => {\n const decoded = (\n unpacked ? body : Utils.decodeBody(body, client._MsgPack, format)\n ) as Utils.Properties<WirePresenceMessage>[];\n\n return _fromEncodedArray(decoded, this.channel);\n },\n ).get(params);\n }\n\n async history(params: any): Promise<PaginatedResult<PresenceMessage>> {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestPresence.history()', 'channel = ' + this.channel.name);\n return this.channel.client.rest.presenceMixin.history(this, params);\n }\n}\n\nexport default RestPresence;\n","import Logger from '../util/logger';\nimport {\n BaseMessage,\n encode,\n decode,\n wireToJSON,\n normalizeCipherOptions,\n EncodingDecodingContext,\n CipherOptions,\n strMsg,\n} from './basemessage';\nimport * as Utils from '../util/utils';\nimport * as API from '../../../../ably';\n\nimport type { IUntypedCryptoStatic } from 'common/types/ICryptoStatic';\nimport type { ChannelOptions } from '../../types/channel';\nimport type { Properties } from '../util/utils';\nimport type RestChannel from '../client/restchannel';\nimport type RealtimeChannel from '../client/realtimechannel';\nimport type ErrorInfo from './errorinfo';\ntype Channel = RestChannel | RealtimeChannel;\n\nconst actions: API.MessageAction[] = [\n 'message.create',\n 'message.update',\n 'message.delete',\n 'meta',\n 'message.summary',\n 'message.append',\n];\n\nexport function stringifyAction(action: number | undefined): API.MessageAction {\n return actions[action || 0] || 'unknown';\n}\n\nexport function encodeAction(action: API.MessageAction): number {\n return actions.indexOf(action || 'message.create');\n}\n\nfunction getMessageSize(msg: WireMessage) {\n let size = 0;\n if (msg.name) {\n size += msg.name.length;\n }\n if (msg.clientId) {\n size += msg.clientId.length;\n }\n if (msg.extras) {\n size += JSON.stringify(msg.extras).length;\n }\n if (msg.data) {\n size += Utils.dataSizeBytes(msg.data);\n }\n return size;\n}\n\nexport async function fromEncoded(\n logger: Logger,\n Crypto: IUntypedCryptoStatic | null,\n encoded: Properties<WireMessage>,\n inputOptions?: API.ChannelOptions,\n): Promise<Message> {\n const options = normalizeCipherOptions(Crypto, logger, inputOptions ?? null);\n const wm = WireMessage.fromValues(encoded);\n return wm.decode(options, logger);\n}\n\nexport async function fromEncodedArray(\n logger: Logger,\n Crypto: IUntypedCryptoStatic | null,\n encodedArray: Array<WireMessage>,\n options?: API.ChannelOptions,\n): Promise<Message[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return fromEncoded(logger, Crypto, encoded, options);\n }),\n );\n}\n\n// these forms of the functions are used internally when we have a channel instance\n// already, so don't need to normalise channel options\nexport async function _fromEncoded(encoded: Properties<WireMessage>, channel: Channel): Promise<Message> {\n const wm = WireMessage.fromValues(encoded);\n return wm.decode(channel.channelOptions, channel.logger);\n}\n\nexport async function _fromEncodedArray(encodedArray: Properties<WireMessage>[], channel: Channel): Promise<Message[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return _fromEncoded(encoded, channel);\n }),\n );\n}\n\nexport async function encodeArray(messages: Array<Message>, options: CipherOptions): Promise<Array<WireMessage>> {\n return Promise.all(messages.map((message) => message.encode(options)));\n}\n\nexport const serialize = Utils.encodeBody;\n\n/* This should be called on encode()d (and encrypt()d) Messages (as it\n * assumes the data is a string or buffer) */\nexport function getMessagesSize(messages: WireMessage[]): number {\n let msg,\n total = 0;\n for (let i = 0; i < messages.length; i++) {\n msg = messages[i];\n total += msg.size || (msg.size = getMessageSize(msg));\n }\n return total;\n}\n\nclass Message extends BaseMessage {\n name?: string;\n connectionKey?: string;\n action?: API.MessageAction;\n serial?: string;\n version?: API.MessageVersion;\n annotations?: API.MessageAnnotations;\n\n expandFields() {\n // TM2s\n if (!this.version) {\n this.version = {};\n }\n\n // TM2s1\n if (!this.version.serial && this.serial) {\n this.version.serial = this.serial;\n }\n\n // TM2s2\n if (!this.version.timestamp && this.timestamp) {\n this.version.timestamp = this.timestamp;\n }\n\n if (!this.annotations) {\n // TM2u\n this.annotations = {\n summary: {},\n };\n } else if (!this.annotations.summary) {\n // TM8a\n this.annotations.summary = {};\n }\n if (this.annotations && this.annotations.summary) {\n // Ensure clipped field is set to false where not explicitly provided\n for (const [type, summaryEntry] of Object.entries(this.annotations.summary)) {\n if (type.endsWith(':distinct.v1') || type.endsWith(':unique.v1') || type.endsWith(':multiple.v1')) {\n for (const [, entry] of Object.entries(summaryEntry)) {\n // TM7c1c, TM7d1c\n if (!entry.clipped) {\n entry.clipped = false;\n }\n }\n } else if (type.endsWith(':flag.v1')) {\n // TM7c1c\n if (!(summaryEntry as API.SummaryClientIdList).clipped) {\n (summaryEntry as API.SummaryClientIdList).clipped = false;\n }\n }\n }\n }\n }\n\n async encode(options: CipherOptions): Promise<WireMessage> {\n const res = Object.assign(new WireMessage(), this, {\n action: actions.indexOf(this.action || 'message.create'),\n });\n return encode(res, options);\n }\n\n static fromValues(values: Properties<Message>): Message {\n return Object.assign(new Message(), values);\n }\n\n static fromValuesArray(values: Properties<Message>[]): Message[] {\n return values.map((v) => Message.fromValues(v));\n }\n\n toString() {\n return strMsg(this, 'Message');\n }\n}\n\nexport class WireMessage extends BaseMessage {\n name?: string;\n connectionKey?: string;\n action?: number;\n serial?: string;\n version?: API.MessageVersion;\n annotations?: API.MessageAnnotations;\n\n // Overload toJSON() to intercept JSON.stringify()\n toJSON(...args: any[]) {\n return wireToJSON.call(this, ...args);\n }\n\n static fromValues(values: Properties<WireMessage>): WireMessage {\n return Object.assign(new WireMessage(), values);\n }\n\n static fromValuesArray(values: Properties<WireMessage>[]): WireMessage[] {\n return values.map((v) => WireMessage.fromValues(v));\n }\n\n // for contexts where some decoding errors need to be handled specially by the caller\n async decodeWithErr(\n inputContext: CipherOptions | EncodingDecodingContext | ChannelOptions,\n logger: Logger,\n ): Promise<{ decoded: Message; err: ErrorInfo | undefined }> {\n const res: Message = Object.assign(new Message(), {\n ...this,\n action: stringifyAction(this.action),\n });\n let err: ErrorInfo | undefined;\n try {\n await decode(res, inputContext);\n } catch (e) {\n Logger.logAction(logger, Logger.LOG_ERROR, 'WireMessage.decode()', Utils.inspectError(e));\n err = e as ErrorInfo;\n }\n res.expandFields();\n return { decoded: res, err: err };\n }\n\n async decode(\n inputContext: CipherOptions | EncodingDecodingContext | ChannelOptions,\n logger: Logger,\n ): Promise<Message> {\n const { decoded } = await this.decodeWithErr(inputContext, logger);\n return decoded;\n }\n\n toString() {\n return strMsg(this, 'WireMessage');\n }\n}\n\nexport default Message;\n","import * as Utils from '../util/utils';\r\nimport Logger from '../util/logger';\r\nimport RestPresence from './restpresence';\r\nimport Message, {\r\n serialize as serializeMessage,\r\n getMessagesSize,\r\n encodeArray as encodeMessagesArray,\r\n} from '../types/message';\r\nimport { CipherOptions } from '../types/basemessage';\r\nimport ErrorInfo from '../types/errorinfo';\r\nimport { PaginatedResult } from './paginatedresource';\r\nimport Resource from './resource';\r\nimport { ChannelOptions } from '../../types/channel';\r\nimport BaseRest from './baseclient';\r\nimport * as API from '../../../../ably';\r\nimport Defaults, { normaliseChannelOptions } from '../util/defaults';\r\nimport { RestHistoryParams } from './restchannelmixin';\r\nimport { RequestBody } from 'common/types/http';\r\nimport type { PushChannel } from 'plugins/push';\r\nimport type RestAnnotations from './restannotations';\r\nimport type { RestObject } from 'plugins/liveobjects';\r\n\r\nconst MSG_ID_ENTROPY_BYTES = 9;\r\n\r\ntype RestPublishResponse = API.PublishResult & { channel?: string; messageId?: string };\r\n\r\nfunction allEmptyIds(messages: Array<Message>) {\r\n return messages.every(function (message: Message) {\r\n return !message.id;\r\n });\r\n}\r\n\r\nclass RestChannel {\r\n client: BaseRest;\r\n name: string;\r\n presence: RestPresence;\r\n channelOptions: ChannelOptions;\r\n _push?: PushChannel;\r\n private _annotations: RestAnnotations | null = null;\r\n get annotations(): RestAnnotations {\r\n if (!this._annotations) {\r\n Utils.throwMissingPluginError('Annotations');\r\n }\r\n return this._annotations;\r\n }\r\n private _object?: RestObject;\r\n\r\n constructor(client: BaseRest, name: string, channelOptions?: ChannelOptions) {\r\n Logger.logAction(client.logger, Logger.LOG_MINOR, 'RestChannel()', 'started; name = ' + name);\r\n this.name = name;\r\n this.client = client;\r\n this.presence = new RestPresence(this);\r\n this.channelOptions = normaliseChannelOptions(client._Crypto ?? null, this.logger, channelOptions);\r\n if (client.options.plugins?.Push) {\r\n this._push = new client.options.plugins.Push.PushChannel(this);\r\n }\r\n if (client._Annotations) {\r\n this._annotations = new client._Annotations.RestAnnotations(this);\r\n }\r\n if (client._liveObjectsPlugin) {\r\n this._object = new client._liveObjectsPlugin.RestObject(this);\r\n }\r\n }\r\n\r\n get push() {\r\n if (!this._push) {\r\n Utils.throwMissingPluginError('Push');\r\n }\r\n return this._push;\r\n }\r\n\r\n get object(): RestObject {\r\n if (!this._object) {\r\n Utils.throwMissingPluginError('LiveObjects');\r\n }\r\n return this._object;\r\n }\r\n\r\n get logger(): Logger {\r\n return this.client.logger;\r\n }\r\n\r\n setOptions(options?: ChannelOptions): void {\r\n this.channelOptions = normaliseChannelOptions(this.client._Crypto ?? null, this.logger, options);\r\n }\r\n\r\n async history(params: RestHistoryParams | null): Promise<PaginatedResult<Message>> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestChannel.history()', 'channel = ' + this.name);\r\n return this.client.rest.channelMixin.history(this, params);\r\n }\r\n\r\n async publish(...args: any[]): Promise<API.PublishResult> {\r\n const first = args[0],\r\n second = args[1];\r\n let messages: Array<Message>;\r\n let params: any;\r\n\r\n if (typeof first === 'string' || first === null) {\r\n /* (name, data, ...) */\r\n messages = [Message.fromValues({ name: first, data: second })];\r\n params = args[2];\r\n } else if (Utils.isObject(first)) {\r\n messages = [Message.fromValues(first)];\r\n params = args[1];\r\n } else if (Array.isArray(first)) {\r\n messages = Message.fromValuesArray(first);\r\n params = args[1];\r\n } else {\r\n throw new ErrorInfo(\r\n 'The single-argument form of publish() expects a message object or an array of message objects',\r\n 40013,\r\n 400,\r\n );\r\n }\r\n\r\n if (!params) {\r\n /* No params supplied */\r\n params = {};\r\n }\r\n\r\n const client = this.client,\r\n options = client.options,\r\n format = options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\r\n idempotentRestPublishing = client.options.idempotentRestPublishing,\r\n headers = Defaults.defaultPostHeaders(client.options);\r\n\r\n Utils.mixin(headers, options.headers);\r\n\r\n if (idempotentRestPublishing && allEmptyIds(messages)) {\r\n const msgIdBase = await Utils.randomString(MSG_ID_ENTROPY_BYTES);\r\n messages.forEach(function (message, index) {\r\n message.id = msgIdBase + ':' + index.toString();\r\n });\r\n }\r\n\r\n const wireMessages = await encodeMessagesArray(messages, this.channelOptions as CipherOptions);\r\n\r\n /* RSL1i */\r\n const size = getMessagesSize(wireMessages),\r\n maxMessageSize = options.maxMessageSize;\r\n if (size > maxMessageSize) {\r\n throw new ErrorInfo(\r\n `Maximum size of messages that can be published at once exceeded (was ${size} bytes; limit is ${maxMessageSize} bytes)`,\r\n 40009,\r\n 400,\r\n );\r\n }\r\n\r\n return this._publish(serializeMessage(wireMessages, client._MsgPack, format), headers, params);\r\n }\r\n\r\n async _publish(\r\n requestBody: RequestBody | null,\r\n headers: Record<string, string>,\r\n params: any,\r\n ): Promise<API.PublishResult> {\r\n const client = this.client;\r\n const format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json;\r\n const { body, unpacked } = await Resource.post<RestPublishResponse>(\r\n client,\r\n client.rest.channelMixin.basePath(this) + '/messages',\r\n requestBody,\r\n headers,\r\n params,\r\n null,\r\n true,\r\n );\r\n const decoded =\r\n (unpacked ? body : Utils.decodeBody<RestPublishResponse>(body, client._MsgPack, format)) ||\r\n ({} as RestPublishResponse);\r\n delete decoded['channel'];\r\n delete decoded['messageId'];\r\n return decoded;\r\n }\r\n\r\n async status(): Promise<API.ChannelDetails> {\r\n return this.client.rest.channelMixin.status(this);\r\n }\r\n\r\n async getMessage(serialOrMessage: string | Message): Promise<Message> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestChannel.getMessage()', 'channel = ' + this.name);\r\n return this.client.rest.channelMixin.getMessage(this, serialOrMessage);\r\n }\r\n\r\n async updateMessage(\r\n message: Message,\r\n operation?: API.MessageOperation,\r\n params?: Record<string, any>,\r\n ): Promise<API.UpdateDeleteResult> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestChannel.updateMessage()', 'channel = ' + this.name);\r\n return this.client.rest.channelMixin.updateDeleteMessage(this, 'message.update', message, operation, params);\r\n }\r\n\r\n async deleteMessage(\r\n message: Message,\r\n operation?: API.MessageOperation,\r\n params?: Record<string, any>,\r\n ): Promise<API.UpdateDeleteResult> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestChannel.deleteMessage()', 'channel = ' + this.name);\r\n return this.client.rest.channelMixin.updateDeleteMessage(this, 'message.delete', message, operation, params);\r\n }\r\n\r\n async appendMessage(\r\n message: Message,\r\n operation?: API.MessageOperation,\r\n params?: Record<string, any>,\r\n ): Promise<API.UpdateDeleteResult> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestChannel.appendMessage()', 'channel = ' + this.name);\r\n return this.client.rest.channelMixin.updateDeleteMessage(this, 'message.append', message, operation, params);\r\n }\r\n\r\n async getMessageVersions(\r\n serialOrMessage: string | Message,\r\n params?: Record<string, any>,\r\n ): Promise<PaginatedResult<Message>> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestChannel.getMessageVersions()', 'channel = ' + this.name);\r\n return this.client.rest.channelMixin.getMessageVersions(this, serialOrMessage, params);\r\n }\r\n}\r\n\r\nexport default RestChannel;\r\n","type StatsValues = {\n entries?: Partial<Record<string, number>>;\n schema?: string;\n appId?: string;\n inProgress?: never;\n unit?: never;\n intervalId?: never;\n};\n\nclass Stats {\n entries?: Partial<Record<string, number>>;\n schema?: string;\n appId?: string;\n inProgress?: never;\n unit?: never;\n intervalId?: never;\n\n constructor(values?: StatsValues) {\n this.entries = (values && values.entries) || undefined;\n this.schema = (values && values.schema) || undefined;\n this.appId = (values && values.appId) || undefined;\n this.inProgress = (values && values.inProgress) || undefined;\n this.unit = (values && values.unit) || undefined;\n this.intervalId = (values && values.intervalId) || undefined;\n }\n\n static fromValues(values: StatsValues): Stats {\n return new Stats(values);\n }\n}\n\nexport default Stats;\n","import * as API from '../../../../ably';\nimport RestChannel from './restchannel';\nimport ErrorInfo from '../types/errorinfo';\nimport RealtimeChannel from './realtimechannel';\nimport * as Utils from '../util/utils';\nimport Message, { WireMessage, _fromEncodedArray, _fromEncoded, serialize as serializeMessage } from '../types/message';\nimport { CipherOptions } from '../types/basemessage';\nimport Defaults from '../util/defaults';\nimport PaginatedResource, { PaginatedResult } from './paginatedresource';\nimport Resource from './resource';\n\nexport interface RestHistoryParams {\n start?: number;\n end?: number;\n direction?: string;\n limit?: number;\n}\n\nexport class RestChannelMixin {\n static basePath(channel: RestChannel | RealtimeChannel) {\n return '/channels/' + encodeURIComponent(channel.name);\n }\n\n static history(\n channel: RestChannel | RealtimeChannel,\n params: RestHistoryParams | null,\n ): Promise<PaginatedResult<Message>> {\n const client = channel.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = channel.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options);\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(client, this.basePath(channel) + '/messages', headers, envelope, async function (\n body,\n headers,\n unpacked,\n ) {\n const decoded = (\n unpacked ? body : Utils.decodeBody(body, client._MsgPack, format)\n ) as Utils.Properties<WireMessage>[];\n\n return _fromEncodedArray(decoded, channel);\n }).get(params as Record<string, unknown>);\n }\n\n static async status(channel: RestChannel | RealtimeChannel): Promise<API.ChannelDetails> {\n const format = channel.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json;\n const headers = Defaults.defaultPostHeaders(channel.client.options);\n\n const response = await Resource.get<API.ChannelDetails>(\n channel.client,\n this.basePath(channel),\n headers,\n {},\n format,\n true,\n );\n\n return response.body!;\n }\n\n static async getMessage(channel: RestChannel | RealtimeChannel, serialOrMessage: string | Message): Promise<Message> {\n const serial = typeof serialOrMessage === 'string' ? serialOrMessage : serialOrMessage.serial;\n if (!serial) {\n throw new ErrorInfo(\n 'This message lacks a serial. Make sure you have enabled \"Message annotations, updates, and deletes\" in channel settings on your dashboard.',\n 40003,\n 400,\n );\n }\n\n const client = channel.client;\n const format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json;\n const headers = Defaults.defaultGetHeaders(client.options);\n Utils.mixin(headers, client.options.headers);\n\n const { body, unpacked } = await Resource.get<WireMessage>(\n client,\n this.basePath(channel) + '/messages/' + encodeURIComponent(serial),\n headers,\n {},\n null,\n true,\n );\n\n const decoded = unpacked ? body! : Utils.decodeBody<WireMessage>(body, client._MsgPack, format);\n return _fromEncoded(decoded, channel);\n }\n\n static async updateDeleteMessage(\n channel: RestChannel | RealtimeChannel,\n action: 'message.update' | 'message.delete' | 'message.append',\n message: Message,\n operation?: API.MessageOperation,\n params?: Record<string, any>,\n ): Promise<API.UpdateDeleteResult> {\n if (!message.serial) {\n throw new ErrorInfo(\n 'This message lacks a serial and cannot be updated. Make sure you have enabled \"Message annotations, updates, and deletes\" in channel settings on your dashboard.',\n 40003,\n 400,\n );\n }\n\n const client = channel.client;\n const format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json;\n const headers = Defaults.defaultPostHeaders(client.options);\n Utils.mixin(headers, client.options.headers);\n\n // construct a new Message to avoid mutating the message the user passes in\n const requestMessage = Message.fromValues(message);\n requestMessage.action = action;\n requestMessage.version = operation;\n\n const encoded = await requestMessage.encode(channel.channelOptions as CipherOptions);\n const requestBody = serializeMessage(encoded, client._MsgPack, format);\n\n let method = Resource.patch;\n const { body, unpacked } = await method<API.UpdateDeleteResult>(\n client,\n this.basePath(channel) + '/messages/' + encodeURIComponent(message.serial),\n requestBody,\n headers,\n params || {},\n null,\n true,\n );\n\n const decoded = unpacked ? body : Utils.decodeBody<API.UpdateDeleteResult>(body, client._MsgPack, format);\n return decoded || { versionSerial: null };\n }\n\n static getMessageVersions(\n channel: RestChannel | RealtimeChannel,\n serialOrMessage: string | Message,\n params?: Record<string, any>,\n ): Promise<PaginatedResult<Message>> {\n const serial = typeof serialOrMessage === 'string' ? serialOrMessage : serialOrMessage.serial;\n if (!serial) {\n throw new ErrorInfo(\n 'This message lacks a serial. Make sure you have enabled \"Message annotations, updates, and deletes\" in channel settings on your dashboard.',\n 40003,\n 400,\n );\n }\n\n const client = channel.client;\n const format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json;\n const envelope = channel.client.http.supportsLinkHeaders ? undefined : format;\n const headers = Defaults.defaultGetHeaders(client.options);\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(\n client,\n this.basePath(channel) + '/messages/' + encodeURIComponent(serial) + '/versions',\n headers,\n envelope,\n async (body, headers, unpacked) => {\n const decoded = unpacked\n ? (body as WireMessage[])\n : Utils.decodeBody<WireMessage[]>(body, client._MsgPack, format);\n\n return _fromEncodedArray(decoded, channel);\n },\n ).get(params || {});\n }\n}\n","import RestPresence from './restpresence';\nimport RealtimePresence from './realtimepresence';\nimport * as Utils from '../util/utils';\nimport Defaults from '../util/defaults';\nimport PaginatedResource, { PaginatedResult } from './paginatedresource';\nimport PresenceMessage, { WirePresenceMessage, _fromEncodedArray } from '../types/presencemessage';\nimport { RestChannelMixin } from './restchannelmixin';\n\nexport class RestPresenceMixin {\n static basePath(presence: RestPresence | RealtimePresence) {\n return RestChannelMixin.basePath(presence.channel) + '/presence';\n }\n\n static async history(\n presence: RestPresence | RealtimePresence,\n params: any,\n ): Promise<PaginatedResult<PresenceMessage>> {\n const client = presence.channel.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = presence.channel.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options);\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(\n client,\n this.basePath(presence) + '/history',\n headers,\n envelope,\n async (body, headers, unpacked) => {\n const decoded = (\n unpacked ? body : Utils.decodeBody(body, client._MsgPack, format)\n ) as Utils.Properties<WirePresenceMessage>[];\n\n return _fromEncodedArray(decoded, presence.channel);\n },\n ).get(params);\n }\n}\n","import * as Utils from '../util/utils';\nimport Defaults from '../util/defaults';\nimport Push from './push';\nimport PaginatedResource, { HttpPaginatedResponse, PaginatedResult } from './paginatedresource';\nimport RestChannel from './restchannel';\nimport ErrorInfo from '../types/errorinfo';\nimport Stats from '../types/stats';\nimport HttpMethods from '../../constants/HttpMethods';\nimport { ChannelOptions } from '../../types/channel';\nimport { RequestBody, RequestParams } from '../../types/http';\nimport * as API from '../../../../ably';\nimport Resource from './resource';\n\nimport Platform from '../../platform';\nimport BaseClient from './baseclient';\nimport { useTokenAuth } from './auth';\nimport { RestChannelMixin } from './restchannelmixin';\nimport { RestPresenceMixin } from './restpresencemixin';\nimport DeviceDetails from '../types/devicedetails';\nimport PushChannelSubscription from '../types/pushchannelsubscription';\n\ntype BatchResult<T> = API.BatchResult<T>;\n\ntype BatchPublishSpec = API.BatchPublishSpec;\ntype BatchPublishSuccessResult = API.BatchPublishSuccessResult;\ntype BatchPublishFailureResult = API.BatchPublishFailureResult;\ntype BatchPublishResult = BatchResult<BatchPublishSuccessResult | BatchPublishFailureResult>;\ntype BatchPresenceSuccessResult = API.BatchPresenceSuccessResult;\ntype BatchPresenceFailureResult = API.BatchPresenceFailureResult;\ntype BatchPresenceResult = BatchResult<BatchPresenceSuccessResult | BatchPresenceFailureResult>;\n\ntype TokenRevocationTargetSpecifier = API.TokenRevocationTargetSpecifier;\ntype TokenRevocationOptions = API.TokenRevocationOptions;\ntype TokenRevocationSuccessResult = API.TokenRevocationSuccessResult;\ntype TokenRevocationFailureResult = API.TokenRevocationFailureResult;\ntype TokenRevocationResult = BatchResult<TokenRevocationSuccessResult | TokenRevocationFailureResult>;\n\nexport class Rest {\n private readonly client: BaseClient;\n readonly channels: Channels;\n readonly push: Push;\n\n readonly channelMixin = RestChannelMixin;\n readonly presenceMixin = RestPresenceMixin;\n\n // exposed for plugins but shouldn't be bundled with minimal realtime\n Resource = Resource;\n PaginatedResource = PaginatedResource;\n DeviceDetails = DeviceDetails;\n PushChannelSubscription = PushChannelSubscription;\n\n constructor(client: BaseClient) {\n this.client = client;\n this.channels = new Channels(this.client);\n this.push = new Push(this.client);\n }\n\n async stats(params: RequestParams): Promise<PaginatedResult<Stats>> {\n const headers = Defaults.defaultGetHeaders(this.client.options),\n format = this.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = this.client.http.supportsLinkHeaders ? undefined : format;\n\n Utils.mixin(headers, this.client.options.headers);\n\n return new PaginatedResource(this.client, '/stats', headers, envelope, async (body, _, unpacked) => {\n const statsValues: Stats[] = unpacked\n ? (body as Stats[])\n : Utils.decodeBody<Stats[]>(body, this.client._MsgPack, format);\n for (let i = 0; i < statsValues.length; i++) statsValues[i] = Stats.fromValues(statsValues[i]);\n return statsValues;\n }).get(params as Record<string, string>);\n }\n\n async time(params?: RequestParams): Promise<number> {\n const headers = Defaults.defaultGetHeaders(this.client.options, { format: Utils.Format.json });\n if (this.client.options.headers) Utils.mixin(headers, this.client.options.headers);\n const timeUri = (host: string) => {\n return this.client.baseUri(host) + '/time';\n };\n\n let { error, body, unpacked } = await this.client.http.do(\n HttpMethods.Get,\n timeUri,\n headers,\n null,\n params as RequestParams,\n );\n\n if (error) {\n throw error;\n }\n if (!unpacked) body = JSON.parse(body as string);\n const time = (body as number[])[0];\n if (!time) {\n throw new ErrorInfo('Internal error (unexpected result type from GET /time)', 50000, 500);\n }\n /* calculate time offset only once for this device by adding to the prototype */\n this.client.serverTimeOffset = time - Date.now();\n return time;\n }\n\n async request(\n method: string,\n path: string,\n version: number,\n params: RequestParams,\n body: unknown,\n customHeaders: Record<string, string>,\n ): Promise<HttpPaginatedResponse<unknown>> {\n const [encoder, decoder, format] = (() => {\n if (this.client.options.useBinaryProtocol) {\n if (!this.client._MsgPack) {\n Utils.throwMissingPluginError('MsgPack');\n }\n return [this.client._MsgPack.encode, this.client._MsgPack.decode, Utils.Format.msgpack];\n } else {\n return [JSON.stringify, JSON.parse, Utils.Format.json];\n }\n })();\n const envelope = this.client.http.supportsLinkHeaders ? undefined : format;\n params = params || {};\n const _method = method.toLowerCase() as HttpMethods;\n const headers =\n _method == 'get'\n ? Defaults.defaultGetHeaders(this.client.options, { format, protocolVersion: version })\n : Defaults.defaultPostHeaders(this.client.options, { format, protocolVersion: version });\n\n if (typeof body !== 'string') {\n body = encoder(body) ?? null;\n }\n Utils.mixin(headers, this.client.options.headers);\n if (customHeaders) {\n Utils.mixin(headers, customHeaders);\n }\n const paginatedResource = new PaginatedResource(\n this.client,\n path,\n headers,\n envelope,\n async function (resbody, headers, unpacked) {\n return Utils.ensureArray(unpacked ? resbody : decoder(resbody as string & Buffer));\n },\n /* useHttpPaginatedResponse: */ true,\n );\n\n if (!Platform.Http.methods.includes(_method)) {\n throw new ErrorInfo('Unsupported method ' + _method, 40500, 405);\n }\n\n if (Platform.Http.methodsWithBody.includes(_method)) {\n return paginatedResource[_method as HttpMethods.Post](params, body as RequestBody) as Promise<\n HttpPaginatedResponse<unknown>\n >;\n } else {\n return paginatedResource[_method as HttpMethods.Get | HttpMethods.Delete](params) as Promise<\n HttpPaginatedResponse<unknown>\n >;\n }\n }\n\n async batchPublish<T extends BatchPublishSpec | BatchPublishSpec[]>(\n specOrSpecs: T,\n ): Promise<T extends BatchPublishSpec ? BatchPublishResult : BatchPublishResult[]> {\n let requestBodyDTO: BatchPublishSpec[];\n let singleSpecMode: boolean;\n if (Array.isArray(specOrSpecs)) {\n requestBodyDTO = specOrSpecs;\n singleSpecMode = false;\n } else {\n requestBodyDTO = [specOrSpecs];\n singleSpecMode = true;\n }\n\n const format = this.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(this.client.options);\n\n if (this.client.options.headers) Utils.mixin(headers, this.client.options.headers);\n\n const requestBody = Utils.encodeBody(requestBodyDTO, this.client._MsgPack, format);\n\n const response = await Resource.post(this.client, '/messages', requestBody, headers, {}, null, true);\n\n const batchResults = (\n response.unpacked ? response.body : Utils.decodeBody(response.body, this.client._MsgPack, format)\n ) as BatchPublishResult[];\n\n // I don't love the below type assertions but not sure how to avoid them\n if (singleSpecMode) {\n return batchResults[0] as T extends BatchPublishSpec ? BatchPublishResult : BatchPublishResult[];\n } else {\n return batchResults as T extends BatchPublishSpec ? BatchPublishResult : BatchPublishResult[];\n }\n }\n\n async batchPresence(channels: string[]): Promise<BatchPresenceResult> {\n const format = this.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultGetHeaders(this.client.options);\n\n if (this.client.options.headers) Utils.mixin(headers, this.client.options.headers);\n\n const channelsParam = channels.join(',');\n\n const response = await Resource.get(this.client, '/presence', headers, { channels: channelsParam }, null, true);\n\n return (\n response.unpacked ? response.body : Utils.decodeBody(response.body, this.client._MsgPack, format)\n ) as BatchPresenceResult;\n }\n\n async revokeTokens(\n specifiers: TokenRevocationTargetSpecifier[],\n options?: TokenRevocationOptions,\n ): Promise<TokenRevocationResult> {\n if (useTokenAuth(this.client.options)) {\n throw new ErrorInfo('Cannot revoke tokens when using token auth', 40162, 401);\n }\n\n const keyName = this.client.options.keyName!;\n\n let resolvedOptions = options ?? {};\n\n const requestBodyDTO = {\n targets: specifiers.map((specifier) => `${specifier.type}:${specifier.value}`),\n ...resolvedOptions,\n };\n\n const format = this.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(this.client.options);\n\n if (this.client.options.headers) Utils.mixin(headers, this.client.options.headers);\n\n const requestBody = Utils.encodeBody(requestBodyDTO, this.client._MsgPack, format);\n\n const response = await Resource.post(\n this.client,\n `/keys/${keyName}/revokeTokens`,\n requestBody,\n headers,\n {},\n null,\n true,\n );\n\n return (\n response.unpacked ? response.body : Utils.decodeBody(response.body, this.client._MsgPack, format)\n ) as TokenRevocationResult;\n }\n}\n\nclass Channels {\n client: BaseClient;\n // RSN2\n all: Record<string, RestChannel>;\n\n constructor(client: BaseClient) {\n this.client = client;\n this.all = Object.create(null);\n }\n\n get(name: string, channelOptions?: ChannelOptions) {\n name = String(name);\n let channel = this.all[name];\n if (!channel) {\n this.all[name] = channel = new RestChannel(this.client, name, channelOptions);\n } else if (channelOptions) {\n channel.setOptions(channelOptions);\n }\n\n return channel;\n }\n\n /* Included to support certain niche use-cases; most users should ignore this.\n * Please do not use this unless you know what you're doing */\n release(name: string) {\n delete this.all[String(name)];\n }\n}\n","import BaseClient from './baseclient';\nimport ClientOptions from '../../types/ClientOptions';\nimport { Rest } from './rest';\nimport Defaults from '../util/defaults';\nimport Logger from '../util/logger';\n\n/**\n `BaseRest` is an export of the tree-shakable version of the SDK, and acts as the base class for the `DefaultRest` class exported by the non tree-shakable version.\n\n It always includes the `Rest` plugin.\n */\nexport class BaseRest extends BaseClient {\n /*\n * The public typings declare that this only accepts an object, but since we want to emit a good error message in the case where a non-TypeScript user does one of these things:\n *\n * 1. passes a string (which is quite likely if they’re e.g. migrating from the default variant to the modular variant)\n * 2. passes no argument at all\n *\n * tell the compiler that these cases are possible so that it forces us to handle them.\n */\n constructor(options?: ClientOptions | string) {\n super(Defaults.objectifyOptions(options, false, 'BaseRest', Logger.defaultLogger, { Rest }));\n }\n}\n","import { Rest } from './rest';\nimport { IUntypedCryptoStatic } from '../../types/ICryptoStatic';\nimport { MsgPack } from 'common/types/msgpack';\nimport RealtimePresence from './realtimepresence';\nimport RealtimeAnnotations from './realtimeannotations';\nimport RestAnnotations from './restannotations';\nimport XHRRequest from 'platform/web/lib/http/request/xhrrequest';\nimport fetchRequest from 'platform/web/lib/http/request/fetchrequest';\nimport { FilteredSubscriptions } from './filteredsubscriptions';\nimport PresenceMessage, { WirePresenceMessage } from '../types/presencemessage';\nimport Annotation, { WireAnnotation } from '../types/annotation';\nimport { TransportCtor } from '../transport/transport';\nimport type * as PushPlugin from 'plugins/push';\nimport type * as LiveObjectsPlugin from 'plugins/liveobjects';\n\nexport interface PresenceMessagePlugin {\n PresenceMessage: typeof PresenceMessage;\n WirePresenceMessage: typeof WirePresenceMessage;\n}\n\nexport type RealtimePresencePlugin = PresenceMessagePlugin & {\n RealtimePresence: typeof RealtimePresence;\n};\n\nexport type AnnotationsPlugin = {\n Annotation: typeof Annotation;\n WireAnnotation: typeof WireAnnotation;\n RealtimeAnnotations: typeof RealtimeAnnotations;\n RestAnnotations: typeof RestAnnotations;\n};\n\nexport interface ModularPlugins {\n Rest?: typeof Rest;\n Crypto?: IUntypedCryptoStatic;\n MsgPack?: MsgPack;\n RealtimePresence?: RealtimePresencePlugin;\n Annotations?: AnnotationsPlugin;\n WebSocketTransport?: TransportCtor;\n XHRPolling?: TransportCtor;\n XHRRequest?: typeof XHRRequest;\n FetchRequest?: typeof fetchRequest;\n MessageInteractions?: typeof FilteredSubscriptions;\n Push?: typeof PushPlugin;\n LiveObjects?: typeof LiveObjectsPlugin; // PC5, PT2b\n}\n\nexport const allCommonModularPlugins: ModularPlugins = { Rest };\n","import Message, { WireMessage, fromEncoded, fromEncodedArray } from './message';\nimport * as API from '../../../../ably';\nimport Platform from 'common/platform';\nimport Logger from '../util/logger';\nimport type { Properties } from '../util/utils';\n\n/**\n `DefaultMessage` is the class returned by `DefaultRest` and `DefaultRealtime`’s `Message` static property. It introduces the static methods described in the `MessageStatic` interface of the public API of the non tree-shakable version of the library.\n */\nexport class DefaultMessage extends Message {\n static async fromEncoded(encoded: unknown, inputOptions?: API.ChannelOptions): Promise<Message> {\n return fromEncoded(Logger.defaultLogger, Platform.Crypto, encoded as WireMessage, inputOptions);\n }\n\n static async fromEncodedArray(encodedArray: Array<unknown>, options?: API.ChannelOptions): Promise<Message[]> {\n return fromEncodedArray(Logger.defaultLogger, Platform.Crypto, encodedArray as WireMessage[], options);\n }\n\n static fromValues(values: Properties<Message>): Message {\n return Message.fromValues(values);\n }\n}\n","import * as API from '../../../../ably';\nimport Logger from '../util/logger';\nimport PresenceMessage, { fromEncoded, fromEncodedArray, WirePresenceMessage } from './presencemessage';\nimport Platform from 'common/platform';\nimport type { Properties } from '../util/utils';\n\n/**\n `DefaultPresenceMessage` is the class returned by `DefaultRest` and `DefaultRealtime`’s `PresenceMessage` static property. It introduces the static methods described in the `PresenceMessageStatic` interface of the public API of the non tree-shakable version of the library.\n */\nexport class DefaultPresenceMessage extends PresenceMessage {\n static async fromEncoded(encoded: unknown, inputOptions?: API.ChannelOptions): Promise<PresenceMessage> {\n return fromEncoded(Logger.defaultLogger, Platform.Crypto, encoded as WirePresenceMessage, inputOptions);\n }\n\n static async fromEncodedArray(\n encodedArray: Array<unknown>,\n options?: API.ChannelOptions,\n ): Promise<PresenceMessage[]> {\n return fromEncodedArray(Logger.defaultLogger, Platform.Crypto, encodedArray as WirePresenceMessage[], options);\n }\n\n static fromValues(values: Properties<PresenceMessage>): PresenceMessage {\n return PresenceMessage.fromValues(values);\n }\n}\n","import Logger from '../util/logger';\nimport { BaseMessage, encode, decode, wireToJSON, strMsg } from './basemessage';\nimport * as API from '../../../../ably';\nimport * as Utils from '../util/utils';\n\nimport type { Properties } from '../util/utils';\nimport type RestChannel from '../client/restchannel';\nimport type RealtimeChannel from '../client/realtimechannel';\nimport type { ChannelOptions } from '../../types/channel';\ntype Channel = RestChannel | RealtimeChannel;\n\nconst actions = ['annotation.create', 'annotation.delete'];\n\nexport async function fromEncoded(\n logger: Logger,\n encoded: WireAnnotation,\n options?: API.ChannelOptions,\n): Promise<Annotation> {\n const wa = WireAnnotation.fromValues(encoded);\n return wa.decode(options || {}, logger);\n}\n\nexport async function fromEncodedArray(\n logger: Logger,\n encodedArray: WireAnnotation[],\n options?: API.ChannelOptions,\n): Promise<Annotation[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return fromEncoded(logger, encoded, options);\n }),\n );\n}\n\n// these forms of the functions are used internally when we have a channel instance\n// already, so don't need to normalise channel options\nexport async function _fromEncoded(encoded: Properties<WireAnnotation>, channel: Channel): Promise<Annotation> {\n return WireAnnotation.fromValues(encoded).decode(channel.channelOptions, channel.logger);\n}\n\nexport async function _fromEncodedArray(\n encodedArray: Properties<WireAnnotation>[],\n channel: Channel,\n): Promise<Annotation[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return _fromEncoded(encoded, channel);\n }),\n );\n}\n\n// for tree-shakability\nexport function fromValues(values: Properties<Annotation>) {\n return Annotation.fromValues(values);\n}\n\nclass Annotation extends BaseMessage {\n action?: API.AnnotationAction;\n serial?: string;\n messageSerial?: string;\n type?: string;\n name?: string;\n count?: number;\n\n async encode(): Promise<WireAnnotation> {\n const res = Object.assign(new WireAnnotation(), this, {\n action: actions.indexOf(this.action || 'annotation.create'),\n });\n // note: we do not pass cipheroptions/channeloptions here as annotations are not\n // encrypted (as the data needs to be parsed by the server for summarisation)\n return encode(res, {});\n }\n\n static fromValues(values: Properties<Annotation>): Annotation {\n return Object.assign(new Annotation(), values);\n }\n\n static fromValuesArray(values: Properties<Annotation>[]): Annotation[] {\n return values.map((v) => Annotation.fromValues(v));\n }\n\n toString() {\n return strMsg(this, 'Annotation');\n }\n}\n\nexport class WireAnnotation extends BaseMessage {\n action?: number;\n serial?: string;\n messageSerial?: string;\n type?: string;\n name?: string;\n count?: number;\n\n toJSON(...args: any[]) {\n return wireToJSON.call(this, ...args);\n }\n\n static fromValues(values: Properties<WireAnnotation>): WireAnnotation {\n return Object.assign(new WireAnnotation(), values);\n }\n\n static fromValuesArray(values: Properties<WireAnnotation>[]): WireAnnotation[] {\n return values.map((v) => WireAnnotation.fromValues(v));\n }\n\n async decode(channelOptions: ChannelOptions, logger: Logger): Promise<Annotation> {\n const res = Object.assign(new Annotation(), {\n ...this,\n action: actions[this.action!],\n });\n try {\n await decode(res, channelOptions);\n } catch (e) {\n Logger.logAction(logger, Logger.LOG_ERROR, 'WireAnnotation.decode()', Utils.inspectError(e));\n }\n return res;\n }\n\n toString() {\n return strMsg(this, 'WireAnnotation');\n }\n}\n\nexport default Annotation;\n","import * as API from '../../../../ably';\nimport Logger from '../util/logger';\nimport Annotation, { fromEncoded, fromEncodedArray, WireAnnotation } from './annotation';\nimport type { Properties } from '../util/utils';\n\n/**\n `DefaultAnnotation` is the class returned by `DefaultRest` and `DefaultRealtime`’s `Annotation` static property. It introduces the static methods described in the `AnnotationStatic` interface of the public API of the non tree-shakable version of the library.\n */\nexport class DefaultAnnotation extends Annotation {\n static async fromEncoded(encoded: unknown, inputOptions?: API.ChannelOptions): Promise<Annotation> {\n return fromEncoded(Logger.defaultLogger, encoded as WireAnnotation, inputOptions);\n }\n\n static async fromEncodedArray(encodedArray: Array<unknown>, options?: API.ChannelOptions): Promise<Annotation[]> {\n return fromEncodedArray(Logger.defaultLogger, encodedArray as WireAnnotation[], options);\n }\n\n static fromValues(values: Properties<Annotation>): Annotation {\n return Annotation.fromValues(values);\n }\n}\n","import * as Utils from '../util/utils';\nimport Annotation, { WireAnnotation, _fromEncodedArray } from '../types/annotation';\nimport type Message from '../types/message';\nimport type RestChannel from './restchannel';\nimport type RealtimeChannel from './realtimechannel';\nimport Defaults from '../util/defaults';\nimport PaginatedResource, { PaginatedResult } from './paginatedresource';\nimport Resource from './resource';\nimport type { Properties } from '../util/utils';\nimport ErrorInfo from '../types/errorinfo';\n\nexport interface RestGetAnnotationsParams {\n limit?: number;\n}\n\nexport function serialFromMsgOrSerial(msgOrSerial: string | Message): string {\n let messageSerial: string | undefined;\n switch (typeof msgOrSerial) {\n case 'string':\n messageSerial = msgOrSerial;\n break;\n case 'object':\n messageSerial = msgOrSerial.serial;\n break;\n }\n if (!messageSerial || typeof messageSerial !== 'string') {\n throw new ErrorInfo(\n 'First argument of annotations.publish() must be either a Message (or at least an object with a string `serial` property) or a message serial (string)',\n 40003,\n 400,\n );\n }\n return messageSerial;\n}\n\nexport function constructValidateAnnotation(\n msgOrSerial: string | Message,\n annotationValues: Partial<Properties<Annotation>>,\n): Annotation {\n const messageSerial = serialFromMsgOrSerial(msgOrSerial);\n\n if (!annotationValues || typeof annotationValues !== 'object') {\n throw new ErrorInfo(\n 'Second argument of annotations.publish() must be an object (the intended annotation to publish)',\n 40003,\n 400,\n );\n }\n\n const annotation = Annotation.fromValues(annotationValues);\n annotation.messageSerial = messageSerial;\n if (!annotation.action) {\n annotation.action = 'annotation.create';\n }\n return annotation;\n}\n\nfunction basePathForSerial(channel: RestChannel | RealtimeChannel, serial: string) {\n return (\n channel.client.rest.channelMixin.basePath(channel) + '/messages/' + encodeURIComponent(serial) + '/annotations'\n );\n}\n\nclass RestAnnotations {\n private channel: RestChannel;\n\n constructor(channel: RestChannel) {\n this.channel = channel;\n }\n\n async publish(msgOrSerial: string | Message, annotationValues: Partial<Properties<Annotation>>): Promise<void> {\n const annotation = constructValidateAnnotation(msgOrSerial, annotationValues);\n const wireAnnotation = await annotation.encode();\n\n const client = this.channel.client,\n options = client.options,\n format = options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(client.options),\n params = {};\n\n Utils.mixin(headers, client.options.headers);\n\n const requestBody = Utils.encodeBody([wireAnnotation], client._MsgPack, format);\n\n await Resource.post(\n client,\n basePathForSerial(this.channel, annotation.messageSerial!),\n requestBody,\n headers,\n params,\n null,\n true,\n );\n }\n\n async delete(msgOrSerial: string | Message, annotationValues: Partial<Properties<Annotation>>): Promise<void> {\n annotationValues.action = 'annotation.delete';\n return this.publish(msgOrSerial, annotationValues);\n }\n\n async get(\n msgOrSerial: string | Message,\n params: RestGetAnnotationsParams | null,\n ): Promise<PaginatedResult<Annotation>> {\n const client = this.channel.client,\n messageSerial = serialFromMsgOrSerial(msgOrSerial),\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options);\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(\n client,\n basePathForSerial(this.channel, messageSerial),\n headers,\n envelope,\n async (body, _, unpacked) => {\n const decoded = (\n unpacked ? body : Utils.decodeBody(body, client._MsgPack, format)\n ) as Utils.Properties<WireAnnotation>[];\n\n return _fromEncodedArray(decoded, this.channel);\n },\n ).get(params as Record<string, unknown>);\n }\n}\n\nexport default RestAnnotations;\n","import { MsgPack } from 'common/types/msgpack';\nimport * as API from '../../../../ably';\nimport { PresenceMessagePlugin } from '../client/modularplugins';\nimport { AnnotationsPlugin } from '../client/modularplugins';\nimport * as Utils from '../util/utils';\nimport ErrorInfo from './errorinfo';\nimport { WireMessage } from './message';\nimport PresenceMessage, { WirePresenceMessage } from './presencemessage';\nimport Annotation, { WireAnnotation } from './annotation';\nimport RealtimeAnnotations from '../client/realtimeannotations';\nimport RestAnnotations from '../client/restannotations';\nimport { flags, flagNames, channelModes, ActionName } from './protocolmessagecommon';\nimport type { Properties } from '../util/utils';\nimport type * as LiveObjectsPlugin from 'plugins/liveobjects';\nimport { MessageEncoding } from './basemessage';\n\nexport const serialize = Utils.encodeBody;\n\nfunction toStringArray(array?: any[]): string {\n const result = [];\n if (array) {\n for (let i = 0; i < array.length; i++) {\n result.push(array[i].toString());\n }\n }\n return '[ ' + result.join(', ') + ' ]';\n}\n\nexport function deserialize(\n serialized: unknown,\n MsgPack: MsgPack | null,\n presenceMessagePlugin: PresenceMessagePlugin | null,\n annotationsPlugin: AnnotationsPlugin | null,\n objectsPlugin: typeof LiveObjectsPlugin | null,\n format?: Utils.Format,\n): ProtocolMessage {\n const deserialized = Utils.decodeBody<Record<string, unknown>>(serialized, MsgPack, format);\n return fromDeserialized(deserialized, presenceMessagePlugin, annotationsPlugin, objectsPlugin);\n}\n\nexport function fromDeserialized(\n deserialized: Record<string, unknown>,\n presenceMessagePlugin: PresenceMessagePlugin | null,\n annotationsPlugin: AnnotationsPlugin | null,\n objectsPlugin: typeof LiveObjectsPlugin | null,\n): ProtocolMessage {\n let error: ErrorInfo | undefined;\n if (deserialized.error) {\n error = ErrorInfo.fromValues(deserialized.error as ErrorInfo);\n }\n\n let messages: WireMessage[] | undefined;\n if (deserialized.messages) {\n messages = WireMessage.fromValuesArray(deserialized.messages as Array<Properties<WireMessage>>);\n }\n\n let presence: WirePresenceMessage[] | undefined;\n if (presenceMessagePlugin && deserialized.presence) {\n presence = presenceMessagePlugin.WirePresenceMessage.fromValuesArray(\n deserialized.presence as Array<Properties<WirePresenceMessage>>,\n );\n }\n\n let annotations: WireAnnotation[] | undefined;\n if (annotationsPlugin && deserialized.annotations) {\n annotations = annotationsPlugin.WireAnnotation.fromValuesArray(\n deserialized.annotations as Array<Properties<WireAnnotation>>,\n );\n }\n\n let state: LiveObjectsPlugin.WireObjectMessage[] | undefined;\n if (objectsPlugin && deserialized.state) {\n state = objectsPlugin.WireObjectMessage.fromValuesArray(\n deserialized.state as LiveObjectsPlugin.WireObjectMessage[],\n Utils,\n MessageEncoding,\n );\n }\n\n return Object.assign(new ProtocolMessage(), { ...deserialized, presence, messages, annotations, state, error });\n}\n\n/**\n * Used internally by the tests.\n *\n * LiveObjectsPlugin code can't be included as part of the core library to prevent size growth,\n * so if a test needs to build object messages, then it must provide the plugin upon call.\n */\nexport function makeFromDeserializedWithDependencies(dependencies?: {\n LiveObjectsPlugin: typeof LiveObjectsPlugin | null;\n}) {\n return (deserialized: Record<string, unknown>): ProtocolMessage => {\n return fromDeserialized(\n deserialized,\n {\n PresenceMessage,\n WirePresenceMessage,\n },\n { Annotation, WireAnnotation, RealtimeAnnotations, RestAnnotations },\n dependencies?.LiveObjectsPlugin ?? null,\n );\n };\n}\n\nexport function fromValues(values: Properties<ProtocolMessage>): ProtocolMessage {\n return Object.assign(new ProtocolMessage(), values);\n}\n\nexport function stringify(\n msg: any,\n presenceMessagePlugin: PresenceMessagePlugin | null,\n annotationsPlugin: AnnotationsPlugin | null,\n objectsPlugin: typeof LiveObjectsPlugin | null,\n): string {\n let result = '[ProtocolMessage';\n if (msg.action !== undefined) result += '; action=' + ActionName[msg.action] || msg.action;\n\n const simpleAttributes = ['id', 'channel', 'channelSerial', 'connectionId', 'count', 'msgSerial', 'timestamp'];\n let attribute;\n for (let attribIndex = 0; attribIndex < simpleAttributes.length; attribIndex++) {\n attribute = simpleAttributes[attribIndex];\n if (msg[attribute] !== undefined) result += '; ' + attribute + '=' + msg[attribute];\n }\n\n if (msg.messages) result += '; messages=' + toStringArray(WireMessage.fromValuesArray(msg.messages));\n if (msg.presence && presenceMessagePlugin)\n result += '; presence=' + toStringArray(presenceMessagePlugin.WirePresenceMessage.fromValuesArray(msg.presence));\n if (msg.annotations && annotationsPlugin) {\n result += '; annotations=' + toStringArray(annotationsPlugin.WireAnnotation.fromValuesArray(msg.annotations));\n }\n if (msg.state && objectsPlugin) {\n result +=\n '; state=' + toStringArray(objectsPlugin.WireObjectMessage.fromValuesArray(msg.state, Utils, MessageEncoding));\n }\n if (msg.error) result += '; error=' + ErrorInfo.fromValues(msg.error).toString();\n if (msg.auth && msg.auth.accessToken) result += '; token=' + msg.auth.accessToken;\n if (msg.flags) result += '; flags=' + flagNames.filter(msg.hasFlag).join(',');\n if (msg.params) {\n let stringifiedParams = '';\n Utils.forInOwnNonNullProperties(msg.params, function (prop: string) {\n if (stringifiedParams.length > 0) {\n stringifiedParams += '; ';\n }\n stringifiedParams += prop + '=' + msg.params[prop];\n });\n if (stringifiedParams.length > 0) {\n result += '; params=[' + stringifiedParams + ']';\n }\n }\n result += ']';\n return result;\n}\n\nclass ProtocolMessage {\n action?: number;\n flags?: number;\n id?: string;\n timestamp?: number;\n count?: number;\n error?: ErrorInfo;\n connectionId?: string;\n channel?: string;\n channelSerial?: string | null;\n msgSerial?: number;\n messages?: WireMessage[];\n /**\n * This will be undefined if we skipped decoding this property due to user not requesting Presence functionality — see {@link fromDeserialized}\n */\n presence?: WirePresenceMessage[];\n annotations?: WireAnnotation[];\n /**\n * This will be undefined if we skipped decoding this property due to user not requesting LiveObjects functionality — see {@link fromDeserialized}\n */\n state?: LiveObjectsPlugin.WireObjectMessage[]; // TR4r\n auth?: unknown;\n connectionDetails?: Record<string, unknown>;\n params?: Record<string, string>;\n res?: API.PublishResult[];\n\n hasFlag = (flag: string): boolean => {\n return ((this.flags as number) & flags[flag]) > 0;\n };\n\n setFlag(flag: keyof typeof flags): number {\n return (this.flags = (this.flags as number) | flags[flag]);\n }\n\n getMode(): number {\n return (this.flags || 0) & flags.MODE_ALL;\n }\n\n encodeModesToFlags(modes: API.ChannelMode[]): void {\n modes.forEach((mode) => this.setFlag(mode));\n }\n\n decodeModesFromFlags(): string[] | undefined {\n const modes: string[] = [];\n channelModes.forEach((mode) => {\n if (this.hasFlag(mode)) {\n modes.push(mode);\n }\n });\n return modes.length > 0 ? modes : undefined;\n }\n}\n\nexport default ProtocolMessage;\n","import ErrorInfo from '../types/errorinfo';\n\nclass ChannelStateChange {\n previous: string;\n current: string;\n resumed?: boolean;\n reason?: string | Error | ErrorInfo;\n hasBacklog?: boolean;\n\n constructor(\n previous: string,\n current: string,\n resumed?: boolean,\n hasBacklog?: boolean,\n reason?: string | Error | ErrorInfo | null,\n ) {\n this.previous = previous;\n this.current = current;\n if (current === 'attached') {\n this.resumed = resumed;\n this.hasBacklog = hasBacklog;\n }\n if (reason) this.reason = reason;\n }\n}\n\nexport default ChannelStateChange;\n","import { actions, channelModes } from '../types/protocolmessagecommon';\r\nimport ProtocolMessage, { fromValues as protocolMessageFromValues } from '../types/protocolmessage';\r\nimport EventEmitter from '../util/eventemitter';\r\nimport * as Utils from '../util/utils';\r\nimport Logger from '../util/logger';\r\nimport { EncodingDecodingContext, CipherOptions, populateFieldsFromParent } from '../types/basemessage';\r\nimport Message, { getMessagesSize, encodeArray as encodeMessagesArray } from '../types/message';\r\nimport ChannelStateChange from './channelstatechange';\r\nimport ErrorInfo, { PartialErrorInfo } from '../types/errorinfo';\r\nimport * as API from '../../../../ably';\r\nimport ConnectionManager from '../transport/connectionmanager';\r\nimport { StandardCallback } from '../../types/utils';\r\nimport BaseRealtime from './baserealtime';\r\nimport { ChannelOptions } from '../../types/channel';\r\nimport { normaliseChannelOptions } from '../util/defaults';\r\nimport { PaginatedResult } from './paginatedresource';\r\nimport type { PushChannel } from 'plugins/push';\r\nimport type { WirePresenceMessage } from '../types/presencemessage';\r\nimport type { RealtimeObject, WireObjectMessage } from 'plugins/liveobjects';\r\nimport type RealtimePresence from './realtimepresence';\r\nimport type RealtimeAnnotations from './realtimeannotations';\r\n\r\ninterface RealtimeHistoryParams {\r\n start?: number;\r\n end?: number;\r\n direction?: string;\r\n limit?: number;\r\n untilAttach?: boolean;\r\n from_serial?: string;\r\n}\r\n\r\nfunction validateChannelOptions(options?: API.ChannelOptions) {\r\n if (options && 'params' in options && !Utils.isObject(options.params)) {\r\n return new ErrorInfo('options.params must be an object', 40000, 400);\r\n }\r\n if (options && 'modes' in options) {\r\n if (!Array.isArray(options.modes)) {\r\n return new ErrorInfo('options.modes must be an array', 40000, 400);\r\n }\r\n for (let i = 0; i < options.modes.length; i++) {\r\n const currentMode = options.modes[i];\r\n if (\r\n !currentMode ||\r\n typeof currentMode !== 'string' ||\r\n !channelModes.includes(String.prototype.toUpperCase.call(currentMode))\r\n ) {\r\n return new ErrorInfo('Invalid channel mode: ' + currentMode, 40000, 400);\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass RealtimeChannel extends EventEmitter {\r\n name: string;\r\n channelOptions: ChannelOptions;\r\n client: BaseRealtime;\r\n private _presence: RealtimePresence | null;\r\n private _annotations: RealtimeAnnotations | null = null;\r\n get presence(): RealtimePresence {\r\n if (!this._presence) {\r\n Utils.throwMissingPluginError('RealtimePresence');\r\n }\r\n return this._presence;\r\n }\r\n get annotations(): RealtimeAnnotations {\r\n if (!this._annotations) {\r\n Utils.throwMissingPluginError('Annotations');\r\n }\r\n return this._annotations;\r\n }\r\n connectionManager: ConnectionManager;\r\n state: API.ChannelState;\r\n subscriptions: EventEmitter;\r\n filteredSubscriptions?: Map<API.messageCallback<Message>, Map<API.MessageFilter, API.messageCallback<Message>[]>>;\r\n syncChannelSerial?: string | null;\r\n properties: {\r\n attachSerial: string | null | undefined;\r\n channelSerial: string | null | undefined;\r\n };\r\n errorReason: ErrorInfo | null;\r\n _mode = 0;\r\n _attachResume: boolean;\r\n _decodingContext: EncodingDecodingContext;\r\n _lastPayload: {\r\n messageId?: string | null;\r\n protocolMessageChannelSerial?: string | null;\r\n decodeFailureRecoveryInProgress: null | boolean;\r\n };\r\n /**\r\n * Emits an 'attached' event (with no payload) whenever an ATTACHED protocol\r\n * message is received from the server. Used by setOptions (RTL16a) to know\r\n * when the server has confirmed new channel options.\r\n */\r\n _attachedReceived: EventEmitter;\r\n /**\r\n * Internal event emitter for channel state changes, not affected by public\r\n * off() calls. Exists to satisfy RTC10: the client library should never\r\n * register internal listeners with the public EventEmitter in such a way\r\n * that a user calling off() would result in the library not working as\r\n * expected.\r\n */\r\n internalStateChanges: EventEmitter;\r\n params?: Record<string, any>;\r\n modes: API.ChannelMode[] | undefined;\r\n stateTimer?: number | NodeJS.Timeout | null;\r\n retryTimer?: number | NodeJS.Timeout | null;\r\n retryCount: number = 0;\r\n _push?: PushChannel;\r\n _object?: RealtimeObject;\r\n\r\n constructor(client: BaseRealtime, name: string, options?: API.ChannelOptions) {\r\n super(client.logger);\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'RealtimeChannel()', 'started; name = ' + name);\r\n this.name = name;\r\n this.channelOptions = normaliseChannelOptions(client._Crypto ?? null, this.logger, options);\r\n this.client = client;\r\n this._presence = client._RealtimePresence ? new client._RealtimePresence.RealtimePresence(this) : null;\r\n if (client._Annotations) {\r\n this._annotations = new client._Annotations.RealtimeAnnotations(this);\r\n }\r\n this.connectionManager = client.connection.connectionManager;\r\n this.state = 'initialized';\r\n this.subscriptions = new EventEmitter(this.logger);\r\n this.syncChannelSerial = undefined;\r\n this.properties = {\r\n attachSerial: undefined,\r\n channelSerial: undefined,\r\n };\r\n this.setOptions(options);\r\n this.errorReason = null;\r\n this._attachResume = false;\r\n this._decodingContext = {\r\n channelOptions: this.channelOptions,\r\n plugins: client.options.plugins || {},\r\n baseEncodedPreviousPayload: undefined,\r\n };\r\n this._lastPayload = {\r\n messageId: null,\r\n protocolMessageChannelSerial: null,\r\n decodeFailureRecoveryInProgress: null,\r\n };\r\n this._attachedReceived = new EventEmitter(this.logger);\r\n this.internalStateChanges = new EventEmitter(this.logger);\r\n\r\n if (client.options.plugins?.Push) {\r\n this._push = new client.options.plugins.Push.PushChannel(this);\r\n }\r\n\r\n if (client._liveObjectsPlugin) {\r\n this._object = new client._liveObjectsPlugin.RealtimeObject(this);\r\n }\r\n }\r\n\r\n get push() {\r\n if (!this._push) {\r\n Utils.throwMissingPluginError('Push');\r\n }\r\n return this._push;\r\n }\r\n\r\n /** @spec RTL27 */\r\n get object() {\r\n if (!this._object) {\r\n Utils.throwMissingPluginError('LiveObjects'); // RTL27b\r\n }\r\n return this._object; // RTL27a\r\n }\r\n\r\n // Override of EventEmitter method\r\n emit(event: string, ...args: unknown[]) {\r\n super.emit(event, ...args);\r\n this.internalStateChanges.emit(event, ...args);\r\n }\r\n\r\n invalidStateError(): ErrorInfo {\r\n return new ErrorInfo(\r\n 'Channel operation failed as channel state is ' + this.state,\r\n 90001,\r\n 400,\r\n this.errorReason || undefined,\r\n );\r\n }\r\n\r\n static processListenerArgs(args: unknown[]): any[] {\r\n /* [event], listener */\r\n args = Array.prototype.slice.call(args);\r\n if (typeof args[0] === 'function') {\r\n args.unshift(null);\r\n }\r\n return args;\r\n }\r\n\r\n async setOptions(options?: API.ChannelOptions): Promise<void> {\r\n const previousChannelOptions = this.channelOptions;\r\n const err = validateChannelOptions(options);\r\n if (err) {\r\n throw err;\r\n }\r\n this.channelOptions = normaliseChannelOptions(this.client._Crypto ?? null, this.logger, options);\r\n if (this._decodingContext) this._decodingContext.channelOptions = this.channelOptions;\r\n if (this._shouldReattachToSetOptions(options, previousChannelOptions)) {\r\n /* This does not just do _attach(true, null, callback) because that would put us\r\n * into the 'attaching' state until we receive the new attached, which is\r\n * conceptually incorrect: we are still attached, we just have a pending request to\r\n * change some channel params. Per RTL17 going into the attaching state would mean\r\n * rejecting messages until we have confirmation that the options have changed,\r\n * which would unnecessarily lose message continuity. */\r\n this.attachImpl();\r\n return new Promise<void>((resolve, reject) => {\r\n const cleanup = () => {\r\n this._attachedReceived.off(onAttached);\r\n this.internalStateChanges.off(onFailure);\r\n };\r\n const onAttached = () => {\r\n cleanup();\r\n resolve();\r\n };\r\n const onFailure = (stateChange: ChannelStateChange) => {\r\n cleanup();\r\n reject(stateChange.reason);\r\n };\r\n this._attachedReceived.once('attached', onAttached);\r\n this.internalStateChanges.once(['detached', 'failed'], onFailure);\r\n });\r\n }\r\n }\r\n\r\n _shouldReattachToSetOptions(options: API.ChannelOptions | undefined, prevOptions: API.ChannelOptions) {\r\n if (!(this.state === 'attached' || this.state === 'attaching')) {\r\n return false;\r\n }\r\n if (options?.params) {\r\n // Don't check against the `agent` param - it isn't returned in the ATTACHED message\r\n const requestedParams = omitAgent(options.params);\r\n const existingParams = omitAgent(prevOptions.params);\r\n\r\n if (Object.keys(requestedParams).length !== Object.keys(existingParams).length) {\r\n return true;\r\n }\r\n\r\n if (!Utils.shallowEquals(existingParams, requestedParams)) {\r\n return true;\r\n }\r\n }\r\n if (options?.modes) {\r\n if (!prevOptions.modes || !Utils.arrEquals(options.modes, prevOptions.modes)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n async publish(...args: any[]): Promise<API.PublishResult> {\r\n const first = args[0],\r\n second = args[1];\r\n let messages: Message[];\r\n let params: Record<string, any> | undefined;\r\n\r\n if (typeof first === 'string' || first === null || first === undefined) {\r\n messages = [Message.fromValues({ name: first, data: second })];\r\n params = args[2];\r\n } else if (Utils.isObject(first)) {\r\n messages = [Message.fromValues(first)];\r\n params = args[1];\r\n } else if (Array.isArray(first)) {\r\n messages = Message.fromValuesArray(first);\r\n params = args[1];\r\n } else {\r\n throw new ErrorInfo(\r\n 'The single-argument form of publish() expects a message object or an array of message objects',\r\n 40013,\r\n 400,\r\n );\r\n }\r\n const maxMessageSize = this.client.options.maxMessageSize;\r\n // TODO get rid of CipherOptions type assertion, indicates channeloptions types are broken\r\n const wireMessages = await encodeMessagesArray(messages, this.channelOptions as CipherOptions);\r\n /* RSL1i */\r\n const size = getMessagesSize(wireMessages);\r\n if (size > maxMessageSize) {\r\n throw new ErrorInfo(\r\n `Maximum size of messages that can be published at once exceeded (was ${size} bytes; limit is ${maxMessageSize} bytes)`,\r\n 40009,\r\n 400,\r\n );\r\n }\r\n\r\n this.throwIfUnpublishableState();\r\n\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'RealtimeChannel.publish()',\r\n 'sending message; channel state is ' + this.state + ', message count = ' + wireMessages.length,\r\n );\r\n\r\n const pm = protocolMessageFromValues({\r\n action: actions.MESSAGE,\r\n channel: this.name,\r\n messages: wireMessages,\r\n params: params ? Utils.stringifyValues(params) : undefined,\r\n });\r\n return this.sendAndAwaitAck(pm);\r\n }\r\n\r\n throwIfUnpublishableState(): void {\r\n if (!this.connectionManager.activeState()) {\r\n throw this.connectionManager.getError();\r\n }\r\n if (this.state === 'failed' || this.state === 'suspended') {\r\n throw this.invalidStateError();\r\n }\r\n }\r\n\r\n onEvent(messages: Array<any>): void {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.onEvent()', 'received message');\r\n const subscriptions = this.subscriptions;\r\n for (let i = 0; i < messages.length; i++) {\r\n const message = messages[i];\r\n subscriptions.emit(message.name, message);\r\n }\r\n }\r\n\r\n async attach(): Promise<ChannelStateChange | null> {\r\n if (this.state === 'attached') {\r\n return null;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this._attach(false, null, (err, result) => (err ? reject(err) : resolve(result!)));\r\n });\r\n }\r\n\r\n _attach(\r\n forceReattach: boolean,\r\n attachReason: ErrorInfo | null,\r\n callback?: StandardCallback<ChannelStateChange>,\r\n ): void {\r\n if (!callback) {\r\n callback = (err?: ErrorInfo | null) => {\r\n if (err) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_ERROR,\r\n 'RealtimeChannel._attach()',\r\n 'Channel attach failed: ' + err.toString(),\r\n );\r\n }\r\n };\r\n }\r\n\r\n const connectionManager = this.connectionManager;\r\n if (!connectionManager.activeState()) {\r\n callback(connectionManager.getError());\r\n return;\r\n }\r\n\r\n if (this.state !== 'attaching' || forceReattach) {\r\n this.requestState('attaching', attachReason);\r\n }\r\n\r\n this.internalStateChanges.once(function (this: { event: string }, stateChange: ChannelStateChange) {\r\n switch (this.event) {\r\n case 'attached':\r\n callback?.(null, stateChange);\r\n break;\r\n case 'detached':\r\n case 'suspended':\r\n case 'failed':\r\n callback?.(\r\n stateChange.reason ||\r\n connectionManager.getError() ||\r\n new ErrorInfo('Unable to attach; reason unknown; state = ' + this.event, 90000, 500),\r\n );\r\n break;\r\n case 'detaching':\r\n callback?.(new ErrorInfo('Attach request superseded by a subsequent detach request', 90000, 409));\r\n break;\r\n }\r\n });\r\n }\r\n\r\n attachImpl(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.attachImpl()', 'sending ATTACH message');\r\n const attachMsg = protocolMessageFromValues({\r\n action: actions.ATTACH,\r\n channel: this.name,\r\n params: this.channelOptions.params,\r\n // RTL4c1: Includes the channel serial to resume from a previous message\r\n // or attachment.\r\n channelSerial: this.properties.channelSerial,\r\n });\r\n if (this.channelOptions.modes) {\r\n attachMsg.encodeModesToFlags(Utils.allToUpperCase(this.channelOptions.modes) as API.ChannelMode[]);\r\n }\r\n if (this._attachResume) {\r\n attachMsg.setFlag('ATTACH_RESUME');\r\n }\r\n if (this._lastPayload.decodeFailureRecoveryInProgress) {\r\n attachMsg.channelSerial = this._lastPayload.protocolMessageChannelSerial;\r\n }\r\n this.send(attachMsg);\r\n }\r\n\r\n async detach(): Promise<void> {\r\n const connectionManager = this.connectionManager;\r\n switch (this.state) {\r\n // RTL5j\r\n case 'suspended':\r\n this.notifyState('detached');\r\n return;\r\n case 'detached':\r\n return;\r\n // RTL5b\r\n case 'failed':\r\n throw new ErrorInfo('Unable to detach; channel state = failed', 90001, 400);\r\n default:\r\n // RTL5l: if connection is not connected, immediately transition to detached\r\n if (connectionManager.state.state !== 'connected') {\r\n this.notifyState('detached');\r\n return;\r\n }\r\n this.requestState('detaching');\r\n // eslint-disable-next-line no-fallthrough\r\n case 'detaching':\r\n return new Promise((resolve, reject) => {\r\n this.internalStateChanges.once(function (this: { event: string }, stateChange: ChannelStateChange) {\r\n switch (this.event) {\r\n case 'detached':\r\n resolve();\r\n break;\r\n case 'attached':\r\n case 'suspended':\r\n case 'failed':\r\n reject(\r\n stateChange.reason ||\r\n connectionManager.getError() ||\r\n new ErrorInfo('Unable to detach; reason unknown; state = ' + this.event, 90000, 500),\r\n );\r\n break;\r\n case 'attaching':\r\n reject(new ErrorInfo('Detach request superseded by a subsequent attach request', 90000, 409));\r\n break;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n detachImpl(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.detach()', 'sending DETACH message');\r\n const msg = protocolMessageFromValues({ action: actions.DETACH, channel: this.name });\r\n this.send(msg);\r\n }\r\n\r\n async subscribe(...args: unknown[] /* [event], listener */): Promise<ChannelStateChange | null> {\r\n const [event, listener] = RealtimeChannel.processListenerArgs(args);\r\n\r\n if (this.state === 'failed') {\r\n throw ErrorInfo.fromValues(this.invalidStateError());\r\n }\r\n\r\n // Filtered\r\n if (event && typeof event === 'object' && !Array.isArray(event)) {\r\n this.client._FilteredSubscriptions.subscribeFilter(this, event, listener);\r\n } else {\r\n this.subscriptions.on(event, listener);\r\n }\r\n\r\n // (RTL7g)\r\n if (this.channelOptions.attachOnSubscribe !== false) {\r\n return this.attach();\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n unsubscribe(...args: unknown[] /* [event], listener */): void {\r\n const [event, listener] = RealtimeChannel.processListenerArgs(args);\r\n\r\n // If we either have a filtered listener, a filter or both we need to do additional processing to find the original function(s)\r\n if ((typeof event === 'object' && !listener) || this.filteredSubscriptions?.has(listener)) {\r\n this.client._FilteredSubscriptions\r\n .getAndDeleteFilteredSubscriptions(this, event, listener)\r\n .forEach((l) => this.subscriptions.off(l));\r\n return;\r\n }\r\n\r\n this.subscriptions.off(event, listener);\r\n }\r\n\r\n sync(): void {\r\n /* check preconditions */\r\n switch (this.state) {\r\n case 'initialized':\r\n case 'detaching':\r\n case 'detached':\r\n throw new PartialErrorInfo('Unable to sync to channel; not attached', 40000);\r\n default:\r\n }\r\n const connectionManager = this.connectionManager;\r\n if (!connectionManager.activeState()) {\r\n throw connectionManager.getError();\r\n }\r\n\r\n /* send sync request */\r\n const syncMessage = protocolMessageFromValues({ action: actions.SYNC, channel: this.name });\r\n if (this.syncChannelSerial) {\r\n syncMessage.channelSerial = this.syncChannelSerial;\r\n }\r\n connectionManager.send(syncMessage);\r\n }\r\n\r\n send(msg: ProtocolMessage): void {\r\n this.connectionManager.send(msg);\r\n }\r\n\r\n async sendAndAwaitAck(msg: ProtocolMessage): Promise<API.PublishResult> {\r\n return new Promise((resolve, reject) => {\r\n this.connectionManager.send(msg, this.client.options.queueMessages, (err, publishResponse) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(publishResponse!);\r\n }\r\n });\r\n });\r\n }\r\n\r\n async sendPresence(presence: WirePresenceMessage[]): Promise<void> {\r\n const msg = protocolMessageFromValues({\r\n action: actions.PRESENCE,\r\n channel: this.name,\r\n presence: presence,\r\n });\r\n await this.sendAndAwaitAck(msg);\r\n }\r\n\r\n async sendState(objectMessages: WireObjectMessage[]): Promise<API.PublishResult> {\r\n const msg = protocolMessageFromValues({\r\n action: actions.OBJECT,\r\n channel: this.name,\r\n state: objectMessages,\r\n });\r\n return this.sendAndAwaitAck(msg);\r\n }\r\n\r\n // Access to this method is synchronised by ConnectionManager#processChannelMessage, in order to synchronise access to the state stored in _decodingContext.\r\n async processMessage(message: ProtocolMessage): Promise<void> {\r\n if (\r\n message.action === actions.ATTACHED ||\r\n message.action === actions.MESSAGE ||\r\n message.action === actions.PRESENCE ||\r\n message.action === actions.OBJECT ||\r\n message.action === actions.ANNOTATION\r\n ) {\r\n // RTL15b\r\n this.setChannelSerial(message.channelSerial);\r\n }\r\n\r\n let syncChannelSerial,\r\n isSync = false;\r\n switch (message.action) {\r\n case actions.ATTACHED: {\r\n this.properties.attachSerial = message.channelSerial;\r\n this._mode = message.getMode();\r\n this.params = (message as any).params || {};\r\n const modesFromFlags = message.decodeModesFromFlags();\r\n this.modes = (modesFromFlags && (Utils.allToLowerCase(modesFromFlags) as API.ChannelMode[])) || undefined;\r\n const resumed = message.hasFlag('RESUMED');\r\n const hasPresence = message.hasFlag('HAS_PRESENCE');\r\n const hasBacklog = message.hasFlag('HAS_BACKLOG');\r\n const hasObjects = message.hasFlag('HAS_OBJECTS');\r\n this._attachedReceived.emit('attached');\r\n if (this.state === 'attached') {\r\n if (!resumed) {\r\n // we have lost continuity.\r\n // the presence set needs to be re-synced\r\n if (this._presence) {\r\n this._presence.onAttached(hasPresence);\r\n }\r\n }\r\n\r\n // Must always resync the Objects tree after an ATTACHED.\r\n // Whether there are objects on the channel and whether an OBJECT_SYNC sequence will follow\r\n // is determined by the HAS_OBJECTS flag.\r\n if (this._object) {\r\n this._object.onAttached(hasObjects);\r\n }\r\n\r\n const change = new ChannelStateChange(this.state, this.state, resumed, hasBacklog, message.error);\r\n if (!resumed || this.channelOptions.updateOnAttached) {\r\n this.emit('update', change);\r\n }\r\n } else if (this.state === 'detaching') {\r\n /* RTL5i: re-send DETACH and remain in the 'detaching' state */\r\n this.checkPendingState();\r\n } else {\r\n this.notifyState('attached', message.error, resumed, hasPresence, hasBacklog, hasObjects);\r\n }\r\n break;\r\n }\r\n\r\n case actions.DETACHED: {\r\n const detachErr = message.error\r\n ? ErrorInfo.fromValues(message.error)\r\n : new ErrorInfo('Channel detached', 90001, 404);\r\n if (this.state === 'detaching') {\r\n this.notifyState('detached', detachErr);\r\n } else if (this.state === 'attaching') {\r\n /* Only retry immediately if we were previously attached. If we were\r\n * attaching, go into suspended, fail messages, and wait a few seconds\r\n * before retrying */\r\n this.notifyState('suspended', detachErr);\r\n } else if (this.state === 'attached' || this.state === 'suspended') {\r\n // RTL13a\r\n this.requestState('attaching', detachErr);\r\n }\r\n // else no action (detached in initialized, detached, or failed state is a noop)\r\n break;\r\n }\r\n\r\n case actions.SYNC:\r\n /* syncs can have channelSerials, but might not if the sync is one page long */\r\n isSync = true;\r\n syncChannelSerial = this.syncChannelSerial = message.channelSerial;\r\n /* syncs can happen on channels with no presence data as part of connection\r\n * resuming, in which case protocol message has no presence property */\r\n if (!message.presence) break;\r\n // eslint-disable-next-line no-fallthrough\r\n case actions.PRESENCE: {\r\n if (!message.presence) {\r\n break;\r\n }\r\n\r\n populateFieldsFromParent(message);\r\n const options = this.channelOptions;\r\n if (this._presence) {\r\n const presenceMessages = await Promise.all(\r\n message.presence.map((wpm) => {\r\n return wpm.decode(options, this.logger);\r\n }),\r\n );\r\n\r\n this._presence.setPresence(presenceMessages, isSync, syncChannelSerial as any);\r\n }\r\n break;\r\n }\r\n\r\n // RTL1\r\n // OBJECT and OBJECT_SYNC message processing share most of the logic, so group them together\r\n case actions.OBJECT:\r\n case actions.OBJECT_SYNC: {\r\n if (!this._object || !message.state) {\r\n return;\r\n }\r\n\r\n populateFieldsFromParent(message);\r\n // need to use the active protocol format instead of just client's useBinaryProtocol option,\r\n // as comet transport does not support msgpack and will default to json without changing useBinaryProtocol.\r\n // message processing is done in the same event loop tick up until this point,\r\n // so we can reliably expect an active protocol to exist and be the one that received the object message.\r\n const format = this.client.connection.connectionManager.getActiveTransportFormat()!;\r\n const objectMessages = message.state.map((om) => om.decode(this.client, format));\r\n\r\n if (message.action === actions.OBJECT) {\r\n this._object.handleObjectMessages(objectMessages);\r\n } else {\r\n this._object.handleObjectSyncMessages(objectMessages, message.channelSerial);\r\n }\r\n\r\n break;\r\n }\r\n\r\n case actions.MESSAGE: {\r\n //RTL17\r\n if (this.state !== 'attached') {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MAJOR,\r\n 'RealtimeChannel.processMessage()',\r\n 'Message \"' +\r\n message.id +\r\n '\" skipped as this channel \"' +\r\n this.name +\r\n '\" state is not \"attached\" (state is \"' +\r\n this.state +\r\n '\").',\r\n );\r\n return;\r\n }\r\n\r\n populateFieldsFromParent(message);\r\n\r\n const encoded = message.messages!,\r\n firstMessage = encoded[0],\r\n lastMessage = encoded[encoded.length - 1];\r\n\r\n if (\r\n firstMessage.extras &&\r\n firstMessage.extras.delta &&\r\n firstMessage.extras.delta.from !== this._lastPayload.messageId\r\n ) {\r\n const msg =\r\n 'Delta message decode failure - previous message not available for message \"' +\r\n message.id +\r\n '\" on this channel \"' +\r\n this.name +\r\n '\".';\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'RealtimeChannel.processMessage()', msg);\r\n this._startDecodeFailureRecovery(new ErrorInfo(msg, 40018, 400));\r\n break;\r\n }\r\n\r\n let messages: Message[] = [];\r\n for (let i = 0; i < encoded.length; i++) {\r\n const { decoded, err } = await encoded[i].decodeWithErr(this._decodingContext, this.logger);\r\n messages[i] = decoded;\r\n\r\n if (err) {\r\n switch (err.code) {\r\n case 40018:\r\n /* decode failure */\r\n this._startDecodeFailureRecovery(err);\r\n return;\r\n\r\n case 40019: /* No vcdiff plugin passed in - no point recovering, give up */\r\n case 40021:\r\n /* Browser does not support deltas, similarly no point recovering */\r\n this.notifyState('failed', err);\r\n return;\r\n\r\n default:\r\n // do nothing, continue decoding\r\n }\r\n }\r\n }\r\n\r\n this._lastPayload.messageId = lastMessage.id;\r\n this._lastPayload.protocolMessageChannelSerial = message.channelSerial;\r\n this.onEvent(messages);\r\n break;\r\n }\r\n\r\n case actions.ANNOTATION: {\r\n populateFieldsFromParent(message);\r\n const options = this.channelOptions;\r\n if (this._annotations) {\r\n const annotations = await Promise.all(\r\n (message.annotations || []).map((wpm) => {\r\n return wpm.decode(options, this.logger);\r\n }),\r\n );\r\n\r\n this._annotations._processIncoming(annotations);\r\n }\r\n break;\r\n }\r\n\r\n case actions.ERROR: {\r\n /* there was a channel-specific error */\r\n const err = message.error as ErrorInfo;\r\n if (err && err.code == 80016) {\r\n /* attach/detach operation attempted on superseded transport handle */\r\n this.checkPendingState();\r\n } else {\r\n this.notifyState('failed', ErrorInfo.fromValues(err));\r\n }\r\n break;\r\n }\r\n\r\n default:\r\n // RSF1, should handle unrecognized message actions gracefully and don't abort the realtime connection to ensure forward compatibility\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MAJOR,\r\n 'RealtimeChannel.processMessage()',\r\n 'Protocol error: unrecognised message action (' + message.action + ')',\r\n );\r\n }\r\n }\r\n\r\n _startDecodeFailureRecovery(reason: ErrorInfo): void {\r\n if (!this._lastPayload.decodeFailureRecoveryInProgress) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MAJOR,\r\n 'RealtimeChannel.processMessage()',\r\n 'Starting decode failure recovery process.',\r\n );\r\n this._lastPayload.decodeFailureRecoveryInProgress = true;\r\n this._attach(true, reason, () => {\r\n this._lastPayload.decodeFailureRecoveryInProgress = false;\r\n });\r\n }\r\n }\r\n\r\n onAttached(): void {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'RealtimeChannel.onAttached',\r\n 'activating channel; name = ' + this.name,\r\n );\r\n }\r\n\r\n notifyState(\r\n state: API.ChannelState,\r\n reason?: ErrorInfo | null,\r\n resumed?: boolean,\r\n hasPresence?: boolean,\r\n hasBacklog?: boolean,\r\n hasObjects?: boolean,\r\n ): void {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'RealtimeChannel.notifyState',\r\n 'name = ' + this.name + ', current state = ' + this.state + ', notifying state ' + state,\r\n );\r\n this.clearStateTimer();\r\n\r\n // RTP5a1\r\n if (['detached', 'suspended', 'failed'].includes(state)) {\r\n this.properties.channelSerial = null;\r\n }\r\n\r\n if (state === this.state) {\r\n return;\r\n }\r\n if (this._presence) {\r\n this._presence.actOnChannelState(state, hasPresence, reason);\r\n }\r\n if (this._object) {\r\n this._object.actOnChannelState(state, hasObjects);\r\n }\r\n if (state === 'suspended' && this.connectionManager.state.sendEvents) {\r\n this.startRetryTimer();\r\n } else {\r\n this.cancelRetryTimer();\r\n }\r\n if (reason) {\r\n this.errorReason = reason;\r\n }\r\n const change = new ChannelStateChange(this.state, state, resumed, hasBacklog, reason);\r\n const action = 'Channel state for channel \"' + this.name + '\"';\r\n const message = state + (reason ? '; reason: ' + reason : '');\r\n if (state === 'failed') {\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, action, message);\r\n } else {\r\n Logger.logAction(this.logger, Logger.LOG_MAJOR, action, message);\r\n }\r\n\r\n if (state !== 'attaching' && state !== 'suspended') {\r\n this.retryCount = 0;\r\n }\r\n\r\n /* Note: we don't set inProgress for pending states until the request is actually in progress */\r\n if (state === 'attached') {\r\n this.onAttached();\r\n }\r\n\r\n if (state === 'attached') {\r\n this._attachResume = true;\r\n } else if (state === 'detaching' || state === 'failed') {\r\n this._attachResume = false;\r\n }\r\n\r\n this.state = state;\r\n this.emit(state, change);\r\n }\r\n\r\n requestState(state: API.ChannelState, reason?: ErrorInfo | null): void {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'RealtimeChannel.requestState',\r\n 'name = ' + this.name + ', state = ' + state,\r\n );\r\n this.notifyState(state, reason);\r\n /* send the event and await response */\r\n this.checkPendingState();\r\n }\r\n\r\n checkPendingState(): void {\r\n /* if can't send events, do nothing */\r\n const cmState = this.connectionManager.state;\r\n if (!cmState.sendEvents) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'RealtimeChannel.checkPendingState',\r\n 'sendEvents is false; state is ' + this.connectionManager.state.state,\r\n );\r\n return;\r\n }\r\n\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'RealtimeChannel.checkPendingState',\r\n 'name = ' + this.name + ', state = ' + this.state,\r\n );\r\n /* Only start the state timer running when actually sending the event */\r\n switch (this.state) {\r\n case 'attaching':\r\n this.startStateTimerIfNotRunning();\r\n this.attachImpl();\r\n break;\r\n case 'detaching':\r\n this.startStateTimerIfNotRunning();\r\n this.detachImpl();\r\n break;\r\n case 'attached':\r\n /* resume any sync operation that was in progress */\r\n this.sync();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n timeoutPendingState(): void {\r\n switch (this.state) {\r\n case 'attaching': {\r\n const err = new ErrorInfo('Channel attach timed out', 90007, 408);\r\n this.notifyState('suspended', err);\r\n break;\r\n }\r\n case 'detaching': {\r\n const err = new ErrorInfo('Channel detach timed out', 90007, 408);\r\n this.notifyState('attached', err);\r\n break;\r\n }\r\n default:\r\n this.checkPendingState();\r\n break;\r\n }\r\n }\r\n\r\n startStateTimerIfNotRunning(): void {\r\n if (!this.stateTimer) {\r\n this.stateTimer = setTimeout(() => {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'RealtimeChannel.startStateTimerIfNotRunning', 'timer expired');\r\n this.stateTimer = null;\r\n this.timeoutPendingState();\r\n }, this.client.options.timeouts.realtimeRequestTimeout);\r\n }\r\n }\r\n\r\n clearStateTimer(): void {\r\n const stateTimer = this.stateTimer;\r\n if (stateTimer) {\r\n clearTimeout(stateTimer);\r\n this.stateTimer = null;\r\n }\r\n }\r\n\r\n startRetryTimer(): void {\r\n if (this.retryTimer) return;\r\n\r\n this.retryCount++;\r\n const retryDelay = Utils.getRetryTime(this.client.options.timeouts.channelRetryTimeout, this.retryCount);\r\n\r\n this.retryTimer = setTimeout(() => {\r\n /* If connection is not connected, just leave in suspended, a reattach\r\n * will be triggered once it connects again */\r\n if (this.state === 'suspended' && this.connectionManager.state.sendEvents) {\r\n this.retryTimer = null;\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'RealtimeChannel retry timer expired',\r\n 'attempting a new attach',\r\n );\r\n this.requestState('attaching');\r\n }\r\n }, retryDelay);\r\n }\r\n\r\n cancelRetryTimer(): void {\r\n if (this.retryTimer) {\r\n clearTimeout(this.retryTimer as NodeJS.Timeout);\r\n this.retryTimer = null;\r\n }\r\n }\r\n\r\n history = async function (\r\n this: RealtimeChannel,\r\n params: RealtimeHistoryParams | null,\r\n ): Promise<PaginatedResult<Message>> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.history()', 'channel = ' + this.name);\r\n\r\n // We fetch this first so that any plugin-not-provided error takes priority over other errors\r\n const restMixin = this.client.rest.channelMixin;\r\n\r\n if (params && params.untilAttach) {\r\n if (this.state !== 'attached') {\r\n throw new ErrorInfo('option untilAttach requires the channel to be attached', 40000, 400);\r\n }\r\n if (!this.properties.attachSerial) {\r\n throw new ErrorInfo(\r\n 'untilAttach was specified and channel is attached, but attachSerial is not defined',\r\n 40000,\r\n 400,\r\n );\r\n }\r\n delete params.untilAttach;\r\n params.from_serial = this.properties.attachSerial;\r\n }\r\n\r\n return restMixin.history(this, params);\r\n } as any;\r\n\r\n whenState = ((state: string) => {\r\n return EventEmitter.prototype.whenState.call(this, state, this.state);\r\n }) as any;\r\n\r\n /* @returns null (if can safely be released) | ErrorInfo (if cannot) */\r\n getReleaseErr(): ErrorInfo | null {\r\n const s = this.state;\r\n if (s === 'initialized' || s === 'detached' || s === 'failed') {\r\n return null;\r\n }\r\n return new ErrorInfo(\r\n 'Can only release a channel in a state where there is no possibility of further updates from the server being received (initialized, detached, or failed); was ' +\r\n s,\r\n 90001,\r\n 400,\r\n );\r\n }\r\n\r\n setChannelSerial(channelSerial?: string | null): void {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'RealtimeChannel.setChannelSerial()',\r\n 'Updating channel serial; serial = ' + channelSerial + '; previous = ' + this.properties.channelSerial,\r\n );\r\n\r\n // RTP17h: Only update the channel serial if its present (it won't always\r\n // be set).\r\n if (channelSerial) {\r\n this.properties.channelSerial = channelSerial;\r\n }\r\n }\r\n\r\n async status(): Promise<API.ChannelDetails> {\r\n return this.client.rest.channelMixin.status(this);\r\n }\r\n\r\n async getMessage(serialOrMessage: string | Message): Promise<Message> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.getMessage()', 'channel = ' + this.name);\r\n const restMixin = this.client.rest.channelMixin;\r\n return restMixin.getMessage(this, serialOrMessage);\r\n }\r\n\r\n async updateMessage(\r\n message: Message,\r\n operation?: API.MessageOperation,\r\n params?: Record<string, any>,\r\n ): Promise<API.UpdateDeleteResult> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.updateMessage()', 'channel = ' + this.name);\r\n return this.sendUpdate(message, 'message.update', operation, params);\r\n }\r\n\r\n async deleteMessage(\r\n message: Message,\r\n operation?: API.MessageOperation,\r\n params?: Record<string, any>,\r\n ): Promise<API.UpdateDeleteResult> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.deleteMessage()', 'channel = ' + this.name);\r\n return this.sendUpdate(message, 'message.delete', operation, params);\r\n }\r\n\r\n async appendMessage(\r\n message: Message,\r\n operation?: API.MessageOperation,\r\n params?: Record<string, any>,\r\n ): Promise<API.UpdateDeleteResult> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.appendMessage()', 'channel = ' + this.name);\r\n return this.sendUpdate(message, 'message.append', operation, params);\r\n }\r\n\r\n private async sendUpdate(\r\n message: Message,\r\n action: 'message.update' | 'message.delete' | 'message.append',\r\n operation?: API.MessageOperation,\r\n params?: Record<string, any>,\r\n ): Promise<API.UpdateDeleteResult> {\r\n if (!message.serial) {\r\n throw new ErrorInfo(\r\n 'This message lacks a serial and cannot be updated. Make sure you have enabled \"Message annotations, updates, and deletes\" in channel settings on your dashboard.',\r\n 40003,\r\n 400,\r\n );\r\n }\r\n\r\n this.throwIfUnpublishableState();\r\n\r\n const updateDeleteMsg = Message.fromValues({\r\n ...message,\r\n action: action,\r\n version: operation,\r\n });\r\n\r\n const wireMessage = await updateDeleteMsg.encode(this.channelOptions as CipherOptions);\r\n const pm = protocolMessageFromValues({\r\n action: actions.MESSAGE,\r\n channel: this.name,\r\n messages: [wireMessage],\r\n params: params ? Utils.stringifyValues(params) : undefined,\r\n });\r\n const publishResponse = await this.sendAndAwaitAck(pm);\r\n return { versionSerial: publishResponse.serials[0] ?? null };\r\n }\r\n\r\n async getMessageVersions(\r\n serialOrMessage: string | Message,\r\n params?: Record<string, any>,\r\n ): Promise<PaginatedResult<Message>> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.getMessageVersions()', 'channel = ' + this.name);\r\n const restMixin = this.client.rest.channelMixin;\r\n return restMixin.getMessageVersions(this, serialOrMessage, params);\r\n }\r\n\r\n /**\r\n * Ensures the channel is attached, attaching if necessary.\r\n *\r\n * This method is intended for use by features like Presence or Objects that need to\r\n * implicitly attach the channel when an operation is called (e.g., `presence.get()` per RTP11b,\r\n * or `objects.get()`). This guarantees that the corresponding sync sequence will start and\r\n * that the operation will resolve for callers even if they did not explicitly attach beforehand.\r\n */\r\n async ensureAttached(): Promise<void> {\r\n switch (this.state) {\r\n case 'attached':\r\n case 'suspended':\r\n break;\r\n case 'initialized':\r\n case 'detached':\r\n case 'detaching':\r\n case 'attaching':\r\n await this.attach();\r\n break;\r\n case 'failed':\r\n default:\r\n throw ErrorInfo.fromValues(this.invalidStateError());\r\n }\r\n }\r\n}\r\n\r\nfunction omitAgent(channelParams?: API.ChannelParams) {\r\n const { agent: _, ...paramsWithoutAgent } = channelParams || {};\r\n return paramsWithoutAgent;\r\n}\r\n\r\nexport default RealtimeChannel;\r\n","import EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport Annotation from '../types/annotation';\nimport { actions, flags } from '../types/protocolmessagecommon';\nimport { fromValues as protocolMessageFromValues } from '../types/protocolmessage';\nimport ErrorInfo from '../types/errorinfo';\nimport RealtimeChannel from './realtimechannel';\nimport RestAnnotations, { RestGetAnnotationsParams, constructValidateAnnotation } from './restannotations';\nimport type { PaginatedResult } from './paginatedresource';\nimport type Message from '../types/message';\nimport type { Properties } from '../util/utils';\n\nclass RealtimeAnnotations {\n private channel: RealtimeChannel;\n private logger: Logger;\n private subscriptions: EventEmitter;\n\n constructor(channel: RealtimeChannel) {\n this.channel = channel;\n this.logger = channel.logger;\n this.subscriptions = new EventEmitter(this.logger);\n }\n\n async publish(msgOrSerial: string | Message, annotationValues: Partial<Properties<Annotation>>): Promise<void> {\n const channelName = this.channel.name;\n const annotation = constructValidateAnnotation(msgOrSerial, annotationValues);\n const wireAnnotation = await annotation.encode();\n\n this.channel.throwIfUnpublishableState();\n\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimeAnnotations.publish()',\n 'channelName = ' +\n channelName +\n ', sending annotation with messageSerial = ' +\n annotation.messageSerial +\n ', type = ' +\n annotation.type,\n );\n\n const pm = protocolMessageFromValues({\n action: actions.ANNOTATION,\n channel: channelName,\n annotations: [wireAnnotation],\n });\n await this.channel.sendAndAwaitAck(pm);\n }\n\n async delete(msgOrSerial: string | Message, annotationValues: Partial<Properties<Annotation>>): Promise<void> {\n annotationValues.action = 'annotation.delete';\n await this.publish(msgOrSerial, annotationValues);\n }\n\n async subscribe(..._args: unknown[] /* [type], listener */): Promise<void> {\n const args = RealtimeChannel.processListenerArgs(_args);\n const event = args[0];\n const listener = args[1];\n const channel = this.channel;\n\n if (channel.state === 'failed') {\n throw ErrorInfo.fromValues(channel.invalidStateError());\n }\n\n this.subscriptions.on(event, listener);\n\n if (this.channel.channelOptions.attachOnSubscribe !== false) {\n await channel.attach();\n }\n\n // explicit check for attach state in caes attachOnSubscribe=false\n if ((this.channel.state === 'attached' && this.channel._mode & flags.ANNOTATION_SUBSCRIBE) === 0) {\n throw new ErrorInfo(\n \"You are trying to add an annotation listener, but you haven't requested the annotation_subscribe channel mode in ChannelOptions, so this won't do anything (we only deliver annotations to clients who have explicitly requested them)\",\n 93001,\n 400,\n );\n }\n }\n\n unsubscribe(..._args: unknown[] /* [event], listener */): void {\n const args = RealtimeChannel.processListenerArgs(_args);\n const event = args[0];\n const listener = args[1];\n this.subscriptions.off(event, listener);\n }\n\n _processIncoming(annotations: Annotation[]): void {\n for (const annotation of annotations) {\n this.subscriptions.emit(annotation.type || '', annotation);\n }\n }\n\n async get(\n msgOrSerial: string | Message,\n params: RestGetAnnotationsParams | null,\n ): Promise<PaginatedResult<Annotation>> {\n return RestAnnotations.prototype.get.call(this, msgOrSerial, params);\n }\n}\n\nexport default RealtimeAnnotations;\n","import { BaseRest } from './baserest';\nimport ClientOptions from '../../types/ClientOptions';\nimport { allCommonModularPlugins } from './modularplugins';\nimport Platform from 'common/platform';\nimport { DefaultMessage } from '../types/defaultmessage';\nimport { MsgPack } from 'common/types/msgpack';\nimport { DefaultPresenceMessage } from '../types/defaultpresencemessage';\nimport { DefaultAnnotation } from '../types/defaultannotation';\nimport { Http } from 'common/types/http';\nimport RealtimeAnnotations from './realtimeannotations';\nimport RestAnnotations from './restannotations';\nimport Annotation, { WireAnnotation } from '../types/annotation';\nimport Defaults from '../util/defaults';\nimport Logger from '../util/logger';\n\n/**\n `DefaultRest` is the class that the non tree-shakable version of the SDK exports as `Rest`. It ensures that this version of the SDK includes all of the functionality which is optionally available in the tree-shakable version.\n */\nexport class DefaultRest extends BaseRest {\n // The public typings declare that this requires an argument to be passed, but since we want to emit a good error message in the case where a non-TypeScript user does not pass an argument, tell the compiler that this is possible so that it forces us to handle it.\n constructor(options?: ClientOptions | string) {\n const MsgPack = DefaultRest._MsgPack;\n if (!MsgPack) {\n throw new Error('Expected DefaultRest._MsgPack to have been set');\n }\n\n super(\n Defaults.objectifyOptions(options, true, 'Rest', Logger.defaultLogger, {\n ...allCommonModularPlugins,\n Crypto: DefaultRest.Crypto ?? undefined,\n MsgPack: DefaultRest._MsgPack ?? undefined,\n Annotations: {\n Annotation,\n WireAnnotation,\n RealtimeAnnotations,\n RestAnnotations,\n },\n }),\n );\n }\n\n private static _Crypto: typeof Platform.Crypto = null;\n static get Crypto() {\n if (this._Crypto === null) {\n throw new Error('Encryption not enabled; use ably.encryption.js instead');\n }\n\n return this._Crypto;\n }\n static set Crypto(newValue: typeof Platform.Crypto) {\n this._Crypto = newValue;\n }\n\n static Message = DefaultMessage;\n static PresenceMessage = DefaultPresenceMessage;\n static Annotation = DefaultAnnotation;\n\n static _MsgPack: MsgPack | null = null;\n\n // Used by tests\n static _Http = Http;\n}\n","import ErrorInfo from '../types/errorinfo';\nimport EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport { PendingMessage } from './protocol';\nimport type * as API from '../../../../ably';\n\nclass MessageQueue extends EventEmitter {\n messages: Array<PendingMessage>;\n\n constructor(logger: Logger) {\n super(logger);\n this.messages = [];\n }\n\n count(): number {\n return this.messages.length;\n }\n\n push(message: PendingMessage): void {\n this.messages.push(message);\n }\n\n shift(): PendingMessage | undefined {\n return this.messages.shift();\n }\n\n last(): PendingMessage {\n return this.messages[this.messages.length - 1];\n }\n\n copyAll(): PendingMessage[] {\n return this.messages.slice();\n }\n\n append(messages: Array<PendingMessage>): void {\n this.messages.push.apply(this.messages, messages);\n }\n\n prepend(messages: Array<PendingMessage>): void {\n this.messages.unshift.apply(this.messages, messages);\n }\n\n /**\n * For all messages targeted by the selector, calls their callback and removes them from the queue.\n *\n * @param selector - Describes which messages to target. 'all' means all messages in the queue (regardless of whether they have had a `msgSerial` assigned); `serial` / `count` targets a range of messages described by an `ACK` or `NACK` received from Ably (this assumes that all the messages in the queue have had a `msgSerial` assigned).\n */\n completeMessages(\n selector: 'all' | { serial: number; count: number },\n err?: ErrorInfo | null,\n res?: API.PublishResult[],\n ): void {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'MessageQueue.completeMessages()',\n selector == 'all' ? '(all)' : 'serial = ' + selector.serial + '; count = ' + selector.count,\n );\n err = err || null;\n const messages = this.messages;\n if (messages.length === 0) {\n throw new Error('MessageQueue.completeMessages(): completeMessages called on any empty MessageQueue');\n }\n\n let completeMessages: PendingMessage[] = [];\n\n if (selector === 'all') {\n completeMessages = messages.splice(0);\n } else {\n const first = messages[0];\n if (first) {\n const startSerial = first.message.msgSerial as number;\n const endSerial =\n selector.serial + selector.count; /* the serial of the first message that is *not* the subject of this call */\n if (endSerial > startSerial) {\n completeMessages = messages.splice(0, endSerial - startSerial);\n }\n }\n }\n\n for (let i = 0; i < completeMessages.length; i++) {\n const message = completeMessages[i];\n const publishResponse = res?.[i];\n (message.callback as Function)(err, publishResponse);\n }\n\n if (messages.length == 0) this.emit('idle');\n }\n\n completeAllMessages(err: ErrorInfo): void {\n this.completeMessages('all', err);\n }\n\n resetSendAttempted(): void {\n for (let msg of this.messages) {\n msg.sendAttempted = false;\n }\n }\n\n clear(): void {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'MessageQueue.clear()',\n 'clearing ' + this.messages.length + ' messages',\n );\n this.messages = [];\n this.emit('idle');\n }\n}\n\nexport default MessageQueue;\n","import { actions } from '../types/protocolmessagecommon';\nimport ProtocolMessage, { stringify as stringifyProtocolMessage } from '../types/protocolmessage';\nimport * as Utils from '../util/utils';\nimport EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport MessageQueue from './messagequeue';\nimport ErrorInfo from '../types/errorinfo';\nimport Transport from './transport';\nimport { StandardCallback, ErrCallback } from '../../types/utils';\nimport * as API from '../../../../ably';\n\nexport type PublishCallback = StandardCallback<API.PublishResult>;\n\nexport class PendingMessage {\n message: ProtocolMessage;\n callback?: PublishCallback;\n merged: boolean;\n sendAttempted: boolean;\n ackRequired: boolean;\n\n constructor(message: ProtocolMessage, callback?: PublishCallback) {\n this.message = message;\n this.callback = callback;\n this.merged = false;\n const action = message.action;\n this.sendAttempted = false;\n this.ackRequired =\n typeof action === 'number' &&\n [actions.MESSAGE, actions.PRESENCE, actions.ANNOTATION, actions.OBJECT].includes(action);\n }\n}\n\nclass Protocol extends EventEmitter {\n transport: Transport;\n messageQueue: MessageQueue;\n\n constructor(transport: Transport) {\n super(transport.logger);\n this.transport = transport;\n this.messageQueue = new MessageQueue(this.logger);\n transport.on('ack', (serial: number, count: number, res?: API.PublishResult[]) => {\n this.onAck(serial, count, res);\n });\n transport.on('nack', (serial: number, count: number, err: ErrorInfo) => {\n this.onNack(serial, count, err);\n });\n }\n\n onAck(serial: number, count: number, res?: API.PublishResult[]): void {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'Protocol.onAck()', 'serial = ' + serial + '; count = ' + count);\n this.messageQueue.completeMessages({ serial, count }, null, res);\n }\n\n onNack(serial: number, count: number, err: ErrorInfo): void {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Protocol.onNack()',\n 'serial = ' + serial + '; count = ' + count + '; err = ' + Utils.inspectError(err),\n );\n if (!err) {\n err = new ErrorInfo('Unable to send message; channel not responding', 50001, 500);\n }\n this.messageQueue.completeMessages({ serial, count }, err);\n }\n\n onceIdle(listener: ErrCallback): void {\n const messageQueue = this.messageQueue;\n if (messageQueue.count() === 0) {\n listener();\n return;\n }\n messageQueue.once('idle', listener);\n }\n\n send(pendingMessage: PendingMessage): void {\n if (pendingMessage.ackRequired) {\n this.messageQueue.push(pendingMessage);\n }\n if (this.logger.shouldLog(Logger.LOG_MICRO)) {\n Logger.logActionNoStrip(\n this.logger,\n Logger.LOG_MICRO,\n 'Protocol.send()',\n 'sending msg; ' +\n stringifyProtocolMessage(\n pendingMessage.message,\n this.transport.connectionManager.realtime._RealtimePresence,\n this.transport.connectionManager.realtime._Annotations,\n this.transport.connectionManager.realtime._liveObjectsPlugin,\n ),\n );\n }\n pendingMessage.sendAttempted = true;\n this.transport.send(pendingMessage.message);\n }\n\n getTransport(): Transport {\n return this.transport;\n }\n\n getPendingMessages(): PendingMessage[] {\n return this.messageQueue.copyAll();\n }\n\n clearPendingMessages(): void {\n return this.messageQueue.clear();\n }\n\n finish(): void {\n const transport = this.transport;\n this.onceIdle(function () {\n transport.disconnect();\n });\n }\n}\n\nexport default Protocol;\n","import { IPartialErrorInfo } from '../types/errorinfo';\n\nclass ConnectionStateChange {\n previous?: string;\n current?: string;\n retryIn?: number;\n reason?: IPartialErrorInfo;\n\n constructor(previous?: string, current?: string, retryIn?: number | null, reason?: IPartialErrorInfo) {\n this.previous = previous;\n this.current = current;\n if (retryIn) this.retryIn = retryIn;\n if (reason) this.reason = reason;\n }\n}\n\nexport default ConnectionStateChange;\n","import ErrorInfo from '../types/errorinfo';\n\nconst ConnectionErrorCodes = {\n DISCONNECTED: 80003,\n SUSPENDED: 80002,\n FAILED: 80000,\n CLOSING: 80017,\n CLOSED: 80017,\n UNKNOWN_CONNECTION_ERR: 50002,\n UNKNOWN_CHANNEL_ERR: 50001,\n};\n\nconst ConnectionErrors = {\n disconnected: () =>\n ErrorInfo.fromValues({\n statusCode: 400,\n code: ConnectionErrorCodes.DISCONNECTED,\n message: 'Connection to server temporarily unavailable',\n }),\n suspended: () =>\n ErrorInfo.fromValues({\n statusCode: 400,\n code: ConnectionErrorCodes.SUSPENDED,\n message: 'Connection to server unavailable',\n }),\n failed: () =>\n ErrorInfo.fromValues({\n statusCode: 400,\n code: ConnectionErrorCodes.FAILED,\n message: 'Connection failed or disconnected by server',\n }),\n closing: () =>\n ErrorInfo.fromValues({\n statusCode: 400,\n code: ConnectionErrorCodes.CLOSING,\n message: 'Connection closing',\n }),\n closed: () =>\n ErrorInfo.fromValues({\n statusCode: 400,\n code: ConnectionErrorCodes.CLOSED,\n message: 'Connection closed',\n }),\n unknownConnectionErr: () =>\n ErrorInfo.fromValues({\n statusCode: 500,\n code: ConnectionErrorCodes.UNKNOWN_CONNECTION_ERR,\n message: 'Internal connection error',\n }),\n unknownChannelErr: () =>\n ErrorInfo.fromValues({\n statusCode: 500,\n code: ConnectionErrorCodes.UNKNOWN_CONNECTION_ERR,\n message: 'Internal channel error',\n }),\n};\n\nexport function isRetriable(err: ErrorInfo) {\n if (!err.statusCode || !err.code || err.statusCode >= 500) {\n return true;\n }\n return Object.values(ConnectionErrorCodes).includes(err.code);\n}\n\nexport default ConnectionErrors;\n","import { actions } from '../types/protocolmessagecommon';\nimport ProtocolMessage, {\n fromValues as protocolMessageFromValues,\n stringify as stringifyProtocolMessage,\n} from '../types/protocolmessage';\nimport * as Utils from '../util/utils';\nimport EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport ConnectionErrors from './connectionerrors';\nimport ErrorInfo from '../types/errorinfo';\nimport Auth from '../client/auth';\nimport * as API from '../../../../ably';\nimport ConnectionManager, { TransportParams } from './connectionmanager';\nimport Platform from 'common/platform';\nimport TransportName from 'common/constants/TransportName';\n\nexport type TryConnectCallback = (\n wrappedErr: { error: ErrorInfo; event: string } | null,\n transport?: Transport,\n) => void;\n\nexport interface TransportCtor {\n new (\n connectionManager: ConnectionManager,\n auth: Auth,\n params: TransportParams,\n forceJsonProtocol?: boolean,\n ): Transport;\n\n isAvailable(): boolean;\n}\n\nconst closeMessage = protocolMessageFromValues({ action: actions.CLOSE });\nconst disconnectMessage = protocolMessageFromValues({ action: actions.DISCONNECT });\n\n/*\n * Transport instances inherit from EventEmitter and emit the following events:\n *\n * event name data\n * closed error\n * failed error\n * disposed\n * connected null error, connectionSerial, connectionId, connectionDetails\n * event channel message object\n */\n\nabstract class Transport extends EventEmitter {\n connectionManager: ConnectionManager;\n auth: Auth;\n params: TransportParams;\n timeouts: Record<string, number>;\n format?: Utils.Format;\n isConnected: boolean;\n isFinished: boolean;\n isDisposed: boolean;\n maxIdleInterval: number | null;\n idleTimer: NodeJS.Timeout | number | null;\n lastActivity: number | null;\n\n constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams, forceJsonProtocol?: boolean) {\n super(connectionManager.logger);\n if (forceJsonProtocol) {\n params.format = undefined;\n params.heartbeats = true;\n }\n this.connectionManager = connectionManager;\n this.auth = auth;\n this.params = params;\n this.timeouts = params.options.timeouts;\n this.format = params.format;\n this.isConnected = false;\n this.isFinished = false;\n this.isDisposed = false;\n this.maxIdleInterval = null;\n this.idleTimer = null;\n this.lastActivity = null;\n }\n\n abstract shortName: TransportName;\n abstract send(message: ProtocolMessage): void;\n\n connect(): void {}\n\n close(): void {\n if (this.isConnected) {\n this.requestClose();\n }\n this.finish('closed', ConnectionErrors.closed());\n }\n\n disconnect(err?: Error | ErrorInfo): void {\n /* Used for network/transport issues that need to result in the transport\n * being disconnected, but should not transition the connection to 'failed' */\n if (this.isConnected) {\n this.requestDisconnect();\n }\n this.finish('disconnected', err || ConnectionErrors.disconnected());\n }\n\n fail(err: ErrorInfo): void {\n /* Used for client-side-detected fatal connection issues */\n if (this.isConnected) {\n this.requestDisconnect();\n }\n this.finish('failed', err || ConnectionErrors.failed());\n }\n\n finish(event: string, err?: Error | ErrorInfo): void {\n if (this.isFinished) {\n return;\n }\n\n this.isFinished = true;\n this.isConnected = false;\n this.maxIdleInterval = null;\n clearTimeout(this.idleTimer ?? undefined);\n this.idleTimer = null;\n this.emit(event, err);\n this.dispose();\n }\n\n onProtocolMessage(message: ProtocolMessage): void {\n if (this.logger.shouldLog(Logger.LOG_MICRO)) {\n Logger.logActionNoStrip(\n this.logger,\n Logger.LOG_MICRO,\n 'Transport.onProtocolMessage()',\n 'received on ' +\n this.shortName +\n ': ' +\n stringifyProtocolMessage(\n message,\n this.connectionManager.realtime._RealtimePresence,\n this.connectionManager.realtime._Annotations,\n this.connectionManager.realtime._liveObjectsPlugin,\n ) +\n '; connectionId = ' +\n this.connectionManager.connectionId,\n );\n }\n this.onActivity();\n\n switch (message.action) {\n case actions.HEARTBEAT:\n Logger.logActionNoStrip(\n this.logger,\n Logger.LOG_MICRO,\n 'Transport.onProtocolMessage()',\n this.shortName + ' heartbeat; connectionId = ' + this.connectionManager.connectionId,\n );\n this.emit('heartbeat', message.id);\n break;\n case actions.CONNECTED:\n this.onConnect(message);\n this.emit('connected', message.error, message.connectionId, message.connectionDetails, message);\n break;\n case actions.CLOSED:\n this.onClose(message);\n break;\n case actions.DISCONNECTED:\n this.onDisconnect(message);\n break;\n case actions.ACK:\n this.emit('ack', message.msgSerial, message.count, message.res);\n break;\n case actions.NACK:\n this.emit('nack', message.msgSerial, message.count, message.error);\n break;\n case actions.SYNC:\n this.connectionManager.onChannelMessage(message, this);\n break;\n case actions.ACTIVATE:\n // Ignored.\n break;\n case actions.AUTH:\n Utils.whenPromiseSettles(this.auth.authorize(), (err: ErrorInfo | null) => {\n if (err) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Transport.onProtocolMessage()',\n 'Ably requested re-authentication, but unable to obtain a new token: ' + Utils.inspectError(err),\n );\n }\n });\n break;\n case actions.ERROR:\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'Transport.onProtocolMessage()',\n 'received error action; connectionId = ' +\n this.connectionManager.connectionId +\n '; err = ' +\n Platform.Config.inspect(message.error) +\n (message.channel ? ', channel: ' + message.channel : ''),\n );\n if (message.channel === undefined) {\n this.onFatalError(message);\n break;\n }\n /* otherwise it's a channel-specific error, so handle it in the channel */\n this.connectionManager.onChannelMessage(message, this);\n break;\n default:\n /* all other actions are channel-specific */\n this.connectionManager.onChannelMessage(message, this);\n }\n }\n\n onConnect(message: ProtocolMessage): void {\n this.isConnected = true;\n if (!message.connectionDetails) {\n throw new Error('Transport.onConnect(): Connect message recieved without connectionDetails');\n }\n const maxPromisedIdle = message.connectionDetails.maxIdleInterval as number;\n if (maxPromisedIdle) {\n this.maxIdleInterval = maxPromisedIdle + this.timeouts.realtimeRequestTimeout;\n this.onActivity();\n }\n /* else Realtime declines to guarantee any maximum idle interval - CD2h */\n }\n\n onDisconnect(message: ProtocolMessage): void {\n /* Used for when the server has disconnected the client (usually with a\n * DISCONNECTED action) */\n const err = message && message.error;\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.onDisconnect()', 'err = ' + Utils.inspectError(err));\n this.finish('disconnected', err);\n }\n\n onFatalError(message: ProtocolMessage): void {\n /* On receipt of a fatal connection error, we can assume that the server\n * will close the connection and the transport, and do not need to request\n * a disconnection - RTN15i */\n const err = message && message.error;\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.onFatalError()', 'err = ' + Utils.inspectError(err));\n this.finish('failed', err);\n }\n\n onClose(message: ProtocolMessage): void {\n const err = message && message.error;\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.onClose()', 'err = ' + Utils.inspectError(err));\n this.finish('closed', err);\n }\n\n requestClose(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.requestClose()', '');\n this.send(closeMessage);\n }\n\n requestDisconnect(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.requestDisconnect()', '');\n this.send(disconnectMessage);\n }\n\n ping(id: string): void {\n const msg: Record<string, number | string> = { action: actions.HEARTBEAT };\n if (id) msg.id = id;\n this.send(protocolMessageFromValues(msg));\n }\n\n dispose(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.dispose()', '');\n this.isDisposed = true;\n this.off();\n }\n\n onActivity(): void {\n if (!this.maxIdleInterval) {\n return;\n }\n this.lastActivity = this.connectionManager.lastActivity = Date.now();\n this.setIdleTimer(this.maxIdleInterval + 100);\n }\n\n setIdleTimer(timeout: number): void {\n if (!this.idleTimer) {\n this.idleTimer = setTimeout(() => {\n this.onIdleTimerExpire();\n }, timeout);\n }\n }\n\n onIdleTimerExpire(): void {\n if (!this.lastActivity || !this.maxIdleInterval) {\n throw new Error('Transport.onIdleTimerExpire(): lastActivity/maxIdleInterval not set');\n }\n this.idleTimer = null;\n const sinceLast = Date.now() - this.lastActivity;\n const timeRemaining = this.maxIdleInterval - sinceLast;\n if (timeRemaining <= 0) {\n const msg = 'No activity seen from realtime in ' + sinceLast + 'ms; assuming connection has dropped';\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Transport.onIdleTimerExpire()', msg);\n this.disconnect(new ErrorInfo(msg, 80003, 408));\n } else {\n this.setIdleTimer(timeRemaining + 100);\n }\n }\n\n static tryConnect(\n transportCtor: TransportCtor,\n connectionManager: ConnectionManager,\n auth: Auth,\n transportParams: TransportParams,\n callback: TryConnectCallback,\n ): Transport {\n const transport = new transportCtor(connectionManager, auth, transportParams);\n\n let transportAttemptTimer: NodeJS.Timeout | number;\n\n const errorCb = function (this: { event: string }, err: ErrorInfo) {\n clearTimeout(transportAttemptTimer);\n callback({ event: this.event, error: err });\n };\n\n const realtimeRequestTimeout = connectionManager.options.timeouts.realtimeRequestTimeout;\n transportAttemptTimer = setTimeout(() => {\n transport.off(['preconnect', 'disconnected', 'failed']);\n transport.dispose();\n errorCb.call(\n { event: 'disconnected' },\n new ErrorInfo('Timeout waiting for transport to indicate itself viable', 50000, 500),\n );\n }, realtimeRequestTimeout);\n\n transport.on(['failed', 'disconnected'], errorCb);\n transport.on('preconnect', function () {\n Logger.logAction(\n connectionManager.logger,\n Logger.LOG_MINOR,\n 'Transport.tryConnect()',\n 'viable transport ' + transport,\n );\n clearTimeout(transportAttemptTimer);\n transport.off(['failed', 'disconnected'], errorCb);\n callback(null, transport);\n });\n transport.connect();\n return transport;\n }\n\n onAuthUpdated?: (tokenDetails: API.TokenDetails) => void;\n\n static isAvailable(): boolean {\n throw new ErrorInfo('isAvailable not implemented for transport', 50000, 500);\n }\n}\n\nexport default Transport;\n","export namespace TransportNames {\n export const WebSocket = 'web_socket' as const;\n export const Comet = 'comet' as const;\n export const XhrPolling = 'xhr_polling' as const;\n}\n\ntype TransportName = typeof TransportNames.WebSocket | typeof TransportNames.Comet | typeof TransportNames.XhrPolling;\n\nexport default TransportName;\n","import { actions } from '../types/protocolmessagecommon';\nimport ProtocolMessage, {\n stringify as stringifyProtocolMessage,\n fromValues as protocolMessageFromValues,\n} from 'common/lib/types/protocolmessage';\nimport * as Utils from 'common/lib/util/utils';\nimport Protocol, { PendingMessage, PublishCallback } from './protocol';\nimport Defaults, { getAgentString } from 'common/lib/util/defaults';\nimport Platform, { TransportImplementations } from 'common/platform';\nimport EventEmitter from '../util/eventemitter';\nimport MessageQueue from './messagequeue';\nimport Logger from '../util/logger';\nimport ConnectionStateChange from 'common/lib/client/connectionstatechange';\nimport ConnectionErrors, { isRetriable } from './connectionerrors';\nimport ErrorInfo, { IPartialErrorInfo, PartialErrorInfo } from 'common/lib/types/errorinfo';\nimport Auth from 'common/lib/client/auth';\nimport Transport, { TransportCtor } from './transport';\nimport * as API from '../../../../ably';\nimport HttpStatusCodes from 'common/constants/HttpStatusCodes';\nimport BaseRealtime from '../client/baserealtime';\nimport { NormalisedClientOptions } from 'common/types/ClientOptions';\nimport TransportName, { TransportNames } from 'common/constants/TransportName';\n\nlet globalObject = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : self;\n\nconst haveWebStorage = () => typeof Platform.WebStorage !== 'undefined' && Platform.WebStorage?.localSupported;\nconst haveSessionStorage = () => typeof Platform.WebStorage !== 'undefined' && Platform.WebStorage?.sessionSupported;\nconst noop = function () {};\nconst transportPreferenceName = 'ably-transport-preference';\n\ntype RecoveryContext = {\n connectionKey: string;\n msgSerial: number;\n channelSerials: { [name: string]: string };\n};\n\nfunction decodeRecoveryKey(recoveryKey: NormalisedClientOptions['recover']): RecoveryContext | null {\n try {\n return JSON.parse(recoveryKey as string);\n } catch (e) {\n return null;\n }\n}\n\nexport class TransportParams {\n options: NormalisedClientOptions;\n host: string | null;\n mode: string;\n format?: Utils.Format;\n connectionKey?: string;\n stream?: any;\n heartbeats?: boolean;\n\n constructor(options: NormalisedClientOptions, host: string | null, mode: string, connectionKey?: string) {\n this.options = options;\n this.host = host;\n this.mode = mode;\n this.connectionKey = connectionKey;\n this.format = options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json;\n }\n\n getConnectParams(authParams: Record<string, unknown>): Record<string, string> {\n const params = authParams ? Utils.copy(authParams) : {};\n const options = this.options;\n switch (this.mode) {\n case 'resume':\n params.resume = this.connectionKey as string;\n break;\n case 'recover': {\n const recoveryContext = decodeRecoveryKey(options.recover);\n if (recoveryContext) {\n params.recover = recoveryContext.connectionKey;\n }\n break;\n }\n default:\n }\n if (options.clientId !== undefined) {\n params.clientId = options.clientId;\n }\n if (options.echoMessages === false) {\n params.echo = 'false';\n }\n if (this.format !== undefined) {\n params.format = this.format;\n }\n if (this.stream !== undefined) {\n params.stream = this.stream;\n }\n if (this.heartbeats !== undefined) {\n params.heartbeats = this.heartbeats;\n }\n params.v = Defaults.protocolVersion;\n params.agent = getAgentString(this.options);\n if (options.transportParams !== undefined) {\n Utils.mixin(params, options.transportParams);\n }\n return params as Record<string, string>;\n }\n\n toString(): string {\n let result = '[mode=' + this.mode;\n if (this.host) {\n result += ',host=' + this.host;\n }\n if (this.connectionKey) {\n result += ',connectionKey=' + this.connectionKey;\n }\n if (this.format) {\n result += ',format=' + this.format;\n }\n result += ']';\n\n return result;\n }\n}\n\ntype ConnectionState = {\n state: string;\n terminal?: boolean;\n queueEvents?: boolean;\n sendEvents?: boolean;\n failState?: string;\n retryDelay?: number;\n retryImmediately?: boolean;\n error?: IPartialErrorInfo;\n};\n\nclass ConnectionManager extends EventEmitter {\n supportedTransports: Partial<Record<TransportName, TransportCtor>> = {};\n realtime: BaseRealtime;\n options: NormalisedClientOptions;\n states: Record<string, ConnectionState>;\n state: ConnectionState;\n errorReason: IPartialErrorInfo | null;\n queuedMessages: MessageQueue;\n msgSerial: number;\n connectionDetails?: Record<string, any>;\n connectionId?: string;\n connectionKey?: string;\n connectionStateTtl: number;\n maxIdleInterval: number | null;\n transports: TransportName[];\n baseTransport?: TransportName;\n webSocketTransportAvailable?: true;\n transportPreference: string | null;\n domains: string[];\n activeProtocol: null | Protocol;\n pendingTransport?: Transport;\n proposedTransport?: Transport;\n host: string | null;\n lastAutoReconnectAttempt: number | null;\n lastActivity: number | null;\n forceFallbackHost: boolean;\n transitionTimer?: number | NodeJS.Timeout | null;\n suspendTimer?: number | NodeJS.Timeout | null;\n retryTimer?: number | NodeJS.Timeout | null;\n disconnectedRetryCount: number = 0;\n pendingChannelMessagesState: {\n // Whether a message is currently being processed\n isProcessing: boolean;\n // The messages remaining to be processed (excluding any message currently being processed)\n queue: { message: ProtocolMessage; transport: Transport }[];\n } = { isProcessing: false, queue: [] };\n webSocketSlowTimer: NodeJS.Timeout | null;\n wsCheckResult: boolean | null;\n webSocketGiveUpTimer: NodeJS.Timeout | null;\n abandonedWebSocket: boolean;\n connectCounter: number;\n\n constructor(realtime: BaseRealtime, options: NormalisedClientOptions) {\n super(realtime.logger);\n this.realtime = realtime;\n this.initTransports();\n this.options = options;\n const timeouts = options.timeouts;\n /* connectingTimeout: leave webSocketConnectTimeout (~6s) to try the\n * websocket transport, then realtimeRequestTimeout (~10s) to establish\n * the base transport in case that fails */\n const connectingTimeout = timeouts.webSocketConnectTimeout + timeouts.realtimeRequestTimeout;\n this.states = {\n initialized: {\n state: 'initialized',\n terminal: false,\n queueEvents: true,\n sendEvents: false,\n failState: 'disconnected',\n },\n connecting: {\n state: 'connecting',\n terminal: false,\n queueEvents: true,\n sendEvents: false,\n retryDelay: connectingTimeout,\n failState: 'disconnected',\n },\n connected: {\n state: 'connected',\n terminal: false,\n queueEvents: false,\n sendEvents: true,\n failState: 'disconnected',\n },\n disconnected: {\n state: 'disconnected',\n terminal: false,\n queueEvents: true,\n sendEvents: false,\n retryDelay: timeouts.disconnectedRetryTimeout,\n failState: 'disconnected',\n },\n suspended: {\n state: 'suspended',\n terminal: false,\n queueEvents: false,\n sendEvents: false,\n retryDelay: timeouts.suspendedRetryTimeout,\n failState: 'suspended',\n },\n closing: {\n state: 'closing',\n terminal: false,\n queueEvents: false,\n sendEvents: false,\n retryDelay: timeouts.realtimeRequestTimeout,\n failState: 'closed',\n },\n closed: { state: 'closed', terminal: true, queueEvents: false, sendEvents: false, failState: 'closed' },\n failed: { state: 'failed', terminal: true, queueEvents: false, sendEvents: false, failState: 'failed' },\n };\n this.state = this.states.initialized;\n this.errorReason = null;\n\n this.queuedMessages = new MessageQueue(this.logger);\n this.msgSerial = 0;\n this.connectionDetails = undefined;\n this.connectionId = undefined;\n this.connectionKey = undefined;\n this.connectionStateTtl = timeouts.connectionStateTtl;\n this.maxIdleInterval = null;\n\n this.transports = Utils.intersect(options.transports || Defaults.defaultTransports, this.supportedTransports);\n this.transportPreference = null;\n\n if (this.transports.includes(TransportNames.WebSocket)) {\n this.webSocketTransportAvailable = true;\n }\n if (this.transports.includes(TransportNames.XhrPolling)) {\n this.baseTransport = TransportNames.XhrPolling;\n } else if (this.transports.includes(TransportNames.Comet)) {\n this.baseTransport = TransportNames.Comet;\n }\n\n this.domains = Defaults.getHosts(options);\n this.activeProtocol = null;\n this.host = null;\n this.lastAutoReconnectAttempt = null;\n this.lastActivity = null;\n this.forceFallbackHost = false;\n this.connectCounter = 0;\n this.wsCheckResult = null;\n this.webSocketSlowTimer = null;\n this.webSocketGiveUpTimer = null;\n this.abandonedWebSocket = false;\n\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime.ConnectionManager()', 'started');\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Realtime.ConnectionManager()',\n 'requested transports = [' + (options.transports || Defaults.defaultTransports) + ']',\n );\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Realtime.ConnectionManager()',\n 'available transports = [' + this.transports + ']',\n );\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Realtime.ConnectionManager()',\n 'http domains = [' + this.domains + ']',\n );\n\n if (!this.transports.length) {\n const msg = 'no requested transports available';\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'realtime.ConnectionManager()', msg);\n throw new Error(msg);\n }\n\n const addEventListener = Platform.Config.addEventListener;\n if (addEventListener) {\n /* intercept close event in browser to persist connection id if requested */\n if (haveSessionStorage() && typeof options.recover === 'function') {\n addEventListener('beforeunload', this.persistConnection.bind(this));\n }\n\n if (options.closeOnUnload === true) {\n addEventListener('beforeunload', () => {\n Logger.logAction(\n this.logger,\n Logger.LOG_MAJOR,\n 'Realtime.ConnectionManager()',\n 'beforeunload event has triggered the connection to close as closeOnUnload is true',\n );\n this.requestState({ state: 'closing' });\n });\n }\n\n /* Listen for online and offline events */\n addEventListener('online', () => {\n if (this.state == this.states.disconnected || this.state == this.states.suspended) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager caught browser ‘online’ event',\n 'reattempting connection',\n );\n this.requestState({ state: 'connecting' });\n } else if (this.state == this.states.connecting) {\n // RTN20c: if 'online' event recieved while CONNECTING, abandon connection attempt and retry\n this.pendingTransport?.off();\n this.disconnectAllTransports();\n\n this.startConnect();\n }\n });\n\n addEventListener('offline', () => {\n if (this.state == this.states.connected) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager caught browser ‘offline’ event',\n 'disconnecting active transport',\n );\n // Not sufficient to just go to the 'disconnected' state, want to\n // force all transports to reattempt the connection. Will immediately\n // retry.\n this.disconnectAllTransports();\n }\n });\n }\n }\n\n /*********************\n * transport management\n *********************/\n\n // Used by tests\n static supportedTransports(additionalImplementations: TransportImplementations) {\n const storage: TransportStorage = { supportedTransports: {} };\n this.initTransports(additionalImplementations, storage);\n return storage.supportedTransports;\n }\n\n private static initTransports(additionalImplementations: TransportImplementations, storage: TransportStorage) {\n const implementations = { ...Platform.Transports.bundledImplementations, ...additionalImplementations };\n\n [TransportNames.WebSocket, ...Platform.Transports.order].forEach((transportName) => {\n const transport = implementations[transportName];\n if (transport && transport.isAvailable()) {\n storage.supportedTransports[transportName] = transport;\n }\n });\n }\n\n initTransports() {\n ConnectionManager.initTransports(this.realtime._additionalTransportImplementations, this);\n }\n\n createTransportParams(host: string | null, mode: string): TransportParams {\n return new TransportParams(this.options, host, mode, this.connectionKey);\n }\n\n getTransportParams(callback: Function): void {\n const decideMode = (modeCb: Function) => {\n if (this.connectionKey) {\n modeCb('resume');\n return;\n }\n\n if (typeof this.options.recover === 'string') {\n modeCb('recover');\n return;\n }\n\n const recoverFn = this.options.recover,\n lastSessionData = this.getSessionRecoverData(),\n sessionRecoveryName = this.sessionRecoveryName();\n if (lastSessionData && typeof recoverFn === 'function') {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.getTransportParams()',\n 'Calling clientOptions-provided recover function with last session data (recovery scope: ' +\n sessionRecoveryName +\n ')',\n );\n recoverFn(lastSessionData, (shouldRecover?: boolean) => {\n if (shouldRecover) {\n this.options.recover = lastSessionData.recoveryKey;\n modeCb('recover');\n } else {\n modeCb('clean');\n }\n });\n return;\n }\n modeCb('clean');\n };\n\n decideMode((mode: string) => {\n const transportParams = this.createTransportParams(null, mode);\n if (mode === 'recover') {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.getTransportParams()',\n 'Transport recovery mode = recover; recoveryKey = ' + this.options.recover,\n );\n const recoveryContext = decodeRecoveryKey(this.options.recover);\n if (recoveryContext) {\n this.msgSerial = recoveryContext.msgSerial;\n }\n } else {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.getTransportParams()',\n 'Transport params = ' + transportParams.toString(),\n );\n }\n callback(transportParams);\n });\n }\n\n /**\n * Attempt to connect using a given transport\n * @param transportParams\n * @param candidate, the transport to try\n * @param callback\n */\n tryATransport(transportParams: TransportParams, candidate: TransportName, callback: Function): void {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.tryATransport()', 'trying ' + candidate);\n\n this.proposedTransport = Transport.tryConnect(\n this.supportedTransports[candidate]!,\n this,\n this.realtime.auth,\n transportParams,\n (wrappedErr: { error: ErrorInfo; event: string } | null, transport?: Transport) => {\n const state = this.state;\n if (state == this.states.closing || state == this.states.closed || state == this.states.failed) {\n if (transport) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.tryATransport()',\n 'connection ' + state.state + ' while we were attempting the transport; closing ' + transport,\n );\n transport.close();\n }\n callback(true);\n return;\n }\n\n if (wrappedErr) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.tryATransport()',\n 'transport ' + candidate + ' ' + wrappedErr.event + ', err: ' + wrappedErr.error.toString(),\n );\n\n /* Comet transport onconnect token errors can be dealt with here.\n * Websocket ones only happen after the transport claims to be viable,\n * so are dealt with as non-onconnect token errors */\n if (\n Auth.isTokenErr(wrappedErr.error) &&\n !(this.errorReason && Auth.isTokenErr(this.errorReason as ErrorInfo))\n ) {\n this.errorReason = wrappedErr.error;\n /* re-get a token and try again */\n Utils.whenPromiseSettles(this.realtime.auth._forceNewToken(null, null), (err: ErrorInfo | null) => {\n if (err) {\n this.actOnErrorFromAuthorize(err);\n return;\n }\n this.tryATransport(transportParams, candidate, callback);\n });\n } else if (wrappedErr.event === 'failed') {\n /* Error that's fatal to the connection */\n this.notifyState({ state: 'failed', error: wrappedErr.error });\n callback(true);\n } else if (wrappedErr.event === 'disconnected') {\n if (!isRetriable(wrappedErr.error)) {\n /* Error received from the server that does not call for trying a fallback host, eg a rate limit */\n this.notifyState({ state: this.states.connecting.failState as string, error: wrappedErr.error });\n callback(true);\n } else {\n /* Error with that transport only; continue trying other fallback hosts */\n callback(false);\n }\n }\n return;\n }\n\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'ConnectionManager.tryATransport()',\n 'viable transport ' + candidate + '; setting pending',\n );\n this.setTransportPending(transport as Transport, transportParams);\n callback(null, transport);\n },\n );\n }\n\n /**\n * Called when a transport is indicated to be viable, and the ConnectionManager\n * expects to activate this transport as soon as it is connected.\n * @param transport\n * @param transportParams\n */\n setTransportPending(transport: Transport, transportParams: TransportParams): void {\n const mode = transportParams.mode;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.setTransportPending()',\n 'transport = ' + transport + '; mode = ' + mode,\n );\n\n this.pendingTransport = transport;\n\n this.cancelWebSocketSlowTimer();\n this.cancelWebSocketGiveUpTimer();\n\n transport.once('connected', (error: ErrorInfo, connectionId: string, connectionDetails: Record<string, any>) => {\n this.activateTransport(error, transport, connectionId, connectionDetails);\n\n if (mode === 'recover' && this.options.recover) {\n /* After a successful recovery, we unpersist, as a recovery key cannot\n * be used more than once */\n delete this.options.recover;\n this.unpersistConnection();\n }\n });\n\n const self = this;\n transport.on(['disconnected', 'closed', 'failed'], function (this: { event: string }, error: ErrorInfo) {\n self.deactivateTransport(transport, this.event, error);\n });\n\n this.emit('transport.pending', transport);\n }\n\n /**\n * Called when a transport is connected, and the connectionmanager decides that\n * it will now be the active transport. Returns whether or not it activated\n * the transport (if the connection is closing/closed it will choose not to).\n * @param transport the transport instance\n * @param connectionId the id of the new active connection\n * @param connectionDetails the details of the new active connection\n */\n activateTransport(\n error: ErrorInfo,\n transport: Transport,\n connectionId: string,\n connectionDetails: Record<string, any>,\n ): boolean {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.activateTransport()',\n 'transport = ' + transport,\n );\n if (error) {\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.activateTransport()', 'error = ' + error);\n }\n if (connectionId) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'ConnectionManager.activateTransport()',\n 'connectionId = ' + connectionId,\n );\n }\n if (connectionDetails) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'ConnectionManager.activateTransport()',\n 'connectionDetails = ' + JSON.stringify(connectionDetails),\n );\n }\n\n this.persistTransportPreference(transport);\n\n /* if the connectionmanager moved to the closing/closed state before this\n * connection event, then we won't activate this transport */\n const existingState = this.state,\n connectedState = this.states.connected.state;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.activateTransport()',\n 'current state = ' + existingState.state,\n );\n if (\n existingState.state == this.states.closing.state ||\n existingState.state == this.states.closed.state ||\n existingState.state == this.states.failed.state\n ) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.activateTransport()',\n 'Disconnecting transport and abandoning',\n );\n transport.disconnect();\n return false;\n }\n\n delete this.pendingTransport;\n\n /* if the transport is not connected then don't activate it */\n if (!transport.isConnected) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.activateTransport()',\n 'Declining to activate transport ' + transport + ' since it appears to no longer be connected',\n );\n return false;\n }\n\n /* the given transport is connected; this will immediately\n * take over as the active transport */\n const existingActiveProtocol = this.activeProtocol;\n this.activeProtocol = new Protocol(transport);\n this.host = transport.params.host;\n\n const connectionKey = connectionDetails.connectionKey;\n if (connectionKey && this.connectionKey != connectionKey) {\n this.setConnection(connectionId, connectionDetails, !!error);\n }\n\n /* Rebroadcast any new connectionDetails from the active transport, which\n * can come at any time (eg following a reauth), and emit an RTN24 UPDATE\n * event. (Listener added on nextTick because we're in a transport.on('connected')\n * callback at the moment; if we add it now we'll be adding it to the end\n * of the listeners array and it'll be called immediately) */\n this.onConnectionDetailsUpdate(connectionDetails, transport);\n Platform.Config.nextTick(() => {\n transport.on(\n 'connected',\n (connectedErr: ErrorInfo, _connectionId: string, connectionDetails: Record<string, any>) => {\n this.onConnectionDetailsUpdate(connectionDetails, transport);\n this.emit('update', new ConnectionStateChange(connectedState, connectedState, null, connectedErr));\n },\n );\n });\n\n /* If previously not connected, notify the state change (including any\n * error). */\n if (existingState.state === this.states.connected.state) {\n if (error) {\n this.errorReason = this.realtime.connection.errorReason = error;\n this.emit('update', new ConnectionStateChange(connectedState, connectedState, null, error));\n }\n } else {\n this.notifyState({ state: 'connected', error: error });\n this.errorReason = this.realtime.connection.errorReason = error || null;\n }\n\n /* Send after the connection state update, as Channels hooks into this to\n * resend attaches on a new transport if necessary */\n this.emit('transport.active', transport);\n\n /* Gracefully terminate existing protocol */\n if (existingActiveProtocol) {\n if (existingActiveProtocol.messageQueue.count() > 0) {\n /* We could just requeue pending messages on the new transport, but\n * actually this should never happen: transports should only take over\n * from other active transports when upgrading, and upgrading waits for\n * the old transport to be idle. So log an error. */\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'ConnectionManager.activateTransport()',\n 'Previous active protocol (for transport ' +\n existingActiveProtocol.transport.shortName +\n ', new one is ' +\n transport.shortName +\n ') finishing with ' +\n existingActiveProtocol.messageQueue.count() +\n ' messages still pending',\n );\n }\n if (existingActiveProtocol.transport === transport) {\n const msg =\n 'Assumption violated: activating a transport that was also the transport for the previous active protocol; transport = ' +\n transport.shortName +\n '; stack = ' +\n new Error().stack;\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.activateTransport()', msg);\n } else {\n existingActiveProtocol.finish();\n }\n }\n\n return true;\n }\n\n /**\n * Called when a transport is no longer the active transport. This can occur\n * in any transport connection state.\n * @param transport\n */\n deactivateTransport(transport: Transport, state: string, error: ErrorInfo): void {\n const currentProtocol = this.activeProtocol,\n wasActive = currentProtocol && currentProtocol.getTransport() === transport,\n wasPending = transport === this.pendingTransport,\n noTransportsScheduledForActivation = this.noTransportsScheduledForActivation();\n\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.deactivateTransport()',\n 'transport = ' + transport,\n );\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.deactivateTransport()',\n 'state = ' +\n state +\n (wasActive ? '; was active' : wasPending ? '; was pending' : '') +\n (noTransportsScheduledForActivation ? '' : '; another transport is scheduled for activation'),\n );\n if (error && error.message)\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'ConnectionManager.deactivateTransport()',\n 'reason = ' + error.message,\n );\n\n if (wasActive) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'ConnectionManager.deactivateTransport()',\n 'Getting, clearing, and requeuing ' +\n (this.activeProtocol as Protocol).messageQueue.count() +\n ' pending messages',\n );\n this.queuePendingMessages((currentProtocol as Protocol).getPendingMessages());\n /* Clear any messages we requeue to allow the protocol to become idle.*/\n (currentProtocol as Protocol).clearPendingMessages();\n this.activeProtocol = this.host = null;\n }\n\n this.emit('transport.inactive', transport);\n\n /* this transport state change is a state change for the connectionmanager if\n * - the transport was the active transport and there are no transports\n * which are connected and scheduled for activation, just waiting for the\n * active transport to finish what its doing; or\n * - the transport was the active transport and the error was fatal (so\n * unhealable by another transport); or\n * - there is no active transport, and this is the last remaining\n * pending transport (so we were in the connecting state)\n */\n if (\n (wasActive && noTransportsScheduledForActivation) ||\n (wasActive && state === 'failed') ||\n state === 'closed' ||\n (currentProtocol === null && wasPending)\n ) {\n /* If we're disconnected with a 5xx we need to try fallback hosts\n * (RTN14d), but (a) due to how the upgrade sequence works, the\n * host/transport selection sequence only cares about getting to\n * `preconnect` (eg establishing a websocket) getting a `disconnected`\n * protocol message afterwards is too late; and (b) host retry only\n * applies to connectBase unless the stored preference transport doesn't\n * work. We solve this by unpersisting the transport preference and\n * setting an instance variable to force fallback hosts to be used (if\n * any) here. Bit of a kludge, but no real better alternatives without\n * rewriting the entire thing */\n if (state === 'disconnected' && error && (error.statusCode as number) > 500 && this.domains.length > 1) {\n this.unpersistTransportPreference();\n this.forceFallbackHost = true;\n /* and try to connect again to try a fallback host without waiting for the usual 15s disconnectedRetryTimeout */\n this.notifyState({ state: state, error: error, retryImmediately: true });\n return;\n }\n\n /* TODO remove below line once realtime sends token errors as DISCONNECTEDs */\n const newConnectionState = state === 'failed' && Auth.isTokenErr(error) ? 'disconnected' : state;\n this.notifyState({ state: newConnectionState, error: error });\n return;\n }\n }\n\n /* Helper that returns true if there are no transports which are pending,\n * have been connected, and are just waiting for onceNoPending to fire before\n * being activated */\n noTransportsScheduledForActivation(): boolean {\n return !this.pendingTransport || !this.pendingTransport.isConnected;\n }\n\n setConnection(connectionId: string, connectionDetails: Record<string, any>, hasConnectionError?: boolean): void {\n /* if connectionKey changes but connectionId stays the same, then just a\n * transport change on the same connection. If connectionId changes, we're\n * on a new connection, with implications for msgSerial and channel state */\n /* If no previous connectionId, don't reset the msgSerial as it may have\n * been set by recover data (unless the recover failed) */\n const prevConnId = this.connectionId,\n connIdChanged = prevConnId && prevConnId !== connectionId,\n recoverFailure = !prevConnId && hasConnectionError;\n if (connIdChanged || recoverFailure) {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.setConnection()', 'Resetting msgSerial');\n this.msgSerial = 0;\n // RTN19a2: In the event of a new connectionId, previous msgSerials are\n // meaningless.\n this.queuedMessages.resetSendAttempted();\n }\n if (this.connectionId !== connectionId) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.setConnection()',\n 'New connectionId; reattaching any attached channels',\n );\n }\n this.realtime.connection.id = this.connectionId = connectionId;\n this.realtime.connection.key = this.connectionKey = connectionDetails.connectionKey;\n }\n\n clearConnection(): void {\n this.realtime.connection.id = this.connectionId = undefined;\n this.realtime.connection.key = this.connectionKey = undefined;\n this.msgSerial = 0;\n // RTN19a2: On a new connection, previous msgSerials are meaningless.\n // Reset sendAttempted so queued messages get new serials.\n this.queuedMessages.resetSendAttempted();\n this.unpersistConnection();\n }\n\n createRecoveryKey(): string | null {\n // RTN16g2.\n if (!this.connectionKey) {\n return null;\n }\n\n return JSON.stringify({\n connectionKey: this.connectionKey,\n msgSerial: this.msgSerial,\n channelSerials: this.realtime.channels.channelSerials(),\n });\n }\n\n checkConnectionStateFreshness(): void {\n if (!this.lastActivity || !this.connectionId) {\n return;\n }\n\n const sinceLast = Date.now() - this.lastActivity;\n if (sinceLast > this.connectionStateTtl + (this.maxIdleInterval as number)) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.checkConnectionStateFreshness()',\n 'Last known activity from realtime was ' + sinceLast + 'ms ago; discarding connection state',\n );\n this.clearConnection();\n this.states.connecting.failState = 'suspended';\n }\n }\n\n /**\n * Called when the connectionmanager wants to persist transport\n * state for later recovery. Only applicable in the browser context.\n */\n persistConnection(): void {\n if (haveSessionStorage()) {\n const recoveryKey = this.createRecoveryKey();\n if (recoveryKey) {\n this.setSessionRecoverData({\n recoveryKey: recoveryKey,\n disconnectedAt: Date.now(),\n location: globalObject.location,\n clientId: this.realtime.auth.clientId,\n });\n }\n }\n }\n\n /**\n * Called when the connectionmanager wants to persist transport\n * state for later recovery. Only applicable in the browser context.\n */\n unpersistConnection(): void {\n this.clearSessionRecoverData();\n }\n\n getActiveTransportFormat(): Utils.Format | undefined {\n return this.activeProtocol?.getTransport().format;\n }\n\n /*********************\n * state management\n *********************/\n\n getError(): IPartialErrorInfo | string {\n if (this.errorReason) {\n // create new PartialErrorInfo so it has the correct stack trace\n // which points to the place which caused us to return this error.\n const newError = PartialErrorInfo.fromValues(this.errorReason);\n newError.cause = this.errorReason;\n return newError;\n }\n\n return this.getStateError();\n }\n\n getStateError(): ErrorInfo {\n return (ConnectionErrors as Record<string, () => ErrorInfo>)[this.state.state]?.();\n }\n\n activeState(): boolean | void {\n return this.state.queueEvents || this.state.sendEvents;\n }\n\n enactStateChange(stateChange: ConnectionStateChange): void {\n const action = 'Connection state';\n const message = stateChange.current + (stateChange.reason ? '; reason: ' + stateChange.reason : '');\n if (stateChange.current === 'failed') {\n Logger.logAction(this.logger, Logger.LOG_ERROR, action, message);\n } else {\n Logger.logAction(this.logger, Logger.LOG_MAJOR, action, message);\n }\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.enactStateChange',\n 'setting new state: ' +\n stateChange.current +\n '; reason = ' +\n (stateChange.reason && (stateChange.reason as ErrorInfo).message),\n );\n const newState = (this.state = this.states[stateChange.current as string]);\n if (stateChange.reason) {\n this.errorReason = stateChange.reason;\n // TODO remove this type assertion after fixing https://github.com/ably/ably-js/issues/1405\n this.realtime.connection.errorReason = stateChange.reason as ErrorInfo;\n }\n if (newState.terminal || newState.state === 'suspended') {\n /* suspended is nonterminal, but once in the suspended state, realtime\n * will have discarded our connection state, so futher connection\n * attempts should start from scratch */\n this.clearConnection();\n }\n this.emit('connectionstate', stateChange);\n }\n\n /****************************************\n * ConnectionManager connection lifecycle\n ****************************************/\n\n startTransitionTimer(transitionState: ConnectionState): void {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.startTransitionTimer()',\n 'transitionState: ' + transitionState.state,\n );\n\n if (this.transitionTimer) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.startTransitionTimer()',\n 'clearing already-running timer',\n );\n clearTimeout(this.transitionTimer as number);\n }\n\n this.transitionTimer = setTimeout(() => {\n if (this.transitionTimer) {\n this.transitionTimer = null;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager ' + transitionState.state + ' timer expired',\n 'requesting new state: ' + transitionState.failState,\n );\n this.notifyState({ state: transitionState.failState as string });\n }\n }, transitionState.retryDelay);\n }\n\n cancelTransitionTimer(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.cancelTransitionTimer()', '');\n if (this.transitionTimer) {\n clearTimeout(this.transitionTimer as number);\n this.transitionTimer = null;\n }\n }\n\n startSuspendTimer(): void {\n if (this.suspendTimer) return;\n this.suspendTimer = setTimeout(() => {\n if (this.suspendTimer) {\n this.suspendTimer = null;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager suspend timer expired',\n 'requesting new state: suspended',\n );\n this.states.connecting.failState = 'suspended';\n this.notifyState({ state: 'suspended' });\n }\n }, this.connectionStateTtl);\n }\n\n checkSuspendTimer(state: string): void {\n if (state !== 'disconnected' && state !== 'suspended' && state !== 'connecting') this.cancelSuspendTimer();\n }\n\n cancelSuspendTimer(): void {\n this.states.connecting.failState = 'disconnected';\n if (this.suspendTimer) {\n clearTimeout(this.suspendTimer as number);\n this.suspendTimer = null;\n }\n }\n\n startRetryTimer(interval: number): void {\n this.retryTimer = setTimeout(() => {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager retry timer expired', 'retrying');\n this.retryTimer = null;\n this.requestState({ state: 'connecting' });\n }, interval);\n }\n\n cancelRetryTimer(): void {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer as NodeJS.Timeout);\n this.retryTimer = null;\n }\n }\n\n startWebSocketSlowTimer() {\n this.webSocketSlowTimer = setTimeout(() => {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager WebSocket slow timer',\n 'checking connectivity',\n );\n this.checkWsConnectivity()\n .then(() => {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager WebSocket slow timer',\n 'ws connectivity check succeeded',\n );\n this.wsCheckResult = true;\n })\n .catch(() => {\n Logger.logAction(\n this.logger,\n Logger.LOG_MAJOR,\n 'ConnectionManager WebSocket slow timer',\n 'ws connectivity check failed',\n );\n this.wsCheckResult = false;\n });\n if (this.realtime.http.checkConnectivity) {\n Utils.whenPromiseSettles(this.realtime.http.checkConnectivity(), (err, connectivity) => {\n if (err || !connectivity) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MAJOR,\n 'ConnectionManager WebSocket slow timer',\n 'http connectivity check failed',\n );\n this.cancelWebSocketGiveUpTimer();\n this.notifyState({\n state: 'disconnected',\n error: new ErrorInfo('Unable to connect (network unreachable)', 80003, 404),\n });\n } else {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager WebSocket slow timer',\n 'http connectivity check succeeded',\n );\n }\n });\n }\n }, this.options.timeouts.webSocketSlowTimeout);\n }\n\n cancelWebSocketSlowTimer() {\n if (this.webSocketSlowTimer) {\n clearTimeout(this.webSocketSlowTimer);\n this.webSocketSlowTimer = null;\n }\n }\n\n startWebSocketGiveUpTimer(transportParams: TransportParams) {\n this.webSocketGiveUpTimer = setTimeout(() => {\n if (!this.wsCheckResult) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager WebSocket give up timer',\n 'websocket connection took more than 10s; ' + (this.baseTransport ? 'trying base transport' : ''),\n );\n if (this.baseTransport) {\n this.abandonedWebSocket = true;\n this.proposedTransport?.dispose();\n this.pendingTransport?.dispose();\n this.connectBase(transportParams, ++this.connectCounter);\n } else {\n // if we don't have a base transport to fallback to, just let the websocket connection attempt time out\n Logger.logAction(\n this.logger,\n Logger.LOG_MAJOR,\n 'ConnectionManager WebSocket give up timer',\n 'websocket connectivity appears to be unavailable but no other transports to try',\n );\n }\n }\n }, this.options.timeouts.webSocketConnectTimeout);\n }\n\n cancelWebSocketGiveUpTimer() {\n if (this.webSocketGiveUpTimer) {\n clearTimeout(this.webSocketGiveUpTimer);\n this.webSocketGiveUpTimer = null;\n }\n }\n\n notifyState(indicated: ConnectionState): void {\n const state = indicated.state;\n\n /* We retry immediately if:\n * - something disconnects us while we're connected, or\n * - a viable (but not yet active) transport fails due to a token error (so\n * this.errorReason will be set, and startConnect will do a forced\n * authorize). If this.errorReason is already set (to a token error),\n * then there has been at least one previous attempt to connect that also\n * failed for a token error, so by RTN14b we go to DISCONNECTED and wait\n * before trying again */\n const retryImmediately =\n state === 'disconnected' &&\n (this.state === this.states.connected ||\n indicated.retryImmediately ||\n (this.state === this.states.connecting &&\n indicated.error &&\n Auth.isTokenErr(indicated.error) &&\n !(this.errorReason && Auth.isTokenErr(this.errorReason as ErrorInfo))));\n\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.notifyState()',\n 'new state: ' + state + (retryImmediately ? '; will retry connection immediately' : ''),\n );\n /* do nothing if we're already in the indicated state */\n if (state == this.state.state) return;\n\n /* kill timers (possibly excepting suspend timer depending on the notified\n * state), as these are superseded by this notification */\n this.cancelTransitionTimer();\n this.cancelRetryTimer();\n this.cancelWebSocketSlowTimer();\n this.cancelWebSocketGiveUpTimer();\n this.checkSuspendTimer(indicated.state);\n\n if (state === 'suspended' || state === 'connected') {\n this.disconnectedRetryCount = 0;\n }\n\n /* do nothing if we're unable to move from the current state */\n if (this.state.terminal) return;\n\n /* process new state */\n const newState = this.states[indicated.state];\n\n let retryDelay = newState.retryDelay;\n if (newState.state === 'disconnected') {\n this.disconnectedRetryCount++;\n retryDelay = Utils.getRetryTime(newState.retryDelay as number, this.disconnectedRetryCount);\n }\n\n const change = new ConnectionStateChange(\n this.state.state,\n newState.state,\n retryDelay,\n indicated.error || (ConnectionErrors as Partial<Record<string, () => ErrorInfo>>)[newState.state]?.(),\n );\n\n if (retryImmediately) {\n const autoReconnect = () => {\n if (this.state === this.states.disconnected) {\n this.lastAutoReconnectAttempt = Date.now();\n this.requestState({ state: 'connecting' });\n }\n };\n const sinceLast = this.lastAutoReconnectAttempt && Date.now() - this.lastAutoReconnectAttempt + 1;\n if (sinceLast && sinceLast < 1000) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'ConnectionManager.notifyState()',\n 'Last reconnect attempt was only ' +\n sinceLast +\n 'ms ago, waiting another ' +\n (1000 - sinceLast) +\n 'ms before trying again',\n );\n setTimeout(autoReconnect, 1000 - sinceLast);\n } else {\n Platform.Config.nextTick(autoReconnect);\n }\n } else if (state === 'disconnected' || state === 'suspended') {\n this.startRetryTimer(retryDelay as number);\n }\n\n /* If going into disconnect/suspended (and not retrying immediately), or a\n * terminal state, ensure there are no orphaned transports hanging around. */\n if ((state === 'disconnected' && !retryImmediately) || state === 'suspended' || newState.terminal) {\n /* Wait till the next tick so the connection state change is enacted,\n * so aborting transports doesn't trigger redundant state changes */\n Platform.Config.nextTick(() => {\n this.disconnectAllTransports();\n });\n }\n\n if (state == 'connected' && !this.activeProtocol) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'ConnectionManager.notifyState()',\n 'Broken invariant: attempted to go into connected state, but there is no active protocol',\n );\n }\n\n /* implement the change and notify */\n this.enactStateChange(change);\n if (this.state.sendEvents) {\n this.sendQueuedMessages();\n } else if (!this.state.queueEvents) {\n this.realtime.channels.propogateConnectionInterruption(state, change.reason);\n this.failQueuedMessages(change.reason as ErrorInfo); // RTN7c\n }\n }\n\n requestState(request: any): void {\n const state = request.state;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.requestState()',\n 'requested state: ' + state + '; current state: ' + this.state.state,\n );\n if (state == this.state.state) return; /* silently do nothing */\n\n /* kill running timers, as this request supersedes them */\n this.cancelWebSocketSlowTimer();\n this.cancelWebSocketGiveUpTimer();\n this.cancelTransitionTimer();\n this.cancelRetryTimer();\n /* for suspend timer check rather than cancel -- eg requesting a connecting\n * state should not reset the suspend timer */\n this.checkSuspendTimer(state);\n\n if (state == 'connecting' && this.state.state == 'connected') return;\n if (state == 'closing' && this.state.state == 'closed') return;\n\n const newState = this.states[state],\n change = new ConnectionStateChange(\n this.state.state,\n newState.state,\n null,\n request.error || (ConnectionErrors as Partial<Record<string, () => ErrorInfo>>)[newState.state]?.(),\n );\n\n this.enactStateChange(change);\n\n if (state == 'connecting') {\n Platform.Config.nextTick(() => {\n this.startConnect();\n });\n }\n if (state == 'closing') {\n this.closeImpl();\n }\n }\n\n startConnect(): void {\n if (this.state !== this.states.connecting) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'ConnectionManager.startConnect()',\n 'Must be in connecting state to connect, but was ' + this.state.state,\n );\n return;\n }\n\n const auth = this.realtime.auth;\n\n /* The point of the connectCounter mechanism is to ensure that the\n * connection procedure can be cancelled. We want disconnectAllTransports\n * to be able to stop any in-progress connection, even before it gets to\n * the stage of having a pending (or even a proposed) transport that it can\n * dispose() of. So we check that it's still current after any async stage,\n * up until the stage that is synchronous with instantiating a transport */\n const connectCount = ++this.connectCounter;\n\n const connect = () => {\n this.checkConnectionStateFreshness();\n this.getTransportParams((transportParams: TransportParams) => {\n if (transportParams.mode === 'recover' && transportParams.options.recover) {\n const recoveryContext = decodeRecoveryKey(transportParams.options.recover);\n if (recoveryContext) {\n this.realtime.channels.recoverChannels(recoveryContext.channelSerials);\n }\n }\n\n if (connectCount !== this.connectCounter) {\n return;\n }\n this.connectImpl(transportParams, connectCount);\n });\n };\n\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.startConnect()', 'starting connection');\n this.startSuspendTimer();\n this.startTransitionTimer(this.states.connecting);\n\n if (auth.method === 'basic') {\n connect();\n } else {\n const authCb = (err: ErrorInfo | null) => {\n if (connectCount !== this.connectCounter) {\n return;\n }\n if (err) {\n this.actOnErrorFromAuthorize(err);\n } else {\n connect();\n }\n };\n if (this.errorReason && Auth.isTokenErr(this.errorReason as ErrorInfo)) {\n /* Force a refetch of a new token */\n Utils.whenPromiseSettles(auth._forceNewToken(null, null), authCb);\n } else {\n Utils.whenPromiseSettles(auth._ensureValidAuthCredentials(false), authCb);\n }\n }\n }\n\n /*\n * there are, at most, two transports available with which a connection may\n * be attempted: web_socket and/or a base transport (xhr_polling in browsers,\n * comet in nodejs). web_socket is always preferred, and the base transport is\n * only used in case web_socket connectivity appears to be unavailable.\n *\n * connectImpl begins the transport selection process by checking which transports\n * are available, and if there is a cached preference. It then defers to the\n * transport-specific connect methods: connectWs and connectBase.\n *\n * It is also responsible for invalidating the cache in the case that a base\n * transport preference is stored but web socket connectivity is now available.\n *\n * handling of the case where we need to failover from web_socket to the base\n * transport is implemented in the connectWs method.\n */\n connectImpl(transportParams: TransportParams, connectCount: number): void {\n const state = this.state.state;\n if (state !== this.states.connecting.state) {\n /* Only keep trying as long as in the 'connecting' state (or 'connected'\n * for upgrading). Any operation can put us into 'disconnected' to cancel\n * connection attempts and wait before retrying, or 'failed' to fail. */\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MINOR,\n 'ConnectionManager.connectImpl()',\n 'Must be in connecting state to connect, but was ' + state,\n );\n return;\n }\n\n const transportPreference = this.getTransportPreference();\n\n // If transport preference is for a non-ws transport but websocket is now available, unpersist the preference for next time\n if (transportPreference && transportPreference === this.baseTransport && this.webSocketTransportAvailable) {\n this.checkWsConnectivity()\n .then(() => {\n this.unpersistTransportPreference();\n if (this.state === this.states.connecting) {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MINOR,\n 'ConnectionManager.connectImpl():',\n 'web socket connectivity available, cancelling connection attempt with ' + this.baseTransport,\n );\n this.disconnectAllTransports();\n this.connectWs(transportParams, ++this.connectCounter);\n }\n })\n .catch(noop);\n }\n\n if (\n (transportPreference && transportPreference === this.baseTransport) ||\n (this.baseTransport && !this.webSocketTransportAvailable)\n ) {\n this.connectBase(transportParams, connectCount);\n } else {\n this.connectWs(transportParams, connectCount);\n }\n }\n\n /*\n * connectWs starts two timers to monitor the success of a web_socket connection attempt:\n * - webSocketSlowTimer: if this timer fires before the connection succeeds,\n * cm will simultaneously check websocket and http/xhr connectivity. if the http\n * connectivity check fails, we give up the connection sequence entirely and\n * transition to disconnected. if the websocket connectivity check fails then\n * we assume no ws connectivity and failover to base transport. in the case that\n * the checks succeed, we continue with websocket and wait for it to try fallback hosts\n * and, if unsuccessful, ultimately transition to disconnected.\n * - webSocketGiveUpTimer: if this timer fires, and the preceding websocket\n * connectivity check is still pending then we assume that there is an issue\n * with the transport and fallback to base transport.\n */\n connectWs(transportParams: TransportParams, connectCount: number) {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.connectWs()');\n this.wsCheckResult = null;\n this.abandonedWebSocket = false;\n this.startWebSocketSlowTimer();\n this.startWebSocketGiveUpTimer(transportParams);\n\n this.tryTransportWithFallbacks('web_socket', transportParams, true, connectCount, () => {\n return this.wsCheckResult !== false && !this.abandonedWebSocket;\n });\n }\n\n connectBase(transportParams: TransportParams, connectCount: number) {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.connectBase()');\n if (this.baseTransport) {\n this.tryTransportWithFallbacks(this.baseTransport, transportParams, false, connectCount, () => true);\n } else {\n this.notifyState({\n state: 'disconnected',\n error: new ErrorInfo('No transports left to try', 80000, 404),\n });\n }\n }\n\n tryTransportWithFallbacks(\n transportName: TransportName,\n transportParams: TransportParams,\n ws: boolean,\n connectCount: number,\n shouldContinue: () => boolean,\n ): void {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.tryTransportWithFallbacks()',\n transportName,\n );\n const giveUp = (err: IPartialErrorInfo) => {\n this.notifyState({ state: this.states.connecting.failState as string, error: err });\n };\n\n const candidateHosts = this.domains.slice();\n\n const hostAttemptCb = (fatal: boolean, transport: Transport) => {\n if (connectCount !== this.connectCounter) {\n return;\n }\n if (!shouldContinue()) {\n if (transport) {\n transport.dispose();\n }\n return;\n }\n if (!transport && !fatal) {\n tryFallbackHosts();\n }\n };\n\n /* first try to establish a connection with the priority host with http transport */\n const host = candidateHosts.shift();\n if (!host) {\n giveUp(new ErrorInfo('Unable to connect (no available host)', 80003, 404));\n return;\n }\n transportParams.host = host;\n\n /* this is what we'll be doing if the attempt for the main host fails */\n const tryFallbackHosts = () => {\n /* if there aren't any fallback hosts, fail */\n if (!candidateHosts.length) {\n giveUp(new ErrorInfo('Unable to connect (and no more fallback hosts to try)', 80003, 404));\n return;\n }\n /* before trying any fallback (or any remaining fallback) we decide if\n * there is a problem with the ably host, or there is a general connectivity\n * problem */\n if (!this.realtime.http.checkConnectivity) {\n giveUp(new PartialErrorInfo('Internal error: Http.checkConnectivity not set', null, 500));\n return;\n }\n Utils.whenPromiseSettles(\n this.realtime.http.checkConnectivity(),\n (err?: ErrorInfo | null, connectivity?: boolean) => {\n if (connectCount !== this.connectCounter) {\n return;\n }\n if (!shouldContinue()) {\n return;\n }\n /* we know err won't happen but handle it here anyway */\n if (err) {\n giveUp(err);\n return;\n }\n if (!connectivity) {\n /* the internet isn't reachable, so don't try the fallback hosts */\n giveUp(new ErrorInfo('Unable to connect (network unreachable)', 80003, 404));\n return;\n }\n /* the network is there, so there's a problem with the main host, or\n * its dns. Try the fallback hosts. We could try them simultaneously but\n * that would potentially cause a huge spike in load on the load balancer */\n transportParams.host = Utils.arrPopRandomElement(candidateHosts);\n this.tryATransport(transportParams, transportName, hostAttemptCb);\n },\n );\n };\n\n if (this.forceFallbackHost && candidateHosts.length) {\n this.forceFallbackHost = false;\n tryFallbackHosts();\n return;\n }\n\n this.tryATransport(transportParams, transportName, hostAttemptCb);\n }\n\n closeImpl(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.closeImpl()', 'closing connection');\n this.cancelSuspendTimer();\n this.startTransitionTimer(this.states.closing);\n\n if (this.pendingTransport) {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.closeImpl()',\n 'Closing pending transport: ' + this.pendingTransport,\n );\n this.pendingTransport.close();\n }\n\n if (this.activeProtocol) {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.closeImpl()',\n 'Closing active transport: ' + this.activeProtocol.getTransport(),\n );\n this.activeProtocol.getTransport().close();\n }\n\n /* If there was an active transport, this will probably be\n * preempted by the notifyState call in deactivateTransport */\n this.notifyState({ state: 'closed' });\n }\n\n onAuthUpdated(tokenDetails: API.TokenDetails, callback: Function): void {\n switch (this.state.state) {\n case 'connected': {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.onAuthUpdated()',\n 'Sending AUTH message on active transport',\n );\n\n /* Do any transport-specific new-token action */\n const activeTransport = this.activeProtocol?.getTransport();\n if (activeTransport && activeTransport.onAuthUpdated) {\n activeTransport.onAuthUpdated(tokenDetails);\n }\n\n const authMsg = protocolMessageFromValues({\n action: actions.AUTH,\n auth: {\n accessToken: tokenDetails.token,\n },\n });\n this.send(authMsg);\n\n /* The answer will come back as either a connectiondetails event\n * (realtime sends a CONNECTED to acknowledge the reauth) or a\n * statechange to failed */\n const successListener = () => {\n this.off(failureListener);\n callback(null, tokenDetails);\n };\n const failureListener = (stateChange: ConnectionStateChange) => {\n if (stateChange.current === 'failed') {\n this.off(successListener);\n this.off(failureListener);\n callback(stateChange.reason || this.getStateError());\n }\n };\n this.once('connectiondetails', successListener);\n this.on('connectionstate', failureListener);\n break;\n }\n\n case 'connecting':\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.onAuthUpdated()',\n 'Aborting current connection attempts in order to start again with the new auth details',\n );\n this.disconnectAllTransports();\n /* fallthrough to add statechange listener */\n\n default: {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.onAuthUpdated()',\n 'Connection state is ' + this.state.state + '; waiting until either connected or failed',\n );\n const listener = (stateChange: ConnectionStateChange) => {\n switch (stateChange.current) {\n case 'connected':\n this.off(listener);\n callback(null, tokenDetails);\n break;\n case 'failed':\n case 'closed':\n case 'suspended':\n this.off(listener);\n callback(stateChange.reason || this.getStateError());\n break;\n default:\n /* ignore till we get either connected or failed */\n break;\n }\n };\n this.on('connectionstate', listener);\n if (this.state.state === 'connecting') {\n /* can happen if in the connecting state but no transport was pending\n * yet, so disconnectAllTransports did not trigger a disconnected state */\n this.startConnect();\n } else {\n this.requestState({ state: 'connecting' });\n }\n }\n }\n }\n\n disconnectAllTransports(): void {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MINOR,\n 'ConnectionManager.disconnectAllTransports()',\n 'Disconnecting all transports',\n );\n\n /* This will prevent any connection procedure in an async part of one of its early stages from continuing */\n this.connectCounter++;\n\n if (this.pendingTransport) {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.disconnectAllTransports()',\n 'Disconnecting pending transport: ' + this.pendingTransport,\n );\n this.pendingTransport.disconnect();\n }\n delete this.pendingTransport;\n\n if (this.proposedTransport) {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.disconnectAllTransports()',\n 'Disconnecting proposed transport: ' + this.pendingTransport,\n );\n this.proposedTransport.disconnect();\n }\n delete this.pendingTransport;\n\n if (this.activeProtocol) {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.disconnectAllTransports()',\n 'Disconnecting active transport: ' + this.activeProtocol.getTransport(),\n );\n this.activeProtocol.getTransport().disconnect();\n }\n /* No need to notify state disconnected; disconnecting the active transport\n * will have that effect */\n }\n\n /******************\n * event queueing\n ******************/\n\n send(msg: ProtocolMessage, queueEvent?: boolean, callback?: PublishCallback): void {\n callback = callback || noop;\n const state = this.state;\n\n if (state.sendEvents) {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.send()', 'sending event');\n this.sendImpl(new PendingMessage(msg, callback));\n return;\n }\n const shouldQueue = queueEvent && state.queueEvents;\n if (!shouldQueue) {\n const err = 'rejecting event, queueEvent was ' + queueEvent + ', state was ' + state.state;\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.send()', err);\n callback(this.errorReason || new ErrorInfo(err, 90000, 400));\n return;\n }\n if (this.logger.shouldLog(Logger.LOG_MICRO)) {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.send()',\n 'queueing msg; ' +\n stringifyProtocolMessage(\n msg,\n this.realtime._RealtimePresence,\n this.realtime._Annotations,\n this.realtime._liveObjectsPlugin,\n ),\n );\n }\n this.queue(msg, callback);\n }\n\n sendImpl(pendingMessage: PendingMessage): void {\n const msg = pendingMessage.message;\n /* If have already attempted to send this, resend with the same msgSerial,\n * so Ably can dedup if the previous send succeeded */\n if (pendingMessage.ackRequired && !pendingMessage.sendAttempted) {\n msg.msgSerial = this.msgSerial++;\n }\n try {\n (this.activeProtocol as Protocol).send(pendingMessage);\n } catch (e) {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_ERROR,\n 'ConnectionManager.sendImpl()',\n 'Unexpected exception in transport.send(): ' + (e as Error).stack,\n );\n }\n }\n\n queue(msg: ProtocolMessage, callback: PublishCallback): void {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.queue()', 'queueing event');\n this.queuedMessages.push(new PendingMessage(msg, callback));\n }\n\n sendQueuedMessages(): void {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.sendQueuedMessages()',\n 'sending ' + this.queuedMessages.count() + ' queued messages',\n );\n let pendingMessage;\n while ((pendingMessage = this.queuedMessages.shift())) this.sendImpl(pendingMessage);\n }\n\n queuePendingMessages(pendingMessages: Array<PendingMessage>): void {\n if (pendingMessages && pendingMessages.length) {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_MICRO,\n 'ConnectionManager.queuePendingMessages()',\n 'queueing ' + pendingMessages.length + ' pending messages',\n );\n this.queuedMessages.prepend(pendingMessages);\n }\n }\n\n failQueuedMessages(err: ErrorInfo): void {\n const numQueued = this.queuedMessages.count();\n if (numQueued > 0) {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_ERROR,\n 'ConnectionManager.failQueuedMessages()',\n 'failing ' + numQueued + ' queued messages, err = ' + Utils.inspectError(err),\n );\n this.queuedMessages.completeAllMessages(err);\n }\n }\n\n onChannelMessage(message: ProtocolMessage, transport: Transport): void {\n this.pendingChannelMessagesState.queue.push({ message, transport });\n\n if (!this.pendingChannelMessagesState.isProcessing) {\n this.processNextPendingChannelMessage();\n }\n }\n\n private processNextPendingChannelMessage() {\n if (this.pendingChannelMessagesState.queue.length > 0) {\n this.pendingChannelMessagesState.isProcessing = true;\n\n const pendingChannelMessage = this.pendingChannelMessagesState.queue.shift()!;\n this.processChannelMessage(pendingChannelMessage.message)\n .catch((err) => {\n Logger.logAction(\n this.logger,\n\n Logger.LOG_ERROR,\n 'ConnectionManager.processNextPendingChannelMessage() received error ',\n err,\n );\n })\n .finally(() => {\n this.pendingChannelMessagesState.isProcessing = false;\n this.processNextPendingChannelMessage();\n });\n }\n }\n\n private async processChannelMessage(message: ProtocolMessage) {\n await this.realtime.channels.processChannelMessage(message);\n }\n\n async ping(): Promise<number> {\n if (this.state.state !== 'connected') {\n throw new ErrorInfo('Unable to ping service; not connected', 40000, 400);\n }\n\n const transport = this.activeProtocol?.getTransport();\n if (!transport) {\n throw this.getStateError();\n }\n\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.ping()', 'transport = ' + transport);\n\n const pingStart = Date.now();\n const id = Utils.cheapRandStr();\n\n return Utils.withTimeoutAsync<number>(\n new Promise((resolve) => {\n const onHeartbeat = (responseId: string) => {\n if (responseId === id) {\n transport.off('heartbeat', onHeartbeat);\n resolve(Date.now() - pingStart);\n }\n };\n transport.on('heartbeat', onHeartbeat);\n transport.ping(id);\n }),\n this.options.timeouts.realtimeRequestTimeout,\n 'Timeout waiting for heartbeat response',\n );\n }\n\n abort(error: ErrorInfo): void {\n (this.activeProtocol as Protocol).getTransport().fail(error);\n }\n\n getTransportPreference(): TransportName {\n return this.transportPreference || (haveWebStorage() && Platform.WebStorage?.get?.(transportPreferenceName));\n }\n\n persistTransportPreference(transport: Transport): void {\n this.transportPreference = transport.shortName;\n if (haveWebStorage()) {\n Platform.WebStorage?.set?.(transportPreferenceName, transport.shortName);\n }\n }\n\n unpersistTransportPreference(): void {\n this.transportPreference = null;\n if (haveWebStorage()) {\n Platform.WebStorage?.remove?.(transportPreferenceName);\n }\n }\n\n /* This method is only used during connection attempts, so implements RSA4c1, RSA4c2,\n * and RSA4d. It is generally not invoked for serverside-triggered reauths or manual\n * reauths, so RSA4c3 does not apply, except (per per RSA4d1) in the case that the auth\n * server returns 403. */\n actOnErrorFromAuthorize(err: ErrorInfo): void {\n if (err.code === 40171) {\n /* No way to reauth */\n this.notifyState({ state: 'failed', error: err });\n } else if (err.code === 40102) {\n this.notifyState({ state: 'failed', error: err });\n } else if (err.statusCode === HttpStatusCodes.Forbidden) {\n const msg = 'Client configured authentication provider returned 403; failing the connection';\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.actOnErrorFromAuthorize()', msg);\n this.notifyState({ state: 'failed', error: new ErrorInfo(msg, 80019, 403, err) });\n } else {\n const msg = 'Client configured authentication provider request failed';\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.actOnErrorFromAuthorize', msg);\n this.notifyState({ state: this.state.failState as string, error: new ErrorInfo(msg, 80019, 401, err) });\n }\n }\n\n onConnectionDetailsUpdate(connectionDetails: Record<string, any>, transport: Transport): void {\n if (!connectionDetails) {\n return;\n }\n this.connectionDetails = connectionDetails;\n if (connectionDetails.maxMessageSize) {\n this.options.maxMessageSize = connectionDetails.maxMessageSize;\n }\n const clientId = connectionDetails.clientId;\n if (clientId) {\n const err = this.realtime.auth._uncheckedSetClientId(clientId);\n if (err) {\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.onConnectionDetailsUpdate()', err.message);\n /* Errors setting the clientId are fatal to the connection */\n transport.fail(err);\n return;\n }\n }\n const connectionStateTtl = connectionDetails.connectionStateTtl;\n if (connectionStateTtl) {\n this.connectionStateTtl = connectionStateTtl;\n }\n this.maxIdleInterval = connectionDetails.maxIdleInterval;\n this.emit('connectiondetails', connectionDetails);\n }\n\n checkWsConnectivity() {\n const wsConnectivityCheckUrl = this.options.wsConnectivityCheckUrl || Defaults.wsConnectivityCheckUrl;\n const ws = new Platform.Config.WebSocket(wsConnectivityCheckUrl);\n return new Promise<void>((resolve, reject) => {\n let finished = false;\n ws.onopen = () => {\n if (!finished) {\n finished = true;\n resolve();\n ws.close();\n }\n };\n\n ws.onclose = ws.onerror = () => {\n if (!finished) {\n finished = true;\n reject();\n }\n };\n });\n }\n\n sessionRecoveryName() {\n return this.options.recoveryKeyStorageName || 'ably-connection-recovery';\n }\n\n getSessionRecoverData() {\n return haveSessionStorage() && Platform.WebStorage?.getSession?.(this.sessionRecoveryName());\n }\n setSessionRecoverData(value: any) {\n return haveSessionStorage() && Platform.WebStorage?.setSession?.(this.sessionRecoveryName(), value);\n }\n clearSessionRecoverData() {\n return haveSessionStorage() && Platform.WebStorage?.removeSession?.(this.sessionRecoveryName());\n }\n}\n\nexport default ConnectionManager;\n\nexport interface TransportStorage {\n supportedTransports: Partial<Record<TransportName, TransportCtor>>;\n}\n","import EventEmitter from '../util/eventemitter';\nimport ConnectionManager from '../transport/connectionmanager';\nimport Logger from '../util/logger';\nimport ConnectionStateChange from './connectionstatechange';\nimport ErrorInfo from '../types/errorinfo';\nimport { NormalisedClientOptions } from '../../types/ClientOptions';\nimport BaseRealtime from './baserealtime';\nimport Platform from 'common/platform';\n\nclass Connection extends EventEmitter {\n ably: BaseRealtime;\n connectionManager: ConnectionManager;\n state: string;\n key?: string;\n id?: string;\n errorReason: ErrorInfo | null;\n\n constructor(ably: BaseRealtime, options: NormalisedClientOptions) {\n super(ably.logger);\n this.ably = ably;\n this.connectionManager = new ConnectionManager(ably, options);\n this.state = this.connectionManager.state.state;\n this.key = undefined;\n this.id = undefined;\n this.errorReason = null;\n\n this.connectionManager.on('connectionstate', (stateChange: ConnectionStateChange) => {\n const state = (this.state = stateChange.current as string);\n Platform.Config.nextTick(() => {\n this.emit(state, stateChange);\n });\n });\n this.connectionManager.on('update', (stateChange: ConnectionStateChange) => {\n Platform.Config.nextTick(() => {\n this.emit('update', stateChange);\n });\n });\n }\n\n whenState = ((state: string) => {\n return EventEmitter.prototype.whenState.call(this, state, this.state);\n }) as any;\n\n connect(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Connection.connect()', '');\n this.connectionManager.requestState({ state: 'connecting' });\n }\n\n async ping(): Promise<number> {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Connection.ping()', '');\n return this.connectionManager.ping();\n }\n\n close(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Connection.close()', 'connectionKey = ' + this.key);\n this.connectionManager.requestState({ state: 'closing' });\n }\n\n get recoveryKey(): string | null {\n this.logger.deprecationWarning(\n 'The `Connection.recoveryKey` attribute has been replaced by the `Connection.createRecoveryKey()` method. Replace your usage of `recoveryKey` with the return value of `createRecoveryKey()`. `recoveryKey` will be removed in a future version.',\n );\n return this.createRecoveryKey();\n }\n\n createRecoveryKey(): string | null {\n return this.connectionManager.createRecoveryKey();\n }\n}\n\nexport default Connection;\n","import * as Utils from '../util/utils';\r\nimport BaseClient from './baseclient';\r\nimport EventEmitter from '../util/eventemitter';\r\nimport Logger from '../util/logger';\r\nimport Connection from './connection';\r\nimport RealtimeChannel from './realtimechannel';\r\nimport ErrorInfo from '../types/errorinfo';\r\nimport ProtocolMessage from '../types/protocolmessage';\r\nimport { ChannelOptions } from '../../types/channel';\r\nimport ClientOptions from '../../types/ClientOptions';\r\nimport * as API from '../../../../ably';\r\nimport { ModularPlugins, RealtimePresencePlugin } from './modularplugins';\r\nimport { TransportNames } from 'common/constants/TransportName';\r\nimport { TransportImplementations } from 'common/platform';\r\nimport Defaults from '../util/defaults';\r\n\r\n/**\r\n `BaseRealtime` is an export of the tree-shakable version of the SDK, and acts as the base class for the `DefaultRealtime` class exported by the non tree-shakable version.\r\n */\r\nclass BaseRealtime extends BaseClient {\r\n readonly _RealtimePresence: RealtimePresencePlugin | null;\r\n // Extra transport implementations available to this client, in addition to those in Platform.Transports.bundledImplementations\r\n readonly _additionalTransportImplementations: TransportImplementations;\r\n _channels: any;\r\n connection: Connection;\r\n\r\n // internal API to make EventEmitter usable in other SDKs\r\n static readonly EventEmitter = EventEmitter;\r\n\r\n /*\r\n * The public typings declare that this only accepts an object, but since we want to emit a good error message in the case where a non-TypeScript user does one of these things:\r\n *\r\n * 1. passes a string (which is quite likely if they’re e.g. migrating from the default variant to the modular variant)\r\n * 2. passes no argument at all\r\n *\r\n * tell the compiler that these cases are possible so that it forces us to handle them.\r\n */\r\n constructor(options?: ClientOptions | string) {\r\n super(Defaults.objectifyOptions(options, false, 'BaseRealtime', Logger.defaultLogger));\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime()', '');\r\n\r\n // currently we cannot support using Ably.Realtime instances in Vercel Edge runtime.\r\n // this error can be removed after fixing https://github.com/ably/ably-js/issues/1731,\r\n // and https://github.com/ably/ably-js/issues/1732\r\n // @ts-ignore\r\n if (typeof EdgeRuntime === 'string') {\r\n throw new ErrorInfo(\r\n `Ably.Realtime instance cannot be used in Vercel Edge runtime.` +\r\n ` If you are running Vercel Edge functions, please replace your` +\r\n ` \"new Ably.Realtime()\" with \"new Ably.Rest()\" and use Ably Rest API` +\r\n ` instead of the Realtime API. If you are server-rendering your application` +\r\n ` in the Vercel Edge runtime, please use the condition \"if (typeof EdgeRuntime === 'string')\"` +\r\n ` to prevent instantiating Ably.Realtime instance during SSR in the Vercel Edge runtime.`,\r\n 40000,\r\n 400,\r\n );\r\n }\r\n\r\n this._additionalTransportImplementations = BaseRealtime.transportImplementationsFromPlugins(this.options.plugins);\r\n this._RealtimePresence = this.options.plugins?.RealtimePresence ?? null;\r\n this.connection = new Connection(this, this.options);\r\n this._channels = new Channels(this);\r\n if (this.options.autoConnect !== false) this.connect();\r\n }\r\n\r\n private static transportImplementationsFromPlugins(plugins?: ModularPlugins) {\r\n const transports: TransportImplementations = {};\r\n\r\n if (plugins?.WebSocketTransport) {\r\n transports[TransportNames.WebSocket] = plugins.WebSocketTransport;\r\n }\r\n if (plugins?.XHRPolling) {\r\n transports[TransportNames.XhrPolling] = plugins.XHRPolling;\r\n }\r\n\r\n return transports;\r\n }\r\n\r\n get channels() {\r\n return this._channels;\r\n }\r\n\r\n get clientId() {\r\n //RTC17\r\n return this.auth.clientId;\r\n }\r\n\r\n connect(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime.connect()', '');\r\n this.connection.connect();\r\n }\r\n\r\n close(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime.close()', '');\r\n this.connection.close();\r\n }\r\n}\r\n\r\nclass Channels extends EventEmitter {\r\n realtime: BaseRealtime;\r\n // RSN2\r\n all: Record<string, RealtimeChannel>;\r\n\r\n constructor(realtime: BaseRealtime) {\r\n super(realtime.logger);\r\n this.realtime = realtime;\r\n this.all = Object.create(null);\r\n realtime.connection.connectionManager.on('transport.active', () => {\r\n this.onTransportActive();\r\n });\r\n }\r\n\r\n channelSerials(): { [name: string]: string } {\r\n let serials: { [name: string]: string } = {};\r\n for (const name of Utils.keysArray(this.all, true)) {\r\n const channel = this.all[name];\r\n if (channel.properties.channelSerial) {\r\n serials[name] = channel.properties.channelSerial;\r\n }\r\n }\r\n return serials;\r\n }\r\n\r\n // recoverChannels gets the given channels and sets their channel serials.\r\n recoverChannels(channelSerials: { [name: string]: string }) {\r\n for (const name of Utils.keysArray(channelSerials, true)) {\r\n const channel = this.get(name);\r\n channel.properties.channelSerial = channelSerials[name];\r\n }\r\n }\r\n\r\n // Access to this method is synchronised by ConnectionManager#processChannelMessage.\r\n async processChannelMessage(msg: ProtocolMessage) {\r\n const channelName = msg.channel;\r\n if (channelName === undefined) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_ERROR,\r\n 'Channels.processChannelMessage()',\r\n 'received event unspecified channel, action = ' + msg.action,\r\n );\r\n return;\r\n }\r\n const channel = this.all[channelName];\r\n if (!channel) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_ERROR,\r\n 'Channels.processChannelMessage()',\r\n 'received event for non-existent channel: ' + channelName,\r\n );\r\n return;\r\n }\r\n await channel.processMessage(msg);\r\n }\r\n\r\n /* called when a transport becomes connected; reattempt attach/detach\r\n * for channels that are attaching or detaching. */\r\n onTransportActive() {\r\n for (const channelName in this.all) {\r\n const channel = this.all[channelName];\r\n if (channel.state === 'attaching' || channel.state === 'detaching') {\r\n channel.checkPendingState();\r\n } else if (channel.state === 'suspended') {\r\n channel._attach(false, null);\r\n } else if (channel.state === 'attached') {\r\n // Note explicity request the state, channel.attach() would do nothing\r\n // as its already attached.\r\n channel.requestState('attaching');\r\n }\r\n }\r\n }\r\n\r\n /* Connection interruptions (ie when the connection will no longer queue\r\n * events) imply connection state changes for any channel which is either\r\n * attached, pending, or will attempt to become attached in the future */\r\n propogateConnectionInterruption(connectionState: string, reason: ErrorInfo) {\r\n const connectionStateToChannelState: Record<string, API.ChannelState> = {\r\n closing: 'detached',\r\n closed: 'detached',\r\n failed: 'failed',\r\n suspended: 'suspended',\r\n };\r\n const fromChannelStates = ['attaching', 'attached', 'detaching', 'suspended'];\r\n const toChannelState = connectionStateToChannelState[connectionState];\r\n\r\n for (const channelId in this.all) {\r\n const channel = this.all[channelId];\r\n if (fromChannelStates.includes(channel.state)) {\r\n channel.notifyState(toChannelState, reason);\r\n }\r\n }\r\n }\r\n\r\n get(name: string, channelOptions?: ChannelOptions) {\r\n name = String(name);\r\n let channel = this.all[name];\r\n if (!channel) {\r\n channel = this.all[name] = new RealtimeChannel(this.realtime, name, channelOptions);\r\n } else if (channelOptions) {\r\n if (channel._shouldReattachToSetOptions(channelOptions, channel.channelOptions)) {\r\n throw new ErrorInfo(\r\n 'Channels.get() cannot be used to set channel options that would cause the channel to reattach. Please, use RealtimeChannel.setOptions() instead.',\r\n 40000,\r\n 400,\r\n );\r\n }\r\n channel.setOptions(channelOptions);\r\n }\r\n return channel;\r\n }\r\n\r\n getDerived(name: string, deriveOptions: API.DeriveOptions, channelOptions?: ChannelOptions) {\r\n if (deriveOptions.filter) {\r\n const filter = Utils.toBase64(deriveOptions.filter);\r\n const match = Utils.matchDerivedChannel(name);\r\n name = `[filter=${filter}${match.qualifierParam}]${match.channelName}`;\r\n }\r\n return this.get(name, channelOptions);\r\n }\r\n\r\n /* Included to support certain niche use-cases; most users should ignore this.\r\n * Please do not use this unless you know what you're doing */\r\n release(name: string) {\r\n name = String(name);\r\n const channel = this.all[name];\r\n if (!channel) {\r\n return;\r\n }\r\n const releaseErr = channel.getReleaseErr();\r\n if (releaseErr) {\r\n throw releaseErr;\r\n }\r\n delete this.all[name];\r\n }\r\n}\r\n\r\nexport default BaseRealtime;\r\n","import * as Utils from '../util/utils';\nimport EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport PresenceMessage from '../types/presencemessage';\n\nimport type RealtimePresence from './realtimepresence';\n\ntype compFn = (item: PresenceMessage, existing: PresenceMessage) => boolean;\n\nexport interface RealtimePresenceParams {\n waitForSync?: boolean;\n clientId?: string;\n connectionId?: string;\n}\n\nfunction newerThan(item: PresenceMessage, existing: PresenceMessage): boolean {\n /* RTP2b1: if either is synthesised, compare by timestamp */\n if (item.isSynthesized() || existing.isSynthesized()) {\n // RTP2b1a: if equal, prefer the newly-arrived one\n return (item.timestamp as number) >= (existing.timestamp as number);\n }\n\n /* RTP2b2 */\n const itemOrderings = item.parseId(),\n existingOrderings = existing.parseId();\n if (itemOrderings.msgSerial === existingOrderings.msgSerial) {\n return itemOrderings.index > existingOrderings.index;\n } else {\n return itemOrderings.msgSerial > existingOrderings.msgSerial;\n }\n}\n\nexport class PresenceMap extends EventEmitter {\n map: Record<string, PresenceMessage>;\n residualMembers: Record<string, PresenceMessage> | null;\n syncInProgress: boolean;\n presence: RealtimePresence;\n memberKey: (item: PresenceMessage) => string;\n newerThan: compFn;\n\n constructor(presence: RealtimePresence, memberKey: (item: PresenceMessage) => string, newer: compFn = newerThan) {\n super(presence.logger);\n this.presence = presence;\n this.map = Object.create(null);\n this.syncInProgress = false;\n this.residualMembers = null;\n this.memberKey = memberKey;\n this.newerThan = newer;\n }\n\n get(key: string) {\n return this.map[key];\n }\n\n getClient(clientId: string) {\n const map = this.map,\n result = [];\n for (const key in map) {\n const item = map[key];\n if (item.clientId == clientId && item.action != 'absent') result.push(item);\n }\n return result;\n }\n\n list(params: RealtimePresenceParams) {\n const map = this.map,\n clientId = params && params.clientId,\n connectionId = params && params.connectionId,\n result = [];\n\n for (const key in map) {\n const item = map[key];\n if (item.action === 'absent') continue;\n if (clientId && clientId != item.clientId) continue;\n if (connectionId && connectionId != item.connectionId) continue;\n result.push(item);\n }\n return result;\n }\n\n put(item: PresenceMessage) {\n if (item.action === 'enter' || item.action === 'update') {\n item = PresenceMessage.fromValues(item);\n item.action = 'present';\n }\n const map = this.map,\n key = this.memberKey(item);\n /* we've seen this member, so do not remove it at the end of sync */\n if (this.residualMembers) delete this.residualMembers[key];\n\n /* compare the timestamp of the new item with any existing member (or ABSENT witness) */\n const existingItem = map[key];\n if (existingItem && !this.newerThan(item, existingItem)) {\n return false;\n }\n map[key] = item;\n return true;\n }\n\n values() {\n const map = this.map,\n result = [];\n for (const key in map) {\n const item = map[key];\n if (item.action != 'absent') result.push(item);\n }\n return result;\n }\n\n remove(item: PresenceMessage) {\n const map = this.map,\n key = this.memberKey(item);\n const existingItem = map[key];\n\n if (existingItem && !this.newerThan(item, existingItem)) {\n return false;\n }\n\n /* RTP2f */\n if (this.syncInProgress) {\n item = PresenceMessage.fromValues(item);\n item.action = 'absent';\n map[key] = item;\n } else {\n delete map[key];\n }\n\n return !!existingItem;\n }\n\n startSync() {\n const map = this.map,\n syncInProgress = this.syncInProgress;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'PresenceMap.startSync()',\n 'channel = ' + this.presence.channel.name + '; syncInProgress = ' + syncInProgress,\n );\n /* we might be called multiple times while a sync is in progress */\n if (!this.syncInProgress) {\n this.residualMembers = Utils.copy(map);\n this.setInProgress(true);\n }\n }\n\n endSync() {\n const map = this.map,\n syncInProgress = this.syncInProgress;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'PresenceMap.endSync()',\n 'channel = ' + this.presence.channel.name + '; syncInProgress = ' + syncInProgress,\n );\n if (syncInProgress) {\n /* we can now strip out the ABSENT members, as we have\n * received all of the out-of-order sync messages */\n for (const memberKey in map) {\n const entry = map[memberKey];\n if (entry.action === 'absent') {\n delete map[memberKey];\n }\n }\n /* any members that were present at the start of the sync,\n * and have not been seen in sync, can be removed, and leave events emitted */\n this.presence._synthesizeLeaves(Utils.valuesArray(this.residualMembers as Record<string, PresenceMessage>));\n for (const memberKey in this.residualMembers) {\n delete map[memberKey];\n }\n this.residualMembers = null;\n\n /* finish, notifying any waiters */\n this.setInProgress(false);\n }\n this.emit('sync');\n }\n\n async waitSync(): Promise<void> {\n const syncInProgress = this.syncInProgress;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'PresenceMap.waitSync()',\n 'channel = ' + this.presence.channel.name + '; syncInProgress = ' + syncInProgress,\n );\n if (!syncInProgress) {\n return;\n }\n\n await this.once('sync');\n }\n\n clear() {\n this.map = {};\n this.setInProgress(false);\n this.residualMembers = null;\n }\n\n setInProgress(inProgress: boolean) {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'PresenceMap.setInProgress()', 'inProgress = ' + inProgress);\n this.syncInProgress = inProgress;\n this.presence.syncComplete = !inProgress;\n }\n}\n","import * as Utils from '../util/utils';\nimport EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport PresenceMessage, { WirePresenceMessage } from '../types/presencemessage';\nimport type { CipherOptions } from '../types/basemessage';\nimport ErrorInfo, { PartialErrorInfo } from '../types/errorinfo';\nimport RealtimeChannel from './realtimechannel';\nimport Multicaster from '../util/multicaster';\nimport ChannelStateChange from './channelstatechange';\nimport { ErrCallback } from '../../types/utils';\nimport { PaginatedResult } from './paginatedresource';\nimport { PresenceMap, RealtimePresenceParams } from './presencemap';\n\ninterface RealtimeHistoryParams {\n start?: number;\n end?: number;\n direction?: string;\n limit?: number;\n untilAttach?: boolean;\n from_serial?: string | null;\n}\n\nfunction getClientId(realtimePresence: RealtimePresence) {\n return realtimePresence.channel.client.auth.clientId;\n}\n\nfunction isAnonymousOrWildcard(realtimePresence: RealtimePresence) {\n const realtime = realtimePresence.channel.client;\n /* If not currently connected, we can't assume that we're an anonymous\n * client, as realtime may inform us of our clientId in the CONNECTED\n * message. So assume we're not anonymous and leave it to realtime to\n * return an error if we are */\n const clientId = realtime.auth.clientId;\n return (!clientId || clientId === '*') && realtime.connection.state === 'connected';\n}\n\nclass RealtimePresence extends EventEmitter {\n channel: RealtimeChannel;\n pendingPresence: { presence: WirePresenceMessage; callback: ErrCallback }[];\n syncComplete: boolean;\n members: PresenceMap;\n _myMembers: PresenceMap;\n subscriptions: EventEmitter;\n name?: string;\n\n constructor(channel: RealtimeChannel) {\n super(channel.logger);\n this.channel = channel;\n this.syncComplete = false;\n this.members = new PresenceMap(this, (item) => item.clientId + ':' + item.connectionId);\n // RTP17h: Store own members by clientId only.\n this._myMembers = new PresenceMap(this, (item) => item.clientId!);\n this.subscriptions = new EventEmitter(this.logger);\n this.pendingPresence = [];\n }\n\n async enter(data: unknown): Promise<void> {\n if (isAnonymousOrWildcard(this)) {\n throw new ErrorInfo('clientId must be specified to enter a presence channel', 40012, 400);\n }\n return this._enterOrUpdateClient(undefined, undefined, data, 'enter');\n }\n\n async update(data: unknown): Promise<void> {\n if (isAnonymousOrWildcard(this)) {\n throw new ErrorInfo('clientId must be specified to update presence data', 40012, 400);\n }\n return this._enterOrUpdateClient(undefined, undefined, data, 'update');\n }\n\n async enterClient(clientId: string, data: unknown): Promise<void> {\n return this._enterOrUpdateClient(undefined, clientId, data, 'enter');\n }\n\n async updateClient(clientId: string, data: unknown): Promise<void> {\n return this._enterOrUpdateClient(undefined, clientId, data, 'update');\n }\n\n async _enterOrUpdateClient(\n id: string | undefined,\n clientId: string | undefined,\n data: unknown,\n action: string,\n ): Promise<void> {\n const channel = this.channel;\n if (!channel.connectionManager.activeState()) {\n throw channel.connectionManager.getError();\n }\n\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimePresence.' + action + 'Client()',\n 'channel = ' + channel.name + ', id = ' + id + ', client = ' + (clientId || '(implicit) ' + getClientId(this)),\n );\n\n const presence = PresenceMessage.fromData(data);\n presence.action = action;\n if (id) {\n presence.id = id;\n }\n if (clientId) {\n presence.clientId = clientId;\n }\n const wirePresMsg = await presence.encode(channel.channelOptions as CipherOptions);\n\n switch (channel.state) {\n case 'attached':\n return channel.sendPresence([wirePresMsg]);\n case 'initialized':\n case 'detached':\n channel.attach();\n // eslint-disable-next-line no-fallthrough\n case 'attaching':\n return new Promise((resolve, reject) => {\n this.pendingPresence.push({\n presence: wirePresMsg,\n callback: (err) => (err ? reject(err) : resolve()),\n });\n });\n default: {\n const err = new PartialErrorInfo(\n 'Unable to ' + action + ' presence channel while in ' + channel.state + ' state',\n 90001,\n );\n err.code = 90001;\n throw err;\n }\n }\n }\n\n async leave(data: unknown): Promise<void> {\n if (isAnonymousOrWildcard(this)) {\n throw new ErrorInfo('clientId must have been specified to enter or leave a presence channel', 40012, 400);\n }\n return this.leaveClient(undefined, data);\n }\n\n async leaveClient(clientId?: string, data?: unknown): Promise<void> {\n const channel = this.channel;\n if (!channel.connectionManager.activeState()) {\n throw channel.connectionManager.getError();\n }\n\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimePresence.leaveClient()',\n 'leaving; channel = ' + this.channel.name + ', client = ' + clientId,\n );\n const presence = PresenceMessage.fromData(data);\n presence.action = 'leave';\n if (clientId) {\n presence.clientId = clientId;\n }\n const wirePresMsg = await presence.encode(channel.channelOptions as CipherOptions);\n\n switch (channel.state) {\n case 'attached':\n return channel.sendPresence([wirePresMsg]);\n case 'attaching':\n return new Promise((resolve, reject) => {\n this.pendingPresence.push({\n presence: wirePresMsg,\n callback: (err) => (err ? reject(err) : resolve()),\n });\n });\n case 'initialized':\n case 'failed': {\n /* we're not attached; therefore we let any entered status\n * timeout by itself instead of attaching just in order to leave */\n throw new PartialErrorInfo('Unable to leave presence channel (incompatible state)', 90001);\n }\n default:\n throw channel.invalidStateError();\n }\n }\n\n async get(params?: RealtimePresenceParams): Promise<PresenceMessage[]> {\n const waitForSync = !params || ('waitForSync' in params ? params.waitForSync : true);\n\n function toMessages(members: PresenceMap): PresenceMessage[] {\n return params ? members.list(params) : members.values();\n }\n\n /* Special-case the suspended state: can still get (stale) presence set if waitForSync is false */\n if (this.channel.state === 'suspended') {\n if (waitForSync) {\n throw ErrorInfo.fromValues({\n statusCode: 400,\n code: 91005,\n message: 'Presence state is out of sync due to channel being in the SUSPENDED state',\n });\n }\n return toMessages(this.members);\n }\n\n await this.channel.ensureAttached();\n const members = this.members;\n if (waitForSync) {\n await members.waitSync();\n }\n\n return toMessages(this.members);\n }\n\n async history(params: RealtimeHistoryParams | null): Promise<PaginatedResult<PresenceMessage>> {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimePresence.history()', 'channel = ' + this.name);\n // We fetch this first so that any plugin-not-provided error takes priority over other errors\n const restMixin = this.channel.client.rest.presenceMixin;\n\n if (params && params.untilAttach) {\n if (this.channel.state === 'attached') {\n delete params.untilAttach;\n params.from_serial = this.channel.properties.attachSerial;\n } else {\n throw new ErrorInfo(\n 'option untilAttach requires the channel to be attached, was: ' + this.channel.state,\n 40000,\n 400,\n );\n }\n }\n\n return restMixin.history(this, params);\n }\n\n setPresence(presenceSet: PresenceMessage[], isSync: boolean, syncChannelSerial?: string): void {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimePresence.setPresence()',\n 'received presence for ' + presenceSet.length + ' participants; syncChannelSerial = ' + syncChannelSerial,\n );\n let syncCursor, match;\n const members = this.members,\n myMembers = this._myMembers,\n broadcastMessages = [],\n connId = this.channel.connectionManager.connectionId;\n\n if (isSync) {\n this.members.startSync();\n if (syncChannelSerial && (match = syncChannelSerial.match(/^[\\w-]+:(.*)$/))) {\n syncCursor = match[1];\n }\n }\n\n for (let presence of presenceSet) {\n switch (presence.action) {\n case 'leave':\n if (members.remove(presence)) {\n broadcastMessages.push(presence);\n }\n if (presence.connectionId === connId && !presence.isSynthesized()) {\n myMembers.remove(presence);\n }\n break;\n case 'enter':\n case 'present':\n case 'update':\n if (members.put(presence)) {\n broadcastMessages.push(presence);\n }\n if (presence.connectionId === connId) {\n myMembers.put(presence);\n }\n break;\n }\n }\n /* if this is the last (or only) message in a sequence of sync updates, end the sync */\n if (isSync && !syncCursor) {\n members.endSync();\n this.channel.syncChannelSerial = null;\n }\n\n /* broadcast to listeners */\n for (let i = 0; i < broadcastMessages.length; i++) {\n const presence = broadcastMessages[i];\n this.subscriptions.emit(presence.action!, presence);\n }\n }\n\n onAttached(hasPresence?: boolean): void {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'RealtimePresence.onAttached()',\n 'channel = ' + this.channel.name + ', hasPresence = ' + hasPresence,\n );\n\n if (hasPresence) {\n this.members.startSync();\n } else {\n this._synthesizeLeaves(this.members.values());\n this.members.clear();\n }\n\n // RTP17i: Re-enter own members when moving into the attached state.\n this._ensureMyMembersPresent();\n\n /* NB this must be after the _ensureMyMembersPresent call, which may add items to pendingPresence */\n const pendingPresence = this.pendingPresence,\n pendingPresCount = pendingPresence.length;\n\n if (pendingPresCount) {\n this.pendingPresence = [];\n const presenceArray = [];\n const multicaster = Multicaster.create(this.logger);\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimePresence.onAttached',\n 'sending ' + pendingPresCount + ' queued presence messages',\n );\n for (let i = 0; i < pendingPresCount; i++) {\n const event = pendingPresence[i];\n presenceArray.push(event.presence);\n multicaster.push(event.callback);\n }\n this.channel\n .sendPresence(presenceArray)\n .then(() => multicaster())\n .catch((err: ErrorInfo) => multicaster(err));\n }\n }\n\n actOnChannelState(state: string, hasPresence?: boolean, err?: ErrorInfo | null): void {\n switch (state) {\n case 'attached':\n this.onAttached(hasPresence);\n break;\n case 'detached':\n case 'failed':\n this._clearMyMembers();\n this.members.clear();\n /* falls through */\n case 'suspended':\n this.failPendingPresence(err);\n break;\n }\n }\n\n failPendingPresence(err?: ErrorInfo | null): void {\n if (this.pendingPresence.length) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'RealtimeChannel.failPendingPresence',\n 'channel; name = ' + this.channel.name + ', err = ' + Utils.inspectError(err),\n );\n for (let i = 0; i < this.pendingPresence.length; i++)\n try {\n this.pendingPresence[i].callback(err);\n // eslint-disable-next-line no-empty\n } catch (e) {}\n this.pendingPresence = [];\n }\n }\n\n _clearMyMembers(): void {\n this._myMembers.clear();\n }\n\n _ensureMyMembersPresent(): void {\n const myMembers = this._myMembers;\n const connId = this.channel.connectionManager.connectionId;\n\n for (const memberKey in myMembers.map) {\n const entry = myMembers.map[memberKey];\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimePresence._ensureMyMembersPresent()',\n 'Auto-reentering clientId \"' + entry.clientId + '\" into the presence set',\n );\n // RTP17g: Send ENTER containing the member id, clientId and data\n // attributes.\n // RTP17g1: suppress id if the connId has changed\n const id = entry.connectionId === connId ? entry.id : undefined;\n this._enterOrUpdateClient(id, entry.clientId, entry.data, 'enter').catch((err) => {\n const wrappedErr = new ErrorInfo('Presence auto re-enter failed', 91004, 400, err);\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'RealtimePresence._ensureMyMembersPresent()',\n 'Presence auto re-enter failed; reason = ' + Utils.inspectError(err),\n );\n // RTP17e\n const change = new ChannelStateChange(this.channel.state, this.channel.state, true, false, wrappedErr);\n this.channel.emit('update', change);\n });\n }\n }\n\n _synthesizeLeaves(items: PresenceMessage[]): void {\n const subscriptions = this.subscriptions;\n items.forEach(function (item) {\n const presence = PresenceMessage.fromValues({\n action: 'leave',\n connectionId: item.connectionId,\n clientId: item.clientId,\n data: item.data,\n encoding: item.encoding,\n timestamp: Date.now(),\n });\n subscriptions.emit('leave', presence);\n });\n }\n\n async subscribe(..._args: unknown[] /* [event], listener */): Promise<void> {\n const args = RealtimeChannel.processListenerArgs(_args);\n const event = args[0];\n const listener = args[1];\n const channel = this.channel;\n\n if (channel.state === 'failed') {\n throw ErrorInfo.fromValues(channel.invalidStateError());\n }\n\n this.subscriptions.on(event, listener);\n\n // (RTP6d)\n if (channel.channelOptions.attachOnSubscribe !== false) {\n await channel.attach();\n }\n }\n\n unsubscribe(..._args: unknown[] /* [event], listener */): void {\n const args = RealtimeChannel.processListenerArgs(_args);\n const event = args[0];\n const listener = args[1];\n this.subscriptions.off(event, listener);\n }\n}\n\nexport default RealtimePresence;\n","import Platform from 'common/platform';\nimport * as Utils from '../util/utils';\nimport Transport from './transport';\nimport Defaults from '../util/defaults';\nimport Logger from '../util/logger';\nimport ProtocolMessage, {\n serialize as serializeProtocolMessage,\n deserialize as deserializeProtocolMessage,\n} from '../types/protocolmessage';\nimport ErrorInfo from '../types/errorinfo';\nimport NodeWebSocket from 'ws';\nimport ConnectionManager, { TransportParams } from './connectionmanager';\nimport Auth from '../client/auth';\nimport { TransportNames } from 'common/constants/TransportName';\n\nconst shortName = TransportNames.WebSocket;\n\nfunction isNodeWebSocket(ws: WebSocket | NodeWebSocket): ws is NodeWebSocket {\n return !!(ws as NodeWebSocket).on;\n}\n\nclass WebSocketTransport extends Transport {\n shortName = shortName;\n wsHost: string;\n uri?: string;\n wsConnection?: WebSocket | NodeWebSocket;\n\n constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams) {\n super(connectionManager, auth, params);\n /* If is a browser, can't detect pings, so request protocol heartbeats */\n params.heartbeats = Platform.Config.useProtocolHeartbeats;\n this.wsHost = params.host as string;\n }\n\n static isAvailable() {\n return !!Platform.Config.WebSocket;\n }\n\n createWebSocket(uri: string, connectParams: Record<string, string>) {\n this.uri = uri + Utils.toQueryString(connectParams);\n return new Platform.Config.WebSocket(this.uri);\n }\n\n toString() {\n return 'WebSocketTransport; uri=' + this.uri;\n }\n\n connect() {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.connect()', 'starting');\n Transport.prototype.connect.call(this);\n const self = this,\n params = this.params,\n options = params.options;\n const wsScheme = options.tls ? 'wss://' : 'ws://';\n const wsUri = wsScheme + this.wsHost + ':' + Defaults.getPort(options) + '/';\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.connect()', 'uri: ' + wsUri);\n Utils.whenPromiseSettles(\n this.auth.getAuthParams(),\n function (err: ErrorInfo | null, authParams?: Record<string, string>) {\n if (self.isDisposed) {\n return;\n }\n let paramStr = '';\n for (const param in authParams) paramStr += ' ' + param + ': ' + authParams[param] + ';';\n Logger.logAction(\n self.logger,\n Logger.LOG_MINOR,\n 'WebSocketTransport.connect()',\n 'authParams:' + paramStr + ' err: ' + err,\n );\n if (err) {\n self.disconnect(err);\n return;\n }\n const connectParams = params.getConnectParams(authParams!);\n try {\n const wsConnection = (self.wsConnection = self.createWebSocket(wsUri, connectParams));\n wsConnection.binaryType = Platform.Config.binaryType;\n wsConnection.onopen = function () {\n self.onWsOpen();\n };\n wsConnection.onclose = function (ev: CloseEvent) {\n self.onWsClose(ev);\n };\n wsConnection.onmessage = function (ev: MessageEvent) {\n self.onWsData(ev.data);\n };\n wsConnection.onerror = function (ev: Event) {\n self.onWsError(ev as ErrorEvent);\n };\n if (isNodeWebSocket(wsConnection)) {\n /* node; browsers currently don't have a general eventemitter and can't detect\n * pings. Also, no need to reply with a pong explicitly, ws lib handles that */\n wsConnection.on('ping', function () {\n self.onActivity();\n });\n }\n } catch (e) {\n Logger.logAction(\n self.logger,\n Logger.LOG_ERROR,\n 'WebSocketTransport.connect()',\n 'Unexpected exception creating websocket: err = ' + ((e as Error).stack || (e as Error).message),\n );\n self.disconnect(e as Error);\n }\n },\n );\n }\n\n send(message: ProtocolMessage) {\n const wsConnection = this.wsConnection;\n if (!wsConnection) {\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'WebSocketTransport.send()', 'No socket connection');\n return;\n }\n try {\n (wsConnection as NodeWebSocket).send(\n serializeProtocolMessage(message, this.connectionManager.realtime._MsgPack, this.params.format),\n );\n } catch (e) {\n const msg = 'Exception from ws connection when trying to send: ' + Utils.inspectError(e);\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'WebSocketTransport.send()', msg);\n /* Don't try to request a disconnect, that'll just involve sending data\n * down the websocket again. Just finish the transport. */\n this.finish('disconnected', new ErrorInfo(msg, 50000, 500));\n }\n }\n\n onWsData(data: string) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'WebSocketTransport.onWsData()',\n 'data received; length = ' + data.length + '; type = ' + typeof data,\n );\n try {\n this.onProtocolMessage(\n deserializeProtocolMessage(\n data,\n this.connectionManager.realtime._MsgPack,\n this.connectionManager.realtime._RealtimePresence,\n this.connectionManager.realtime._Annotations,\n this.connectionManager.realtime._liveObjectsPlugin,\n this.format,\n ),\n );\n } catch (e) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'WebSocketTransport.onWsData()',\n 'Unexpected exception handing channel message: ' + (e as Error).stack,\n );\n }\n }\n\n onWsOpen() {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.onWsOpen()', 'opened WebSocket');\n this.emit('preconnect');\n }\n\n onWsClose(ev: number | CloseEvent) {\n let wasClean, code;\n if (typeof ev == 'object') {\n /* W3C spec-compatible */\n code = ev.code;\n // ev.wasClean is undefined in reactnative\n wasClean = ev.wasClean || code === 1000;\n } /*if(typeof(ev) == 'number')*/ else {\n /* ws in node */\n code = ev;\n wasClean = code == 1000;\n }\n delete this.wsConnection;\n if (wasClean) {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.onWsClose()', 'Cleanly closed WebSocket');\n const err = new ErrorInfo('Websocket closed', 80003, 400);\n this.finish('disconnected', err);\n } else {\n const msg = 'Unclean disconnection of WebSocket ; code = ' + code,\n err = new ErrorInfo(msg, 80003, 400);\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.onWsClose()', msg);\n this.finish('disconnected', err);\n }\n this.emit('disposed');\n }\n\n onWsError(err: ErrorEvent) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'WebSocketTransport.onError()',\n 'Error from WebSocket: ' + err.message,\n );\n /* Wait a tick before aborting: if the websocket was connected, this event\n * will be immediately followed by an onclose event with a close code. Allow\n * that to close it (so we see the close code) rather than anticipating it */\n Platform.Config.nextTick(() => {\n this.disconnect(Error(err.message));\n });\n }\n\n dispose() {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.dispose()', '');\n this.isDisposed = true;\n const wsConnection = this.wsConnection;\n if (wsConnection) {\n /* Ignore any messages that come through after dispose() is called but before\n * websocket is actually closed. (mostly would be harmless, but if it's a\n * CONNECTED, it'll re-tick isConnected and cause all sorts of havoc) */\n wsConnection.onmessage = function () {};\n delete this.wsConnection;\n /* defer until the next event loop cycle before closing the socket,\n * giving some implementations the opportunity to send any outstanding close message */\n Platform.Config.nextTick(() => {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'WebSocketTransport.dispose()', 'closing websocket');\n if (!wsConnection) {\n throw new Error('WebSocketTransport.dispose(): wsConnection is not defined');\n }\n wsConnection.close();\n });\n }\n }\n}\n\nexport default WebSocketTransport;\n","import * as API from '../../../../ably';\nimport RealtimeChannel from './realtimechannel';\nimport Message from '../types/message';\n\nexport class FilteredSubscriptions {\n static subscribeFilter(channel: RealtimeChannel, filter: API.MessageFilter, listener: API.messageCallback<Message>) {\n const filteredListener = (m: Message) => {\n const mapping: { [key in keyof API.MessageFilter]: any } = {\n name: m.name,\n refTimeserial: m.extras?.ref?.timeserial,\n refType: m.extras?.ref?.type,\n isRef: !!m.extras?.ref?.timeserial,\n clientId: m.clientId,\n };\n // Check if any values are defined in the filter and if they match the value in the message object\n if (\n Object.entries(filter).find(([key, value]) =>\n value !== undefined ? mapping[key as keyof API.MessageFilter] !== value : false,\n )\n ) {\n return;\n }\n listener(m);\n };\n this.addFilteredSubscription(channel, filter, listener, filteredListener);\n channel.subscriptions.on(filteredListener);\n }\n\n // Adds a new filtered subscription\n static addFilteredSubscription(\n channel: RealtimeChannel,\n filter: API.MessageFilter,\n realListener: API.messageCallback<Message>,\n filteredListener: API.messageCallback<Message>,\n ) {\n if (!channel.filteredSubscriptions) {\n channel.filteredSubscriptions = new Map<\n API.messageCallback<Message>,\n Map<API.MessageFilter, API.messageCallback<Message>[]>\n >();\n }\n if (channel.filteredSubscriptions.has(realListener)) {\n const realListenerMap = channel.filteredSubscriptions.get(realListener) as Map<\n API.MessageFilter,\n API.messageCallback<Message>[]\n >;\n // Add the filtered listener to the map, or append to the array if this filter has already been used\n realListenerMap.set(filter, realListenerMap?.get(filter)?.concat(filteredListener) || [filteredListener]);\n } else {\n channel.filteredSubscriptions.set(\n realListener,\n new Map<API.MessageFilter, API.messageCallback<Message>[]>([[filter, [filteredListener]]]),\n );\n }\n }\n\n static getAndDeleteFilteredSubscriptions(\n channel: RealtimeChannel,\n filter: API.MessageFilter | undefined,\n realListener: API.messageCallback<Message> | undefined,\n ): API.messageCallback<Message>[] {\n // No filtered subscriptions map means there has been no filtered subscriptions yet, so return nothing\n if (!channel.filteredSubscriptions) {\n return [];\n }\n // Only a filter is passed in with no specific listener\n if (!realListener && filter) {\n // Return each listener which is attached to the specified filter object\n return Array.from(channel.filteredSubscriptions.entries())\n .map(([key, filterMaps]) => {\n // Get (then delete) the maps matching this filter\n let listenerMaps = filterMaps.get(filter);\n filterMaps.delete(filter);\n // Clear the parent if nothing is left\n if (filterMaps.size === 0) {\n channel.filteredSubscriptions?.delete(key);\n }\n return listenerMaps;\n })\n .reduce(\n (prev, cur) => (cur ? (prev as API.messageCallback<Message>[]).concat(...cur) : prev),\n [],\n ) as API.messageCallback<Message>[];\n }\n\n // No subscriptions for this listener\n if (!realListener || !channel.filteredSubscriptions.has(realListener)) {\n return [];\n }\n const realListenerMap = channel.filteredSubscriptions.get(realListener) as Map<\n API.MessageFilter,\n API.messageCallback<Message>[]\n >;\n // If no filter is specified return all listeners using that function\n if (!filter) {\n // array.flat is not available unless we support es2019 or higher\n const listeners = Array.from(realListenerMap.values()).reduce((prev, cur) => prev.concat(...cur), []);\n // remove the listener from the map\n channel.filteredSubscriptions.delete(realListener);\n return listeners;\n }\n\n let listeners = realListenerMap.get(filter);\n realListenerMap.delete(filter);\n\n return listeners || [];\n }\n}\n","import BaseRealtime from './baserealtime';\nimport ClientOptions from '../../types/ClientOptions';\nimport { allCommonModularPlugins } from './modularplugins';\nimport * as Utils from '../util/utils';\nimport ConnectionManager from '../transport/connectionmanager';\nimport ProtocolMessage from '../types/protocolmessage';\nimport Platform from 'common/platform';\nimport { DefaultMessage } from '../types/defaultmessage';\nimport { MsgPack } from 'common/types/msgpack';\nimport RealtimePresence from './realtimepresence';\nimport { DefaultPresenceMessage } from '../types/defaultpresencemessage';\nimport { DefaultAnnotation } from '../types/defaultannotation';\nimport WebSocketTransport from '../transport/websockettransport';\nimport { FilteredSubscriptions } from './filteredsubscriptions';\nimport { PresenceMap } from './presencemap';\nimport PresenceMessage, { WirePresenceMessage } from '../types/presencemessage';\nimport RealtimeAnnotations from './realtimeannotations';\nimport RestAnnotations from './restannotations';\nimport Annotation, { WireAnnotation } from '../types/annotation';\nimport { Http } from 'common/types/http';\nimport Defaults from '../util/defaults';\nimport Logger from '../util/logger';\nimport { MessageEncoding } from '../types/basemessage';\n\n/**\n `DefaultRealtime` is the class that the non tree-shakable version of the SDK exports as `Realtime`. It ensures that this version of the SDK includes all of the functionality which is optionally available in the tree-shakable version.\n */\nexport class DefaultRealtime extends BaseRealtime {\n // The public typings declare that this requires an argument to be passed, but since we want to emit a good error message in the case where a non-TypeScript user does not pass an argument, tell the compiler that this is possible so that it forces us to handle it.\n constructor(options?: ClientOptions | string) {\n const MsgPack = DefaultRealtime._MsgPack;\n if (!MsgPack) {\n throw new Error('Expected DefaultRealtime._MsgPack to have been set');\n }\n\n super(\n Defaults.objectifyOptions(options, true, 'Realtime', Logger.defaultLogger, {\n ...allCommonModularPlugins,\n Crypto: DefaultRealtime.Crypto ?? undefined,\n MsgPack,\n RealtimePresence: {\n RealtimePresence,\n PresenceMessage,\n WirePresenceMessage,\n },\n Annotations: {\n Annotation,\n WireAnnotation,\n RealtimeAnnotations,\n RestAnnotations,\n },\n WebSocketTransport,\n MessageInteractions: FilteredSubscriptions,\n }),\n );\n }\n\n static Utils = Utils;\n static ConnectionManager = ConnectionManager;\n static ProtocolMessage = ProtocolMessage;\n\n private static _Crypto: typeof Platform.Crypto = null;\n static get Crypto() {\n if (this._Crypto === null) {\n throw new Error('Encryption not enabled; use ably.encryption.js instead');\n }\n\n return this._Crypto;\n }\n static set Crypto(newValue: typeof Platform.Crypto) {\n this._Crypto = newValue;\n }\n\n static Message = DefaultMessage;\n static PresenceMessage = DefaultPresenceMessage;\n static Annotation = DefaultAnnotation;\n\n static _MsgPack: MsgPack | null = null;\n\n // Used by tests\n static _Http = Http;\n static _PresenceMap = PresenceMap;\n static _MessageEncoding = MessageEncoding;\n}\n","import IBufferUtils from 'common/types/IBufferUtils';\nimport crypto from 'crypto';\n\nexport type Bufferlike = Buffer | ArrayBuffer | ArrayBufferView;\nexport type Output = Buffer;\nexport type ToBufferOutput = Buffer;\n\nclass BufferUtils implements IBufferUtils<Bufferlike, Output, ToBufferOutput> {\n base64CharSet: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n hexCharSet: string = '0123456789abcdef';\n\n base64Decode(string: string): Output {\n return Buffer.from(string, 'base64');\n }\n\n base64Encode(buffer: Bufferlike): string {\n return this.toBuffer(buffer).toString('base64');\n }\n\n base64UrlEncode(buffer: Bufferlike): string {\n return this.toBuffer(buffer).toString('base64url');\n }\n\n areBuffersEqual(buffer1: Bufferlike, buffer2: Bufferlike): boolean {\n if (!buffer1 || !buffer2) return false;\n return this.toBuffer(buffer1).compare(this.toBuffer(buffer2)) == 0;\n }\n\n byteLength(buffer: Bufferlike): number {\n return buffer.byteLength;\n }\n\n hexDecode(string: string): Output {\n return Buffer.from(string, 'hex');\n }\n\n hexEncode(buffer: Bufferlike): string {\n return this.toBuffer(buffer).toString('hex');\n }\n\n /* In node, BufferUtils methods that return binary objects return a Buffer\n * for historical reasons; the browser equivalents return ArrayBuffers */\n isBuffer(buffer: unknown): buffer is Bufferlike {\n return Buffer.isBuffer(buffer) || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer);\n }\n\n toArrayBuffer(buffer: Bufferlike): ArrayBuffer {\n const nodeBuffer = this.toBuffer(buffer);\n return nodeBuffer.buffer.slice(nodeBuffer.byteOffset, nodeBuffer.byteOffset + nodeBuffer.byteLength);\n }\n\n toBuffer(buffer: Bufferlike): ToBufferOutput {\n if (Buffer.isBuffer(buffer)) {\n return buffer;\n }\n if (buffer instanceof ArrayBuffer) {\n return Buffer.from(buffer);\n }\n return Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n }\n\n arrayBufferViewToBuffer(arrayBufferView: ArrayBufferView): Buffer {\n return this.toBuffer(arrayBufferView);\n }\n\n utf8Decode(buffer: Bufferlike): string {\n if (!this.isBuffer(buffer)) {\n throw new Error('Expected input of utf8Decode to be a buffer, arraybuffer, or view');\n }\n return this.toBuffer(buffer).toString('utf8');\n }\n\n utf8Encode(string: string): Output {\n return Buffer.from(string, 'utf8');\n }\n\n concat(buffers: Bufferlike[]): Output {\n return Buffer.concat(buffers.map((x) => this.toBuffer(x)));\n }\n\n sha256(message: Bufferlike): Output {\n const messageBuffer = this.toBuffer(message);\n\n return crypto.createHash('SHA256').update(messageBuffer).digest();\n }\n\n hmacSha256(message: Bufferlike, key: Bufferlike): Output {\n const messageBuffer = this.toBuffer(message);\n const keyBuffer = this.toBuffer(key);\n\n return crypto.createHmac('SHA256', keyBuffer).update(messageBuffer).digest();\n }\n}\n\nexport default new BufferUtils();\n","'use strict';\nimport Logger from '../../../../common/lib/util/logger';\nimport crypto from 'crypto';\nimport ErrorInfo from '../../../../common/lib/types/errorinfo';\nimport * as API from '../../../../../ably';\nimport ICryptoStatic, { IGetCipherParams } from '../../../../common/types/ICryptoStatic';\nimport ICipher from '../../../../common/types/ICipher';\nimport { CryptoDataTypes } from '../../../../common/types/cryptoDataTypes';\nimport { Cipher as NodeCipher, CipherKey as NodeCipherKey } from 'crypto';\nimport BufferUtils, { Bufferlike, Output as BufferUtilsOutput } from './bufferutils';\nimport util from 'util';\n\n// The type to which ably-forks/msgpack-js deserializes elements of the `bin` or `ext` type\ntype MessagePackBinaryType = Buffer;\n\ntype IV = CryptoDataTypes.IV<BufferUtilsOutput>;\ntype InputPlaintext = CryptoDataTypes.InputPlaintext<Bufferlike, BufferUtilsOutput>;\ntype OutputCiphertext = Buffer;\ntype InputCiphertext = CryptoDataTypes.InputCiphertext<MessagePackBinaryType, BufferUtilsOutput>;\ntype OutputPlaintext = Buffer;\n\nvar createCryptoClass = function (bufferUtils: typeof BufferUtils) {\n var DEFAULT_ALGORITHM = 'aes';\n var DEFAULT_KEYLENGTH = 256; // bits\n var DEFAULT_MODE = 'cbc';\n var DEFAULT_BLOCKLENGTH = 16; // bytes\n\n /**\n * Internal: generate a buffer of secure random bytes of the given length\n * @param bytes\n */\n async function generateRandom(bytes: number): Promise<Buffer> {\n return util.promisify(crypto.randomBytes)(bytes);\n }\n\n /**\n * Internal: calculate the padded length of a given plaintext\n * using PKCS5.\n * @param plaintextLength\n * @return\n */\n function getPaddedLength(plaintextLength: number) {\n return (plaintextLength + DEFAULT_BLOCKLENGTH) & -DEFAULT_BLOCKLENGTH;\n }\n\n /**\n * Internal: checks that the cipherParams are a valid combination. Currently\n * just checks that the calculated keyLength is a valid one for aes-cbc\n */\n function validateCipherParams(params: API.CipherParams) {\n if (params.algorithm === 'aes' && params.mode === 'cbc') {\n if (params.keyLength === 128 || params.keyLength === 256) {\n return;\n }\n throw new Error(\n 'Unsupported key length ' +\n params.keyLength +\n ' for aes-cbc encryption. Encryption key must be 128 or 256 bits (16 or 32 ASCII characters)',\n );\n }\n }\n\n function normaliseBase64(string: string) {\n /* url-safe base64 strings use _ and - instread of / and + */\n return string.replace('_', '/').replace('-', '+');\n }\n\n /**\n * Internal: obtain the pkcs5 padding string for a given padded length;\n */\n function filledBuffer(length: number, value: number) {\n var result = Buffer.alloc(length);\n result.fill(value);\n return result;\n }\n var pkcs5Padding = [filledBuffer(16, 16)];\n for (var i = 1; i <= 16; i++) pkcs5Padding.push(filledBuffer(i, i));\n\n /**\n * A class encapsulating the client-specifiable parameters for\n * the cipher.\n *\n * algorithm is the name of the algorithm in the default system provider,\n * or the lower-cased version of it; eg \"aes\" or \"AES\".\n *\n * Clients may instance a CipherParams directly and populate it, or may\n * query the implementation to obtain a default system CipherParams.\n */\n class CipherParams implements API.CipherParams {\n algorithm: string;\n keyLength: number;\n mode: string;\n key: NodeCipherKey;\n iv: unknown;\n\n constructor(algorithm: string, keyLength: number, mode: string, key: NodeCipherKey) {\n this.algorithm = algorithm;\n this.keyLength = keyLength;\n this.mode = mode;\n this.key = key;\n this.iv = null;\n }\n }\n\n function isInstCipherParams(params: API.CipherParams | API.CipherParamOptions): params is API.CipherParams {\n /* In node, can't use instanceof CipherParams due to the vm context problem (see\n * https://github.com/nwjs/nw.js/wiki/Differences-of-JavaScript-contexts).\n * So just test for presence of all necessary attributes */\n return !!(params.algorithm && params.key && params.keyLength && params.mode);\n }\n\n /**\n * Utility classes and interfaces for message payload encryption.\n *\n * This class supports AES/CBC/PKCS5 with a default keylength of 128 bits\n * but supporting other keylengths. Other algorithms and chaining modes are\n * not supported directly, but supportable by extending/implementing the base\n * classes and interfaces here.\n *\n * Secure random data for creation of Initialization Vectors (IVs) and keys\n * is obtained from the default system SecureRandom. Future extensions of this\n * class might make the SecureRandom pluggable or at least seedable with\n * client-provided entropy.\n *\n * Each message payload is encrypted with an IV in CBC mode, and the IV is\n * concatenated with the resulting raw ciphertext to construct the \"ciphertext\"\n * data passed to the recipient.\n */\n class Crypto {\n static CipherParams = CipherParams;\n\n /**\n * Obtain a complete CipherParams instance from the provided params, filling\n * in any not provided with default values, calculating a keyLength from\n * the supplied key, and validating the result.\n * @param params an object containing at a minimum a `key` key with value the\n * key, as either a binary or a base64-encoded string.\n * May optionally also contain: algorithm (defaults to AES),\n * mode (defaults to 'cbc')\n */\n static getDefaultParams(params: API.CipherParamOptions) {\n var key: NodeCipherKey;\n\n if (!params.key) {\n throw new Error('Crypto.getDefaultParams: a key is required');\n }\n\n if (typeof params.key === 'string') {\n key = bufferUtils.base64Decode(normaliseBase64(params.key));\n } else if (params.key instanceof ArrayBuffer) {\n key = Buffer.from(params.key);\n } else {\n key = params.key;\n }\n\n var algorithm = params.algorithm || DEFAULT_ALGORITHM;\n var keyLength = key.length * 8;\n var mode = params.mode || DEFAULT_MODE;\n var cipherParams = new CipherParams(algorithm, keyLength, mode, key);\n\n if (params.keyLength && params.keyLength !== cipherParams.keyLength) {\n throw new Error(\n 'Crypto.getDefaultParams: a keyLength of ' +\n params.keyLength +\n ' was specified, but the key actually has length ' +\n cipherParams.keyLength,\n );\n }\n\n validateCipherParams(cipherParams);\n return cipherParams;\n }\n\n /**\n * Generate a random encryption key from the supplied keylength (or the\n * default keyLength if none supplied) as a Buffer\n * @param keyLength (optional) the required keyLength in bits\n */\n static async generateRandomKey(keyLength?: number): Promise<API.CipherKey> {\n try {\n return generateRandom((keyLength || DEFAULT_KEYLENGTH) / 8);\n } catch (err) {\n throw new ErrorInfo('Failed to generate random key: ' + (err as Error).message, 500, 50000);\n }\n }\n\n /**\n * Internal; get a ChannelCipher instance based on the given cipherParams\n * @param params either a CipherParams instance or some subset of its\n * fields that includes a key\n */\n static getCipher(params: IGetCipherParams<IV>, logger: Logger) {\n var cipherParams = isInstCipherParams(params) ? (params as CipherParams) : this.getDefaultParams(params);\n\n return {\n cipherParams: cipherParams,\n cipher: new CBCCipher(cipherParams, params.iv ?? null, logger),\n };\n }\n }\n\n Crypto satisfies ICryptoStatic<IV, InputPlaintext, OutputCiphertext, InputCiphertext, OutputPlaintext>;\n\n class CBCCipher implements ICipher<InputPlaintext, OutputCiphertext, InputCiphertext, OutputPlaintext> {\n algorithm: string;\n key: NodeCipherKey;\n iv: Buffer | null;\n encryptCipher: NodeCipher | null = null;\n\n constructor(\n params: CipherParams,\n iv: Buffer | null,\n private readonly logger: Logger,\n ) {\n this.algorithm = params.algorithm + '-' + String(params.keyLength) + '-' + params.mode;\n this.key = params.key;\n this.iv = iv;\n }\n\n async encrypt(plaintext: InputPlaintext): Promise<OutputCiphertext> {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'CBCCipher.encrypt()', '');\n\n const iv = await this.getIv();\n if (!this.encryptCipher) {\n this.encryptCipher = crypto.createCipheriv(this.algorithm, this.key, iv);\n }\n\n var plaintextBuffer = bufferUtils.toBuffer(plaintext);\n var plaintextLength = plaintextBuffer.length,\n paddedLength = getPaddedLength(plaintextLength);\n var cipherOut = this.encryptCipher.update(\n Buffer.concat([plaintextBuffer, pkcs5Padding[paddedLength - plaintextLength]]),\n );\n var ciphertext = Buffer.concat([iv, cipherOut]);\n return ciphertext;\n }\n\n async decrypt(ciphertext: InputCiphertext): Promise<OutputPlaintext> {\n var decryptCipher = crypto.createDecipheriv(this.algorithm, this.key, ciphertext.slice(0, DEFAULT_BLOCKLENGTH)),\n plaintext = decryptCipher.update(ciphertext.slice(DEFAULT_BLOCKLENGTH)),\n final = decryptCipher.final();\n if (final && final.length) plaintext = Buffer.concat([plaintext, final]);\n return plaintext;\n }\n\n async getIv(): Promise<Buffer> {\n if (this.iv) {\n var iv = this.iv;\n this.iv = null;\n return iv;\n }\n\n var randomBlock = await generateRandom(DEFAULT_BLOCKLENGTH);\n\n if (!this.encryptCipher) {\n return randomBlock;\n } else {\n /* Since the iv for a new block is the ciphertext of the last, this\n * sets a new iv (= aes(randomBlock XOR lastCipherText)) as well as\n * returning it */\n return this.encryptCipher.update(randomBlock);\n }\n }\n }\n\n return Crypto;\n};\n\nexport { createCryptoClass };\n","import Platform from 'common/platform';\nimport Defaults from 'common/lib/util/defaults';\nimport ErrorInfo from 'common/lib/types/errorinfo';\nimport {\n ErrnoException,\n RequestBody,\n IPlatformHttpStatic,\n RequestResultError,\n RequestParams,\n RequestResult,\n} from '../../../../common/types/http';\nimport HttpMethods from '../../../../common/constants/HttpMethods';\nimport got, { Response, Options, CancelableRequest, Agents } from 'got';\nimport http from 'http';\nimport https from 'https';\nimport BaseClient from 'common/lib/client/baseclient';\nimport { RestAgentOptions } from 'common/types/ClientOptions';\nimport { isSuccessCode } from 'common/constants/HttpStatusCodes';\nimport { createMissingPluginError, shallowEquals } from 'common/lib/util/utils';\n\n/***************************************************\n *\n * These Http operations are used for REST operations\n * and assume that the system is stateless - ie\n * there is no connection state that tells us\n * anything about the state of the network or the\n * viability of any of the hosts we know about.\n * Therefore all requests will respond to specific\n * errors by attempting the fallback hosts, and no\n * assumptions about host or network is retained to\n * influence the handling of any subsequent request.\n *\n ***************************************************/\n\nconst globalAgentPool: Array<{ options: RestAgentOptions; agents: Agents }> = [];\n\nconst Http: IPlatformHttpStatic = class {\n static methods = [HttpMethods.Get, HttpMethods.Delete, HttpMethods.Post, HttpMethods.Put, HttpMethods.Patch];\n static methodsWithoutBody = [HttpMethods.Get, HttpMethods.Delete];\n static methodsWithBody = [HttpMethods.Post, HttpMethods.Put, HttpMethods.Patch];\n private agent: Agents | null = null;\n supportsAuthHeaders = true;\n supportsLinkHeaders = true;\n private client: BaseClient | null;\n\n constructor(client?: BaseClient) {\n this.client = client ?? null;\n }\n\n async doUri(\n method: HttpMethods,\n uri: string,\n headers: Record<string, string> | null,\n body: RequestBody | null,\n params: RequestParams,\n ): Promise<RequestResult> {\n /* Will generally be making requests to one or two servers exclusively\n * (Ably and perhaps an auth server), so for efficiency, use the\n * foreverAgent to keep the TCP stream alive between requests where possible */\n const agentOptions =\n (this.client && this.client.options.restAgentOptions) || (Defaults.restAgentOptions as RestAgentOptions);\n const doOptions: Options = { headers: headers || undefined, responseType: 'buffer' };\n\n if (!this.agent) {\n const persistedAgent = globalAgentPool.find((x) => shallowEquals(agentOptions, x.options))?.agents;\n if (persistedAgent) {\n this.agent = persistedAgent;\n } else {\n this.agent = {\n http: new http.Agent(agentOptions),\n https: new https.Agent(agentOptions),\n };\n globalAgentPool.push({\n options: agentOptions,\n agents: this.agent,\n });\n }\n }\n\n if (body) {\n doOptions.body = body as Buffer;\n }\n if (params) doOptions.searchParams = params;\n\n doOptions.agent = this.agent;\n\n doOptions.url = uri;\n doOptions.timeout = {\n request: ((this.client && this.client.options.timeouts) || Defaults.TIMEOUTS).httpRequestTimeout,\n };\n // We have our own logic that retries appropriate statuscodes to fallback endpoints,\n // with timeouts constructed appropriately. Don't want `got` doing its own retries to\n // the same endpoint, inappropriately retrying 429s, etc\n doOptions.retry = { limit: 0 };\n\n try {\n const res = await (got[method](doOptions) as CancelableRequest<Response>);\n return this._handler(null, res, res.body);\n } catch (err) {\n if (err instanceof got.HTTPError) {\n return this._handler(null, err.response, err.response.body);\n }\n return this._handler(err as ErrnoException);\n }\n }\n\n checkConnectivity = async (): Promise<boolean> => {\n if (this.client?.options.disableConnectivityCheck) {\n return true;\n }\n const connectivityCheckUrl = this.client?.options.connectivityCheckUrl || Defaults.connectivityCheckUrl;\n const connectivityCheckParams = this.client?.options.connectivityCheckParams ?? null;\n const connectivityUrlIsDefault = !this.client?.options.connectivityCheckUrl;\n\n const { error, statusCode, body } = await this.doUri(\n HttpMethods.Get,\n connectivityCheckUrl,\n null,\n null,\n connectivityCheckParams,\n );\n\n if (!error && !connectivityUrlIsDefault) {\n return isSuccessCode(statusCode as number);\n }\n return !error && (body as Buffer | string)?.toString().trim() === 'yes';\n };\n\n shouldFallback(err: RequestResultError) {\n const { code, statusCode } = err as ErrnoException;\n return (\n code === 'ENETUNREACH' ||\n code === 'EHOSTUNREACH' ||\n code === 'EHOSTDOWN' ||\n code === 'ETIMEDOUT' ||\n code === 'ESOCKETTIMEDOUT' ||\n code === 'ENOTFOUND' ||\n code === 'ECONNRESET' ||\n code === 'ECONNREFUSED' ||\n (statusCode >= 500 && statusCode <= 504)\n );\n }\n\n private _handler(err: ErrnoException | null, response?: Response, body?: unknown) {\n if (err) {\n return { error: err };\n }\n\n const statusCode = (response as Response).statusCode,\n headers = (response as Response).headers;\n\n if (statusCode >= 300) {\n switch (headers['content-type']) {\n case 'application/json':\n body = JSON.parse(body as string);\n break;\n\n case 'application/x-msgpack':\n if (!this.client?._MsgPack) {\n return { error: createMissingPluginError('MsgPack') };\n }\n body = this.client._MsgPack.decode(body as Buffer);\n break;\n }\n\n const error = (body as { error: ErrorInfo }).error\n ? ErrorInfo.fromValues((body as { error: ErrorInfo }).error)\n : new ErrorInfo(\n (headers['x-ably-errormessage'] as string) ||\n 'Error response received from server: ' + statusCode + ' body was: ' + Platform.Config.inspect(body),\n Number(headers['x-ably-errorcode']),\n statusCode,\n );\n\n return { error, body, headers, unpacked: true, statusCode };\n }\n\n return { error: null, body, headers, unpacked: false, statusCode };\n }\n};\n\nexport default Http;\n","import { IPlatformConfig } from '../../common/types/IPlatformConfig';\nimport crypto from 'crypto';\nimport WebSocket from 'ws';\nimport util from 'util';\n\nconst Config: IPlatformConfig = {\n agent: 'nodejs/' + process.versions.node,\n logTimestamps: true,\n userAgent: null,\n binaryType: 'nodebuffer' as BinaryType,\n WebSocket,\n useProtocolHeartbeats: false,\n supportsBinary: true,\n preferBinary: true,\n nextTick: process.nextTick,\n inspect: util.inspect,\n stringByteSize: Buffer.byteLength,\n inherits: util.inherits,\n addEventListener: null,\n getRandomArrayBuffer: async function (byteLength: number): Promise<Buffer> {\n return util.promisify(crypto.randomBytes)(byteLength);\n },\n};\n\nexport default Config;\n","enum XHRStates {\n REQ_SEND = 0,\n REQ_RECV = 1,\n REQ_RECV_POLL = 2,\n REQ_RECV_STREAM = 3,\n}\n\nexport default XHRStates;\n","import * as Utils from '../util/utils';\nimport { actions } from '../types/protocolmessagecommon';\nimport ProtocolMessage, {\n fromValues as protocolMessageFromValues,\n fromDeserialized as protocolMessageFromDeserialized,\n} from '../types/protocolmessage';\nimport Transport from './transport';\nimport Logger from '../util/logger';\nimport Defaults from '../util/defaults';\nimport ConnectionErrors from './connectionerrors';\nimport Auth from '../client/auth';\nimport ErrorInfo from '../types/errorinfo';\nimport IXHRRequest from '../../types/IXHRRequest';\nimport * as API from '../../../../ably';\nimport ConnectionManager, { TransportParams } from './connectionmanager';\nimport XHRStates from '../../constants/XHRStates';\nimport Platform from 'common/platform';\n\n/* TODO: can remove once realtime sends protocol message responses for comet errors */\nfunction shouldBeErrorAction(err: ErrorInfo) {\n const UNRESOLVABLE_ERROR_CODES = [80015, 80017, 80030];\n if (err.code) {\n if (Auth.isTokenErr(err)) return false;\n if (UNRESOLVABLE_ERROR_CODES.includes(err.code)) return true;\n return err.code >= 40000 && err.code < 50000;\n } else {\n /* Likely a network or transport error of some kind. Certainly not fatal to the connection */\n return false;\n }\n}\n\nfunction protocolMessageFromRawError(err: ErrorInfo) {\n /* err will be either a legacy (non-protocolmessage) comet error response\n * (which will have an err.code), or a xhr/network error (which won't). */\n if (shouldBeErrorAction(err)) {\n return [protocolMessageFromValues({ action: actions.ERROR, error: err })];\n } else {\n return [protocolMessageFromValues({ action: actions.DISCONNECTED, error: err })];\n }\n}\n\n/*\n * A base comet transport class\n */\nabstract class CometTransport extends Transport {\n stream: string | boolean;\n sendRequest: IXHRRequest | null;\n recvRequest: null | IXHRRequest;\n pendingCallback: null;\n pendingItems: null | Array<ProtocolMessage>;\n baseUri?: string;\n authParams?: Record<string, any>;\n closeUri?: string;\n disconnectUri?: string;\n sendUri?: string;\n recvUri?: string;\n\n constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams) {\n super(connectionManager, auth, params, /* binary not supported for comet so force JSON protocol */ true);\n this.stream = 'stream' in params ? params.stream : true;\n this.sendRequest = null;\n this.recvRequest = null;\n this.pendingCallback = null;\n this.pendingItems = null;\n }\n\n abstract createRequest(\n uri: string,\n headers: Record<string, string> | null,\n params?: Record<string, unknown> | null,\n body?: unknown,\n requestMode?: number,\n ): IXHRRequest;\n\n connect(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.connect()', 'starting');\n Transport.prototype.connect.call(this);\n const params = this.params;\n const options = params.options;\n const host = params.host || options.primaryDomain;\n const port = Defaults.getPort(options);\n const cometScheme = options.tls ? 'https://' : 'http://';\n\n this.baseUri = cometScheme + host + ':' + port + '/comet/';\n const connectUri = this.baseUri + 'connect';\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.connect()', 'uri: ' + connectUri);\n Utils.whenPromiseSettles(this.auth.getAuthParams(), (err: Error | null, authParams?: Record<string, any>) => {\n if (err) {\n this.disconnect(err);\n return;\n }\n if (this.isDisposed) {\n return;\n }\n this.authParams = authParams;\n const connectParams = this.params.getConnectParams(authParams!);\n if ('stream' in connectParams) this.stream = connectParams.stream;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'CometTransport.connect()',\n 'connectParams:' + Utils.toQueryString(connectParams),\n );\n\n /* this will be the 'recvRequest' so this connection can stream messages */\n let preconnected = false;\n const connectRequest = (this.recvRequest = this.createRequest(\n connectUri,\n null,\n connectParams,\n null,\n this.stream ? XHRStates.REQ_RECV_STREAM : XHRStates.REQ_RECV,\n ));\n\n connectRequest.on('data', (data: any) => {\n if (!this.recvRequest) {\n /* the transport was disposed before we connected */\n return;\n }\n if (!preconnected) {\n preconnected = true;\n this.emit('preconnect');\n }\n this.onData(data);\n });\n connectRequest.on('complete', (err: ErrorInfo) => {\n if (!this.recvRequest) {\n /* the transport was disposed before we connected */\n err = err || new ErrorInfo('Request cancelled', 80003, 400);\n }\n this.recvRequest = null;\n /* Connect request may complete without a emitting 'data' event since that is not\n * emitted for e.g. a non-streamed error response. Still implies preconnect. */\n if (!preconnected && !err) {\n preconnected = true;\n this.emit('preconnect');\n }\n this.onActivity();\n if (err) {\n if (err.code) {\n /* A protocol error received from realtime. TODO: once realtime\n * consistendly sends errors wrapped in protocol messages, should be\n * able to remove this */\n this.onData(protocolMessageFromRawError(err));\n } else {\n /* A network/xhr error. Don't bother wrapping in a protocol message,\n * just disconnect the transport */\n this.disconnect(err);\n }\n return;\n }\n Platform.Config.nextTick(() => {\n this.recv();\n });\n });\n connectRequest.exec();\n });\n }\n\n requestClose(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.requestClose()');\n this._requestCloseOrDisconnect(true);\n }\n\n requestDisconnect(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.requestDisconnect()');\n this._requestCloseOrDisconnect(false);\n }\n\n _requestCloseOrDisconnect(closing: boolean): void {\n const closeOrDisconnectUri = closing ? this.closeUri : this.disconnectUri;\n if (closeOrDisconnectUri) {\n const request = this.createRequest(closeOrDisconnectUri, null, this.authParams, null, XHRStates.REQ_SEND);\n\n request.on('complete', (err: ErrorInfo) => {\n if (err) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'CometTransport.request' + (closing ? 'Close()' : 'Disconnect()'),\n 'request returned err = ' + Utils.inspectError(err),\n );\n this.finish('disconnected', err);\n }\n });\n request.exec();\n }\n }\n\n dispose(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.dispose()', '');\n if (!this.isDisposed) {\n this.isDisposed = true;\n if (this.recvRequest) {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.dispose()', 'aborting recv request');\n this.recvRequest.abort();\n this.recvRequest = null;\n }\n /* In almost all cases the transport will be finished before it's\n * disposed. Finish here just to make sure. */\n this.finish('disconnected', ConnectionErrors.disconnected());\n Platform.Config.nextTick(() => {\n this.emit('disposed');\n });\n }\n }\n\n onConnect(message: ProtocolMessage): void {\n /* if this transport has been disposed whilst awaiting connection, do nothing */\n if (this.isDisposed) {\n return;\n }\n\n /* the connectionKey in a comet connected response is really\n * <instId>-<connectionKey> */\n const connectionStr = message.connectionDetails?.connectionKey;\n Transport.prototype.onConnect.call(this, message);\n\n const baseConnectionUri = (this.baseUri as string) + connectionStr;\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'CometTransport.onConnect()', 'baseUri = ' + baseConnectionUri);\n this.sendUri = baseConnectionUri + '/send';\n this.recvUri = baseConnectionUri + '/recv';\n this.closeUri = baseConnectionUri + '/close';\n this.disconnectUri = baseConnectionUri + '/disconnect';\n }\n\n send(message: ProtocolMessage): void {\n if (this.sendRequest) {\n /* there is a pending send, so queue this message */\n this.pendingItems = this.pendingItems || [];\n this.pendingItems.push(message);\n return;\n }\n /* send this, plus any pending, now */\n const pendingItems = this.pendingItems || [];\n pendingItems.push(message);\n this.pendingItems = null;\n\n this.sendItems(pendingItems);\n }\n\n sendAnyPending(): void {\n const pendingItems = this.pendingItems;\n\n if (!pendingItems) {\n return;\n }\n\n this.pendingItems = null;\n this.sendItems(pendingItems);\n }\n\n sendItems(items: Array<ProtocolMessage>): void {\n const sendRequest = (this.sendRequest = this.createRequest(\n this.sendUri as string,\n null,\n this.authParams,\n this.encodeRequest(items),\n XHRStates.REQ_SEND,\n ));\n\n sendRequest.on('complete', (err: ErrorInfo, data: string) => {\n if (err)\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'CometTransport.sendItems()',\n 'on complete: err = ' + Utils.inspectError(err),\n );\n this.sendRequest = null;\n\n /* the result of the request, even if a nack, is usually a protocol response\n * contained in the data. An err is anomolous, and indicates some issue with the\n * network,transport, or connection */\n if (err) {\n if (err.code) {\n /* A protocol error received from realtime. TODO: once realtime\n * consistendly sends errors wrapped in protocol messages, should be\n * able to remove this */\n this.onData(protocolMessageFromRawError(err));\n } else {\n /* A network/xhr error. Don't bother wrapping in a protocol message,\n * just disconnect the transport */\n this.disconnect(err);\n }\n return;\n }\n\n if (data) {\n this.onData(data);\n }\n\n if (this.pendingItems) {\n Platform.Config.nextTick(() => {\n /* If there's a new send request by now, any pending items will have\n * been picked up by that; any new ones added since then will be\n * picked up after that one completes */\n if (!this.sendRequest) {\n this.sendAnyPending();\n }\n });\n }\n });\n sendRequest.exec();\n }\n\n recv(): void {\n /* do nothing if there is an active request, which might be streaming */\n if (this.recvRequest) return;\n\n /* If we're no longer connected, do nothing */\n if (!this.isConnected) return;\n\n const recvRequest = (this.recvRequest = this.createRequest(\n this.recvUri as string,\n null,\n this.authParams,\n null,\n this.stream ? XHRStates.REQ_RECV_STREAM : XHRStates.REQ_RECV_POLL,\n ));\n\n recvRequest.on('data', (data: string) => {\n this.onData(data);\n });\n recvRequest.on('complete', (err: ErrorInfo) => {\n this.recvRequest = null;\n /* A request completing must be considered activity, as realtime sends\n * heartbeats every 15s since a request began, not every 15s absolutely */\n this.onActivity();\n if (err) {\n if (err.code) {\n /* A protocol error received from realtime. TODO: once realtime\n * consistently sends errors wrapped in protocol messages, should be\n * able to remove this */\n this.onData(protocolMessageFromRawError(err));\n } else {\n /* A network/xhr error. Don't bother wrapping in a protocol message,\n * just disconnect the transport */\n this.disconnect(err);\n }\n return;\n }\n Platform.Config.nextTick(() => {\n this.recv();\n });\n });\n recvRequest.exec();\n }\n\n onData(responseData: string | Record<string, any>): void {\n try {\n const items = this.decodeResponse(responseData);\n if (items && items.length)\n for (let i = 0; i < items.length; i++)\n this.onProtocolMessage(\n protocolMessageFromDeserialized(\n items[i],\n this.connectionManager.realtime._RealtimePresence,\n this.connectionManager.realtime._Annotations,\n this.connectionManager.realtime._liveObjectsPlugin,\n ),\n );\n } catch (e) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'CometTransport.onData()',\n 'Unexpected exception handing channel event: ' + (e as Error).stack,\n );\n }\n }\n\n encodeRequest(requestItems: Array<ProtocolMessage>): string {\n return JSON.stringify(requestItems);\n }\n\n decodeResponse(responseData: string | Record<string, any>): Record<string, any> {\n if (typeof responseData == 'string') return JSON.parse(responseData);\n return responseData;\n }\n\n /* Historical comment, back from when we supported JSONP:\n *\n * > For comet, we could do the auth update by aborting the current recv and\n * > starting a new one with the new token, that'd be sufficient for realtime.\n * > Problem is JSONP - you can't cancel truly abort a recv once started. So\n * > we need to send an AUTH for jsonp. In which case it's simpler to keep all\n * > comet transports the same and do it for all of them. So we send the AUTH\n * > instead, and don't need to abort the recv\n *\n * Now that we’ve dropped JSONP support, we may be able to revisit the above;\n * see https://github.com/ably/ably-js/issues/1214.\n */\n onAuthUpdated = (tokenDetails: API.TokenDetails): void => {\n this.authParams = { access_token: tokenDetails.token };\n };\n}\n\nexport default CometTransport;\n","'use strict';\nimport CometTransport from '../../../../common/lib/transport/comettransport';\nimport Logger from '../../../../common/lib/util/logger';\nimport * as Utils from '../../../../common/lib/util/utils';\nimport ErrorInfo, { PartialErrorInfo } from '../../../../common/lib/types/errorinfo';\nimport EventEmitter from '../../../../common/lib/util/eventemitter';\nimport HttpStatusCodes from '../../../../common/constants/HttpStatusCodes';\nimport XHRStates from '../../../../common/constants/XHRStates';\nimport http from 'http';\nimport https from 'https';\nimport url from 'url';\nimport util from 'util';\nimport { TransportNames } from '../../../../common/constants/TransportName';\n\nvar noop = function () {};\nvar shortName = TransportNames.Comet;\n\n/*\n * A transport to use with nodejs\n * to simulate an XHR transport for test purposes\n */\nclass NodeCometTransport extends CometTransport {\n constructor(connectionManager, auth, params) {\n super(connectionManager, auth, params);\n this.httpAgent = null;\n this.httpsAgent = null;\n this.pendingRequests = 0;\n this.shortName = shortName;\n }\n\n static isAvailable() {\n return true;\n }\n\n toString() {\n return (\n 'NodeCometTransport; uri=' +\n this.baseUri +\n '; isConnected=' +\n this.isConnected +\n '; format=' +\n this.format +\n '; stream=' +\n this.stream\n );\n }\n\n getAgent(tls) {\n var prop = tls ? 'httpsAgent' : 'httpAgent',\n agent = this[prop];\n\n if (!agent) agent = this[prop] = new (tls ? https : http).Agent({ keepAlive: true });\n\n return agent;\n }\n\n dispose() {\n var self = this;\n this.onceNoPending(function () {\n if (self.httpAgent) self.httpAgent.destroy();\n if (self.httpsAgent) self.httpsAgent.destroy();\n });\n CometTransport.prototype.dispose.call(this);\n }\n\n /* valid in non-streaming mode only, or data only contains last update */\n request(uri, params, body, requestMode, callback) {\n var req = this.createRequest(uri, params, body, requestMode);\n req.once('complete', callback);\n req.exec();\n return req;\n }\n\n createRequest(uri, headers, params, body, requestMode) {\n return new Request(uri, headers, params, body, requestMode, this.format, this.timeouts, this);\n }\n\n addPending() {\n ++this.pendingRequests;\n }\n\n removePending() {\n if (--this.pendingRequests <= 0) {\n this.emit('nopending');\n }\n }\n\n onceNoPending(listener) {\n if (this.pendingRequests == 0) {\n listener();\n return;\n }\n this.once('nopending', listener);\n }\n}\n\nclass Request extends EventEmitter {\n constructor(uri, headers, params, body, requestMode, format, timeouts, transport) {\n super(transport.logger);\n\n if (typeof uri == 'string') uri = url.parse(uri);\n var tls = uri.protocol == 'https:';\n this.client = tls ? https : http;\n this.requestMode = requestMode;\n this.timeouts = timeouts;\n this.transport = transport;\n this.requestComplete = false;\n this.req = this.res = null;\n\n var method = 'GET',\n contentType = format == 'msgpack' ? 'application/x-msgpack' : 'application/json';\n\n headers = headers ? Utils.mixin({}, headers) : {};\n headers['accept'] = contentType;\n\n if (body) {\n method = 'POST';\n if (!Buffer.isBuffer(body)) {\n if (typeof body == 'object') body = JSON.stringify(body);\n body = Buffer.from(body);\n }\n this.body = body;\n headers['Content-Length'] = body.length;\n headers['Content-Type'] = contentType;\n }\n var requestOptions = (this.requestOptions = {\n hostname: uri.hostname,\n port: uri.port,\n path: uri.path + Utils.toQueryString(params),\n method: method,\n headers: headers,\n });\n if (transport) requestOptions.agent = transport.getAgent(tls);\n }\n\n exec() {\n var timeout = this.requestMode == XHRStates.REQ_SEND ? this.timeouts.httpRequestTimeout : this.timeouts.recvTimeout,\n self = this;\n\n var timer = (this.timer = setTimeout(function () {\n self.abort();\n }, timeout)),\n req = (this.req = this.client.request(this.requestOptions));\n\n req.on(\n 'error',\n (this.onReqError = function (err) {\n err = new PartialErrorInfo('Request error: ' + err.message, null, 400);\n clearTimeout(timer);\n self.timer = null;\n self.complete(err);\n }),\n );\n\n req.on('response', function (res) {\n clearTimeout(timer);\n self.timer = null;\n\n var statusCode = res.statusCode;\n if (statusCode == HttpStatusCodes.NoContent) {\n /* cause the stream to flow, and thus end */\n res.resume();\n self.complete();\n return;\n }\n\n res.on(\n 'error',\n (self.onResError = function (err) {\n err = new PartialErrorInfo('Response error: ' + err.message, null, 400);\n self.complete(err);\n }),\n );\n\n self.res = res;\n /* responses with an non-success statusCode are never streamed */\n if (self.requestMode == XHRStates.REQ_RECV_STREAM && statusCode < 400) {\n self.readStream();\n } else {\n self.readFully();\n }\n });\n\n if (this.transport) this.transport.addPending();\n\n req.end(this.body);\n }\n\n readStream() {\n var res = this.res,\n self = this;\n\n /* an array of text blocks to concatenate and parse once complete */\n this.chunks = [];\n this.streamComplete = false;\n\n function onChunk(chunk) {\n try {\n chunk = JSON.parse(chunk);\n } catch (e) {\n var msg = 'Malformed response body from server: ' + e.message;\n Logger.logAction(self.logger, Logger.LOG_ERROR, 'NodeCometTransport.Request.readStream()', msg);\n self.complete(new PartialErrorInfo(msg, null, 400));\n return;\n }\n self.emit('data', chunk);\n }\n\n res.on(\n 'data',\n (this.ondata = function (data) {\n var newChunks = String(data).split('\\n'),\n chunks = self.chunks;\n\n if (newChunks.length > 1 && chunks.length > 0) {\n /* there is a \\n in this chunk, so it completes the partial chunks we had */\n chunks.push(newChunks.shift());\n self.chunks = [];\n onChunk(chunks.join(''));\n }\n\n /* if the trailing chunk wasn't empty, it's a new fragment */\n var trailingNewChunk = newChunks.pop();\n if (trailingNewChunk.length) {\n self.chunks.push(trailingNewChunk);\n }\n\n /* the remaining new chunks are complete */\n newChunks.map(onChunk);\n }),\n );\n\n res.on('end', function () {\n self.streamComplete = true;\n process.nextTick(function () {\n self.complete();\n });\n });\n }\n\n readFully() {\n var res = this.res,\n chunks = [],\n self = this;\n\n res.on('data', function (chunk) {\n chunks.push(chunk);\n });\n\n res.on('end', function () {\n process.nextTick(function () {\n var body = Buffer.concat(chunks),\n statusCode = res.statusCode;\n\n try {\n body = JSON.parse(String(body));\n } catch (e) {\n var msg = 'Malformed response body from server: ' + e.message;\n Logger.logAction(self.logger, Logger.LOG_ERROR, 'NodeCometTransport.Request.readFully()', msg);\n self.complete(new PartialErrorInfo(msg, null, 400));\n return;\n }\n\n /* If response is an array, it's an array of protocol messages -- even if\n * is contains an error action (hence the nonsuccess statuscode), we can\n * consider the request to have succeeded, just pass it on to\n * onProtocolMessage to decide what to do */\n if (statusCode < 400 || Array.isArray(body)) {\n self.complete(null, body);\n return;\n }\n\n var err = body.error && ErrorInfo.fromValues(body.error);\n if (!err) {\n err = new PartialErrorInfo(\n 'Error response received from server: ' + statusCode + ', body was: ' + util.inspect(body),\n null,\n statusCode,\n );\n }\n self.complete(err);\n });\n });\n }\n\n complete(err, body) {\n if (!this.requestComplete) {\n this.requestComplete = true;\n if (body) this.emit('data', body);\n this.emit('complete', err, body);\n if (err) {\n /* if there was an error mid-stream, ensure\n * we get no new data events from the stream */\n if (this.ondata && !this.streamComplete)\n if (this.ondata && this.res) this.res.removeListener('data', this.ondata);\n }\n if (this.transport) {\n this.transport.removePending();\n }\n }\n }\n\n abort() {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'NodeCometTransport.Request.abort()', '');\n var timer = this.timer;\n if (timer) {\n clearTimeout(timer);\n this.timer = null;\n }\n var req = this.req;\n if (req) {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'NodeCometTransport.Request.abort()', 'aborting request');\n req.removeListener('error', this.onReqError);\n req.on('error', noop);\n req.abort();\n this.req = null;\n }\n this.complete({ statusCode: 400, code: 80003, message: 'Cancelled' });\n }\n}\n\nexport default NodeCometTransport;\n","import { TransportNames } from 'common/constants/TransportName';\nimport NodeCometTransport from './nodecomettransport';\nimport { default as WebSocketTransport } from '../../../../common/lib/transport/websockettransport';\nimport { TransportCtor } from 'common/lib/transport/transport';\n\nexport default {\n order: [TransportNames.Comet],\n bundledImplementations: {\n [TransportNames.WebSocket]: WebSocketTransport as TransportCtor,\n [TransportNames.Comet]: NodeCometTransport as unknown as TransportCtor,\n },\n};\n","import IDefaults from '../../../../common/types/IDefaults';\nimport { TransportNames } from '../../../../common/constants/TransportName';\n\nconst Defaults: IDefaults = {\n connectivityCheckUrl: 'https://internet-up.ably-realtime.com/is-the-internet-up.txt',\n wsConnectivityCheckUrl: 'wss://ws-up.ably-realtime.com',\n /* Note: order matters here: the base transport is the leftmost one in the\n * intersection of baseTransportOrder and the transports clientOption that's supported. */\n defaultTransports: [TransportNames.WebSocket],\n restAgentOptions: { maxSockets: 40, keepAlive: true },\n};\n\nexport default Defaults;\n","// Common\nimport { DefaultRest } from '../../common/lib/client/defaultrest';\nimport { DefaultRealtime } from '../../common/lib/client/defaultrealtime';\nimport Platform from '../../common/platform';\nimport ErrorInfo from '../../common/lib/types/errorinfo';\nimport { makeFromDeserializedWithDependencies as makeProtocolMessageFromDeserialized } from '../../common/lib/types/protocolmessage';\n\n// Platform Specific\nimport BufferUtils from './lib/util/bufferutils';\n// @ts-ignore\nimport { createCryptoClass } from './lib/util/crypto';\nimport Http from './lib/util/http';\nimport Config from './config';\n// @ts-ignore\nimport Transports from './lib/transport';\nimport Logger from '../../common/lib/util/logger';\nimport { getDefaults } from '../../common/lib/util/defaults';\nimport PlatformDefaults from './lib/util/defaults';\nimport msgpack = require('@ably/msgpack-js');\n\nconst Crypto = createCryptoClass(BufferUtils);\n\nPlatform.Crypto = Crypto;\nPlatform.BufferUtils = BufferUtils as typeof Platform.BufferUtils;\nPlatform.Http = Http;\nPlatform.Config = Config;\nPlatform.Transports = Transports;\nPlatform.WebStorage = null;\n\nfor (const clientClass of [DefaultRest, DefaultRealtime]) {\n clientClass.Crypto = Crypto;\n clientClass._MsgPack = msgpack;\n}\n\nLogger.initLogHandlers();\n\nPlatform.Defaults = getDefaults(PlatformDefaults);\n\nif (Platform.Config.agent) {\n // @ts-ignore\n Platform.Defaults.agent += ' ' + Platform.Config.agent;\n}\n\nmodule.exports = {\n ErrorInfo,\n Rest: DefaultRest,\n Realtime: DefaultRealtime,\n msgpack: null,\n makeProtocolMessageFromDeserialized,\n};\n","import { createWriteStream, readFileSync, statSync } from \"node:fs\";\nimport { basename, extname } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { Realtime, type AuthOptions, type InboundMessage } from \"ably\";\nimport type {\n ZeroBuiltInGenerationAcceptedResponse,\n ZeroBuiltInGenerationResponse,\n} from \"@vm0/api-contracts/contracts/zero-built-in-generation\";\nimport type {\n ZeroAvatarVideoAvatar,\n ZeroAvatarVideoAvatarsQuery,\n ZeroAvatarVideoGenerateRequest,\n ZeroAvatarVideoGenerateResponse,\n ZeroAvatarVideoVoice,\n ZeroAvatarVideoVoicesQuery,\n} from \"@vm0/api-contracts/contracts/zero-avatar-video\";\nimport {\n zeroAvatarVideoAvatarsResponseSchema,\n zeroAvatarVideoVoicesResponseSchema,\n} from \"@vm0/api-contracts/contracts/zero-avatar-video\";\nimport { ApiRequestError, getBaseUrl } from \"../core/client-factory\";\nimport { getActiveToken } from \"../config\";\nimport { headersWithCliClientHeaders } from \"../client-headers\";\n\nconst BUILT_IN_GENERATION_POLL_INTERVAL_MS = 2_000;\nconst BUILT_IN_GENERATION_WAIT_TIMEOUT_MS_BY_TYPE = {\n image: 15 * 60 * 1000,\n video: 30 * 60 * 1000,\n presentation: 60 * 60 * 1000,\n website: 60 * 60 * 1000,\n} as const satisfies Record<\n ZeroBuiltInGenerationAcceptedResponse[\"type\"],\n number\n>;\nconst ABLY_CONNECT_TIMEOUT_MS = 10_000;\n\n/**\n * Minimal extension → MIME map covering the server allowlist for\n * `/api/zero/uploads/prepare`. Kept in this file rather than a shared module\n * to match the YAGNI pattern used elsewhere in the CLI.\n */\nconst MIME_BY_EXTENSION: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".avif\": \"image/avif\",\n \".svg\": \"image/svg+xml\",\n \".bmp\": \"image/bmp\",\n \".heic\": \"image/heic\",\n \".heif\": \"image/heif\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".psd\": \"image/vnd.adobe.photoshop\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".aac\": \"audio/aac\",\n \".flac\": \"audio/flac\",\n \".m4a\": \"audio/mp4\",\n \".mp3\": \"audio/mpeg\",\n \".mpga\": \"audio/mpga\",\n \".oga\": \"audio/ogg\",\n \".ogg\": \"audio/ogg\",\n \".opus\": \"audio/opus\",\n \".wav\": \"audio/wav\",\n \".wave\": \"audio/wave\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".csv\": \"text/csv\",\n \".md\": \"text/markdown\",\n \".html\": \"text/html\",\n \".htm\": \"text/html\",\n \".json\": \"application/json\",\n \".xml\": \"application/xml\",\n \".yaml\": \"application/yaml\",\n \".yml\": \"application/yaml\",\n \".tsv\": \"text/tab-separated-values\",\n \".doc\": \"application/msword\",\n \".docx\":\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".docm\": \"application/vnd.ms-word.document.macroenabled.12\",\n \".dotm\": \"application/vnd.ms-word.template.macroenabled.12\",\n \".dotx\":\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n \".odt\": \"application/vnd.oasis.opendocument.text\",\n \".rtf\": \"application/rtf\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".xlsb\": \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n \".xlsm\": \"application/vnd.ms-excel.sheet.macroenabled.12\",\n \".xltm\": \"application/vnd.ms-excel.template.macroenabled.12\",\n \".xltx\":\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n \".ods\": \"application/vnd.oasis.opendocument.spreadsheet\",\n \".ppt\": \"application/vnd.ms-powerpoint\",\n \".pptx\":\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \".potm\": \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n \".potx\":\n \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n \".odp\": \"application/vnd.oasis.opendocument.presentation\",\n \".ppsx\":\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n \".ppsm\": \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n \".pptm\": \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n \".zip\": \"application/zip\",\n \".rar\": \"application/vnd.rar\",\n \".7z\": \"application/x-7z-compressed\",\n \".tar\": \"application/x-tar\",\n \".gz\": \"application/gzip\",\n \".tgz\": \"application/gzip\",\n \".bz2\": \"application/x-bzip2\",\n \".xz\": \"application/x-xz\",\n \".pages\": \"application/vnd.apple.pages\",\n \".numbers\": \"application/vnd.apple.numbers\",\n \".key\": \"application/vnd.apple.keynote\",\n \".parquet\": \"application/vnd.apache.parquet\",\n \".sqlite\": \"application/vnd.sqlite3\",\n \".sqlite3\": \"application/vnd.sqlite3\",\n \".db\": \"application/vnd.sqlite3\",\n \".epub\": \"application/epub+zip\",\n \".ai\": \"application/postscript\",\n};\n\nexport function inferWebUploadContentType(localPath: string): string {\n const ext = extname(localPath).toLowerCase();\n return MIME_BY_EXTENSION[ext] ?? \"application/octet-stream\";\n}\n\ninterface DownloadWebFileResult {\n path: string;\n mimetype: string;\n size: number;\n}\n\n/**\n * Download a web-uploaded file to a local path, streaming the response body\n * to disk. Authenticates via ZERO_TOKEN. Response is binary, so this bypasses\n * the typed contract client.\n */\nexport async function downloadWebFile(\n fileId: string,\n outPath: string,\n): Promise<DownloadWebFileResult> {\n const baseUrl = await getBaseUrl();\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n\n const url = new URL(\"/api/zero/web/download-file\", baseUrl);\n url.searchParams.set(\"file_id\", fileId);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n\n const response = await fetch(url, {\n headers: headersWithCliClientHeaders(headers),\n });\n\n if (!response.ok) {\n let message = `Failed to download web file (HTTP ${response.status})`;\n let code = \"UNKNOWN\";\n try {\n const body = (await response.json()) as {\n error?: { message?: string; code?: string };\n };\n if (body.error?.message) message = body.error.message;\n if (body.error?.code) code = body.error.code;\n } catch {\n // ignore parse errors — keep generic message\n }\n throw new ApiRequestError(message, code, response.status);\n }\n\n if (!response.body) {\n throw new ApiRequestError(\n \"Web download response has no body\",\n \"EMPTY_BODY\",\n 502,\n );\n }\n\n const mimetype =\n response.headers.get(\"x-file-mimetype\") ??\n response.headers.get(\"content-type\") ??\n \"application/octet-stream\";\n\n // Cast required: Web API ReadableStream and Node.js ReadableStream are\n // structurally compatible but have incompatible type declarations.\n await pipeline(\n Readable.fromWeb(response.body as never),\n createWriteStream(outPath),\n );\n\n const contentLengthHeader = response.headers.get(\"content-length\");\n const size = contentLengthHeader ? Number(contentLengthHeader) : 0;\n\n return { path: outPath, mimetype, size };\n}\n\ninterface UploadWebFileResult {\n id: string;\n filename: string;\n contentType: string;\n size: number;\n url: string;\n}\n\ninterface GenerateWebVoiceOptions {\n text: string;\n voice?: string;\n instructions?: string;\n}\n\ninterface GenerateWebVoiceResult {\n id: string;\n filename: string;\n contentType: string;\n size: number;\n url: string;\n durationSeconds: number;\n creditsCharged: number;\n model: string;\n voice: string;\n}\n\ninterface GenerateWebImageOptions {\n prompt: string;\n model?: string;\n size?: string;\n quality?: string;\n background?: string;\n outputFormat?: string;\n outputCompression?: number;\n moderation?: string;\n seed?: number;\n safetyTolerance?: string;\n enhancePrompt?: boolean;\n imageUrls?: readonly string[];\n maskImageUrl?: string;\n inputFidelity?: string;\n imagePromptStrength?: number;\n}\n\ninterface GenerateWebImageResult {\n id: string;\n filename: string;\n contentType: string;\n size: number;\n url: string;\n creditsCharged: number;\n model: string;\n provider: string;\n imageSize: string;\n quality: string;\n background: string;\n outputFormat: string;\n outputCompression?: number;\n moderation?: string;\n safetyTolerance?: string;\n revisedPrompt?: string;\n usage?: {\n textInputTokens: number;\n imageInputTokens: number;\n imageOutputTokens: number;\n totalTokens: number;\n };\n billingCategory?: string;\n billingQuantity?: number;\n sourceUrl?: string;\n seed?: number;\n sourceImageUrls?: string[];\n maskImageUrl?: string;\n inputFidelity?: string;\n imagePromptStrength?: number;\n}\n\ninterface GenerateWebVideoOptions {\n prompt: string;\n model?: string;\n aspectRatio?: string;\n duration?: string;\n resolution?: string;\n generateAudio?: boolean;\n negativePrompt?: string;\n seed?: number;\n autoFix?: boolean;\n safetyTolerance?: string;\n imageUrls?: string[];\n videoUrls?: string[];\n audioUrls?: string[];\n firstFrameImageUrl?: string;\n lastFrameImageUrl?: string;\n}\n\ninterface GenerateWebVideoResult {\n id: string;\n filename: string;\n contentType: string;\n size: number;\n url: string;\n durationSeconds: number;\n creditsCharged: number;\n model: string;\n aspectRatio: string;\n duration: string;\n resolution: string;\n generateAudio: boolean;\n sourceUrl: string;\n requestId?: string;\n}\n\ninterface ListWebAvatarVideoAvatarsResult {\n readonly avatars: readonly ZeroAvatarVideoAvatar[];\n}\n\ninterface ListWebAvatarVideoVoicesResult {\n readonly voices: readonly ZeroAvatarVideoVoice[];\n readonly hasMore: boolean;\n}\n\nfunction shouldIncludePayloadValue(value: unknown): boolean {\n if (value === undefined) {\n return false;\n }\n return !Array.isArray(value) || value.length > 0;\n}\n\nfunction compactPayload(\n entries: readonly (readonly [string, unknown])[],\n): Record<string, unknown> {\n return Object.fromEntries(\n entries.filter(([, value]) => {\n return shouldIncludePayloadValue(value);\n }),\n );\n}\n\nfunction generateWebVideoPayload(\n options: GenerateWebVideoOptions,\n): Record<string, unknown> {\n return compactPayload([\n [\"prompt\", options.prompt],\n [\"model\", options.model],\n [\"aspectRatio\", options.aspectRatio],\n [\"duration\", options.duration],\n [\"resolution\", options.resolution],\n [\"generateAudio\", options.generateAudio],\n [\"negativePrompt\", options.negativePrompt],\n [\"seed\", options.seed],\n [\"autoFix\", options.autoFix],\n [\"safetyTolerance\", options.safetyTolerance],\n [\"imageUrls\", options.imageUrls],\n [\"videoUrls\", options.videoUrls],\n [\"audioUrls\", options.audioUrls],\n [\"firstFrameImageUrl\", options.firstFrameImageUrl],\n [\"lastFrameImageUrl\", options.lastFrameImageUrl],\n ]);\n}\n\ninterface PrepareUploadResponse {\n id: string;\n filename: string;\n contentType: string;\n size: number;\n uploadUrl: string;\n uploadHeaders?: Record<string, string>;\n url: string;\n}\n\ninterface CompleteUploadResponse {\n id: string;\n filename: string;\n contentType: string;\n size: number;\n url: string;\n}\n\nasync function parseErrorBody(\n response: Response,\n fallback: string,\n): Promise<{ message: string; code: string }> {\n let message = `${fallback} (HTTP ${response.status})`;\n let code = \"UNKNOWN\";\n try {\n const body = (await response.json()) as {\n error?: { message?: string; code?: string };\n };\n if (body.error?.message) message = body.error.message;\n if (body.error?.code) code = body.error.code;\n } catch {\n // ignore parse errors — keep generic message\n }\n return { message, code };\n}\n\nfunction authenticatedJsonHeaders(token: string): Headers {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n return headersWithCliClientHeaders(headers);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isBuiltInGenerationAcceptedResponse(\n value: unknown,\n): value is ZeroBuiltInGenerationAcceptedResponse {\n if (!isRecord(value)) {\n return false;\n }\n return (\n typeof value.generationId === \"string\" &&\n value.status === \"queued\" &&\n (value.type === \"image\" ||\n value.type === \"video\" ||\n value.type === \"presentation\" ||\n value.type === \"website\") &&\n isRecord(value.realtime)\n );\n}\n\ninterface BuiltInGenerationNotifier {\n wait(timeoutMs: number): Promise<void>;\n close(): void;\n}\n\nfunction createBuiltInGenerationRealtime(\n accepted: ZeroBuiltInGenerationAcceptedResponse,\n): Realtime {\n let nextAuthRequest = accepted.realtime.tokenRequest;\n const authCallback: NonNullable<AuthOptions[\"authCallback\"]> = (\n _params,\n callback,\n ) => {\n const current = nextAuthRequest;\n nextAuthRequest = accepted.realtime.tokenRequest;\n callback(null, current);\n };\n\n return new Realtime({\n authCallback,\n autoConnect: true,\n disconnectedRetryTimeout: 5000,\n suspendedRetryTimeout: 15_000,\n });\n}\n\nfunction waitForRealtimeConnected(\n ably: Realtime,\n timeoutMs = ABLY_CONNECT_TIMEOUT_MS,\n): Promise<void> {\n if (ably.connection.state === \"connected\") {\n return Promise.resolve();\n }\n if (ably.connection.state === \"failed\") {\n return Promise.reject(new Error(\"Ably connection failed\"));\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"Timed out connecting to Ably\"));\n }, timeoutMs);\n\n ably.connection.once(\"connected\", () => {\n clearTimeout(timer);\n resolve();\n });\n ably.connection.once(\"failed\", (stateChange) => {\n clearTimeout(timer);\n reject(\n new Error(\n `Ably connection failed: ${stateChange?.reason?.message ?? \"unknown\"}`,\n ),\n );\n });\n });\n}\n\nasync function createBuiltInGenerationNotifier(\n accepted: ZeroBuiltInGenerationAcceptedResponse,\n): Promise<BuiltInGenerationNotifier | null> {\n const ably = createBuiltInGenerationRealtime(accepted);\n\n try {\n await waitForRealtimeConnected(ably);\n const channel = ably.channels.get(accepted.realtime.channelName);\n\n let pendingEvent = false;\n let closed = false;\n let wake: (() => void) | null = null;\n\n const wakeWaiter = () => {\n const current = wake;\n wake = null;\n current?.();\n };\n\n const onMessage = (_message: InboundMessage) => {\n if (wake) {\n wakeWaiter();\n return;\n }\n pendingEvent = true;\n };\n\n await channel.subscribe(accepted.realtime.eventName, onMessage);\n\n return {\n wait(timeoutMs: number): Promise<void> {\n if (pendingEvent || closed || timeoutMs <= 0) {\n pendingEvent = false;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n function done() {\n clearTimeout(timer);\n if (wake === done) {\n wake = null;\n }\n resolve();\n }\n const timer = setTimeout(done, timeoutMs);\n wake = done;\n });\n },\n close(): void {\n if (closed) {\n return;\n }\n closed = true;\n channel.unsubscribe(accepted.realtime.eventName, onMessage);\n wakeWaiter();\n ably.close();\n },\n };\n } catch {\n ably.close();\n return null;\n }\n}\n\nasync function getBuiltInGenerationStatus(\n baseUrl: string,\n token: string,\n generationId: string,\n): Promise<ZeroBuiltInGenerationResponse> {\n const response = await fetch(\n new URL(`/api/zero/built-in-generations/${generationId}`, baseUrl),\n { headers: authenticatedJsonHeaders(token) },\n );\n\n if (!response.ok) {\n const { message, code } = await parseErrorBody(\n response,\n \"Failed to get generation status\",\n );\n throw new ApiRequestError(message, code, response.status);\n }\n\n return (await response.json()) as ZeroBuiltInGenerationResponse;\n}\n\nfunction readBuiltInGenerationResult<T>(\n status: ZeroBuiltInGenerationResponse,\n fallback: string,\n): T | undefined {\n if (status.status === \"completed\") {\n if (!status.result) {\n throw new ApiRequestError(\n `${fallback} returned no result`,\n \"EMPTY_RESULT\",\n 502,\n );\n }\n return status.result as T;\n }\n\n if (status.status === \"failed\") {\n const code = status.error?.code ?? \"GENERATION_FAILED\";\n throw new ApiRequestError(\n status.error?.message ?? `${fallback} failed`,\n code,\n statusForBuiltInGenerationError(code),\n );\n }\n\n return undefined;\n}\n\nfunction statusForBuiltInGenerationError(code: string): number {\n if (code === \"BAD_REQUEST\") {\n return 400;\n }\n if (code === \"INSUFFICIENT_CREDITS\") {\n return 402;\n }\n if (code === \"NOT_CONFIGURED\") {\n return 503;\n }\n if (code === \"GENERATION_TIMEOUT\") {\n return 504;\n }\n if (\n code.startsWith(\"BYTEPLUS_INVALID_PARAMETER\") ||\n code.startsWith(\"BYTEPLUS_INPUT_\")\n ) {\n return 400;\n }\n if (code.startsWith(\"BYTEPLUS_\")) {\n return 502;\n }\n if (code.startsWith(\"NO_\") || code.endsWith(\"_FAILED\")) {\n return 502;\n }\n return 500;\n}\n\nasync function waitForBuiltInGenerationResult<T>(args: {\n readonly accepted: ZeroBuiltInGenerationAcceptedResponse;\n readonly baseUrl: string;\n readonly token: string;\n readonly fallback: string;\n}): Promise<T> {\n let notifier: BuiltInGenerationNotifier | null = null;\n let notifierCreated = false;\n const startedAt = Date.now();\n const timeoutMs =\n BUILT_IN_GENERATION_WAIT_TIMEOUT_MS_BY_TYPE[args.accepted.type];\n\n try {\n while (Date.now() - startedAt < timeoutMs) {\n const status = await getBuiltInGenerationStatus(\n args.baseUrl,\n args.token,\n args.accepted.generationId,\n );\n const result = readBuiltInGenerationResult<T>(status, args.fallback);\n if (result) {\n return result;\n }\n\n const elapsed = Date.now() - startedAt;\n const remaining = timeoutMs - elapsed;\n const waitMs = Math.min(BUILT_IN_GENERATION_POLL_INTERVAL_MS, remaining);\n if (!notifierCreated) {\n notifier = await createBuiltInGenerationNotifier(args.accepted);\n notifierCreated = true;\n }\n if (notifier) {\n await notifier.wait(waitMs);\n } else {\n await delay(waitMs);\n }\n }\n } finally {\n notifier?.close();\n }\n\n throw new ApiRequestError(\n `${args.fallback} timed out (generationId: ${args.accepted.generationId})`,\n \"GENERATION_TIMEOUT\",\n 504,\n );\n}\n\nasync function readBuiltInGenerationResponse<T>(args: {\n readonly response: Response;\n readonly baseUrl: string;\n readonly token: string;\n readonly fallback: string;\n}): Promise<T> {\n const body: unknown = await args.response.json();\n if (isBuiltInGenerationAcceptedResponse(body)) {\n return waitForBuiltInGenerationResult<T>({\n accepted: body,\n baseUrl: args.baseUrl,\n token: args.token,\n fallback: args.fallback,\n });\n }\n if (args.response.status === 202) {\n throw new ApiRequestError(\n `${args.fallback} returned an invalid generation response`,\n \"INVALID_GENERATION_RESPONSE\",\n 502,\n );\n }\n return body as T;\n}\n\n/**\n * Upload a local file and receive back metadata including a public CDN URL.\n * Authenticates via ZERO_TOKEN (`file:write` capability) or a CLI\n * PAT / Clerk session.\n *\n * Three-step flow:\n * 1. POST /api/zero/uploads/prepare — server signs a PUT URL for R2\n * 2. PUT the file bytes directly to R2\n * 3. POST /api/zero/uploads/complete — server verifies the object and\n * records any run-scoped upload association\n *\n * Step 2 never touches the Next.js runtime, which lifts the cap from\n * Vercel's ~4.5 MB body limit up to R2's 5 GB single-PUT limit.\n */\nexport async function uploadWebFile(\n localPath: string,\n options?: { contentType?: string },\n): Promise<UploadWebFileResult> {\n const stats = statSync(localPath);\n if (!stats.isFile()) {\n throw new ApiRequestError(\n `Not a regular file: ${localPath}`,\n \"BAD_REQUEST\",\n 400,\n );\n }\n\n const baseUrl = await getBaseUrl();\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n\n const filename = basename(localPath);\n const contentType =\n options?.contentType ?? inferWebUploadContentType(localPath);\n\n const prepareHeaders: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n\n const prepareUrl = new URL(\"/api/zero/uploads/prepare\", baseUrl);\n const prepareRes = await fetch(prepareUrl, {\n method: \"POST\",\n headers: headersWithCliClientHeaders(prepareHeaders),\n body: JSON.stringify({\n filename,\n contentType,\n size: stats.size,\n supportsUploadHeaders: true,\n }),\n });\n\n if (!prepareRes.ok) {\n const { message, code } = await parseErrorBody(\n prepareRes,\n \"Failed to prepare upload\",\n );\n throw new ApiRequestError(message, code, prepareRes.status);\n }\n\n const prepared = (await prepareRes.json()) as PrepareUploadResponse;\n\n const bytes = readFileSync(localPath);\n const putRes = await fetch(prepared.uploadUrl, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": prepared.contentType,\n ...prepared.uploadHeaders,\n },\n body: new Uint8Array(bytes),\n });\n\n if (!putRes.ok) {\n throw new ApiRequestError(\n `Failed to upload file to storage (HTTP ${putRes.status})`,\n \"UPLOAD_FAILED\",\n putRes.status,\n );\n }\n\n const completeUrl = new URL(\"/api/zero/uploads/complete\", baseUrl);\n const completeRes = await fetch(completeUrl, {\n method: \"POST\",\n headers: headersWithCliClientHeaders(prepareHeaders),\n body: JSON.stringify({\n id: prepared.id,\n contentType: prepared.contentType,\n }),\n });\n\n if (!completeRes.ok) {\n const { message, code } = await parseErrorBody(\n completeRes,\n \"Failed to complete upload\",\n );\n throw new ApiRequestError(message, code, completeRes.status);\n }\n\n const completed = (await completeRes.json()) as CompleteUploadResponse;\n\n return {\n id: completed.id,\n filename: completed.filename,\n contentType: completed.contentType,\n size: completed.size,\n url: completed.url,\n };\n}\n\n/**\n * Generate billed speech audio from text and receive the public CDN URL.\n * Authenticates via ZERO_TOKEN (`file:write` capability) or a CLI PAT /\n * Clerk session.\n */\nexport async function generateWebVoice(\n options: GenerateWebVoiceOptions,\n): Promise<GenerateWebVoiceResult> {\n const baseUrl = await getBaseUrl();\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n\n const response = await fetch(new URL(\"/api/zero/voice-io/speech\", baseUrl), {\n method: \"POST\",\n headers: headersWithCliClientHeaders(headers),\n body: JSON.stringify({\n text: options.text,\n ...(options.voice ? { voice: options.voice } : {}),\n ...(options.instructions ? { instructions: options.instructions } : {}),\n }),\n });\n\n if (!response.ok) {\n const { message, code } = await parseErrorBody(\n response,\n \"Failed to generate voice\",\n );\n throw new ApiRequestError(message, code, response.status);\n }\n\n return (await response.json()) as GenerateWebVoiceResult;\n}\n\n/**\n * Generate a billed image from a prompt and receive the public CDN URL.\n * Authenticates via ZERO_TOKEN (`file:write` capability) or a CLI PAT /\n * Clerk session.\n */\nexport async function generateWebImage(\n options: GenerateWebImageOptions,\n): Promise<GenerateWebImageResult> {\n const baseUrl = await getBaseUrl();\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n\n const response = await fetch(\n new URL(\"/api/zero/image-io/generate\", baseUrl),\n {\n method: \"POST\",\n headers: headersWithCliClientHeaders(headers),\n body: JSON.stringify({\n prompt: options.prompt,\n ...(options.model ? { model: options.model } : {}),\n ...(options.size ? { size: options.size } : {}),\n ...(options.quality ? { quality: options.quality } : {}),\n ...(options.background ? { background: options.background } : {}),\n ...(options.outputFormat ? { outputFormat: options.outputFormat } : {}),\n ...(options.outputCompression !== undefined\n ? { outputCompression: options.outputCompression }\n : {}),\n ...(options.moderation ? { moderation: options.moderation } : {}),\n ...(options.seed !== undefined ? { seed: options.seed } : {}),\n ...(options.safetyTolerance\n ? { safetyTolerance: options.safetyTolerance }\n : {}),\n ...(options.enhancePrompt !== undefined\n ? { enhancePrompt: options.enhancePrompt }\n : {}),\n ...(options.imageUrls && options.imageUrls.length > 0\n ? { imageUrls: options.imageUrls }\n : {}),\n ...(options.maskImageUrl ? { maskImageUrl: options.maskImageUrl } : {}),\n ...(options.inputFidelity\n ? { inputFidelity: options.inputFidelity }\n : {}),\n ...(options.imagePromptStrength !== undefined\n ? { imagePromptStrength: options.imagePromptStrength }\n : {}),\n }),\n },\n );\n\n if (!response.ok) {\n const { message, code } = await parseErrorBody(\n response,\n \"Failed to generate image\",\n );\n throw new ApiRequestError(message, code, response.status);\n }\n\n return readBuiltInGenerationResponse<GenerateWebImageResult>({\n response,\n baseUrl,\n token,\n fallback: \"Failed to generate image\",\n });\n}\n\n/**\n * Generate a billed video from a prompt and receive the public CDN URL.\n * Authenticates via ZERO_TOKEN (`file:write` capability) or a CLI PAT /\n * Clerk session.\n */\nexport async function generateWebVideo(\n options: GenerateWebVideoOptions,\n): Promise<GenerateWebVideoResult> {\n const baseUrl = await getBaseUrl();\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n\n const response = await fetch(\n new URL(\"/api/zero/video-io/generate\", baseUrl),\n {\n method: \"POST\",\n headers: headersWithCliClientHeaders(headers),\n body: JSON.stringify(generateWebVideoPayload(options)),\n },\n );\n\n if (!response.ok) {\n const { message, code } = await parseErrorBody(\n response,\n \"Failed to generate video\",\n );\n throw new ApiRequestError(message, code, response.status);\n }\n\n return readBuiltInGenerationResponse<GenerateWebVideoResult>({\n response,\n baseUrl,\n token,\n fallback: \"Failed to generate video\",\n });\n}\n\n/**\n * Generate a billed JoggAI talking-avatar video and receive its public CDN URL.\n */\nexport async function generateWebAvatarVideo(\n options: ZeroAvatarVideoGenerateRequest,\n): Promise<ZeroAvatarVideoGenerateResponse> {\n const baseUrl = await getBaseUrl();\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n const response = await fetch(\n new URL(\"/api/zero/avatar-video/generate\", baseUrl),\n {\n method: \"POST\",\n headers: headersWithCliClientHeaders({\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n }),\n body: JSON.stringify(options),\n },\n );\n if (!response.ok) {\n const { message, code } = await parseErrorBody(\n response,\n \"Failed to generate avatar video\",\n );\n throw new ApiRequestError(message, code, response.status);\n }\n return readBuiltInGenerationResponse<ZeroAvatarVideoGenerateResponse>({\n response,\n baseUrl,\n token,\n fallback: \"Failed to generate avatar video\",\n });\n}\n\nfunction avatarVideoCollectionUrl(\n baseUrl: string,\n collection: \"avatars\" | \"voices\",\n query: Record<string, string | number | undefined>,\n): URL {\n const url = new URL(`/api/zero/avatar-video/${collection}`, baseUrl);\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n return url;\n}\n\nasync function getAvatarVideoCollection(\n url: URL,\n fallback: string,\n): Promise<unknown> {\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n const response = await fetch(url, {\n headers: headersWithCliClientHeaders({\n Authorization: `Bearer ${token}`,\n }),\n });\n if (!response.ok) {\n const { message, code } = await parseErrorBody(response, fallback);\n throw new ApiRequestError(message, code, response.status);\n }\n return await response.json();\n}\n\nexport async function listWebAvatarVideoAvatars(\n query: ZeroAvatarVideoAvatarsQuery,\n): Promise<ListWebAvatarVideoAvatarsResult> {\n const baseUrl = await getBaseUrl();\n return zeroAvatarVideoAvatarsResponseSchema.parse(\n await getAvatarVideoCollection(\n avatarVideoCollectionUrl(baseUrl, \"avatars\", query),\n \"Failed to list JoggAI avatars\",\n ),\n );\n}\n\nexport async function listWebAvatarVideoVoices(\n query: ZeroAvatarVideoVoicesQuery,\n): Promise<ListWebAvatarVideoVoicesResult> {\n const baseUrl = await getBaseUrl();\n return zeroAvatarVideoVoicesResponseSchema.parse(\n await getAvatarVideoCollection(\n avatarVideoCollectionUrl(baseUrl, \"voices\", query),\n \"Failed to list JoggAI voices\",\n ),\n );\n}\n\nexport interface TranscribeAudioSegment {\n readonly start: number;\n readonly end: number;\n readonly text: string;\n}\n\ninterface TranscribeAudioResult {\n readonly text: string;\n readonly segments?: readonly TranscribeAudioSegment[];\n}\n\nexport async function transcribeAudio(\n audioPath: string,\n options: { readonly verbose?: boolean } = {},\n): Promise<TranscribeAudioResult> {\n const baseUrl = await getBaseUrl();\n const token = await getActiveToken();\n if (!token) {\n throw new ApiRequestError(\"Not authenticated\", \"UNAUTHORIZED\", 401);\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n\n const url = new URL(\"/api/zero/voice-io/stt\", baseUrl);\n if (options.verbose) {\n url.searchParams.set(\"verbose\", \"true\");\n }\n\n const audioData = readFileSync(audioPath);\n const filename = basename(audioPath);\n const ext = extname(filename).toLowerCase();\n const mimeMap: Record<string, string> = {\n \".mp3\": \"audio/mpeg\",\n \".mp4\": \"audio/mp4\",\n \".m4a\": \"audio/m4a\",\n \".wav\": \"audio/wav\",\n \".webm\": \"audio/webm\",\n };\n const mimeType = mimeMap[ext] ?? \"audio/mpeg\";\n\n const formData = new FormData();\n formData.append(\"file\", new Blob([audioData], { type: mimeType }), filename);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: headersWithCliClientHeaders(headers),\n body: formData,\n });\n\n if (!response.ok) {\n const { message, code } = await parseErrorBody(\n response,\n \"Transcription failed\",\n );\n throw new ApiRequestError(message, code, response.status);\n }\n\n return (await response.json()) as TranscribeAudioResult;\n}\n"],"mappings":"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","names":["dir","platform","arch","runtime","abi","require_node_gyp_build","mask","data","require_fallback","Readable","URL","key","err","protocol","require_source","require_source","cb","Readable","require_src","require_src","key","value","keyPrefixed","require_src","opts","require_mimic_response","key","value","result","reject","origin","listeners","Readable","require_source","require_proxy_events","delay","require_url_to_options","self","url","handler","_a","exports","exports","hook","promise","require_types","exports","delay","require_source","exports","__commonJS","exports","module","Buffer","version","copy","require_create","key","encode","decode","_a","_Logger","Format","removeListener","agent","Crypto","HttpMethods","HttpStatusCodes","tokenDetails","err","self","logResult","headers","params","_PushChannelSubscription","actions","fromEncoded","fromEncodedArray","_fromEncoded","_fromEncodedArray","serialize","_DefaultRest","TransportNames","globalObject","connectionDetails","_BaseRealtime","Channels","members","listeners","_DefaultRealtime","__toESM","crypto","import_crypto","util","import_http","Http","http","https","got","import_util","WebSocket","XHRStates","import_https","noop","shortName","url","transport_default","Defaults","defaults_default"]}
|