@surfside/ads-core-client 0.1.0 → 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"src/","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iDA8B4B;AAC5B,uCASmB;AAEnB,wDAA+F;AAE/F,qDAAmC;AACnC,4CAA0B;AAE1B,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,GAAG,GAAG,CAAC;AAapC,MAAM,6BAA6B,GAAG,KAAK,EAAE,oBAiCnD,EAAmC,EAAE;IAClC,MAAM,EACF,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,yBAAyB,EACzB,cAAc,EACd,4BAA4B,EAC5B,2BAA2B,EAC3B,2BAA2B,EAC3B,4BAA4B,EAC5B,UAAU,EACV,UAAU,EACV,UAAU,EACV,SAAS,EACT,MAAM,EACN,EAAE,EACF,gBAAgB,EAChB,SAAS,EACT,MAAM,EACN,SAAS,EACT,UAAU,EACV,MAAM,EACN,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACvB,GAAG,oBAAoB,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,IAAA,kCAAuB,EAAC;QACzC,MAAM;QACN,WAAW;QACX,gBAAgB;QAChB,MAAM;QACN,SAAS;QACT,mBAAmB;QACnB,uBAAuB;QACvB,qBAAqB;QACrB,mBAAmB;QACnB,cAAc;QACd,yBAAyB;QACzB,qCAAqC,EAAE,4BAA4B;QACnE,cAAc;QACd,oCAAoC,EAAE,2BAA2B;QACjE,2BAA2B;QAC3B,4BAA4B;QAC5B,UAAU;QACV,UAAU;QACV,UAAU;QACV,SAAS;QACT,MAAM;QACN,EAAE;QACF,gBAAgB;QAChB,SAAS;QACT,MAAM;QACN,SAAS;QACT,UAAU;QACV,MAAM;KACT,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,OAAO,IAAA,aAAE,EAAC;QACN,GAAG,MAAM,CAAC,KAAK;QACf,mBAAmB;QACnB,kBAAkB;QAClB,iBAAiB;QACjB,oBAAoB;QACpB,oBAAoB,EAAE,8BAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAC7D,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAC9C,MAAM,CAAC,KAAK,CAAC,oCAAoC,EACjD,MAAM,CAAC,KAAK,CAAC,wBAAwB,EACrC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CACrD;QACD,SAAS;QACT,UAAU;QACV,UAAU;KACb,CAAC,CAAC;AACP,CAAC,CAAC;AAzHW,QAAA,6BAA6B,iCAyHxC;AAEK,MAAM,6BAA6B,GAAG,KAAK,EAC9C,MAA2B,EAC3B,gBAAwB,EACxB,uBAA+B,EAC/B,cAAsB,EACtB,yBAAiC,EACjC,qBAA6B,EAC7B,qBAA6B,EAC7B,UAAyC,EACzC,UAAmB,EACnB,SAAqB,EACrB,MAAe,EACf,EAAsB,EACtB,gBAAoC,EACpC,SAAiB,EACjB,MAAc,EACd,SAAiB,EACjB,UAAkB,EAClB,MAA0B,EACK,EAAE;IACjC,MAAM,MAAM,GAAG,MAAM,IAAA,kCAAuB,EACxC,MAAM,EACN,gBAAgB,EAChB,uBAAuB,EACvB,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,EACV,UAAU,EACV,SAAS,EACT,MAAM,EACN,EAAE,EACF,gBAAgB,EAChB,SAAS,EACT,MAAM,EACN,SAAS,EACT,UAAU,EACV,MAAM,CACT,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;IAEzB,MAAM,mBAAmB,GAAG,6BAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IACvG,MAAM,kBAAkB,GAAG,4BAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAErG,OAAO,IAAA,qCAA6B,EAAC;QACjC,MAAM;QACN,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;QAC5C,uBAAuB,EAAE,GAAG,CAAC,uBAAuB;QACpD,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;QAChD,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;QAC5C,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,yBAAyB,EAAE,GAAG,CAAC,yBAAyB;QACxD,4BAA4B,EAAE,GAAG,CAAC,qCAAqC;QACvE,2BAA2B,EAAE,GAAG,CAAC,oCAAoC;QACrE,mBAAmB;QACnB,kBAAkB;QAClB,iBAAiB,EAAE,2BAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EACvD,mBAAmB,EACnB,kBAAkB,EAClB,GAAG,CAAC,qCAAqC,CAC5C;QACD,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,oBAAoB,EAAE,8BAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAC7D,mBAAmB,EACnB,kBAAkB,EAClB,GAAG,CAAC,qCAAqC,CAC5C;QACD,2BAA2B,EAAE,GAAG,CAAC,2BAA2B;QAC5D,4BAA4B,EAAE,GAAG,CAAC,4BAA4B;QAC9D,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU;QACV,UAAU;QACV,SAAS;QACT,MAAM;QACN,EAAE;QACF,gBAAgB;QAChB,SAAS;QACT,MAAM;QACN,SAAS;QACT,UAAU;QACV,MAAM;KACT,CAAC,CAAC;AACP,CAAC,CAAC;AA5FW,QAAA,6BAA6B,iCA4FxC;AAEK,MAAM,qBAAqB,GAAG,KAAK,EACtC,SAAiB,EACjB,MAAc,EACd,SAAiB,EACjB,UAAkB,EAClB,MAA0B,EAC1B,MAAgB,EACe,EAAE;IACjC,MAAM,UAAU,GAAG,IAAA,wBAAa,GAAE,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,OAAO,IAAA,qCAA6B,EAChC,MAAM,EACN,GAAG,CAAC,sBAAW,CAAC,EAChB,GAAG,CAAC,qCAA0B,CAAC,EAC/B,GAAG,CAAC,sCAA2B,CAAC,EAChC,GAAG,CAAC,wCAA6B,CAAC,EAClC,GAAG,CAAC,mCAAwB,CAAC,EAC7B,GAAG,CAAC,oCAAyB,CAAC,EAC9B,UAAU,CAAC,KAAK,EAChB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,SAAS,EAChB,QAAQ,EAAE,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,MAAM,EACN,SAAS,EACT,UAAU,EACV,MAAM,CACT,CAAC;AACN,CAAC,CAAC;AAjCW,QAAA,qBAAqB,yBAiChC;AAEF,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './response';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"src/","sources":["helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { BuildClickthroughUrl, Ctx, Err, GetValue, MissingAdmError, Ok } from '@surfside/ads-core';
2
+ export const BuildBannerResponse = (logger, windowInfo, config, bid) => {
3
+ const log = Ctx(logger)?.with('BuildBannerResponse');
4
+ log?.info('Building banner response');
5
+ log?.debug(bid);
6
+ const adm = bid?.adm;
7
+ if (adm === undefined || adm === null) {
8
+ return Err(new MissingAdmError(bid ?? null));
9
+ }
10
+ const parser = new DOMParser();
11
+ const admDoc = parser.parseFromString(adm, 'text/html');
12
+ const dataTag = admDoc.getElementById('surf-product-info');
13
+ admDoc.childNodes.forEach(child => log?.debug(child.outerHTML));
14
+ const productData = getProductInfoFromDivTag(log, dataTag, bid);
15
+ const clickthrough = buildBidderClickCallback(log, windowInfo, config, GetValue(productData), admDoc);
16
+ if (!clickthrough.ok) {
17
+ log?.error('Failed to build banner', clickthrough.error);
18
+ return clickthrough;
19
+ }
20
+ const serializer = new XMLSerializer();
21
+ const html = serializer.serializeToString(admDoc);
22
+ return Ok({
23
+ type: 'banner',
24
+ adm: html,
25
+ clickthrough: clickthrough.value,
26
+ bid
27
+ });
28
+ };
29
+ const buildBidderClickCallback = (logger, windowInfo, configuration, productData, document) => {
30
+ const log = Ctx(logger)?.with('buildBidderClickCallback');
31
+ log?.info('Building bidder click callback');
32
+ const bidderClickCallbackUrlAnchors = document.querySelectorAll('a[href*=\\{SURF_COMMERCE_URL\\}]');
33
+ if (bidderClickCallbackUrlAnchors.length > 0) {
34
+ if (productData === undefined) {
35
+ log?.error('The banner had {SURF_COMMERCE_URL} in its clickthrough link, so it is expecting a rendered ' +
36
+ 'clickthrough URL, but there was no product info provided. Therefore, the banner cannot be rendered, ' +
37
+ 'or else it might redirect to an invalid page');
38
+ return Err(new MissingProductInfoError);
39
+ }
40
+ const clickthrough = BuildClickthroughUrl(log, windowInfo, configuration, productData // destructure in case it's undefined. ProductInfo has no required fields
41
+ );
42
+ if (clickthrough.ok === false) {
43
+ log?.error('The banner had {SURF_COMMERCE_URL} in its clickthrough link, so it is expecting a rendered ' +
44
+ 'clickthrough URL, but the clickthrough failed to render. Therefore, the banner cannot be rendered, ' +
45
+ 'or else it might redirect to an invalid page', clickthrough.error);
46
+ return clickthrough; // Error Result
47
+ }
48
+ bidderClickCallbackUrlAnchors.forEach(a => {
49
+ const href = a.getAttribute('href');
50
+ if (href === null) {
51
+ return;
52
+ }
53
+ const finalClick = href.replace('{SURF_COMMERCE_URL}', clickthrough.value);
54
+ a.setAttribute('href', finalClick);
55
+ });
56
+ return Ok(clickthrough.value);
57
+ }
58
+ return Ok(undefined);
59
+ };
60
+ export const getProductInfoFromDivTag = (logger, div, bid) => {
61
+ const log = Ctx(logger)?.with('getProductInfoFromDivTag');
62
+ log?.info('Getting product info for banner');
63
+ if (div === null) {
64
+ log?.warn('No product data for banner in div tag');
65
+ return Err(new MissingProductInfoError);
66
+ }
67
+ const { image, price, saleprice, thc, strain, cbd, name, brandname, producttype, details, cta, clickthroughurl, winurl, pixelurl, } = div.dataset;
68
+ log?.debug('Brand Name:' + brandname + '\nProduct Type' + producttype);
69
+ if (brandname === undefined) {
70
+ log?.warn('Missing brand name field in banner creative. The brand name was probably not set on the banner. ' +
71
+ 'Technically, this isn\'t an *error*, but almost all banner creatives rely on brand info, so the ' +
72
+ 'banner probably isn\'t working. CHECK THE CREATIVE. Banner ID is: ' + bid.crid);
73
+ }
74
+ const productData = {
75
+ image,
76
+ price,
77
+ salePrice: saleprice,
78
+ thc,
79
+ strain,
80
+ cbd,
81
+ name,
82
+ brand_name: brandname,
83
+ brandName: brandname,
84
+ productType: producttype,
85
+ details,
86
+ cta,
87
+ clickthroughUrl: clickthroughurl,
88
+ winurl,
89
+ pixelurl
90
+ };
91
+ if (Object.keys(productData).length === 0) {
92
+ return Err(new MissingProductInfoError());
93
+ }
94
+ return Ok(productData);
95
+ };
96
+ export class MissingProductInfoError extends Error {
97
+ constructor() {
98
+ super('Missing product info in banner');
99
+ }
100
+ }
101
+ //# sourceMappingURL=Banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Banner.js","sourceRoot":"src/","sources":["helpers/response/Banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { AllOrNone, Ctx, GetValue, Ok, ValueOr } from '@surfside/ads-core';
2
+ export const BuildAllResponses = async (logger, buildBannerResponse, buildVideoResponse, buildAllProductCardResponses, request, response) => {
3
+ const log = Ctx(logger)?.with('BuildAllResponses');
4
+ log?.info('Building all bid responses');
5
+ log?.debug(request, response);
6
+ const bannerRequestIds = request.imp.filter(imp => imp.banner !== undefined).map(imp => imp.id);
7
+ const videoRequestIds = request.imp.filter(imp => imp.video !== undefined).map(imp => imp.id);
8
+ const nativeRequestIds = request.imp.filter(imp => imp.native !== undefined).map(imp => imp.id);
9
+ log?.debug(bannerRequestIds, videoRequestIds, nativeRequestIds);
10
+ const bannerBids = response.seatbid?.[0]?.bid.filter(bid => bannerRequestIds.includes(bid.impid)) ?? [];
11
+ const videoBids = response.seatbid?.[0]?.bid.filter(bid => videoRequestIds.includes(bid.impid)) ?? [];
12
+ const nativeBids = response.seatbid?.[0]?.bid.filter(bid => nativeRequestIds.includes(bid.impid)) ?? [];
13
+ log?.debug(bannerBids, videoBids, nativeBids);
14
+ return Ok({
15
+ banners: ValueOr(AllOrNone(bannerBids.map(buildBannerResponse)), []),
16
+ videos: ValueOr(AllOrNone(videoBids.map(buildVideoResponse)), []),
17
+ productCards: ValueOr(await buildAllProductCardResponses(nativeBids), [])
18
+ });
19
+ };
20
+ export const GenerateAllResponses = async (logger, buildBannerResponse, buildVideoResponse, buildProductCard, request, response) => {
21
+ const log = Ctx(logger)?.with('GenerateAllResponses');
22
+ log?.info('Generating all responses');
23
+ log?.debug(request, response);
24
+ const bannerRequestIds = request.imp.filter(imp => imp.banner !== undefined).map(imp => imp.id);
25
+ const videoRequestIds = request.imp.filter(imp => imp.video !== undefined).map(imp => imp.id);
26
+ const nativeRequestIds = request.imp.filter(imp => imp.native !== undefined).map(imp => imp.id);
27
+ log?.debug(bannerRequestIds, videoRequestIds, nativeRequestIds);
28
+ const bannerBids = response.seatbid?.[0]?.bid.filter(bid => bannerRequestIds.includes(bid.impid)) ?? [];
29
+ const videoBids = response.seatbid?.[0]?.bid.filter(bid => videoRequestIds.includes(bid.impid)) ?? [];
30
+ const nativeBids = response.seatbid?.[0]?.bid.filter(bid => nativeRequestIds.includes(bid.impid)) ?? [];
31
+ log?.debug(bannerBids, videoBids, nativeBids);
32
+ return Ok({
33
+ banners: ValueOr(AllOrNone(bannerBids.map(buildBannerResponse)), []),
34
+ videos: ValueOr(AllOrNone(videoBids.map(buildVideoResponse)), []),
35
+ productCards: GetValue(await buildProductCard(nativeBids))
36
+ });
37
+ };
38
+ //# sourceMappingURL=BuildAll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildAll.js","sourceRoot":"src/","sources":["helpers/response/BuildAll.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import { Ctx, Err, MissingBidsError, ConsumeNAsync, TryDoAsync, GetValueOrThrow, GetValue, Ok } from '@surfside/ads-core';
2
+ export const BuildDynamicResponse = async (logger, requestBids, buildBannerResponse, buildVideoResponse, buildHybridCarousel, buildSponsoredCarousel, buildRecommendedCarousel, buildAllSponsoredProductCardResponses, dynamicRequest) => {
3
+ const log = Ctx(logger)?.with('BuildDynamicResponse');
4
+ log?.info('Building dynamic response');
5
+ log?.debug(dynamicRequest);
6
+ const bidderResult = await requestBids(dynamicRequest.request);
7
+ if (!bidderResult.ok) {
8
+ return bidderResult;
9
+ }
10
+ const bids = bidderResult.value.seatbid?.[0]?.bid;
11
+ log?.debug('bids', bids);
12
+ if (bids === undefined) {
13
+ return Err(new MissingBidsError);
14
+ }
15
+ for (const id in dynamicRequest.requestIds) {
16
+ const creative = dynamicRequest.requestIds[id];
17
+ const bid = bids.filter(bid => bid.impid === id)[0];
18
+ if (bid === undefined) {
19
+ log?.debug('No bid for id', id);
20
+ continue;
21
+ }
22
+ const builtCreative = GetValue(await TryDoAsync(async () => {
23
+ switch (creative.type) {
24
+ case 'Banner': {
25
+ return {
26
+ ...GetValueOrThrow(buildBannerResponse(bid)),
27
+ dynamicBannerRequest: creative
28
+ };
29
+ }
30
+ case 'Video': {
31
+ return {
32
+ ...GetValueOrThrow(buildVideoResponse(bid)),
33
+ dynamicVideoRequest: creative
34
+ };
35
+ }
36
+ case 'Carousel': {
37
+ const carousel = creative;
38
+ switch (carousel.strategy) {
39
+ case 'hybrid': {
40
+ const hybrid = GetValueOrThrow(buildHybridCarousel({
41
+ type: carousel.recommendation ?? 'top-products'
42
+ }, dynamicRequest.request, bid));
43
+ const generator = hybrid.getProduct();
44
+ const [product] = await ConsumeNAsync(generator, 1);
45
+ if (product.length === 1) {
46
+ // Success!
47
+ return {
48
+ type: 'carousel',
49
+ getProduct: async function* wrappedGenerator() {
50
+ yield product[0];
51
+ yield* generator;
52
+ },
53
+ bid,
54
+ dynamicCarouselRequest: carousel
55
+ };
56
+ }
57
+ throw new Error('No inventory in carousel. Skipping');
58
+ }
59
+ case 'recommended': {
60
+ return {
61
+ ...GetValueOrThrow(buildRecommendedCarousel({
62
+ type: carousel.recommendation ?? 'top-products'
63
+ })),
64
+ dynamicCarouselRequest: carousel
65
+ };
66
+ }
67
+ case 'sponsored': {
68
+ const sponsored = GetValueOrThrow(buildSponsoredCarousel(dynamicRequest.request, bid));
69
+ const generator = sponsored.getProduct();
70
+ const [product] = await ConsumeNAsync(generator, 1);
71
+ if (product.length === 1) {
72
+ // Success!
73
+ return {
74
+ type: 'carousel',
75
+ getProduct: async function* wrappedGenerator() {
76
+ yield product[0];
77
+ yield* generator;
78
+ },
79
+ bid,
80
+ dynamicCarouselRequest: carousel
81
+ };
82
+ }
83
+ throw new Error('No inventory in carousel. Skipping');
84
+ }
85
+ }
86
+ throw new Error('Malformed carousel configuration. Skipping');
87
+ }
88
+ case 'ProductCard': {
89
+ const value = GetValueOrThrow(await buildAllSponsoredProductCardResponses([bid]));
90
+ if (value.length === 0) {
91
+ throw new Error('No inventory for product card');
92
+ }
93
+ return {
94
+ ...value[0],
95
+ dynamicProductCardRequest: creative
96
+ };
97
+ }
98
+ }
99
+ throw new Error('Malformed creative. Skipping');
100
+ }));
101
+ if (builtCreative === undefined) {
102
+ log?.debug('No inventory or error on creative. Skipping');
103
+ continue;
104
+ }
105
+ return Ok(builtCreative);
106
+ }
107
+ return Err(new NoDynamicAdsAvailableError(dynamicRequest));
108
+ };
109
+ export class NoDynamicAdsAvailableError extends Error {
110
+ dynamicRequest;
111
+ constructor(dynamicRequest) {
112
+ super('No dynamic ads available');
113
+ this.dynamicRequest = dynamicRequest;
114
+ }
115
+ }
116
+ ;
117
+ //# sourceMappingURL=Dynamic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dynamic.js","sourceRoot":"src/","sources":["helpers/response/Dynamic.ts"],"names":[],"mappings":"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"}