@surfside/ads-core 2.0.1 → 2.0.3

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 (274) hide show
  1. package/README.md +15 -15
  2. package/lib/cjs/Api.js +195 -0
  3. package/lib/cjs/Api.js.map +1 -0
  4. package/lib/cjs/helpers/Generator.js +50 -0
  5. package/lib/cjs/helpers/Generator.js.map +1 -0
  6. package/lib/cjs/helpers/Handlebars.js +313 -0
  7. package/lib/cjs/helpers/Handlebars.js.map +1 -0
  8. package/lib/cjs/helpers/NativeRequestBuilder.js +174 -0
  9. package/lib/cjs/helpers/NativeRequestBuilder.js.map +1 -0
  10. package/lib/cjs/helpers/RequestBuilder.js +160 -0
  11. package/lib/cjs/helpers/RequestBuilder.js.map +1 -0
  12. package/lib/cjs/helpers/TryGet.js +14 -0
  13. package/lib/cjs/helpers/TryGet.js.map +1 -0
  14. package/lib/cjs/helpers/Window.js +24 -0
  15. package/lib/cjs/helpers/Window.js.map +1 -0
  16. package/lib/cjs/helpers/index.js +24 -0
  17. package/lib/cjs/helpers/index.js.map +1 -0
  18. package/lib/cjs/helpers/response/Banner.js +4 -0
  19. package/lib/cjs/helpers/response/Banner.js.map +1 -0
  20. package/lib/cjs/helpers/response/BuiltResponse.js +27 -0
  21. package/lib/cjs/helpers/response/BuiltResponse.js.map +1 -0
  22. package/lib/cjs/helpers/response/Carousel.js +282 -0
  23. package/lib/cjs/helpers/response/Carousel.js.map +1 -0
  24. package/lib/cjs/helpers/response/Clickthrough.js +24 -0
  25. package/lib/cjs/helpers/response/Clickthrough.js.map +1 -0
  26. package/lib/cjs/helpers/response/ProductCard.js +198 -0
  27. package/lib/cjs/helpers/response/ProductCard.js.map +1 -0
  28. package/lib/cjs/helpers/response/Video.js +4 -0
  29. package/lib/cjs/helpers/response/Video.js.map +1 -0
  30. package/lib/cjs/helpers/response/index.js +23 -0
  31. package/lib/cjs/helpers/response/index.js.map +1 -0
  32. package/lib/cjs/index.js +21 -3488
  33. package/lib/cjs/index.js.map +1 -54
  34. package/lib/cjs/models/dynamic/DynamicZone.js +12 -0
  35. package/lib/cjs/models/dynamic/DynamicZone.js.map +1 -0
  36. package/lib/cjs/models/dynamic/index.js +18 -0
  37. package/lib/cjs/models/dynamic/index.js.map +1 -0
  38. package/lib/cjs/models/index.js +22 -0
  39. package/lib/cjs/models/index.js.map +1 -0
  40. package/lib/cjs/models/retail/Configuration.js +10 -0
  41. package/lib/cjs/models/retail/Configuration.js.map +1 -0
  42. package/lib/cjs/models/retail/Product.js +4 -0
  43. package/lib/cjs/models/retail/Product.js.map +1 -0
  44. package/lib/cjs/models/retail/Recommended.js +3 -0
  45. package/lib/cjs/models/retail/Recommended.js.map +1 -0
  46. package/lib/cjs/models/retail/index.js +20 -0
  47. package/lib/cjs/models/retail/index.js.map +1 -0
  48. package/lib/cjs/models/rtb/BidRequest.js +20 -0
  49. package/lib/cjs/models/rtb/BidRequest.js.map +1 -0
  50. package/lib/cjs/models/rtb/BidResponse.js +3 -0
  51. package/lib/cjs/models/rtb/BidResponse.js.map +1 -0
  52. package/lib/cjs/models/rtb/NativeRequest.js +122 -0
  53. package/lib/cjs/models/rtb/NativeRequest.js.map +1 -0
  54. package/lib/cjs/models/rtb/NativeResponse.js +26 -0
  55. package/lib/cjs/models/rtb/NativeResponse.js.map +1 -0
  56. package/lib/cjs/models/rtb/index.js +21 -0
  57. package/lib/cjs/models/rtb/index.js.map +1 -0
  58. package/lib/cjs/models/tracking/Geo.js +3 -0
  59. package/lib/cjs/models/tracking/Geo.js.map +1 -0
  60. package/lib/cjs/models/tracking/index.js +18 -0
  61. package/lib/cjs/models/tracking/index.js.map +1 -0
  62. package/lib/cjs/models/vast/Vast.js +4 -0
  63. package/lib/cjs/models/vast/Vast.js.map +1 -0
  64. package/lib/cjs/models/vast/index.js +18 -0
  65. package/lib/cjs/models/vast/index.js.map +1 -0
  66. package/lib/cjs/services/Bidder.js +128 -0
  67. package/lib/cjs/services/Bidder.js.map +1 -0
  68. package/lib/cjs/services/Configuration.js +93 -0
  69. package/lib/cjs/services/Configuration.js.map +1 -0
  70. package/lib/cjs/services/Device.js +236 -0
  71. package/lib/cjs/services/Device.js.map +1 -0
  72. package/lib/cjs/services/Dynamic.js +129 -0
  73. package/lib/cjs/services/Dynamic.js.map +1 -0
  74. package/lib/cjs/services/Geo.js +35 -0
  75. package/lib/cjs/services/Geo.js.map +1 -0
  76. package/lib/cjs/services/Logger.js +57 -0
  77. package/lib/cjs/services/Logger.js.map +1 -0
  78. package/lib/cjs/services/Memoization.js +17 -0
  79. package/lib/cjs/services/Memoization.js.map +1 -0
  80. package/lib/cjs/services/Product.js +127 -0
  81. package/lib/cjs/services/Product.js.map +1 -0
  82. package/lib/cjs/services/Recommender.js +83 -0
  83. package/lib/cjs/services/Recommender.js.map +1 -0
  84. package/lib/cjs/services/Result.js +220 -0
  85. package/lib/cjs/services/Result.js.map +1 -0
  86. package/lib/cjs/services/Template.js +43 -0
  87. package/lib/cjs/services/Template.js.map +1 -0
  88. package/lib/cjs/services/index.js +28 -0
  89. package/lib/cjs/services/index.js.map +1 -0
  90. package/lib/cjs/services/mock/Bidder.js +3 -0
  91. package/lib/cjs/services/mock/Bidder.js.map +1 -0
  92. package/lib/cjs/services/mock/index.js +18 -0
  93. package/lib/cjs/services/mock/index.js.map +1 -0
  94. package/lib/esm/Api.js +183 -0
  95. package/lib/esm/Api.js.map +1 -0
  96. package/lib/esm/helpers/Generator.js +42 -0
  97. package/lib/esm/helpers/Generator.js.map +1 -0
  98. package/lib/esm/helpers/Handlebars.js +294 -0
  99. package/lib/esm/helpers/Handlebars.js.map +1 -0
  100. package/lib/esm/helpers/NativeRequestBuilder.js +169 -0
  101. package/lib/esm/helpers/NativeRequestBuilder.js.map +1 -0
  102. package/lib/esm/helpers/RequestBuilder.js +157 -0
  103. package/lib/esm/helpers/RequestBuilder.js.map +1 -0
  104. package/lib/esm/helpers/TryGet.js +10 -0
  105. package/lib/esm/helpers/TryGet.js.map +1 -0
  106. package/lib/esm/helpers/Window.js +20 -0
  107. package/lib/esm/helpers/Window.js.map +1 -0
  108. package/lib/esm/helpers/index.js +8 -0
  109. package/lib/esm/helpers/index.js.map +1 -0
  110. package/lib/esm/helpers/response/Banner.js +3 -0
  111. package/lib/esm/helpers/response/Banner.js.map +1 -0
  112. package/lib/esm/helpers/response/BuiltResponse.js +22 -0
  113. package/lib/esm/helpers/response/BuiltResponse.js.map +1 -0
  114. package/lib/esm/helpers/response/Carousel.js +273 -0
  115. package/lib/esm/helpers/response/Carousel.js.map +1 -0
  116. package/lib/esm/helpers/response/Clickthrough.js +20 -0
  117. package/lib/esm/helpers/response/Clickthrough.js.map +1 -0
  118. package/lib/esm/helpers/response/ProductCard.js +189 -0
  119. package/lib/esm/helpers/response/ProductCard.js.map +1 -0
  120. package/lib/esm/helpers/response/Video.js +3 -0
  121. package/lib/esm/helpers/response/Video.js.map +1 -0
  122. package/lib/esm/helpers/response/index.js +7 -0
  123. package/lib/esm/helpers/response/index.js.map +1 -0
  124. package/lib/esm/index.js +5 -3460
  125. package/lib/esm/index.js.map +1 -54
  126. package/lib/esm/models/dynamic/DynamicZone.js +11 -0
  127. package/lib/esm/models/dynamic/DynamicZone.js.map +1 -0
  128. package/lib/esm/models/dynamic/index.js +2 -0
  129. package/lib/esm/models/dynamic/index.js.map +1 -0
  130. package/lib/esm/models/index.js +6 -0
  131. package/lib/esm/models/index.js.map +1 -0
  132. package/lib/esm/models/retail/Configuration.js +9 -0
  133. package/lib/esm/models/retail/Configuration.js.map +1 -0
  134. package/lib/esm/models/retail/Product.js +3 -0
  135. package/lib/esm/models/retail/Product.js.map +1 -0
  136. package/lib/esm/models/retail/Recommended.js +2 -0
  137. package/lib/esm/models/retail/Recommended.js.map +1 -0
  138. package/lib/esm/models/retail/index.js +4 -0
  139. package/lib/esm/models/retail/index.js.map +1 -0
  140. package/lib/esm/models/rtb/BidRequest.js +17 -0
  141. package/lib/esm/models/rtb/BidRequest.js.map +1 -0
  142. package/lib/esm/models/rtb/BidResponse.js +2 -0
  143. package/lib/esm/models/rtb/BidResponse.js.map +1 -0
  144. package/lib/esm/models/rtb/NativeRequest.js +119 -0
  145. package/lib/esm/models/rtb/NativeRequest.js.map +1 -0
  146. package/lib/esm/models/rtb/NativeResponse.js +23 -0
  147. package/lib/esm/models/rtb/NativeResponse.js.map +1 -0
  148. package/lib/esm/models/rtb/index.js +5 -0
  149. package/lib/esm/models/rtb/index.js.map +1 -0
  150. package/lib/esm/models/tracking/Geo.js +2 -0
  151. package/lib/esm/models/tracking/Geo.js.map +1 -0
  152. package/lib/esm/models/tracking/index.js +2 -0
  153. package/lib/esm/models/tracking/index.js.map +1 -0
  154. package/lib/esm/models/vast/Vast.js +3 -0
  155. package/lib/esm/models/vast/Vast.js.map +1 -0
  156. package/lib/esm/models/vast/index.js +2 -0
  157. package/lib/esm/models/vast/index.js.map +1 -0
  158. package/lib/esm/services/Bidder.js +119 -0
  159. package/lib/esm/services/Bidder.js.map +1 -0
  160. package/lib/esm/services/Configuration.js +56 -0
  161. package/lib/esm/services/Configuration.js.map +1 -0
  162. package/lib/esm/services/Device.js +232 -0
  163. package/lib/esm/services/Device.js.map +1 -0
  164. package/lib/esm/services/Dynamic.js +120 -0
  165. package/lib/esm/services/Dynamic.js.map +1 -0
  166. package/lib/esm/services/Geo.js +30 -0
  167. package/lib/esm/services/Geo.js.map +1 -0
  168. package/lib/esm/services/Logger.js +52 -0
  169. package/lib/esm/services/Logger.js.map +1 -0
  170. package/lib/esm/services/Memoization.js +13 -0
  171. package/lib/esm/services/Memoization.js.map +1 -0
  172. package/lib/esm/services/Product.js +120 -0
  173. package/lib/esm/services/Product.js.map +1 -0
  174. package/lib/esm/services/Recommender.js +78 -0
  175. package/lib/esm/services/Recommender.js.map +1 -0
  176. package/lib/esm/services/Result.js +199 -0
  177. package/lib/esm/services/Result.js.map +1 -0
  178. package/lib/esm/services/Template.js +38 -0
  179. package/lib/esm/services/Template.js.map +1 -0
  180. package/lib/esm/services/index.js +12 -0
  181. package/lib/esm/services/index.js.map +1 -0
  182. package/lib/esm/services/mock/Bidder.js +2 -0
  183. package/lib/esm/services/mock/Bidder.js.map +1 -0
  184. package/lib/esm/services/mock/index.js +2 -0
  185. package/lib/esm/services/mock/index.js.map +1 -0
  186. package/lib/types/Api.d.ts +5 -5
  187. package/lib/types/helpers/Handlebars.d.ts +58 -15
  188. package/lib/types/helpers/NativeRequestBuilder.d.ts +1 -1
  189. package/lib/types/helpers/RequestBuilder.d.ts +1 -1
  190. package/lib/types/helpers/TryGet.d.ts +1 -1
  191. package/lib/types/helpers/Window.d.ts +2 -2
  192. package/lib/types/helpers/response/Banner.d.ts +1 -1
  193. package/lib/types/helpers/response/BuiltResponse.d.ts +1 -1
  194. package/lib/types/helpers/response/Carousel.d.ts +1 -1
  195. package/lib/types/helpers/response/Clickthrough.d.ts +1 -1
  196. package/lib/types/helpers/response/ProductCard.d.ts +3 -3
  197. package/lib/types/helpers/response/Video.d.ts +2 -2
  198. package/lib/types/services/Bidder.d.ts +3 -3
  199. package/lib/types/services/Configuration.d.ts +1 -1
  200. package/lib/types/services/Dynamic.d.ts +6 -6
  201. package/lib/types/services/Geo.d.ts +1 -1
  202. package/lib/types/services/Product.d.ts +1 -1
  203. package/lib/types/services/Template.d.ts +3 -3
  204. package/package.json +41 -33
  205. package/lib/index.js +0 -1
  206. package/lib/index.js.map +0 -1
  207. package/lib/types/constant-values/index.d.ts +0 -46
  208. package/lib/types/errors/index.d.ts +0 -3
  209. package/lib/types/helpers/generators/CollectN.d.ts +0 -2
  210. package/lib/types/helpers/generators/index.d.ts +0 -1
  211. package/lib/types/helpers/handlebars/index.d.ts +0 -119
  212. package/lib/types/helpers/requests/RequestBuilder.d.ts +0 -124
  213. package/lib/types/helpers/requests/SimpleBannerRequest.d.ts +0 -26
  214. package/lib/types/helpers/requests/index.d.ts +0 -2
  215. package/lib/types/helpers/responses/BuildBannerResponse.d.ts +0 -10
  216. package/lib/types/helpers/responses/BuildNativeResponse.d.ts +0 -21
  217. package/lib/types/helpers/responses/BuildVideoResponse.d.ts +0 -0
  218. package/lib/types/helpers/responses/ClickthroughHelpers.d.ts +0 -2
  219. package/lib/types/helpers/responses/VastHelpers.d.ts +0 -4
  220. package/lib/types/helpers/responses/index.d.ts +0 -4
  221. package/lib/types/middleware/DeviceMiddleware.d.ts +0 -3
  222. package/lib/types/middleware/GeoMiddleware.d.ts +0 -3
  223. package/lib/types/middleware/IdentityMiddleware.d.ts +0 -4
  224. package/lib/types/middleware/index.d.ts +0 -3
  225. package/lib/types/models/retail/IProductInformation.d.ts +0 -37
  226. package/lib/types/models/retail/IPublisherConfiguration.d.ts +0 -64
  227. package/lib/types/models/retail/IRecommenderResponse.d.ts +0 -10
  228. package/lib/types/models/rtb/IBidRequest.d.ts +0 -399
  229. package/lib/types/models/rtb/IBidResponse.d.ts +0 -47
  230. package/lib/types/models/rtb/native/Constants.d.ts +0 -60
  231. package/lib/types/models/rtb/native/INativeRequest.d.ts +0 -54
  232. package/lib/types/models/rtb/native/INativeResponse.d.ts +0 -60
  233. package/lib/types/models/rtb/native/NativeConstants.d.ts +0 -120
  234. package/lib/types/models/rtb/native/NativeRequestBuilder.d.ts +0 -158
  235. package/lib/types/models/rtb/native/index.d.ts +0 -4
  236. package/lib/types/models/tracking/IEvents.d.ts +0 -82
  237. package/lib/types/models/tracking/IGeoContext.d.ts +0 -14
  238. package/lib/types/models/tracking/IUserID.d.ts +0 -1
  239. package/lib/types/services/OverrideService.d.ts +0 -10
  240. package/lib/types/services/logger/ILoggerService.d.ts +0 -39
  241. package/lib/types/services/logger/LocalLoggerService.d.ts +0 -19
  242. package/lib/types/services/logger/index.d.ts +0 -2
  243. package/lib/types/services/product-feed/IProductFeedService.d.ts +0 -5
  244. package/lib/types/services/product-feed/SurfsideProductFeedService.d.ts +0 -11
  245. package/lib/types/services/product-feed/index.d.ts +0 -2
  246. package/lib/types/services/recommender/IRecommenderService.d.ts +0 -47
  247. package/lib/types/services/recommender/SurfsideRecommenderService.d.ts +0 -31
  248. package/lib/types/services/recommender/index.d.ts +0 -2
  249. package/lib/types/services/rtb/bidder/IBidderService.d.ts +0 -12
  250. package/lib/types/services/rtb/bidder/SurfsideBidderService.d.ts +0 -28
  251. package/lib/types/services/rtb/bidder/index.d.ts +0 -2
  252. package/lib/types/services/rtb/configuration/IConfigurationService.d.ts +0 -14
  253. package/lib/types/services/rtb/configuration/SurfsideConfigurationService.d.ts +0 -29
  254. package/lib/types/services/rtb/configuration/index.d.ts +0 -2
  255. package/lib/types/services/rtb/index.d.ts +0 -2
  256. package/lib/types/services/tracking/device/DeviceOverrideService.d.ts +0 -8
  257. package/lib/types/services/tracking/device/IDeviceService.d.ts +0 -4
  258. package/lib/types/services/tracking/device/SurfsideDeviceService.d.ts +0 -16
  259. package/lib/types/services/tracking/device/index.d.ts +0 -3
  260. package/lib/types/services/tracking/events/IEventService.d.ts +0 -5
  261. package/lib/types/services/tracking/events/SurfsideEventService.d.ts +0 -42
  262. package/lib/types/services/tracking/events/index.d.ts +0 -2
  263. package/lib/types/services/tracking/geo/GeoOverrideService.d.ts +0 -8
  264. package/lib/types/services/tracking/geo/IGeoService.d.ts +0 -12
  265. package/lib/types/services/tracking/geo/SurfsideGeoService.d.ts +0 -7
  266. package/lib/types/services/tracking/geo/index.d.ts +0 -3
  267. package/lib/types/services/tracking/index.d.ts +0 -4
  268. package/lib/types/services/tracking/user/IUserIDService.d.ts +0 -4
  269. package/lib/types/services/tracking/user/SurfsideUserIDService.d.ts +0 -7
  270. package/lib/types/services/tracking/user/UserOverrideService.d.ts +0 -8
  271. package/lib/types/services/tracking/user/index.d.ts +0 -3
  272. package/lib/types/utils/Protocol.d.ts +0 -1
  273. package/lib/types/utils/Rendering.d.ts +0 -44
  274. package/lib/types/utils/index.d.ts +0 -2
@@ -0,0 +1,232 @@
1
+ import { AdCom10DeviceTypes } from '../models';
2
+ import { Ctx, Ok } from '.';
3
+ export const GetDevice = (logger, screen, navigator, mobile) => {
4
+ const log = Ctx(logger)?.with('DeviceService');
5
+ log?.info('Getting device info');
6
+ const deviceInfo = getDeviceInfo(log, navigator.userAgent);
7
+ const sua = {
8
+ model: deviceInfo?.model,
9
+ mobile: mobile ? 1 : 0, // open RTB uses 1 for true and 0 for false
10
+ browsers: deviceInfo?.browser !== undefined
11
+ ? [deviceInfo.browser]
12
+ : undefined,
13
+ platform: (deviceInfo?.os !== undefined)
14
+ ? {
15
+ brand: deviceInfo?.os,
16
+ version: deviceInfo?.osv?.split('.')
17
+ }
18
+ : undefined,
19
+ architecture: getCPUArchitecture(log, navigator.userAgent, mobile),
20
+ source: 3
21
+ };
22
+ return Ok({
23
+ make: deviceInfo?.make,
24
+ model: deviceInfo?.model,
25
+ w: screen.width,
26
+ h: screen.height,
27
+ language: navigator.language,
28
+ ua: navigator.userAgent,
29
+ devicetype: getDeviceType(log, screen, mobile),
30
+ os: deviceInfo?.os,
31
+ osv: deviceInfo?.osv,
32
+ sua
33
+ });
34
+ };
35
+ const getDeviceInfo = (logger, userAgent) => {
36
+ const log = Ctx(logger)?.with('tryGetDeviceInfo');
37
+ log?.debug('getting device info');
38
+ const userAgentLower = userAgent.toLowerCase();
39
+ const browser = getBrowserInfo(log, navigator.userAgent);
40
+ if (userAgentLower.includes('android')) {
41
+ return {
42
+ ...getAndroidDeviceInfo(log, userAgent),
43
+ browser
44
+ };
45
+ }
46
+ else if (userAgentLower.includes('iphone') || userAgentLower.includes('ipad')) {
47
+ return {
48
+ ...getiPhoneDeviceInfo(log, userAgent),
49
+ browser
50
+ };
51
+ }
52
+ else if (userAgentLower.includes('windows nt')) {
53
+ return {
54
+ make: 'Microsoft',
55
+ model: 'Windows',
56
+ os: 'Windows',
57
+ osv: /Windows NT (?<osv>[0-9.]+)/ig.exec(userAgent)?.groups?.osv,
58
+ browser
59
+ };
60
+ }
61
+ else if (userAgentLower.includes('macintosh')) {
62
+ return {
63
+ make: 'Apple',
64
+ model: 'Macintosh',
65
+ os: 'MacOS',
66
+ osv: /Mac OS X (?<osv>[0-9_]+)/ig.exec(userAgent)?.groups?.osv?.replaceAll('_', '.'),
67
+ browser
68
+ };
69
+ }
70
+ return { browser };
71
+ };
72
+ const getAndroidDeviceInfo = (logger, userAgent) => {
73
+ const log = Ctx(logger)?.with('getAndroidDeviceInfo');
74
+ log?.debug('getting android info');
75
+ const match = /^[^\s]+\s\((?<Linux>.*);\s*(?<osv>[^)]+);\s*(?<Model>[^)]+)\)/ig.exec(userAgent);
76
+ const osv = match?.groups?.osv;
77
+ const model = match?.groups?.Model;
78
+ const partialDevice = {
79
+ os: 'Android',
80
+ osv,
81
+ model,
82
+ };
83
+ if (model !== undefined) {
84
+ if (model.includes('Pixel')) {
85
+ return {
86
+ ...partialDevice,
87
+ make: 'Google'
88
+ };
89
+ }
90
+ else if (model.includes('SM-')) {
91
+ return {
92
+ ...partialDevice,
93
+ make: 'Samsung'
94
+ };
95
+ }
96
+ else if (model.startsWith('LG-')) {
97
+ return {
98
+ ...partialDevice,
99
+ make: 'LG'
100
+ };
101
+ }
102
+ else if (model.startsWith('moto')) {
103
+ return {
104
+ ...partialDevice,
105
+ make: 'Motorola'
106
+ };
107
+ }
108
+ else if (model.startsWith('Redmi')) {
109
+ return {
110
+ ...partialDevice,
111
+ make: 'Xiaomi'
112
+ };
113
+ }
114
+ else {
115
+ return {
116
+ ...partialDevice,
117
+ make: 'Android'
118
+ };
119
+ }
120
+ }
121
+ return {
122
+ os: 'Android',
123
+ osv
124
+ };
125
+ };
126
+ const getiPhoneDeviceInfo = (logger, userAgent) => {
127
+ const log = Ctx(logger)?.with('getIphoneDeviceInfo');
128
+ log?.debug('getting iPhone info');
129
+ const match = /^[^\s]+\s*\((?<Device>[^;]+);\s(?<Model>[^;)]+[;)])\s(?<ModelExt>[^;)]+[;)])?/ig.exec(userAgent);
130
+ const make = 'Apple';
131
+ const device = match?.groups?.Device;
132
+ const model = device?.toLowerCase().includes('ipad') === true
133
+ ? 'iPad'
134
+ : 'iPhone';
135
+ const modelGroup = match?.groups?.Model;
136
+ /* Newer Device */
137
+ const os = 'iOS';
138
+ const osvSearch = modelGroup === 'U'
139
+ ? match?.groups?.ModelExt
140
+ : modelGroup;
141
+ const osv = osvSearch !== undefined
142
+ ? /OS (?<ver>[0-9_]+)/ig.exec(osvSearch)?.groups?.ModelExt
143
+ : undefined;
144
+ return {
145
+ make,
146
+ model,
147
+ os,
148
+ osv
149
+ };
150
+ };
151
+ const getBrowserInfo = (logger, userAgent) => {
152
+ const log = Ctx(logger)?.with('getBrowserInfo');
153
+ log?.debug('getting browser info');
154
+ try {
155
+ if (userAgent.includes('Firefox/')) {
156
+ return {
157
+ version: userAgent.split('Firefox/')[1]?.split('.'),
158
+ brand: 'Firefox'
159
+ };
160
+ }
161
+ else if (userAgent.includes('Chrome/')) {
162
+ return {
163
+ version: userAgent.split('Chrome/')[1]?.split(' ')[0]?.split('.'),
164
+ brand: 'Chrome'
165
+ };
166
+ }
167
+ else if (userAgent.includes('CriOS')) {
168
+ // Chrome on iOS uses "CriOS/" instead of "Chrome/", which was causing issues
169
+ return {
170
+ version: userAgent.split('CriOS/')[1]?.split(' ')[0]?.split('.'),
171
+ brand: 'Chrome'
172
+ };
173
+ }
174
+ else if (userAgent.includes('Safari/') && !userAgent.includes('Chrome')) {
175
+ // Safari version is a bit trickier due to its UA string format
176
+ return {
177
+ version: userAgent.split('Version/')[1]?.split(' ')[0]?.split('.'),
178
+ brand: 'Safari'
179
+ };
180
+ }
181
+ else if (userAgent.includes('Edg/')) {
182
+ return {
183
+ version: userAgent.split('Edg/')[1]?.split('.'),
184
+ brand: 'Edge'
185
+ };
186
+ }
187
+ }
188
+ catch (error) {
189
+ log?.error(error);
190
+ }
191
+ };
192
+ const getCPUArchitecture = (logger, userAgent, mobile) => {
193
+ const log = Ctx(logger)?.with('getCPUArchitecture');
194
+ log?.debug('Getting CPU arch');
195
+ // Common architecture patterns
196
+ if (/Win64|x64|x86_64|WOW64/.test(userAgent)) {
197
+ return 'x64';
198
+ }
199
+ if (/Win32|x86/.test(userAgent)) {
200
+ return 'x86';
201
+ }
202
+ if (/aarch64|arm64/.test(userAgent)) {
203
+ return 'ARM64';
204
+ }
205
+ if (/armv\d+/.test(userAgent)) {
206
+ return 'ARM';
207
+ }
208
+ /* Just naively assume all phones are arm */
209
+ if (mobile) {
210
+ return 'ARM';
211
+ }
212
+ log?.warn('Failed to get cpu architecture');
213
+ return;
214
+ };
215
+ const getDeviceType = (logger, screen, mobile) => {
216
+ const log = Ctx(logger)?.with('getDeviceType');
217
+ log?.debug('getting device type');
218
+ const MINIMUM_SHORT_TABLET = 600;
219
+ const MAXIMUM_LONG_TABLET = 960;
220
+ const hasTouch = mobile;
221
+ if (!hasTouch) {
222
+ return AdCom10DeviceTypes.PC;
223
+ }
224
+ const width = screen.width;
225
+ const height = screen.height;
226
+ const [shorterSide, longerSide] = [width, height].sort((a, b) => a - b);
227
+ if (hasTouch && shorterSide >= MINIMUM_SHORT_TABLET && longerSide >= MAXIMUM_LONG_TABLET) {
228
+ return AdCom10DeviceTypes.Tablet;
229
+ }
230
+ return AdCom10DeviceTypes.Mobile;
231
+ };
232
+ //# sourceMappingURL=Device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Device.js","sourceRoot":"src/","sources":["services/Device.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import { Ctx } from './Logger';
2
+ import { Err, GetValue, Ok, TryDo } from './Result';
3
+ export const GetDynamicZone = async (logger, config, zoneId) => {
4
+ const log = Ctx(logger)?.with('GetDynamicZone');
5
+ log?.info('Getting dynamic zone', zoneId);
6
+ const dynamicZone = config?.dynamicZones?.[zoneId];
7
+ if (dynamicZone === undefined) {
8
+ return Err(new MissingDynamicZoneError(zoneId));
9
+ }
10
+ log?.debug('Dynamic zone', dynamicZone);
11
+ return Ok(dynamicZone);
12
+ };
13
+ export const BuildDynamicZoneRequest = (logger, startRequest, nativeRequest, screenInfo, zoneId, dynamicZone) => {
14
+ const log = Ctx(logger)?.with('BuildDynamicZoneRequest');
15
+ log?.info('Building dynamic zone request', dynamicZone);
16
+ const screenSizeRes = selectDynamicScreenSize(log, screenInfo, dynamicZone);
17
+ if (!screenSizeRes.ok) {
18
+ return screenSizeRes;
19
+ }
20
+ return buildDynamicBidRequestFromSelectedScreenSize(log, startRequest, nativeRequest, zoneId, screenSizeRes.value);
21
+ };
22
+ const selectDynamicScreenSize = (logger, screenInfo, dynamicZone) => {
23
+ const log = Ctx(logger)?.with('selectDynamicScreenSize');
24
+ log?.info('Getting screen size for dynamic zone', screenInfo);
25
+ const screenSize = GetValue(TryDo(() => {
26
+ if (screenInfo.width < 768) {
27
+ return 'mobile';
28
+ }
29
+ else if (screenInfo.width < 1024) {
30
+ return 'tablet';
31
+ }
32
+ else {
33
+ return 'desktop';
34
+ }
35
+ })) ?? 'default';
36
+ const selectedDynamic = dynamicZone.value
37
+ .filter(screen => screen.size === screenSize)?.[0]
38
+ ?? dynamicZone.value
39
+ .filter(screen => screen.size === 'default')?.[0];
40
+ if (selectedDynamic === undefined) {
41
+ return Err(new NoDynamicScreenSizeMatchError(dynamicZone, screenInfo, screenSize));
42
+ }
43
+ log?.debug('selectedDynamic', selectedDynamic);
44
+ return Ok(selectedDynamic);
45
+ };
46
+ export class NoDynamicScreenSizeMatchError extends Error {
47
+ dynamicZone;
48
+ screenInfo;
49
+ selectedStringSize;
50
+ constructor(dynamicZone, screenInfo, selectedStringSize) {
51
+ super('No dynamic screen size matched the window width');
52
+ this.dynamicZone = dynamicZone;
53
+ this.screenInfo = screenInfo;
54
+ this.selectedStringSize = selectedStringSize;
55
+ }
56
+ }
57
+ ;
58
+ export const buildDynamicBidRequestFromSelectedScreenSize = (logger, startRequest, nativeRequest, zoneId, screenSize) => {
59
+ const log = Ctx(logger)?.with('buildDynamicBidRequestFromSelectedScreenSize');
60
+ log?.info('Building dynamic bid request', zoneId, screenSize);
61
+ const requestPayload = buildDynamicBidRequestRecursive(log, nativeRequest, startRequest(zoneId), {}, screenSize.values);
62
+ if (!requestPayload.ok) {
63
+ return requestPayload;
64
+ }
65
+ log?.debug('requestPayload', requestPayload);
66
+ const [builder, requestIds] = requestPayload.value;
67
+ return Ok({
68
+ request: builder.build(),
69
+ requestIds
70
+ });
71
+ };
72
+ export const buildDynamicBidRequestRecursive = (logger, nativeRequest, builder, requestIds, [head, ...tail]) => {
73
+ const log = Ctx(logger);
74
+ log?.info('descending...');
75
+ if (head === undefined) {
76
+ // Not an error - we are done
77
+ log?.info('Finished');
78
+ return Ok([builder, requestIds]);
79
+ }
80
+ if (head.type === 'Banner') {
81
+ log?.info('Adding banner to request');
82
+ const banner = head;
83
+ const id = crypto.randomUUID();
84
+ return buildDynamicBidRequestRecursive(log, nativeRequest, builder.withBanner(banner.width, banner.height, undefined, { id }), {
85
+ ...requestIds,
86
+ [id]: head
87
+ }, tail);
88
+ }
89
+ else if (head.type === 'Video') {
90
+ log?.info('Adding video to request');
91
+ const video = head;
92
+ const id = crypto.randomUUID();
93
+ return buildDynamicBidRequestRecursive(log, nativeRequest, builder.withVideo(video.width, video.height, video.minDuration ?? 0, video.maxDuration, ['video/mp4', 'video/webm'], undefined, { id }), {
94
+ ...requestIds,
95
+ [id]: head
96
+ }, tail);
97
+ }
98
+ else if (head.type === 'Carousel' || head.type === 'ProductCard') {
99
+ log?.info('Adding carousel to request');
100
+ const id = crypto.randomUUID();
101
+ return buildDynamicBidRequestRecursive(log, nativeRequest, builder.withNative(nativeRequest()
102
+ .withMetaProduct()
103
+ .build(), undefined, { id }), {
104
+ ...requestIds,
105
+ [id]: head
106
+ }, tail);
107
+ }
108
+ else {
109
+ log?.warn('Invalid creative type. Skipping.', head);
110
+ return buildDynamicBidRequestRecursive(log, nativeRequest, builder, requestIds, tail);
111
+ }
112
+ };
113
+ export class MissingDynamicZoneError extends Error {
114
+ zoneId;
115
+ constructor(zoneId) {
116
+ super('Missing dynamic zone ' + zoneId);
117
+ this.zoneId = zoneId;
118
+ }
119
+ }
120
+ //# sourceMappingURL=Dynamic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dynamic.js","sourceRoot":"src/","sources":["services/Dynamic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Ctx } from './Logger';
2
+ import { Err, Ok } from './Result';
3
+ const SURF_GEO_SERVICE_URL = 'https://g.surfside.io/enrich';
4
+ const LOCATION_TYPE_IP = 2;
5
+ const IP_SERVICES_MAXMIND = 3;
6
+ export const GetGeo = async (logger) => {
7
+ const log = Ctx(logger)?.with('GeoService');
8
+ log?.info('Getting Geo info');
9
+ try {
10
+ const response = await fetch(SURF_GEO_SERVICE_URL);
11
+ log?.debug('Geo Response', response);
12
+ return Ok(await response.json());
13
+ }
14
+ catch (err) {
15
+ return Err(err);
16
+ }
17
+ };
18
+ export const GeoContextToORTB = (logger, geoContext) => ({
19
+ lat: geoContext.coords.latitude,
20
+ lon: geoContext.coords.longitude,
21
+ city: geoContext.city,
22
+ region: geoContext.region,
23
+ country: geoContext.country,
24
+ zip: geoContext.zip,
25
+ type: LOCATION_TYPE_IP,
26
+ accuracy: geoContext.coords.accuracy,
27
+ utcoffset: geoContext.utcoffset,
28
+ ipservice: IP_SERVICES_MAXMIND
29
+ });
30
+ //# sourceMappingURL=Geo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Geo.js","sourceRoot":"src/","sources":["services/Geo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAgB,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAoB,MAAM,UAAU,CAAC;AAErD,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAI5D,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,MAAgB,EAA4B,EAAE;IACvE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,GAAG,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC9B,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACnD,GAAG,EAAE,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACrC,OAAO,EAAE,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAiB,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,GAAY,CAAC,CAAC;IAC7B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAA2B,EAAE,UAAuB,EAAQ,EAAE,CAAC,CAAC;IAC7F,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ;IAC/B,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS;IAChC,IAAI,EAAE,UAAU,CAAC,IAAI;IACrB,MAAM,EAAE,UAAU,CAAC,MAAM;IACzB,OAAO,EAAE,UAAU,CAAC,OAAO;IAC3B,GAAG,EAAE,UAAU,CAAC,GAAG;IACnB,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ;IACpC,SAAS,EAAE,UAAU,CAAC,SAAS;IAC/B,SAAS,EAAE,mBAAmB;CACjC,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ const SURF_PREFIX = '%c[SURF]';
2
+ const SEPARATOR = ' ›';
3
+ const UNDEF = '[ undefined ]';
4
+ const LogColors = {
5
+ /* Accents */
6
+ Lavender: '#c0abff',
7
+ UltraRed: '#f97585',
8
+ SoftGold: '#f4bd5d',
9
+ MagicMint: '#baf7db'
10
+ };
11
+ ;
12
+ ;
13
+ const log = (log, args, color) => {
14
+ args.unshift(`border-radius: 3px; margin-left: 10px; background: ${color}; font-size: 12px; font-weight: bold;`);
15
+ args.unshift(SURF_PREFIX);
16
+ log.apply(console, args);
17
+ };
18
+ const info = (...args) => log(console.log, ['(Info)', ...args], LogColors.Lavender);
19
+ const warn = (...args) => log(console.warn, ['(Warning)', ...args], LogColors.SoftGold);
20
+ const debug = (...args) => log(console.debug, ['(Debug)', ...args], LogColors.MagicMint);
21
+ const error = (...args) => log(console.error, ['(Error)', ...args], LogColors.UltraRed);
22
+ const context = (logger, ...prefix) => {
23
+ const newPrefix = joinCtx(prefix) + SEPARATOR;
24
+ const newLogger = {
25
+ info: logger.info.bind(undefined, newPrefix),
26
+ warn: logger.warn.bind(undefined, newPrefix),
27
+ debug: logger.debug.bind(undefined, newPrefix),
28
+ error: logger.error.bind(undefined, newPrefix),
29
+ table: console.table,
30
+ with: logger.with
31
+ };
32
+ newLogger.with = context.bind(undefined, newLogger);
33
+ return newLogger;
34
+ };
35
+ export const InitLogger = () => {
36
+ const logger = {
37
+ info,
38
+ warn,
39
+ debug,
40
+ error,
41
+ table: console.table
42
+ };
43
+ logger.with = context.bind(undefined, logger);
44
+ return logger;
45
+ };
46
+ const joinCtx = (ctx) => ctx.map(e => e === undefined ? UNDEF : e).join(SEPARATOR);
47
+ export const Ctx = (logger) => logger === undefined
48
+ ? undefined
49
+ : logger?.with === undefined
50
+ ? { ...logger, with: () => Ctx(logger) }
51
+ : logger;
52
+ //# sourceMappingURL=Logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Logger.js","sourceRoot":"src/","sources":["services/Logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export const Memo = (fn) => {
2
+ const cache = new Map();
3
+ return (...args) => {
4
+ const key = JSON.stringify(args);
5
+ if (cache.has(key)) {
6
+ return cache.get(key);
7
+ }
8
+ const result = fn(...args);
9
+ cache.set(key, result);
10
+ return result;
11
+ };
12
+ };
13
+ //# sourceMappingURL=Memoization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Memoization.js","sourceRoot":"src/","sources":["services/Memoization.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,CAAqB,EAAqB,EAAqB,EAAE;IACjF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IACnC,OAAO,CAAC,GAAG,IAAO,EAAK,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QAC3B,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { Ctx } from './Logger';
2
+ import { Err, Ok } from './Result';
3
+ export async function* GetSponsoredProduct(logger, url, accountId, locationId, nativeId) {
4
+ const log = Ctx(logger)?.with('GetSponsoredProduct').with(accountId).with(locationId).with(nativeId);
5
+ log?.info('Getting sponsored product');
6
+ try {
7
+ const rawResponse = await fetch(`${url}/native/${accountId}/${locationId}/${nativeId}.json`);
8
+ if (rawResponse.status !== 200) {
9
+ log?.error('product feed service returned with non-200 response', rawResponse.status);
10
+ return;
11
+ }
12
+ const products = rawResponse;
13
+ log?.debug('response', products);
14
+ if (Array.isArray(products)) {
15
+ log?.debug('Brand level creative');
16
+ const productArr = products;
17
+ for (const product of productArr) {
18
+ yield mapResponseToProductInfo(log, product);
19
+ }
20
+ }
21
+ else {
22
+ log?.debug('Individual product creative');
23
+ const product = products;
24
+ return mapResponseToProductInfo(log, product);
25
+ }
26
+ }
27
+ catch (err) {
28
+ log?.error(err);
29
+ }
30
+ }
31
+ export const GetAllSponsoredProducts = async (logger, url, accountId, locationId, nativeId) => {
32
+ const log = Ctx(logger)?.with('GetSponsoredProduct').with(accountId).with(locationId).with(nativeId);
33
+ log?.info('Getting sponsored product');
34
+ try {
35
+ const rawResponse = await fetch(`${url}/native/${accountId}/${locationId}/${nativeId}.json`);
36
+ if (rawResponse.status !== 200) {
37
+ log?.error('product feed service returned with non-200 response', rawResponse.status);
38
+ return Err(new NoNativeError(nativeId));
39
+ }
40
+ const products = (await rawResponse.json());
41
+ log?.debug('response', products);
42
+ if (Array.isArray(products)) {
43
+ log?.debug('Brand level creative');
44
+ const productArr = products;
45
+ const mapResponseToProductInfoLogged = mapResponseToProductInfo.bind(undefined, log);
46
+ return Ok(productArr.map(mapResponseToProductInfoLogged));
47
+ }
48
+ else {
49
+ log?.debug('Individual product creative');
50
+ const product = products;
51
+ return Ok([mapResponseToProductInfo(log, product)]);
52
+ }
53
+ }
54
+ catch (err) {
55
+ log?.error(err);
56
+ return Err(err);
57
+ }
58
+ };
59
+ export const GetRecommendedProduct = async (logger, url, accountId, locationId, productId) => {
60
+ const log = Ctx(logger)?.with('GetRecommendedProduct').with(accountId).with(locationId).with(productId);
61
+ log?.info('Getting recommended product');
62
+ try {
63
+ const rawResponse = await fetch(`${url}/product/${accountId}/${locationId}/${productId}.json`);
64
+ if (rawResponse.status !== 200) {
65
+ log?.error('product feed service returned with non-200 response', rawResponse.status);
66
+ return Err(new Error('product feed service returned with non-200 response'));
67
+ }
68
+ const rawProduct = await rawResponse.json();
69
+ log?.debug('response', rawProduct);
70
+ const productInfo = mapResponseToProductInfo(log, rawProduct);
71
+ log?.debug('mapped', productInfo);
72
+ return Ok(productInfo);
73
+ }
74
+ catch (err) {
75
+ log?.error(err);
76
+ return Err(err);
77
+ }
78
+ };
79
+ const mapResponseToProductInfo = (logger, data) => {
80
+ const log = Ctx(logger)?.with('mapResponseToProductInfo');
81
+ log?.debug('Mapping product');
82
+ const getField = fieldOrUndef.bind(undefined, data);
83
+ return {
84
+ image: getField('image_link'),
85
+ price: getField('price'),
86
+ salePrice: getField('sale_price'),
87
+ thc: getField('thc'),
88
+ cbd: getField('cbd'),
89
+ strain: getField('strain'),
90
+ name: getField('name'),
91
+ brand_name: getField('brand'),
92
+ brandName: getField('brand'),
93
+ productType: getField('productType'),
94
+ details: getField('details'),
95
+ cta: getField('cta'),
96
+ clickthroughUrl: getField('clickthroughUrl'),
97
+ winUrl: getField('winUrl'),
98
+ pixelUrl: getField('pixelUrl'),
99
+ ext: data
100
+ };
101
+ };
102
+ const fieldOrUndef = (data, field) => {
103
+ if (field in data) {
104
+ return String(data[field]);
105
+ }
106
+ return undefined;
107
+ };
108
+ export class NoNativeError extends Error {
109
+ nativeId;
110
+ constructor(nativeId) {
111
+ super('Native ID did not exist in product feed: ' + nativeId);
112
+ this.nativeId = nativeId;
113
+ }
114
+ }
115
+ //blissandlex-ues
116
+ // blissandlex-ues
117
+ // blissandlex-ues
118
+ // blissandlex-ues
119
+ // blissandlex-ues
120
+ //# sourceMappingURL=Product.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Product.js","sourceRoot":"src/","sources":["services/Product.ts"],"names":[],"mappings":"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"}