@pitcher/js-api 1.25.1 → 1.26.0-beta.10

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.
Files changed (103) hide show
  1. package/impact-js-api.spec.json +15 -0
  2. package/js-api.esm.js +343 -2
  3. package/js-api.esm.js.map +1 -1
  4. package/js-api.umd.min.js +10 -10
  5. package/js-api.umd.min.js.map +1 -1
  6. package/lib/apps/agenda-selector/components/modals/ApplicationBlockSelectorModal.vue.d.ts +148 -36
  7. package/lib/apps/browser/components/UploadFilesModal/UploadFilesModal.vue.d.ts +2 -2
  8. package/lib/apps/browser/stores/api.d.ts +22 -1
  9. package/lib/apps/canvas-builder/components/container/AddComponentModal/AddComponentModal.vue.d.ts +148 -36
  10. package/lib/apps/canvas-builder/components/container/CanvasContent/CanvasContent.vue.d.ts +2 -2
  11. package/lib/apps/canvas-builder/components/container/Navigator/Navigator.vue.d.ts +162 -37
  12. package/lib/apps/canvas-builder/components/ui/Carousel/Carousel.settings.vue.d.ts +2 -2
  13. package/lib/apps/canvas-builder/components/ui/ContentGrid/ContentGridCarousel.vue.d.ts +20 -20
  14. package/lib/apps/canvas-builder/components/ui/ContentList/ContentList.raw.vue.d.ts +30 -0
  15. package/lib/apps/canvas-builder/components/ui/ContentList/ContentList.vue.d.ts +76 -0
  16. package/lib/apps/canvas-builder/components/ui/ContentList/ContentListItems.vue.d.ts +21 -0
  17. package/lib/apps/canvas-builder/components/ui/ContentList/content.store.d.ts +11 -0
  18. package/lib/apps/canvas-builder/components/ui/DataCharts/DataCharts.raw.vue.d.ts +4 -0
  19. package/lib/apps/canvas-builder/components/ui/DataCharts/types.d.ts +87 -8
  20. package/lib/apps/canvas-builder/components/ui/Embeddable/Embeddable.settings.vue.d.ts +4 -4
  21. package/lib/apps/canvas-builder/components/ui/IFrame/IFrame.settings.vue.d.ts +2 -2
  22. package/lib/apps/canvas-builder/components/ui/Link/Link.settings.vue.d.ts +2 -2
  23. package/lib/apps/canvas-builder/components/ui/Multimedia/Multimedia.settings.vue.d.ts +2 -2
  24. package/lib/apps/canvas-builder/components/ui/Page/Page.settings.vue.d.ts +2 -2
  25. package/lib/apps/canvas-builder/components/ui/Root/Root.settings.vue.d.ts +2 -2
  26. package/lib/apps/canvas-builder/composables/useCanvas.d.ts +368 -202
  27. package/lib/apps/canvas-builder/composables/useCanvasBlocks.d.ts +30 -2
  28. package/lib/apps/canvas-builder/composables/useCanvasCompletionWizard.d.ts +1 -1
  29. package/lib/apps/canvas-builder/composables/useCanvasHistory.d.ts +28 -0
  30. package/lib/apps/canvas-builder/composables/useCanvasPages.d.ts +7 -9
  31. package/lib/apps/canvas-builder/composables/useCanvasSectionOverrides.d.ts +1 -1
  32. package/lib/apps/canvas-builder/composables/useCanvasTheme.d.ts +18 -18
  33. package/lib/apps/canvas-builder/composables/useCanvasVisibility.d.ts +1 -1
  34. package/lib/apps/canvas-builder/composables/usePitcherEvents.d.ts +0 -6
  35. package/lib/apps/canvas-builder/composables/usePopupApps.d.ts +2 -0
  36. package/lib/apps/canvas-builder/composables/useReorderComponent.d.ts +3 -3
  37. package/lib/apps/canvas-builder/composables/useScribbleChild.d.ts +1 -1
  38. package/lib/apps/canvas-builder/types/canvas.d.ts +20 -2
  39. package/lib/apps/canvas-builder/util/canvas.util.d.ts +4 -4
  40. package/lib/apps/canvas-selector/stores/app.d.ts +14 -14
  41. package/lib/apps/content-selector/components/Assets.vue.d.ts +2 -2
  42. package/lib/apps/content-selector/components/Content.vue.d.ts +2 -2
  43. package/lib/components/CCarousel/CCarousel.vue.d.ts +98 -20
  44. package/lib/components/CComponentListItem/CComponentListItem.vue.d.ts +8 -8
  45. package/lib/components/CConfigEditor/CConfigEditor.vue.d.ts +2 -2
  46. package/lib/components/CContactSelector/CContactSelectorAccountsWithContacts.vue.d.ts +3 -3
  47. package/lib/components/CCreateTemplateSectionBlockModal/CCreateTemplateSectionBlockModal.vue.d.ts +2 -2
  48. package/lib/components/CCreateThemeModal/steps/CThemeSettingsStep.vue.d.ts +10 -8
  49. package/lib/components/CDataTable/CDataTable.vue.d.ts +876 -100
  50. package/lib/components/CFileViewer/pdf/CFileViewerPageDrawer.pdf.vue.d.ts +2 -2
  51. package/lib/components/CImage/CImage.vue.d.ts +99 -20
  52. package/lib/components/CInput/CInput.vue.d.ts +148 -36
  53. package/lib/components/CRichTextEditor/components/CDynamicValueTreeSelect.vue.d.ts +288 -80
  54. package/lib/components/CRichTextEditor/components/CFormatterWithFieldSelect.vue.d.ts +468 -130
  55. package/lib/components/CRichTextEditor/components/CHandlebarsHelperTreeSelect.vue.d.ts +288 -80
  56. package/lib/components/CRichTextEditor/components/CHyperLinkToolbar.vue.d.ts +148 -36
  57. package/lib/components/CTableInput/CTableInput.vue.d.ts +296 -72
  58. package/lib/components/CTableTag/CTableTag.vue.d.ts +290 -38
  59. package/lib/components/CTags/CTags.vue.d.ts +290 -38
  60. package/lib/components/CTemplateAccessInfo/CTemplateAccessInfo.vue.d.ts +25 -0
  61. package/lib/components/CTemplateAccessManage/CTemplateAccessManage.vue.d.ts +26 -0
  62. package/lib/components/CUpsertFolderModal/CUpsertFolderModal.vue.d.ts +2 -2
  63. package/lib/components/CUserMenu/CUserMenu.vue.d.ts +108 -30
  64. package/lib/components/canvas-templates/CTemplateManagement.vue.d.ts +2 -0
  65. package/lib/components/savedCanvases/CSavedCanvasesManagementOwnerCell.vue.d.ts +176 -46
  66. package/lib/components/savedCanvases/smartFolders/SmartFolders.use.d.ts +4 -4
  67. package/lib/constants/cdp.const.d.ts +3 -0
  68. package/lib/main.lib.d.ts +5 -0
  69. package/lib/sdk/api/HighLevelApi.d.ts +7 -0
  70. package/lib/sdk/api/modules/query.d.ts +153 -1
  71. package/lib/sdk/interfaces.d.ts +4 -1
  72. package/lib/sdk/main.d.ts +22 -0
  73. package/lib/sdk/payload.types.d.ts +116 -0
  74. package/lib/sdk/peer-connectivity/index.d.ts +3 -0
  75. package/lib/sdk/peer-connectivity/peerConnectivity.constants.d.ts +13 -0
  76. package/lib/sdk/peer-connectivity/peerConnectivity.d.ts +3 -0
  77. package/lib/sdk/peer-connectivity/peerConnectivity.types.d.ts +35 -0
  78. package/lib/theme/light.d.ts +113 -8
  79. package/lib/types/app.d.ts +7 -0
  80. package/lib/types/canvases.d.ts +2 -0
  81. package/lib/types/instanceSettings.types.d.ts +1 -0
  82. package/lib/types/launchDarkly.types.d.ts +1 -1
  83. package/lib/types/organizationSettings.types.d.ts +3 -0
  84. package/lib/util/app.util.d.ts +46 -0
  85. package/lib/util/handlebars.d.ts +35 -0
  86. package/npm-cache/_cacache/content-v2/sha512/3e/27/b4826de89487d07340c5facfb59a809827e65850e472a2d853f7f72dbfc2b4ce5b453253d8c1b11077f5dccb02ea418d8708e7f3f52f756f276b663740a3 +0 -0
  87. package/npm-cache/_cacache/content-v2/sha512/64/5a/421e053f6177ae9816e985e900126bd7808f16ec0cc5f58c3e082c79c37d1610e6d493c0b99e4d09224e84ad12bcefb46b8f4cabd04d0f397fa8a5b999e3 +0 -0
  88. package/npm-cache/_cacache/index-v5/ef/db/1a303888dee96dbf0872b6eb0b16af940d57c22846114d55ac441140c1a2 +3 -0
  89. package/npm-cache/_logs/2025-12-12T08_06_50_883Z-debug-0.log +1194 -0
  90. package/npm-cache/_logs/2025-12-12T08_20_34_296Z-debug-0.log +1218 -0
  91. package/package.json +1 -1
  92. package/types/openapi/models/Account.d.ts +1 -1
  93. package/types/openapi/models/AccountRequest.d.ts +1 -1
  94. package/types/openapi/models/DeletedFolder.d.ts +1 -0
  95. package/types/openapi/models/Folder.d.ts +1 -0
  96. package/types/openapi/models/FolderCreate.d.ts +3 -0
  97. package/types/openapi/models/FolderFile.d.ts +2 -0
  98. package/types/openapi/models/FolderRetrieve.d.ts +4 -0
  99. package/types/openapi/models/FolderUpdate.d.ts +3 -0
  100. package/types/openapi/models/InstanceMembershipUser.d.ts +1 -0
  101. package/types/openapi/models/OfflineSyncFolder.d.ts +1 -0
  102. package/types/openapi/models/User.d.ts +4 -1
  103. /package/lib/apps/canvas-builder/components/{ui/SectionList/SectionSearch.vue.d.ts → container/Search/Search.vue.d.ts} +0 -0
@@ -178,6 +178,21 @@
178
178
  "crm_query": {
179
179
  "description": ""
180
180
  },
181
+ "crm_smart_query": {
182
+ "description": "Execute a SmartStore query against local CRM data. iOS only."
183
+ },
184
+ "crm_smart_upsert_objects": {
185
+ "description": "Upsert CRM objects into local CRM data using SmartStore. iOS only."
186
+ },
187
+ "crm_smart_object_validation_rules": {
188
+ "description": "Retrieve validation rules for a CRM smart object. iOS only."
189
+ },
190
+ "crm_smart_object_metadata": {
191
+ "description": "Retrieve metadata for a CRM smart object. iOS only."
192
+ },
193
+ "crm_smart_delete_objects": {
194
+ "description": "Delete CRM objects from local CRM data using SmartStore. iOS only."
195
+ },
181
196
  "search": {
182
197
  "description": ""
183
198
  },
package/js-api.esm.js CHANGED
@@ -2537,6 +2537,153 @@ function query(payload) {
2537
2537
  function crmQuery(payload) {
2538
2538
  return highLevelApi.API.request("crm_query", payload);
2539
2539
  }
2540
+ function crmSmartQuery(payload) {
2541
+ const query2 = payload.query;
2542
+ if (!query2 || typeof query2 !== "string") {
2543
+ return Promise.reject(new Error("Query is required and must be a string"));
2544
+ }
2545
+ const smartStorePattern = /\{[^}]+:[^}]+\}/;
2546
+ if (!smartStorePattern.test(query2.trim())) {
2547
+ return Promise.reject(
2548
+ new Error(
2549
+ "Invalid SmartStore query syntax. SmartStore queries must use curly braces syntax: {SoupName:FieldName}"
2550
+ )
2551
+ );
2552
+ }
2553
+ return highLevelApi.API.request("crm_smart_query", payload);
2554
+ }
2555
+ function crmSmartObjectMetadata(payload) {
2556
+ if (!payload) {
2557
+ return Promise.reject(new Error("Payload is required"));
2558
+ }
2559
+ const objectName = payload.object;
2560
+ if (!objectName || typeof objectName !== "string" || objectName.trim() === "") {
2561
+ return Promise.reject(new Error("Object name is required and must be a non-empty string"));
2562
+ }
2563
+ return highLevelApi.API.request("crm_smart_object_metadata", payload);
2564
+ }
2565
+ function crmSmartUpsertObjects(payload) {
2566
+ if (!payload || !payload.objects || !Array.isArray(payload.objects)) {
2567
+ return Promise.reject(new Error("Payload must contain an array of objects"));
2568
+ }
2569
+ if (payload.objects.length === 0) {
2570
+ return Promise.reject(new Error("Objects array cannot be empty"));
2571
+ }
2572
+ for (const obj of payload.objects) {
2573
+ if (!obj) {
2574
+ return Promise.reject(new Error("Objects array cannot contain null or undefined elements"));
2575
+ }
2576
+ if (!obj.table_name || typeof obj.table_name !== "string" || obj.table_name.trim() === "") {
2577
+ return Promise.reject(new Error("Each object must have a valid non-empty table_name"));
2578
+ }
2579
+ if (obj.external_id_path !== void 0) {
2580
+ if (typeof obj.external_id_path !== "string" || obj.external_id_path.trim() === "") {
2581
+ return Promise.reject(
2582
+ new Error(
2583
+ `Object for table ${obj.table_name} has invalid external_id_path. It must be a non-empty string or undefined.`
2584
+ )
2585
+ );
2586
+ }
2587
+ }
2588
+ if (!obj.objects || !Array.isArray(obj.objects) || obj.objects.length === 0) {
2589
+ return Promise.reject(new Error(`Object for table ${obj.table_name} must have a non-empty objects array`));
2590
+ }
2591
+ for (let i = 0; i < obj.objects.length; i++) {
2592
+ const record = obj.objects[i];
2593
+ if (!record || typeof record !== "object" || Array.isArray(record)) {
2594
+ return Promise.reject(
2595
+ new Error(
2596
+ `Object for table ${obj.table_name} contains invalid element at index ${i}. All records must be valid objects, not null, undefined, or arrays.`
2597
+ )
2598
+ );
2599
+ }
2600
+ }
2601
+ }
2602
+ return highLevelApi.API.request("crm_smart_upsert_objects", payload);
2603
+ }
2604
+ function crmSmartObjectValidationRules(payload) {
2605
+ if (!payload) {
2606
+ return Promise.reject(new Error("Payload is required"));
2607
+ }
2608
+ const objectName = payload.object;
2609
+ if (!objectName || typeof objectName !== "string" || objectName.trim() === "") {
2610
+ return Promise.reject(new Error("Object name is required and must be a non-empty string"));
2611
+ }
2612
+ return highLevelApi.API.request("crm_smart_object_validation_rules", payload);
2613
+ }
2614
+ function crmSmartDeleteObjects(payload) {
2615
+ if (!payload || !payload.objects || !Array.isArray(payload.objects)) {
2616
+ return Promise.reject(new Error("Payload must contain an array of objects"));
2617
+ }
2618
+ if (payload.objects.length === 0) {
2619
+ return Promise.reject(new Error("Objects array cannot be empty"));
2620
+ }
2621
+ for (const obj of payload.objects) {
2622
+ if (!obj) {
2623
+ return Promise.reject(new Error("Objects array cannot contain null or undefined elements"));
2624
+ }
2625
+ if (!obj.table_name || typeof obj.table_name !== "string" || obj.table_name.trim() === "") {
2626
+ return Promise.reject(new Error("Each object must have a valid non-empty table_name"));
2627
+ }
2628
+ if (!obj.ids || !Array.isArray(obj.ids) || obj.ids.length === 0) {
2629
+ return Promise.reject(new Error(`Object for table ${obj.table_name} must have a non-empty ids array`));
2630
+ }
2631
+ for (let i = 0; i < obj.ids.length; i++) {
2632
+ const id = obj.ids[i];
2633
+ if (!id || typeof id !== "string" || id.trim() === "") {
2634
+ return Promise.reject(
2635
+ new Error(
2636
+ `Object for table ${obj.table_name} contains invalid id at index ${i}. All IDs must be non-empty strings.`
2637
+ )
2638
+ );
2639
+ }
2640
+ }
2641
+ }
2642
+ return highLevelApi.API.request("crm_smart_delete_objects", payload);
2643
+ }
2644
+ function crmCreate(payload) {
2645
+ if (!payload) {
2646
+ return Promise.reject(new Error("Payload is required"));
2647
+ }
2648
+ if (!payload.sobject || typeof payload.sobject !== "string" || payload.sobject.trim() === "") {
2649
+ return Promise.reject(new Error("sobject is required and must be a non-empty string"));
2650
+ }
2651
+ if (!payload.records || !Array.isArray(payload.records) || payload.records.length === 0) {
2652
+ return Promise.reject(new Error("records is required and must be a non-empty array"));
2653
+ }
2654
+ for (let i = 0; i < payload.records.length; i++) {
2655
+ const record = payload.records[i];
2656
+ if (!record || typeof record !== "object" || Array.isArray(record)) {
2657
+ return Promise.reject(
2658
+ new Error(`records contains invalid element at index ${i}. All records must be valid objects.`)
2659
+ );
2660
+ }
2661
+ }
2662
+ return highLevelApi.API.request("crm_create", payload);
2663
+ }
2664
+ function crmUpsert(payload) {
2665
+ if (!payload) {
2666
+ return Promise.reject(new Error("Payload is required"));
2667
+ }
2668
+ if (!payload.sobject || typeof payload.sobject !== "string" || payload.sobject.trim() === "") {
2669
+ return Promise.reject(new Error("sobject is required and must be a non-empty string"));
2670
+ }
2671
+ if (!payload.records || !Array.isArray(payload.records) || payload.records.length === 0) {
2672
+ return Promise.reject(new Error("records is required and must be a non-empty array"));
2673
+ }
2674
+ if (!payload.external_id_field || typeof payload.external_id_field !== "string" || payload.external_id_field.trim() === "") {
2675
+ return Promise.reject(new Error("external_id_field is required and must be a non-empty string"));
2676
+ }
2677
+ for (let i = 0; i < payload.records.length; i++) {
2678
+ const record = payload.records[i];
2679
+ if (!record || typeof record !== "object" || Array.isArray(record)) {
2680
+ return Promise.reject(
2681
+ new Error(`records contains invalid element at index ${i}. All records must be valid objects.`)
2682
+ );
2683
+ }
2684
+ }
2685
+ return highLevelApi.API.request("crm_upsert", payload);
2686
+ }
2540
2687
 
2541
2688
  function getFolders(payload) {
2542
2689
  return this.API.request("get_folders", payload);
@@ -2633,7 +2780,14 @@ const modules = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
2633
2780
  createFavorite,
2634
2781
  createFile,
2635
2782
  createFolder,
2783
+ crmCreate,
2636
2784
  crmQuery,
2785
+ crmSmartDeleteObjects,
2786
+ crmSmartObjectMetadata,
2787
+ crmSmartObjectValidationRules,
2788
+ crmSmartQuery,
2789
+ crmSmartUpsertObjects,
2790
+ crmUpsert,
2637
2791
  deleteCanvas,
2638
2792
  deleteEvent,
2639
2793
  deleteFavorite,
@@ -2807,6 +2961,7 @@ var PitcherEventName = /* @__PURE__ */ ((PitcherEventName2) => {
2807
2961
  PitcherEventName2["ITEM_SHAREBOX_ADD_REQUESTED"] = "item_sharebox_add_requested";
2808
2962
  PitcherEventName2["ITEM_SHAREBOX_ADD_COMPLETED"] = "item_sharebox_add_completed";
2809
2963
  PitcherEventName2["SYNC_BADGE_VALUE_REPORTED"] = "sync_badge_value_reported";
2964
+ PitcherEventName2["PEER_CONNECTIVITY_EVENT"] = "peer_connectivity_event";
2810
2965
  return PitcherEventName2;
2811
2966
  })(PitcherEventName || {});
2812
2967
  var PitcherBroadcastedEventName = /* @__PURE__ */ ((PitcherBroadcastedEventName2) => {
@@ -2839,6 +2994,9 @@ function assert(exp, message) {
2839
2994
  const defaultSkipKeys = [
2840
2995
  "id__in",
2841
2996
  "tags__in",
2997
+ "tags__not_in",
2998
+ "template__id",
2999
+ "template__id__in",
2842
3000
  "modified_at__gtr",
2843
3001
  "created_at__gtr",
2844
3002
  "end_at__lt",
@@ -3221,6 +3379,15 @@ function getTopPitcherWindow(current = window) {
3221
3379
  }
3222
3380
 
3223
3381
  const TRUNCATE_LENGTH_TRIGGER = 10;
3382
+ const RAW_PAYLOAD_METHODS = [
3383
+ "crm_create",
3384
+ "crm_upsert",
3385
+ "crm_smart_query",
3386
+ "crm_smart_object_metadata",
3387
+ "crm_smart_object_validation_rules",
3388
+ "crm_smart_upsert_objects",
3389
+ "crm_smart_delete_objects"
3390
+ ];
3224
3391
  function updateOnlineHandlersEnv(env) {
3225
3392
  env && setEnv(env);
3226
3393
  }
@@ -3286,7 +3453,8 @@ class LowLevelApi extends EventEmitter {
3286
3453
  throw new Error("unsupported response status");
3287
3454
  }
3288
3455
  };
3289
- const payload = cloneDeep(snakeCaseKeys(body));
3456
+ const shouldSkipSnakeCase = type === "crm_create" || type === "crm_upsert" || type === "crm_smart_query" || type === "crm_smart_object_metadata" || type === "crm_smart_object_validation_rules" || type === "crm_smart_upsert_objects" || type === "crm_smart_delete_objects" || RAW_PAYLOAD_METHODS.includes(type);
3457
+ const payload = shouldSkipSnakeCase ? cloneDeep(body) : cloneDeep(snakeCaseKeys(body));
3290
3458
  this.callbacks[id] = {
3291
3459
  dispatched_at: Date.now(),
3292
3460
  type,
@@ -4031,6 +4199,179 @@ const dsr = {
4031
4199
  ...filesDsr
4032
4200
  };
4033
4201
 
4202
+ const PEER_CONNECTIVITY_EVENT = "peer_connectivity_event";
4203
+ const PeerConnectivityActions = {
4204
+ CANVAS_PAGE_NEXT: "canvas.navigate.next",
4205
+ CANVAS_PAGE_PREVIOUS: "canvas.navigate.previous",
4206
+ CANVAS_OPEN: "canvas.open",
4207
+ CANVAS_CLOSE: "canvas.close",
4208
+ ROUTE_CHANGE: "route.change",
4209
+ FILE_OPEN: "file.open",
4210
+ FILE_CLOSE: "file.close",
4211
+ BROWSER_FOLDER_OPEN: "browser.folder.open"
4212
+ };
4213
+ const DEFAULT_PEER_CONNECTIVITY_VERSION = 1;
4214
+ const PEER_CONNECTIVITY_HANDLER_MATCH_ALL = "*";
4215
+
4216
+ const handlers = /* @__PURE__ */ new Map();
4217
+ let unsubscribeNativeListener = null;
4218
+ let peerConnectivitySupportPromise = null;
4219
+ function generateCorrelationId() {
4220
+ const cryptoApi = globalThis.crypto;
4221
+ if (cryptoApi?.randomUUID) {
4222
+ return cryptoApi.randomUUID();
4223
+ }
4224
+ return `peer-${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`;
4225
+ }
4226
+ function normalizeEventPayload(payload, defaults) {
4227
+ const metadata = payload.metadata ?? {};
4228
+ const normalized = {
4229
+ version: payload.version ?? defaults?.version ?? DEFAULT_PEER_CONNECTIVITY_VERSION,
4230
+ action: payload.action,
4231
+ context: payload.context ?? defaults?.context,
4232
+ data: payload.data ?? defaults?.data,
4233
+ metadata: {
4234
+ correlationId: metadata.correlationId ?? defaults?.metadata?.correlationId ?? generateCorrelationId(),
4235
+ source: metadata.source ?? defaults?.metadata?.source ?? "web",
4236
+ timestamp: metadata.timestamp ?? defaults?.metadata?.timestamp ?? Date.now(),
4237
+ extras: {
4238
+ ...defaults?.metadata?.extras ?? {},
4239
+ ...metadata.extras ?? {}
4240
+ }
4241
+ }
4242
+ };
4243
+ return normalized;
4244
+ }
4245
+ function addHandler(action, handler) {
4246
+ const key = action || PEER_CONNECTIVITY_HANDLER_MATCH_ALL;
4247
+ const handlerSet = handlers.get(key) ?? /* @__PURE__ */ new Set();
4248
+ handlerSet.add(handler);
4249
+ handlers.set(key, handlerSet);
4250
+ }
4251
+ function removeHandler(action, handler) {
4252
+ const handlerSet = handlers.get(action);
4253
+ if (!handlerSet) {
4254
+ return;
4255
+ }
4256
+ handlerSet.delete(handler);
4257
+ if (!handlerSet.size) {
4258
+ handlers.delete(action);
4259
+ }
4260
+ if (!handlers.size) {
4261
+ teardownNativeListener();
4262
+ }
4263
+ }
4264
+ async function ensureNativeListener() {
4265
+ if (unsubscribeNativeListener) {
4266
+ return;
4267
+ }
4268
+ const api = usePitcherApi();
4269
+ const listener = (event) => {
4270
+ try {
4271
+ const normalized = normalizeEventPayload(event, {
4272
+ metadata: {
4273
+ correlationId: generateCorrelationId(),
4274
+ source: "native",
4275
+ timestamp: Date.now(),
4276
+ extras: {}
4277
+ }
4278
+ });
4279
+ dispatchEvent(normalized);
4280
+ } catch (error) {
4281
+ console.error("[peer-connectivity] Failed to handle native event:", error);
4282
+ }
4283
+ };
4284
+ api.on(PitcherEventName.PEER_CONNECTIVITY_EVENT, listener);
4285
+ unsubscribeNativeListener = () => {
4286
+ api.off(PitcherEventName.PEER_CONNECTIVITY_EVENT, listener);
4287
+ unsubscribeNativeListener = null;
4288
+ };
4289
+ }
4290
+ function teardownNativeListener() {
4291
+ if (unsubscribeNativeListener) {
4292
+ unsubscribeNativeListener();
4293
+ unsubscribeNativeListener = null;
4294
+ }
4295
+ }
4296
+ function dispatchEvent(event) {
4297
+ const specificHandlers = handlers.get(event.action);
4298
+ const wildcardHandlers = handlers.get(PEER_CONNECTIVITY_HANDLER_MATCH_ALL);
4299
+ if (!specificHandlers && !wildcardHandlers) {
4300
+ return;
4301
+ }
4302
+ const payload = Object.freeze(event);
4303
+ specificHandlers?.forEach((handler) => {
4304
+ try {
4305
+ handler(payload);
4306
+ } catch (error) {
4307
+ console.error(`[peer-connectivity] Handler error for action "${event.action}":`, error);
4308
+ }
4309
+ });
4310
+ wildcardHandlers?.forEach((handler) => {
4311
+ try {
4312
+ handler(payload);
4313
+ } catch (error) {
4314
+ console.error("[peer-connectivity] Handler error for wildcard action:", error);
4315
+ }
4316
+ });
4317
+ }
4318
+ async function isPeerConnectivitySupported() {
4319
+ if (!peerConnectivitySupportPromise) {
4320
+ const api = usePitcherApi();
4321
+ peerConnectivitySupportPromise = api.getEnv().then((env) => env.mode === "IOS").catch((error) => {
4322
+ console.error("[peer-connectivity] Failed to determine environment support:", error);
4323
+ return false;
4324
+ });
4325
+ }
4326
+ return peerConnectivitySupportPromise;
4327
+ }
4328
+ function normalizeActions(actionOrActions) {
4329
+ return Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions];
4330
+ }
4331
+ function registerPeerConnectivityHandler(actionOrActions, handler) {
4332
+ normalizeActions(actionOrActions).forEach((action) => {
4333
+ addHandler(action, handler);
4334
+ });
4335
+ ensureNativeListener().catch((error) => {
4336
+ console.error("[peer-connectivity] Failed to register native listener:", error);
4337
+ });
4338
+ return () => {
4339
+ normalizeActions(actionOrActions).forEach((action) => {
4340
+ removeHandler(action, handler);
4341
+ });
4342
+ };
4343
+ }
4344
+ async function sendPeerConnectivityEvent(payload, options) {
4345
+ if (!payload?.action) {
4346
+ console.warn("[peer-connectivity] Attempted to send an event without action");
4347
+ return;
4348
+ }
4349
+ if (options?.isFeatureEnabled === false) {
4350
+ return;
4351
+ }
4352
+ const isSupported = await isPeerConnectivitySupported();
4353
+ if (!isSupported) {
4354
+ return;
4355
+ }
4356
+ const api = usePitcherApi();
4357
+ const normalizedPayload = normalizeEventPayload(payload, {
4358
+ metadata: {
4359
+ correlationId: generateCorrelationId(),
4360
+ source: "web",
4361
+ timestamp: Date.now(),
4362
+ extras: {}
4363
+ }
4364
+ });
4365
+ try {
4366
+ await api.broadcast({
4367
+ type: PitcherEventName.PEER_CONNECTIVITY_EVENT,
4368
+ body: normalizedPayload
4369
+ });
4370
+ } catch (error) {
4371
+ console.error("[peer-connectivity] Failed to send event:", error);
4372
+ }
4373
+ }
4374
+
4034
4375
  let highLevelApi;
4035
4376
  let prevOptions;
4036
4377
  function usePitcherApi(options) {
@@ -4087,5 +4428,5 @@ function useApi(options) {
4087
4428
 
4088
4429
  window.postRobot = pr;
4089
4430
 
4090
- export { ADMIN_API_METHOD_TYPES, ADMIN_API_TYPES, ADMIN_MESSAGE, ADMIN_MESSAGE_TYPES, DSR_API_METHOD_TYPES, DSR_API_TYPES, DSR_MESSAGE, DSR_MESSAGE_TYPES, PITCHER_EVENT, PitcherBroadcastedEventName, PitcherEventName, PitcherExternalEventName, PitcherMessageType, PitcherResponseStatus, UI_API_METHOD_TYPES, UI_MESSAGE, UI_MESSAGE_TYPES, UI_NATIVE_MESSAGE_TYPES, getAvailableApis, highLevelApi, useAdmin, useApi, useDsr, usePitcherApi, useUi };
4431
+ export { ADMIN_API_METHOD_TYPES, ADMIN_API_TYPES, ADMIN_MESSAGE, ADMIN_MESSAGE_TYPES, DEFAULT_PEER_CONNECTIVITY_VERSION, DSR_API_METHOD_TYPES, DSR_API_TYPES, DSR_MESSAGE, DSR_MESSAGE_TYPES, PEER_CONNECTIVITY_EVENT, PEER_CONNECTIVITY_HANDLER_MATCH_ALL, PITCHER_EVENT, PeerConnectivityActions, PitcherBroadcastedEventName, PitcherEventName, PitcherExternalEventName, PitcherMessageType, PitcherResponseStatus, UI_API_METHOD_TYPES, UI_MESSAGE, UI_MESSAGE_TYPES, UI_NATIVE_MESSAGE_TYPES, getAvailableApis, highLevelApi, registerPeerConnectivityHandler, sendPeerConnectivityEvent, useAdmin, useApi, useDsr, usePitcherApi, useUi };
4091
4432
  //# sourceMappingURL=js-api.esm.js.map