prebid.js 7.51.0 → 7.53.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.
Files changed (277) hide show
  1. package/dist/1plusXRtdProvider.js +1 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/adkernelBidAdapter.js +1 -1
  8. package/dist/adqueryBidAdapter.js +1 -1
  9. package/dist/adrelevantisBidAdapter.js +1 -1
  10. package/dist/adriverIdSystem.js +1 -1
  11. package/dist/adtrgtmeBidAdapter.js +1 -1
  12. package/dist/adxcgBidAdapter.js +1 -1
  13. package/dist/adyoulikeBidAdapter.js +1 -1
  14. package/dist/airgridRtdProvider.js +1 -1
  15. package/dist/ajaBidAdapter.js +1 -1
  16. package/dist/allowActivities.js +1 -0
  17. package/dist/amxBidAdapter.js +1 -1
  18. package/dist/amxIdSystem.js +1 -1
  19. package/dist/appierAnalyticsAdapter.js +1 -1
  20. package/dist/appnexusBidAdapter.js +1 -1
  21. package/dist/asoBidAdapter.js +1 -1
  22. package/dist/axonixBidAdapter.js +1 -1
  23. package/dist/beopBidAdapter.js +1 -1
  24. package/dist/bidglassBidAdapter.js +1 -1
  25. package/dist/big-richmediaBidAdapter.js +1 -1
  26. package/dist/bridgewellBidAdapter.js +1 -1
  27. package/dist/brightMountainMediaBidAdapter.js +1 -1
  28. package/dist/carodaBidAdapter.js +1 -1
  29. package/dist/chtnwBidAdapter.js +1 -1
  30. package/dist/conceptxBidAdapter.js +1 -0
  31. package/dist/concertBidAdapter.js +1 -1
  32. package/dist/connectIdSystem.js +1 -1
  33. package/dist/connectadBidAdapter.js +1 -1
  34. package/dist/consumableBidAdapter.js +1 -1
  35. package/dist/conversantAnalyticsAdapter.js +1 -1
  36. package/dist/conversantBidAdapter.js +1 -1
  37. package/dist/craftBidAdapter.js +1 -1
  38. package/dist/criteoBidAdapter.js +1 -1
  39. package/dist/cwireBidAdapter.js +1 -1
  40. package/dist/dependencies.json +6 -0
  41. package/dist/dspxBidAdapter.js +1 -1
  42. package/dist/eplanningBidAdapter.js +1 -1
  43. package/dist/eskimiBidAdapter.js +1 -1
  44. package/dist/euidIdSystem.js +1 -0
  45. package/dist/feedadBidAdapter.js +1 -1
  46. package/dist/finativeBidAdapter.js +1 -1
  47. package/dist/freepassIdSystem.js +1 -0
  48. package/dist/freewheel-sspBidAdapter.js +1 -1
  49. package/dist/gdprEnforcement.js +1 -1
  50. package/dist/glimpseBidAdapter.js +1 -1
  51. package/dist/gmosspBidAdapter.js +1 -1
  52. package/dist/goldbachBidAdapter.js +1 -1
  53. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  54. package/dist/greenbidsRtdProvider.js +1 -1
  55. package/dist/gridBidAdapter.js +1 -1
  56. package/dist/growthCodeRtdProvider.js +1 -0
  57. package/dist/gumgumBidAdapter.js +1 -1
  58. package/dist/h12mediaBidAdapter.js +1 -1
  59. package/dist/id5IdSystem.js +1 -1
  60. package/dist/improvedigitalBidAdapter.js +1 -1
  61. package/dist/inmarBidAdapter.js +1 -1
  62. package/dist/insticatorBidAdapter.js +1 -1
  63. package/dist/ixBidAdapter.js +1 -1
  64. package/dist/justpremiumBidAdapter.js +1 -1
  65. package/dist/kargoBidAdapter.js +1 -1
  66. package/dist/konduitAnalyticsAdapter.js +1 -1
  67. package/dist/kueezBidAdapter.js +1 -1
  68. package/dist/kueezRtbBidAdapter.js +1 -1
  69. package/dist/kulturemediaBidAdapter.js +1 -1
  70. package/dist/lassoBidAdapter.js +1 -1
  71. package/dist/lifestreetBidAdapter.js +1 -1
  72. package/dist/limelightDigitalBidAdapter.js +1 -1
  73. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  74. package/dist/logicadBidAdapter.js +1 -1
  75. package/dist/loglyliftBidAdapter.js +1 -1
  76. package/dist/magniteAnalyticsAdapter.js +1 -1
  77. package/dist/malltvAnalyticsAdapter.js +1 -1
  78. package/dist/marsmediaBidAdapter.js +1 -1
  79. package/dist/mediafuseBidAdapter.js +1 -1
  80. package/dist/mediasquareBidAdapter.js +1 -1
  81. package/dist/mgidBidAdapter.js +1 -1
  82. package/dist/minutemediaBidAdapter.js +1 -1
  83. package/dist/minutemediaplusBidAdapter.js +1 -1
  84. package/dist/nexx360BidAdapter.js +1 -1
  85. package/dist/not-for-prod/prebid.js +154 -146
  86. package/dist/objectGuard.js +1 -0
  87. package/dist/oguryBidAdapter.js +1 -1
  88. package/dist/onetagBidAdapter.js +1 -1
  89. package/dist/ooloAnalyticsAdapter.js +1 -1
  90. package/dist/optidigitalBidAdapter.js +1 -1
  91. package/dist/outbrainBidAdapter.js +1 -1
  92. package/dist/oxxionAnalyticsAdapter.js +1 -0
  93. package/dist/pairIdSystem.js +1 -1
  94. package/dist/parrableIdSystem.js +1 -1
  95. package/dist/pixfutureBidAdapter.js +1 -1
  96. package/dist/prebid-core.js +1 -1
  97. package/dist/proxistoreBidAdapter.js +1 -1
  98. package/dist/publinkIdSystem.js +1 -1
  99. package/dist/pubmaticBidAdapter.js +1 -1
  100. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  101. package/dist/pxyzBidAdapter.js +1 -1
  102. package/dist/quantcastBidAdapter.js +1 -1
  103. package/dist/readpeakBidAdapter.js +1 -1
  104. package/dist/relaidoBidAdapter.js +1 -1
  105. package/dist/retailspotBidAdapter.js +1 -1
  106. package/dist/rhythmoneBidAdapter.js +1 -1
  107. package/dist/richaudienceBidAdapter.js +1 -1
  108. package/dist/riseBidAdapter.js +1 -1
  109. package/dist/rtdModule.js +1 -1
  110. package/dist/rubiconAnalyticsAdapter.js +1 -1
  111. package/dist/rubiconBidAdapter.js +1 -1
  112. package/dist/schain.js +1 -1
  113. package/dist/seedingAllianceBidAdapter.js +1 -1
  114. package/dist/seedtagBidAdapter.js +1 -1
  115. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  116. package/dist/sharethroughBidAdapter.js +1 -1
  117. package/dist/shinezBidAdapter.js +1 -1
  118. package/dist/sirdataRtdProvider.js +1 -1
  119. package/dist/smaatoBidAdapter.js +1 -1
  120. package/dist/smartadserverBidAdapter.js +1 -1
  121. package/dist/smartxBidAdapter.js +1 -1
  122. package/dist/smilewantedBidAdapter.js +1 -1
  123. package/dist/sonobiBidAdapter.js +1 -1
  124. package/dist/sovrnAnalyticsAdapter.js +1 -1
  125. package/dist/sovrnBidAdapter.js +1 -1
  126. package/dist/sspBCBidAdapter.js +1 -1
  127. package/dist/stroeerCoreBidAdapter.js +1 -1
  128. package/dist/stvBidAdapter.js +1 -1
  129. package/dist/sublimeBidAdapter.js +1 -1
  130. package/dist/synacormediaBidAdapter.js +1 -1
  131. package/dist/targetVideoBidAdapter.js +1 -1
  132. package/dist/teadsBidAdapter.js +1 -1
  133. package/dist/trionBidAdapter.js +1 -1
  134. package/dist/tripleliftBidAdapter.js +1 -1
  135. package/dist/ttdBidAdapter.js +1 -1
  136. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  137. package/dist/uid2IdSystem.js +1 -1
  138. package/dist/uid2IdSystem_shared.js +1 -0
  139. package/dist/underdogmediaBidAdapter.js +1 -1
  140. package/dist/undertoneBidAdapter.js +1 -1
  141. package/dist/userId.js +1 -1
  142. package/dist/vidazooBidAdapter.js +1 -1
  143. package/dist/videobyteBidAdapter.js +1 -1
  144. package/dist/viouslyBidAdapter.js +1 -1
  145. package/dist/visxBidAdapter.js +1 -1
  146. package/dist/vuukleBidAdapter.js +1 -1
  147. package/dist/weboramaRtdProvider.js +1 -1
  148. package/dist/widespaceBidAdapter.js +1 -1
  149. package/dist/winrBidAdapter.js +1 -1
  150. package/dist/yahoosspBidAdapter.js +1 -1
  151. package/dist/yieldlabBidAdapter.js +1 -1
  152. package/dist/yieldmoBidAdapter.js +1 -1
  153. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  154. package/dist/zeta_global_sspBidAdapter.js +1 -1
  155. package/integrationExamples/gpt/growthcode.html +20 -9
  156. package/integrationExamples/gpt/userId_example.html +20 -6
  157. package/libraries/objectGuard/objectGuard.js +108 -0
  158. package/libraries/objectGuard/ortbGuard.js +88 -0
  159. package/modules/.submodules.json +3 -1
  160. package/modules/1plusXRtdProvider.js +31 -60
  161. package/modules/adagioBidAdapter.js +86 -24
  162. package/modules/adgenerationBidAdapter.js +14 -5
  163. package/modules/adkernelBidAdapter.js +2 -2
  164. package/modules/adriverIdSystem.js +1 -1
  165. package/modules/airgridRtdProvider.js +11 -12
  166. package/modules/allowActivities.js +74 -0
  167. package/modules/asoBidAdapter.js +2 -1
  168. package/modules/beopBidAdapter.js +6 -0
  169. package/modules/conceptxBidAdapter.js +70 -0
  170. package/modules/conceptxBidAdapter.md +36 -0
  171. package/modules/connectIdSystem.js +89 -13
  172. package/modules/connectIdSystem.md +4 -7
  173. package/modules/criteoBidAdapter.js +18 -2
  174. package/modules/eskimiBidAdapter.js +171 -41
  175. package/modules/eskimiBidAdapter.md +35 -16
  176. package/modules/euidIdSystem.js +121 -0
  177. package/modules/euidIdSystem.md +131 -0
  178. package/modules/freepassIdSystem.js +61 -0
  179. package/modules/freepassIdSystem.md +47 -0
  180. package/modules/gdprEnforcement.js +98 -169
  181. package/modules/greenbidsAnalyticsAdapter.js +1 -1
  182. package/modules/growthCodeRtdProvider.js +131 -0
  183. package/modules/growthCodeRtdProvider.md +55 -0
  184. package/modules/id5IdSystem.js +3 -5
  185. package/modules/ixBidAdapter.js +17 -3
  186. package/modules/limelightDigitalBidAdapter.js +1 -1
  187. package/modules/logicadBidAdapter.js +14 -1
  188. package/modules/mediasquareBidAdapter.js +13 -5
  189. package/modules/nexx360BidAdapter.js +1 -0
  190. package/modules/oxxionAnalyticsAdapter.js +212 -0
  191. package/modules/oxxionAnalyticsAdapter.md +33 -0
  192. package/modules/pairIdSystem.js +16 -11
  193. package/modules/proxistoreBidAdapter.js +11 -14
  194. package/modules/richaudienceBidAdapter.js +10 -1
  195. package/modules/riseBidAdapter.js +1 -1
  196. package/modules/rtdModule/index.js +12 -1
  197. package/modules/schain.js +2 -2
  198. package/modules/sharethroughBidAdapter.js +2 -2
  199. package/modules/sirdataRtdProvider.js +73 -146
  200. package/modules/smartadserverBidAdapter.js +5 -0
  201. package/modules/sovrnBidAdapter.js +4 -1
  202. package/modules/stroeerCoreBidAdapter.js +55 -6
  203. package/modules/stvBidAdapter.js +34 -1
  204. package/modules/uid2IdSystem.js +27 -210
  205. package/modules/uid2IdSystem.md +104 -23
  206. package/modules/uid2IdSystem_shared.js +232 -0
  207. package/modules/undertoneBidAdapter.js +9 -1
  208. package/modules/userId/eids.js +8 -0
  209. package/modules/userId/index.js +69 -41
  210. package/modules/userId/userId.md +2 -1
  211. package/modules/viouslyBidAdapter.js +2 -2
  212. package/modules/weboramaRtdProvider.js +25 -95
  213. package/modules/weboramaRtdProvider.md +4 -4
  214. package/modules/yahoosspBidAdapter.js +45 -3
  215. package/modules/yahoosspBidAdapter.md +1 -1
  216. package/modules/yieldlabBidAdapter.js +23 -14
  217. package/modules/zeta_global_sspBidAdapter.js +28 -22
  218. package/package.json +1 -1
  219. package/src/activities/activities.js +47 -0
  220. package/src/activities/activityParams.js +8 -0
  221. package/src/activities/modules.js +1 -1
  222. package/src/activities/params.js +59 -0
  223. package/src/activities/redactor.js +157 -0
  224. package/src/activities/rules.js +95 -0
  225. package/src/adapterManager.js +45 -8
  226. package/src/adloader.js +1 -0
  227. package/src/fpd/rootDomain.js +1 -1
  228. package/src/prebid.js +1 -1
  229. package/src/storageManager.js +57 -44
  230. package/src/userSync.js +35 -18
  231. package/test/spec/activities/allowActivites_spec.js +138 -0
  232. package/test/spec/activities/objectGuard_spec.js +144 -0
  233. package/test/spec/activities/ortbGuard_spec.js +140 -0
  234. package/test/spec/activities/params_spec.js +25 -0
  235. package/test/spec/activities/redactor_spec.js +296 -0
  236. package/test/spec/activities/rules_spec.js +135 -0
  237. package/test/spec/modules/1plusXRtdProvider_spec.js +98 -149
  238. package/test/spec/modules/adagioBidAdapter_spec.js +46 -17
  239. package/test/spec/modules/adgenerationBidAdapter_spec.js +52 -12
  240. package/test/spec/modules/airgridRtdProvider_spec.js +2 -0
  241. package/test/spec/modules/beopBidAdapter_spec.js +24 -0
  242. package/test/spec/modules/conceptxBidAdapter_spec.js +136 -0
  243. package/test/spec/modules/connectIdSystem_spec.js +291 -23
  244. package/test/spec/modules/criteoBidAdapter_spec.js +85 -1
  245. package/test/spec/modules/eids_spec.js +15 -0
  246. package/test/spec/modules/eskimiBidAdapter_spec.js +264 -112
  247. package/test/spec/modules/euidIdSystem_spec.js +130 -0
  248. package/test/spec/modules/freepassIdSystem_spec.js +186 -0
  249. package/test/spec/modules/gdprEnforcement_spec.js +127 -414
  250. package/test/spec/modules/growthCodeRtdProvider_spec.js +127 -0
  251. package/test/spec/modules/id5IdSystem_spec.js +10 -3
  252. package/test/spec/modules/ixBidAdapter_spec.js +32 -1
  253. package/test/spec/modules/logicadBidAdapter_spec.js +122 -2
  254. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -0
  255. package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +324 -0
  256. package/test/spec/modules/pairIdSystem_spec.js +16 -3
  257. package/test/spec/modules/realTimeDataModule_spec.js +1 -1
  258. package/test/spec/modules/richaudienceBidAdapter_spec.js +44 -0
  259. package/test/spec/modules/schain_spec.js +9 -0
  260. package/test/spec/modules/sharethroughBidAdapter_spec.js +1 -1
  261. package/test/spec/modules/sirdataRtdProvider_spec.js +110 -17
  262. package/test/spec/modules/smartadserverBidAdapter_spec.js +42 -0
  263. package/test/spec/modules/sovrnBidAdapter_spec.js +13 -0
  264. package/test/spec/modules/stroeerCoreBidAdapter_spec.js +151 -6
  265. package/test/spec/modules/stvBidAdapter_spec.js +13 -1
  266. package/test/spec/modules/uid2IdSystem_helpers.js +70 -0
  267. package/test/spec/modules/uid2IdSystem_spec.js +131 -86
  268. package/test/spec/modules/undertoneBidAdapter_spec.js +57 -1
  269. package/test/spec/modules/userId_spec.js +96 -33
  270. package/test/spec/modules/weboramaRtdProvider_spec.js +331 -205
  271. package/test/spec/modules/yahoosspBidAdapter_spec.js +103 -51
  272. package/test/spec/modules/yieldlabBidAdapter_spec.js +42 -2
  273. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +204 -4
  274. package/test/spec/unit/core/adapterManager_spec.js +181 -1
  275. package/test/spec/unit/core/storageManager_spec.js +76 -68
  276. package/test/spec/unit/pbjs_api_spec.js +15 -25
  277. package/test/spec/userSync_spec.js +45 -16
@@ -44,7 +44,11 @@ const ADAGIO_TAG_URL = 'https://script.4dex.io/localstore.js';
44
44
  const ADAGIO_LOCALSTORAGE_KEY = 'adagioScript';
45
45
  const GVLID = 617;
46
46
  export const storage = getStorageManager({bidderCode: BIDDER_CODE});
47
- export const RENDERER_URL = 'https://script.4dex.io/outstream-player.js';
47
+
48
+ const BB_PUBLICATION = 'adagio';
49
+ const BB_RENDERER_DEFAULT = 'renderer';
50
+ export const BB_RENDERER_URL = `https://${BB_PUBLICATION}.bbvms.com/r/$RENDERER.js`;
51
+
48
52
  const MAX_SESS_DURATION = 30 * 60 * 1000;
49
53
  const ADAGIO_PUBKEY = 'AL16XT44Sfp+8SHVF1UdC7hydPSMVLMhsYknKDdwqq+0ToDSJrP0+Qh0ki9JJI2uYm/6VEYo8TJED9WfMkiJ4vf02CW3RvSWwc35bif2SK1L8Nn/GfFYr/2/GG/Rm0vUsv+vBHky6nuuYls20Og0HDhMgaOlXoQ/cxMuiy5QSktp';
50
54
  const ADAGIO_PUBKEY_E = 65537;
@@ -62,7 +66,7 @@ export const ORTB_VIDEO_PARAMS = {
62
66
  'startdelay': (value) => isInteger(value),
63
67
  'placement': (value) => isInteger(value),
64
68
  'linearity': (value) => isInteger(value),
65
- 'skip': (value) => isInteger(value),
69
+ 'skip': (value) => [1, 0].includes(value),
66
70
  'skipmin': (value) => isInteger(value),
67
71
  'skipafter': (value) => isInteger(value),
68
72
  'sequence': (value) => isInteger(value),
@@ -443,16 +447,6 @@ function _buildVideoBidRequest(bidRequest) {
443
447
  });
444
448
  }
445
449
 
446
- function _renderer(bid) {
447
- bid.renderer.push(() => {
448
- if (typeof window.ADAGIO.outstreamPlayer === 'function') {
449
- window.ADAGIO.outstreamPlayer(bid);
450
- } else {
451
- logError(`${LOG_PREFIX} Adagio outstream player is not defined`);
452
- }
453
- });
454
- }
455
-
456
450
  function _parseNativeBidResponse(bid) {
457
451
  if (!bid.admNative || !Array.isArray(bid.admNative.assets)) {
458
452
  logError(`${LOG_PREFIX} Invalid native response`);
@@ -881,6 +875,77 @@ function storeRequestInAdagioNS(bidRequest) {
881
875
  };
882
876
  }
883
877
 
878
+ // See https://support.bluebillywig.com/developers/vast-renderer/
879
+ const OUTSTREAM_RENDERER = {
880
+ bootstrapPlayer: function(bid) {
881
+ const rendererCode = bid.outstreamRendererCode;
882
+
883
+ const config = {
884
+ code: bid.adUnitCode,
885
+ };
886
+
887
+ if (bid.vastXml) {
888
+ config.vastXml = bid.vastXml;
889
+ } else if (bid.vastUrl) {
890
+ config.vastUrl = bid.vastUrl;
891
+ }
892
+
893
+ if (!bid.vastXml && !bid.vastUrl) {
894
+ logError(`${LOG_PREFIX} no vastXml or vastUrl on bid`);
895
+ return;
896
+ }
897
+
898
+ if (!window.bluebillywig || !window.bluebillywig.renderers || !window.bluebillywig.renderers.length) {
899
+ logError(`${LOG_PREFIX} no BlueBillywig renderers found!`);
900
+ return;
901
+ }
902
+
903
+ const rendererId = this.getRendererId(BB_PUBLICATION, rendererCode);
904
+
905
+ const override = {}
906
+ if (bid.skipOffset) {
907
+ override.skipOffset = bid.skipOffset.toString()
908
+ }
909
+
910
+ const renderer = window.bluebillywig.renderers.find(bbr => bbr._id === rendererId);
911
+ if (!renderer) {
912
+ logError(`${LOG_PREFIX} couldn't find a renderer with ID ${rendererId}`);
913
+ return;
914
+ }
915
+
916
+ const el = document.getElementById(bid.adUnitCode);
917
+
918
+ renderer.bootstrap(config, el, override);
919
+ },
920
+ newRenderer: function(adUnitCode, rendererCode) {
921
+ const rendererUrl = BB_RENDERER_URL.replace('$RENDERER', rendererCode);
922
+
923
+ const renderer = Renderer.install({
924
+ url: rendererUrl,
925
+ loaded: false,
926
+ adUnitCode
927
+ });
928
+
929
+ try {
930
+ renderer.setRender(this.outstreamRender);
931
+ } catch (err) {
932
+ logError(`${LOG_PREFIX} error trying to setRender`, err);
933
+ }
934
+
935
+ return renderer;
936
+ },
937
+ outstreamRender: function(bid) {
938
+ bid.renderer.push(() => {
939
+ OUTSTREAM_RENDERER.bootstrapPlayer(bid)
940
+ });
941
+ },
942
+ getRendererId: function(publication, renderer) {
943
+ // By convention, the RENDERER_ID is always the publication name (adagio) and the ad unit code (eg. renderer)
944
+ // joined together by a dash. It's used to identify the correct renderer instance on the page in case there's multiple.
945
+ return `${publication}-${renderer}`;
946
+ }
947
+ };
948
+
884
949
  export const spec = {
885
950
  code: BIDDER_CODE,
886
951
  gvlid: GVLID,
@@ -1110,21 +1175,18 @@ export const spec = {
1110
1175
  const mediaTypeContext = deepAccess(bidReq, 'mediaTypes.video.context');
1111
1176
  // Adagio SSP returns a `vastXml` only. No `vastUrl` nor `videoCacheKey`.
1112
1177
  if (!bidObj.vastUrl && bidObj.vastXml) {
1113
- bidObj.vastUrl = 'data:text/xml;charset=utf-8;base64,' + btoa(bidObj.vastXml.replace(/\\"/g, '"'));
1178
+ bidObj.vastUrl = 'data:text/xml;charset=utf-8;base64,' + window.btoa(bidObj.vastXml.replace(/\\"/g, '"'));
1114
1179
  }
1115
1180
 
1116
1181
  if (mediaTypeContext === OUTSTREAM) {
1117
- bidObj.renderer = Renderer.install({
1118
- id: bidObj.requestId,
1119
- adUnitCode: bidObj.adUnitCode,
1120
- url: bidObj.urlRenderer || RENDERER_URL,
1121
- config: {
1122
- ...deepAccess(bidReq, 'mediaTypes.video'),
1123
- ...deepAccess(bidObj, 'outstream', {})
1124
- }
1125
- });
1126
-
1127
- bidObj.renderer.setRender(_renderer);
1182
+ bidObj.outstreamRendererCode = deepAccess(bidReq, 'params.rendererCode', BB_RENDERER_DEFAULT)
1183
+
1184
+ if (deepAccess(bidReq, 'mediaTypes.video.skip')) {
1185
+ const skipOffset = deepAccess(bidReq, 'mediaTypes.video.skipafter', 5) // default 5s.
1186
+ bidObj.skipOffset = skipOffset
1187
+ }
1188
+
1189
+ bidObj.renderer = OUTSTREAM_RENDERER.newRenderer(bidObj.adUnitCode, bidObj.outstreamRendererCode);
1128
1190
  }
1129
1191
  }
1130
1192
 
@@ -1,8 +1,8 @@
1
- import {tryAppendQueryString, getBidIdParameter, escapeUnsafeChars} from '../src/utils.js';
1
+ import {tryAppendQueryString, getBidIdParameter, escapeUnsafeChars, deepAccess} from '../src/utils.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {BANNER, NATIVE} from '../src/mediaTypes.js';
4
4
  import {config} from '../src/config.js';
5
- import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
5
+ import {convertOrtbRequestToProprietaryNative} from '../src/native.js';
6
6
 
7
7
  const ADG_BIDDER_CODE = 'adgeneration';
8
8
 
@@ -21,14 +21,14 @@ export const spec = {
21
21
  },
22
22
  /**
23
23
  * Make a server request from the list of BidRequests.
24
- *
25
- * @param {validBidRequests[]} - an array of bids
24
+ * @param validBidRequests
25
+ * @param bidderRequest
26
26
  * @return ServerRequest Info describing the request to the server.
27
27
  */
28
28
  buildRequests: function (validBidRequests, bidderRequest) {
29
29
  // convert Native ORTB definition to old-style prebid native definition
30
30
  validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
31
- const ADGENE_PREBID_VERSION = '1.5.0';
31
+ const ADGENE_PREBID_VERSION = '1.6.0';
32
32
  let serverRequests = [];
33
33
  for (let i = 0, len = validBidRequests.length; i < len; i++) {
34
34
  const validReq = validBidRequests[i];
@@ -38,6 +38,9 @@ export const spec = {
38
38
  const criteoId = getCriteoId(validReq);
39
39
  const id5id = getId5Id(validReq);
40
40
  const id5LinkType = getId5LinkType(validReq);
41
+ const imuid = deepAccess(validReq, 'userId.imuid');
42
+ const gpid = deepAccess(validReq, 'ortb2Imp.ext.gpid');
43
+ const sua = deepAccess(validReq, 'ortb2.device.sua');
41
44
  let data = ``;
42
45
  data = tryAppendQueryString(data, 'posall', 'SSPLOC');
43
46
  const id = getBidIdParameter('id', validReq.params);
@@ -54,6 +57,12 @@ export const spec = {
54
57
  data = tryAppendQueryString(data, 'adgext_criteo_id', criteoId);
55
58
  data = tryAppendQueryString(data, 'adgext_id5_id', id5id);
56
59
  data = tryAppendQueryString(data, 'adgext_id5_id_link_type', id5LinkType);
60
+ data = tryAppendQueryString(data, 'adgext_imuid', imuid);
61
+ data = tryAppendQueryString(data, 'adgext_uid2', validReq.userId ? validReq.userId.uid2 : null);
62
+ data = tryAppendQueryString(data, 'gpid', gpid ? encodeURIComponent(gpid) : null);
63
+ data = tryAppendQueryString(data, 'uach', sua ? JSON.stringify(sua) : null);
64
+ data = tryAppendQueryString(data, 'schain', validReq.schain ? encodeURIComponent(JSON.stringify(validReq.schain)) : null);
65
+
57
66
  // native以外にvideo等の対応が入った場合は要修正
58
67
  if (!validReq.mediaTypes || !validReq.mediaTypes.native) {
59
68
  data = tryAppendQueryString(data, 'imark', '1');
@@ -90,7 +90,6 @@ export const spec = {
90
90
  {code: 'denakop'},
91
91
  {code: 'rtbanalytica'},
92
92
  {code: 'unibots'},
93
- {code: 'catapultx'},
94
93
  {code: 'ergadx'},
95
94
  {code: 'turktelekom'},
96
95
  {code: 'felixads'},
@@ -100,7 +99,8 @@ export const spec = {
100
99
  {code: 'rtbdemand_com'},
101
100
  {code: 'bidbuddy'},
102
101
  {code: 'adliveconnect'},
103
- {code: 'didnadisplay'}
102
+ {code: 'didnadisplay'},
103
+ {code: 'qortex'}
104
104
  ],
105
105
  supportedMediaTypes: [BANNER, VIDEO, NATIVE],
106
106
 
@@ -42,7 +42,7 @@ export const adriverIdSubmodule = {
42
42
  if (!isPlainObject(config.params)) {
43
43
  config.params = {};
44
44
  }
45
- const url = 'https://ad.adriver.ru/cgi-bin/json.cgi?sid=1&ad=719473&bt=55&pid=3198680&bid=7189165&bn=7189165&tuid=1';
45
+ const url = 'https://ad.adriver.ru/cgi-bin/json.cgi?sid=1&ad=719473&bt=55&pid=3198680&bid=7189165&bn=7189165&tuid=1&cfa=1';
46
46
  const resp = function (callback) {
47
47
  let creationDate = storage.getDataFromLocalStorage('adrcid_cd') || storage.getCookie('adrcid_cd');
48
48
  let cookie = storage.getDataFromLocalStorage('adrcid') || storage.getCookie('adrcid');
@@ -12,8 +12,9 @@ import {
12
12
  deepAccess,
13
13
  } from '../src/utils.js';
14
14
  import { getGlobal } from '../src/prebidGlobal.js';
15
- import {getStorageManager} from '../src/storageManager.js';
16
- import {MODULE_TYPE_RTD} from '../src/activities/modules.js';
15
+ import { getStorageManager } from '../src/storageManager.js';
16
+ import { loadExternalScript } from '../src/adloader.js';
17
+ import { MODULE_TYPE_RTD } from '../src/activities/modules.js';
17
18
 
18
19
  const MODULE_NAME = 'realTimeData';
19
20
  const SUBMODULE_NAME = 'airgrid';
@@ -25,6 +26,11 @@ export const storage = getStorageManager({
25
26
  moduleName: SUBMODULE_NAME,
26
27
  });
27
28
 
29
+ function getModuleUrl(accountId) {
30
+ const path = accountId ?? 'sdk';
31
+ return `https://cdn.edkt.io/${path}/edgekit.min.js`;
32
+ }
33
+
28
34
  /**
29
35
  * Attach script tag to DOM
30
36
  * @param {Object} rtdConfig
@@ -33,19 +39,12 @@ export const storage = getStorageManager({
33
39
  export function attachScriptTagToDOM(rtdConfig) {
34
40
  var edktInitializor = (window.edktInitializor = window.edktInitializor || {});
35
41
  if (!edktInitializor.invoked) {
36
- edktInitializor.invoked = true;
37
42
  edktInitializor.accountId = rtdConfig.params.accountId;
38
43
  edktInitializor.publisherId = rtdConfig.params.publisherId;
39
44
  edktInitializor.apiKey = rtdConfig.params.apiKey;
40
- edktInitializor.load = function (e) {
41
- var p = e || 'sdk';
42
- var n = document.createElement('script');
43
- n.type = 'module';
44
- n.async = true;
45
- n.src = 'https://cdn.edkt.io/' + p + '/edgekit.min.js';
46
- document.getElementsByTagName('head')[0].appendChild(n);
47
- };
48
- edktInitializor.load(edktInitializor.accountId);
45
+ edktInitializor.invoked = true;
46
+ const moduleSrc = getModuleUrl(rtdConfig.params.accountId);
47
+ loadExternalScript(moduleSrc, SUBMODULE_NAME);
49
48
  }
50
49
  }
51
50
 
@@ -0,0 +1,74 @@
1
+ import {config} from '../src/config.js';
2
+ import {registerActivityControl} from '../src/activities/rules.js';
3
+
4
+ const CFG_NAME = 'allowActivities';
5
+ const RULE_NAME = `${CFG_NAME} config`;
6
+ const DEFAULT_PRIORITY = 1;
7
+
8
+ export function updateRulesFromConfig(registerRule) {
9
+ const activeRuleHandles = new Map();
10
+ const defaultRuleHandles = new Map();
11
+ const rulesByActivity = new Map();
12
+
13
+ function clearAllRules() {
14
+ rulesByActivity.clear();
15
+ Array.from(activeRuleHandles.values())
16
+ .flatMap(ruleset => Array.from(ruleset.values()))
17
+ .forEach(fn => fn());
18
+ activeRuleHandles.clear();
19
+ Array.from(defaultRuleHandles.values()).forEach(fn => fn());
20
+ defaultRuleHandles.clear();
21
+ }
22
+
23
+ function cleanParams(params) {
24
+ // remove private parameters for publisher condition checks
25
+ return Object.fromEntries(Object.entries(params).filter(([k]) => !k.startsWith('_')))
26
+ }
27
+
28
+ function setupRule(activity, priority) {
29
+ if (!activeRuleHandles.has(activity)) {
30
+ activeRuleHandles.set(activity, new Map())
31
+ }
32
+ const handles = activeRuleHandles.get(activity);
33
+ if (!handles.has(priority)) {
34
+ handles.set(priority, registerRule(activity, RULE_NAME, function (params) {
35
+ for (const rule of rulesByActivity.get(activity).get(priority)) {
36
+ if (!rule.condition || rule.condition(cleanParams(params))) {
37
+ return {allow: rule.allow, reason: rule}
38
+ }
39
+ }
40
+ }, priority));
41
+ }
42
+ }
43
+
44
+ function setupDefaultRule(activity) {
45
+ if (!defaultRuleHandles.has(activity)) {
46
+ defaultRuleHandles.set(activity, registerRule(activity, RULE_NAME, function () {
47
+ return {allow: false, reason: 'activity denied by default'}
48
+ }, Number.POSITIVE_INFINITY))
49
+ }
50
+ }
51
+
52
+ config.getConfig(CFG_NAME, (cfg) => {
53
+ clearAllRules();
54
+ Object.entries(cfg[CFG_NAME]).forEach(([activity, activityCfg]) => {
55
+ if (activityCfg.default === false) {
56
+ setupDefaultRule(activity);
57
+ }
58
+ const rules = new Map();
59
+ rulesByActivity.set(activity, rules);
60
+
61
+ (activityCfg.rules || []).forEach(rule => {
62
+ const priority = rule.priority == null ? DEFAULT_PRIORITY : rule.priority;
63
+ if (!rules.has(priority)) {
64
+ rules.set(priority, [])
65
+ }
66
+ rules.get(priority).push(rule);
67
+ });
68
+
69
+ Array.from(rules.keys()).forEach(priority => setupRule(activity, priority));
70
+ });
71
+ })
72
+ }
73
+
74
+ updateRulesFromConfig(registerActivityControl);
@@ -28,7 +28,8 @@ export const spec = {
28
28
  code: BIDDER_CODE,
29
29
  supportedMediaTypes: [BANNER, VIDEO],
30
30
  aliases: [
31
- {code: 'bcmint'}
31
+ {code: 'bcmint'},
32
+ {code: 'bidgency'}
32
33
  ],
33
34
 
34
35
  isBidRequestValid: bid => {
@@ -37,6 +37,8 @@ export const spec = {
37
37
  */
38
38
  buildRequests: function(validBidRequests, bidderRequest) {
39
39
  const slots = validBidRequests.map(beOpRequestSlotsMaker);
40
+ const firstPartyData = bidderRequest.ortb2;
41
+ const psegs = (firstPartyData && firstPartyData.user && firstPartyData.user.ext && firstPartyData.user.ext.data) ? firstPartyData.user.ext.data.permutive : undefined;
40
42
  const pageUrl = getPageUrl(bidderRequest.refererInfo, window);
41
43
  const gdpr = bidderRequest.gdprConsent;
42
44
  const firstSlot = slots[0];
@@ -68,6 +70,10 @@ export const spec = {
68
70
  tc_string: (gdpr && gdpr.gdprApplies) ? gdpr.consentString : null,
69
71
  };
70
72
 
73
+ if (psegs) {
74
+ Object.assign(payloadObject, {psegs: psegs});
75
+ }
76
+
71
77
  const payloadString = JSON.stringify(payloadObject);
72
78
  return {
73
79
  method: 'POST',
@@ -0,0 +1,70 @@
1
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
2
+ import { BANNER } from '../src/mediaTypes.js';
3
+ // import { logError, logInfo, logWarn, parseUrl } from '../src/utils.js';
4
+
5
+ const BIDDER_CODE = 'conceptx';
6
+ let ENDPOINT_URL = 'https://conceptx.cncpt-central.com/openrtb';
7
+ // const LOG_PREFIX = 'ConceptX: ';
8
+
9
+ export const spec = {
10
+ code: BIDDER_CODE,
11
+ supportedMediaTypes: [BANNER],
12
+ isBidRequestValid: function (bid) {
13
+ return !!(bid.bidId);
14
+ },
15
+
16
+ buildRequests: function (validBidRequests, bidderRequest) {
17
+ // logWarn(LOG_PREFIX + 'all native assets containing URL should be sent as placeholders with sendId(icon, image, clickUrl, displayUrl, privacyLink, privacyIcon)');
18
+ const requests = [];
19
+
20
+ if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
21
+ ENDPOINT_URL += '?gdpr_applies=' + bidderRequest.gdprConsent.gdprApplies;
22
+ ENDPOINT_URL += '&consentString=' + bidderRequest.gdprConsent.consentString;
23
+ }
24
+ for (var i = 0; i < validBidRequests.length; i++) {
25
+ const requestParent = { adUnits: [], meta: {} };
26
+ const bid = validBidRequests[i]
27
+ const { adUnitCode, auctionId, bidId, bidder, bidderRequestId, ortb2 } = bid
28
+ requestParent.meta = { adUnitCode, auctionId, bidId, bidder, bidderRequestId, ortb2 }
29
+
30
+ const { site, adunit } = bid.params
31
+ const adUnit = { site, adunit, targetId: bid.bidId }
32
+ if (bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes) adUnit.dimensions = bid.mediaTypes.banner.sizes
33
+ requestParent.adUnits.push(adUnit);
34
+ requests.push({
35
+ method: 'POST',
36
+ url: ENDPOINT_URL,
37
+ options: {
38
+ withCredentials: false,
39
+ },
40
+ data: JSON.stringify(requestParent),
41
+ });
42
+ }
43
+
44
+ return requests;
45
+ },
46
+
47
+ interpretResponse: function (serverResponse, bidRequest) {
48
+ const bidResponsesFromServer = serverResponse.body.bidResponses;
49
+ const firstDummy = bidResponsesFromServer[0]
50
+ const firstSeat = firstDummy.ads[0]
51
+ const bidResponses = [];
52
+ const bidResponse = {
53
+ requestId: firstSeat.requestId,
54
+ cpm: firstSeat.cpm,
55
+ width: firstSeat.width,
56
+ height: firstSeat.height,
57
+ creativeId: firstSeat.creativeId,
58
+ dealId: firstSeat.dealId,
59
+ currency: firstSeat.currency,
60
+ netRevenue: true,
61
+ ttl: firstSeat.ttl,
62
+ referrer: firstSeat.referrer,
63
+ ad: firstSeat.html
64
+ };
65
+ bidResponses.push(bidResponse);
66
+ return bidResponses;
67
+ },
68
+
69
+ }
70
+ registerBidder(spec);
@@ -0,0 +1,36 @@
1
+ # Overview
2
+
3
+ ```
4
+ Module Name: ConceptX Bidder Adapter
5
+ Module Type: Bidder Adapter
6
+ Maintainer: info@concept.dk
7
+ ```
8
+
9
+ # Description
10
+
11
+ ConceptX Bidder Adapter for Prebid.js.
12
+ Only Banner format is supported.
13
+
14
+ # Test Parameters
15
+ ```
16
+ var adUnits = [
17
+ {
18
+ code: "test-div",
19
+ mediaTypes: {
20
+ banner: {
21
+ sizes: [[980, 180]]
22
+ }
23
+ },
24
+ bids: [
25
+ {
26
+ bidder: "conceptx",
27
+ params: {
28
+ site: "example",
29
+ adunit: "some-id-3",
30
+ }
31
+ },
32
+ ]
33
+ },
34
+
35
+ ];
36
+ ```
@@ -11,11 +11,16 @@ import {includes} from '../src/polyfill.js';
11
11
  import {getRefererInfo} from '../src/refererDetection.js';
12
12
  import {getStorageManager} from '../src/storageManager.js';
13
13
  import {formatQS, isPlainObject, logError, parseUrl} from '../src/utils.js';
14
- import {uspDataHandler} from '../src/adapterManager.js';
14
+ import {uspDataHandler, gppDataHandler} from '../src/adapterManager.js';
15
15
  import {MODULE_TYPE_UID} from '../src/activities/modules.js';
16
16
 
17
17
  const MODULE_NAME = 'connectId';
18
- const STORAGE_EXPIRY_DAYS = 14;
18
+ const STORAGE_EXPIRY_DAYS = 365;
19
+ const STORAGE_DURATION = 60 * 60 * 24 * 1000 * STORAGE_EXPIRY_DAYS;
20
+ const ID_EXPIRY_DAYS = 14;
21
+ const VALID_ID_DURATION = 60 * 60 * 24 * 1000 * ID_EXPIRY_DAYS;
22
+ const PUID_EXPIRY_DAYS = 30;
23
+ const PUID_EXPIRY = 60 * 60 * 24 * 1000 * PUID_EXPIRY_DAYS;
19
24
  const VENDOR_ID = 25;
20
25
  const PLACEHOLDER = '__PIXEL_ID__';
21
26
  const UPS_ENDPOINT = `https://ups.analytics.yahoo.com/ups/${PLACEHOLDER}/fed`;
@@ -28,11 +33,11 @@ export const storage = getStorageManager({moduleType: MODULE_TYPE_UID, moduleNam
28
33
  * @param {Object} obj
29
34
  */
30
35
  function storeObject(obj) {
31
- const expires = Date.now() + (60 * 60 * 24 * 1000 * STORAGE_EXPIRY_DAYS);
36
+ const expires = Date.now() + STORAGE_DURATION;
32
37
  if (storage.cookiesAreEnabled()) {
33
38
  setEtldPlusOneCookie(MODULE_NAME, JSON.stringify(obj), new Date(expires), getSiteHostname());
34
- } else if (storage.localStorageIsEnabled()) {
35
- obj.__expires = expires;
39
+ }
40
+ if (storage.localStorageIsEnabled()) {
36
41
  storage.setDataInLocalStorage(MODULE_NAME, JSON.stringify(obj));
37
42
  }
38
43
  }
@@ -75,7 +80,9 @@ function getIdFromLocalStorage() {
75
80
  if (storedIdData) {
76
81
  try {
77
82
  storedIdData = JSON.parse(storedIdData);
78
- } catch {}
83
+ } catch (e) {
84
+ logError(`${MODULE_NAME} module: error while reading the local storage data.`);
85
+ }
79
86
  if (isPlainObject(storedIdData) && storedIdData.__expires &&
80
87
  storedIdData.__expires <= Date.now()) {
81
88
  storage.removeDataFromLocalStorage(MODULE_NAME);
@@ -87,6 +94,34 @@ function getIdFromLocalStorage() {
87
94
  return null;
88
95
  }
89
96
 
97
+ function syncLocalStorageToCookie() {
98
+ if (!storage.cookiesAreEnabled()) {
99
+ return;
100
+ }
101
+ const value = getIdFromLocalStorage();
102
+ const newCookieExpireTime = Date.now() + STORAGE_DURATION;
103
+ setEtldPlusOneCookie(MODULE_NAME, JSON.stringify(value), new Date(newCookieExpireTime), getSiteHostname());
104
+ }
105
+
106
+ function isStale(storedIdData) {
107
+ if (isPlainObject(storedIdData) && storedIdData.lastSynced &&
108
+ (storedIdData.lastSynced + VALID_ID_DURATION) <= Date.now()) {
109
+ return true;
110
+ }
111
+ return false;
112
+ }
113
+
114
+ function getStoredId() {
115
+ let storedId = getIdFromCookie();
116
+ if (!storedId) {
117
+ storedId = getIdFromLocalStorage();
118
+ if (storedId && !isStale(storedId)) {
119
+ syncLocalStorageToCookie();
120
+ }
121
+ }
122
+ return storedId;
123
+ }
124
+
90
125
  function getSiteHostname() {
91
126
  const pageInfo = parseUrl(getRefererInfo().page);
92
127
  return pageInfo.hostname;
@@ -127,16 +162,31 @@ export const connectIdSubmodule = {
127
162
  return;
128
163
  }
129
164
  const params = config.params || {};
130
- if (!params || (typeof params.he !== 'string' && typeof params.puid !== 'string') ||
165
+ if (!params ||
131
166
  (typeof params.pixelId === 'undefined' && typeof params.endpoint === 'undefined')) {
132
- logError(`${MODULE_NAME} module: configurataion requires the 'pixelId' and at ` +
133
- `least one of the 'he' or 'puid' parameters to be defined.`);
167
+ logError(`${MODULE_NAME} module: configuration requires the 'pixelId'.`);
134
168
  return;
135
169
  }
136
170
 
137
- const storedId = getIdFromCookie() || getIdFromLocalStorage();
171
+ const storedId = getStoredId();
172
+
173
+ let shouldResync = isStale(storedId);
174
+
138
175
  if (storedId) {
139
- return {id: storedId};
176
+ if (isPlainObject(storedId) && storedId.puid && storedId.lastUsed && !params.puid &&
177
+ (storedId.lastUsed + PUID_EXPIRY) <= Date.now()) {
178
+ delete storedId.puid;
179
+ shouldResync = true;
180
+ }
181
+ if ((params.he && params.he !== storedId.he) ||
182
+ (params.puid && params.puid !== storedId.puid)) {
183
+ shouldResync = true;
184
+ }
185
+ if (!shouldResync) {
186
+ storedId.lastUsed = Date.now();
187
+ storeObject(storedId);
188
+ return {id: storedId};
189
+ }
140
190
  }
141
191
 
142
192
  const uspString = uspDataHandler.getConsentData() || '';
@@ -148,6 +198,14 @@ export const connectIdSubmodule = {
148
198
  us_privacy: uspString
149
199
  };
150
200
 
201
+ const gppConsent = gppDataHandler.getConsentData();
202
+ if (gppConsent) {
203
+ data.gpp = `${gppConsent.gppString ? gppConsent.gppString : ''}`;
204
+ if (Array.isArray(gppConsent.applicableSections)) {
205
+ data.gpp_sid = gppConsent.applicableSections.join(',');
206
+ }
207
+ }
208
+
151
209
  let topmostLocation = getRefererInfo().topmostLocation;
152
210
  if (typeof topmostLocation === 'string') {
153
211
  data.url = topmostLocation.split('?')[0];
@@ -159,6 +217,14 @@ export const connectIdSubmodule = {
159
217
  }
160
218
  });
161
219
 
220
+ const hashedEmail = params.he || storedId?.he;
221
+ if (hashedEmail) {
222
+ data.he = hashedEmail;
223
+ }
224
+ if (!data.puid && storedId?.puid) {
225
+ data.puid = storedId.puid;
226
+ }
227
+
162
228
  const resp = function (callback) {
163
229
  const callbacks = {
164
230
  success: response => {
@@ -166,7 +232,12 @@ export const connectIdSubmodule = {
166
232
  if (response) {
167
233
  try {
168
234
  responseObj = JSON.parse(response);
169
- if (isPlainObject(responseObj) && Object.keys(responseObj).length > 0) {
235
+ if (isPlainObject(responseObj) && Object.keys(responseObj).length > 0 &&
236
+ (!!responseObj.connectId || !!responseObj.connectid)) {
237
+ responseObj.he = params.he;
238
+ responseObj.puid = params.puid || responseObj.puid;
239
+ responseObj.lastSynced = Date.now();
240
+ responseObj.lastUsed = Date.now();
170
241
  storeObject(responseObj);
171
242
  } else {
172
243
  logError(`${MODULE_NAME} module: UPS response returned an invalid payload ${response}`);
@@ -186,7 +257,12 @@ export const connectIdSubmodule = {
186
257
  let url = `${params.endpoint || endpoint}?${formatQS(data)}`;
187
258
  connectIdSubmodule.getAjaxFn()(url, callbacks, null, {method: 'GET', withCredentials: true});
188
259
  };
189
- return {callback: resp};
260
+ const result = {callback: resp};
261
+ if (shouldResync && storedId) {
262
+ result.id = storedId;
263
+ }
264
+
265
+ return result;
190
266
  },
191
267
 
192
268
  /**