@monetizationos/proxy 1.4.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/IdentityProvider.d.ts +1 -1
- package/dist/adapters/IdentityProvider.js +2 -2
- package/dist/adapters/IdentityProvider.js.map +1 -1
- package/dist/apiRequestHeaders.d.ts +1 -1
- package/dist/apiRequestHeaders.js +1 -1
- package/dist/apiRequestHeaders.js.map +1 -1
- package/dist/stages/fetchSurfaceDecisions.d.ts +2 -1
- package/dist/stages/fetchSurfaceDecisions.js +2 -1
- package/dist/stages/fetchSurfaceDecisions.js.map +1 -1
- package/dist/stages/surfaceDecisions.js +1 -0
- package/dist/stages/surfaceDecisions.js.map +1 -1
- package/package.json +1 -1
|
@@ -31,7 +31,7 @@ export interface IdentityProvider {
|
|
|
31
31
|
resolve?(args: ResolveIdentityArgs): Identity | Promise<Identity>;
|
|
32
32
|
persist?(args: PersistIdentityArgs): Response | Promise<Response>;
|
|
33
33
|
}
|
|
34
|
-
export declare const getExistingCookies: (request: Request, originResponse: Response, config: MOSConfig) => {
|
|
34
|
+
export declare const getExistingCookies: (request: Request, originResponse: Response | undefined, config: MOSConfig) => {
|
|
35
35
|
anonymousIdentifier?: string;
|
|
36
36
|
userJwt?: string;
|
|
37
37
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parse, parseSetCookie } from 'cookie';
|
|
2
2
|
export const getExistingCookies = (request, originResponse, config) => {
|
|
3
|
-
const setCookies = originResponse
|
|
3
|
+
const setCookies = originResponse?.headers.getSetCookie().map((header) => parseSetCookie(header)) || [];
|
|
4
4
|
const originAnonymousCookie = setCookies.find((s) => s.name === config.anonymousSessionCookieName);
|
|
5
5
|
const originUserJwtCookie = setCookies.find((s) => s.name === config.authenticatedUserJwtCookieName);
|
|
6
6
|
if (originAnonymousCookie || originUserJwtCookie) {
|
|
@@ -21,7 +21,7 @@ export const buildIdentity = ({ anonymousIdentifier, userJwt, createAnonymousIde
|
|
|
21
21
|
return { createAnonymousIdentifier: true };
|
|
22
22
|
};
|
|
23
23
|
export const defaultResolveIdentity = (args) => buildIdentity({
|
|
24
|
-
...
|
|
24
|
+
...getExistingCookies(args.request, args.originResponse, args.config),
|
|
25
25
|
createAnonymousIdentifierFallback: args.config.createAnonymousIdentifierFallback,
|
|
26
26
|
});
|
|
27
27
|
export const defaultPersistIdentity = (args) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdentityProvider.js","sourceRoot":"","sources":["../../src/adapters/IdentityProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AAmC9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAC9B,OAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"IdentityProvider.js","sourceRoot":"","sources":["../../src/adapters/IdentityProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { parse, parseSetCookie } from 'cookie'\nimport type { MOSConfig } from '../config'\nimport type { MOSProxyLogger } from '../logger'\nimport type { SurfaceDecisionResponse } from '../types'\n\nexport type Identity =\n | { createAnonymousIdentifier: true }\n | { userJwt: string; createAnonymousIdentifierFallback?: true }\n | { anonymousIdentifier: string }\n\nexport interface ResolveIdentityArgs {\n request: Request\n originResponse?: Response\n config: MOSConfig\n logger: MOSProxyLogger\n}\n\nexport interface PersistIdentityArgs {\n resolved: Identity\n decisions: SurfaceDecisionResponse\n response: Response\n request: Request\n config: MOSConfig\n logger: MOSProxyLogger\n}\n\n/**\n * Either method is optional; omitted methods use the built-in defaults. Both fail open: a throwing\n * `resolve` skips surface decisions; a throwing `persist` keeps the pre-persist response.\n */\nexport interface IdentityProvider {\n resolve?(args: ResolveIdentityArgs): Identity | Promise<Identity>\n persist?(args: PersistIdentityArgs): Response | Promise<Response>\n}\n\nexport const getExistingCookies = (\n request: Request,\n originResponse: Response | undefined,\n config: MOSConfig,\n): { anonymousIdentifier?: string; userJwt?: string } => {\n const setCookies = originResponse?.headers.getSetCookie().map((header) => parseSetCookie(header)) || []\n const originAnonymousCookie = setCookies.find((s) => s.name === config.anonymousSessionCookieName)\n const originUserJwtCookie = setCookies.find((s) => s.name === config.authenticatedUserJwtCookieName)\n if (originAnonymousCookie || originUserJwtCookie) {\n return { anonymousIdentifier: originAnonymousCookie?.value, userJwt: originUserJwtCookie?.value }\n }\n\n const cookies = parse(request.headers.get('Cookie') || '')\n const anonymousIdentifier = cookies[config.anonymousSessionCookieName]\n const userJwt = cookies[config.authenticatedUserJwtCookieName]\n return { anonymousIdentifier, userJwt }\n}\n\nexport const buildIdentity = ({\n anonymousIdentifier,\n userJwt,\n createAnonymousIdentifierFallback = false,\n}: {\n anonymousIdentifier?: string\n userJwt?: string\n createAnonymousIdentifierFallback?: boolean\n}): Identity => {\n if (userJwt) {\n return createAnonymousIdentifierFallback ? { userJwt, createAnonymousIdentifierFallback: true } : { userJwt }\n }\n\n if (anonymousIdentifier) {\n return { anonymousIdentifier }\n }\n\n return { createAnonymousIdentifier: true }\n}\n\nexport const defaultResolveIdentity = (args: ResolveIdentityArgs): Identity =>\n buildIdentity({\n ...getExistingCookies(args.request, args.originResponse, args.config),\n createAnonymousIdentifierFallback: args.config.createAnonymousIdentifierFallback,\n })\n\nexport const defaultPersistIdentity = (args: PersistIdentityArgs): Response => {\n const { resolved, decisions, response, request, config } = args\n const identifier = decisions.identity?.identifier\n if (!identifier) {\n return response\n }\n\n const minted = 'createAnonymousIdentifier' in resolved && resolved.createAnonymousIdentifier === true\n // A JWT resolved with the fallback flag mints a fresh anonymous identifier only when the API reports the\n // JWT as unauthenticated, and only when the request did not already carry an anonymous session cookie.\n const jwtFallback =\n 'createAnonymousIdentifierFallback' in resolved &&\n resolved.createAnonymousIdentifierFallback === true &&\n !decisions.identity?.isAuthenticated &&\n !getExistingCookies(request, response, config).anonymousIdentifier\n\n if (!minted && !jwtFallback) {\n return response\n }\n\n const headers = new Headers(response.headers)\n headers.append('Set-Cookie', `${config.anonymousSessionCookieName}=${identifier}; Path=/`)\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n })\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const MOS_PROXY_VERSION_HEADER = "X-MOS-Proxy-Version";
|
|
2
2
|
export declare const MOS_PROXY_CLIENT_HEADER = "X-MOS-Proxy-Client";
|
|
3
|
-
export declare const MOS_PROXY_PACKAGE_VERSION = "1.4.
|
|
3
|
+
export declare const MOS_PROXY_PACKAGE_VERSION = "1.4.2";
|
|
4
4
|
export declare const setMosProxyHeaders: (headers: Headers) => void;
|
|
5
5
|
export declare const withMosProxyHeaders: (headers?: HeadersInit) => Headers;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { formatClientRuntimeHeader } from './clientRuntime';
|
|
2
2
|
export const MOS_PROXY_VERSION_HEADER = 'X-MOS-Proxy-Version';
|
|
3
3
|
export const MOS_PROXY_CLIENT_HEADER = 'X-MOS-Proxy-Client';
|
|
4
|
-
export const MOS_PROXY_PACKAGE_VERSION = '1.4.
|
|
4
|
+
export const MOS_PROXY_PACKAGE_VERSION = '1.4.2';
|
|
5
5
|
export const setMosProxyHeaders = (headers) => {
|
|
6
6
|
headers.set(MOS_PROXY_VERSION_HEADER, MOS_PROXY_PACKAGE_VERSION);
|
|
7
7
|
headers.set(MOS_PROXY_CLIENT_HEADER, formatClientRuntimeHeader());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiRequestHeaders.js","sourceRoot":"","sources":["../src/apiRequestHeaders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAE3D,MAAM,CAAC,MAAM,wBAAwB,GAAG,qBAAqB,CAAA;AAC7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAA;AAC3D,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAA;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAQ,EAAE;IACzD,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,CAAA;IAChE,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,yBAAyB,EAAE,CAAC,CAAA;AACrE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAqB,EAAW,EAAE;IAClE,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACjC,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACxB,OAAO,IAAI,CAAA;AACf,CAAC,CAAA","sourcesContent":["import { formatClientRuntimeHeader } from './clientRuntime'\n\nexport const MOS_PROXY_VERSION_HEADER = 'X-MOS-Proxy-Version'\nexport const MOS_PROXY_CLIENT_HEADER = 'X-MOS-Proxy-Client'\nexport const MOS_PROXY_PACKAGE_VERSION = '1.4.
|
|
1
|
+
{"version":3,"file":"apiRequestHeaders.js","sourceRoot":"","sources":["../src/apiRequestHeaders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAE3D,MAAM,CAAC,MAAM,wBAAwB,GAAG,qBAAqB,CAAA;AAC7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAA;AAC3D,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAA;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAQ,EAAE;IACzD,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,CAAA;IAChE,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,yBAAyB,EAAE,CAAC,CAAA;AACrE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAqB,EAAW,EAAE;IAClE,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACjC,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACxB,OAAO,IAAI,CAAA;AACf,CAAC,CAAA","sourcesContent":["import { formatClientRuntimeHeader } from './clientRuntime'\n\nexport const MOS_PROXY_VERSION_HEADER = 'X-MOS-Proxy-Version'\nexport const MOS_PROXY_CLIENT_HEADER = 'X-MOS-Proxy-Client'\nexport const MOS_PROXY_PACKAGE_VERSION = '1.4.2'\n\nexport const setMosProxyHeaders = (headers: Headers): void => {\n headers.set(MOS_PROXY_VERSION_HEADER, MOS_PROXY_PACKAGE_VERSION)\n headers.set(MOS_PROXY_CLIENT_HEADER, formatClientRuntimeHeader())\n}\n\nexport const withMosProxyHeaders = (headers?: HeadersInit): Headers => {\n const next = new Headers(headers)\n setMosProxyHeaders(next)\n return next\n}\n"]}
|
|
@@ -9,6 +9,7 @@ export type FetchSurfaceDecisionsArgs = {
|
|
|
9
9
|
clientMetadata: Record<string, unknown>;
|
|
10
10
|
resource: Resource;
|
|
11
11
|
userAgent?: string | undefined;
|
|
12
|
+
referer?: string | undefined;
|
|
12
13
|
originStatus: number;
|
|
13
14
|
};
|
|
14
15
|
export type FetchSurfaceDecisionsFailureReason = 'request-failed' | 'invalid-json' | 'api-error' | 'http-error' | 'invalid-response';
|
|
@@ -22,4 +23,4 @@ export type FetchSurfaceDecisionsResult = {
|
|
|
22
23
|
status?: number;
|
|
23
24
|
statusCode?: number;
|
|
24
25
|
};
|
|
25
|
-
export default function fetchSurfaceDecisions(ctx: PipelineContext, { identity, url, clientMetadata, resource, userAgent, originStatus }: FetchSurfaceDecisionsArgs, apiFetcher: Fetcher): Promise<FetchSurfaceDecisionsResult>;
|
|
26
|
+
export default function fetchSurfaceDecisions(ctx: PipelineContext, { identity, url, clientMetadata, resource, userAgent, referer, originStatus }: FetchSurfaceDecisionsArgs, apiFetcher: Fetcher): Promise<FetchSurfaceDecisionsResult>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { withMosProxyHeaders } from '../apiRequestHeaders';
|
|
2
|
-
export default async function fetchSurfaceDecisions(ctx, { identity, url, clientMetadata, resource, userAgent, originStatus }, apiFetcher) {
|
|
2
|
+
export default async function fetchSurfaceDecisions(ctx, { identity, url, clientMetadata, resource, userAgent, referer, originStatus }, apiFetcher) {
|
|
3
3
|
const { config } = ctx;
|
|
4
4
|
const body = JSON.stringify({
|
|
5
5
|
...clientMetadata,
|
|
@@ -9,6 +9,7 @@ export default async function fetchSurfaceDecisions(ctx, { identity, url, client
|
|
|
9
9
|
http: {
|
|
10
10
|
url,
|
|
11
11
|
userAgent,
|
|
12
|
+
referer,
|
|
12
13
|
proxyOrigin: {
|
|
13
14
|
status: originStatus,
|
|
14
15
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchSurfaceDecisions.js","sourceRoot":"","sources":["../../src/stages/fetchSurfaceDecisions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"fetchSurfaceDecisions.js","sourceRoot":"","sources":["../../src/stages/fetchSurfaceDecisions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Fetcher } from '../adapters/Fetcher'\nimport type { Identity } from '../adapters/IdentityProvider'\nimport type { Resource } from '../adapters/ResourceProvider'\nimport { withMosProxyHeaders } from '../apiRequestHeaders'\nimport type { PipelineContext } from '../context'\nimport type { SurfaceDecisionError, SurfaceDecisionResponse } from '../types'\n\nexport type FetchSurfaceDecisionsArgs = {\n identity: Identity\n url: string\n clientMetadata: Record<string, unknown>\n resource: Resource\n userAgent?: string | undefined\n referer?: string | undefined\n originStatus: number\n}\n\nexport type FetchSurfaceDecisionsFailureReason = 'request-failed' | 'invalid-json' | 'api-error' | 'http-error' | 'invalid-response'\n\nexport type FetchSurfaceDecisionsResult =\n | {\n ok: true\n data: SurfaceDecisionResponse\n }\n | {\n ok: false\n reason: FetchSurfaceDecisionsFailureReason\n error: unknown\n status?: number\n statusCode?: number\n }\n\nexport default async function fetchSurfaceDecisions(\n ctx: PipelineContext,\n { identity, url, clientMetadata, resource, userAgent, referer, originStatus }: FetchSurfaceDecisionsArgs,\n apiFetcher: Fetcher,\n): Promise<FetchSurfaceDecisionsResult> {\n const { config } = ctx\n const body = JSON.stringify({\n ...clientMetadata,\n surfaceSlug: config.surfaceSlug,\n identity,\n resource,\n http: {\n url,\n userAgent,\n referer,\n proxyOrigin: {\n status: originStatus,\n },\n },\n })\n\n const request = new Request(new URL('/api/v1/surface-decisions', config.mosHost), {\n method: 'POST',\n body,\n headers: withMosProxyHeaders({\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.mosSecretKey}`,\n }),\n })\n\n let response: Response\n try {\n response = await apiFetcher(request)\n } catch (error) {\n return { ok: false, reason: 'request-failed', error }\n }\n\n let data: unknown\n try {\n data = await response.json()\n } catch (error) {\n return { ok: false, reason: 'invalid-json', error, status: response.status }\n }\n\n if (isSurfaceDecisionError(data)) {\n return {\n ok: false,\n reason: 'api-error',\n error: new Error(data.message),\n status: response.status,\n statusCode: data.statusCode,\n }\n }\n\n if (!response.ok) {\n return {\n ok: false,\n reason: 'http-error',\n error: new Error(`Surface decisions API returned HTTP ${response.status}`),\n status: response.status,\n }\n }\n\n if (!isSurfaceDecisionResponse(data)) {\n return {\n ok: false,\n reason: 'invalid-response',\n error: new Error('Surface decisions API returned an invalid response shape'),\n status: response.status,\n }\n }\n\n return { ok: true, data }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null\n\nconst isSurfaceDecisionError = (value: unknown): value is SurfaceDecisionError =>\n isRecord(value) && value.status === 'error' && typeof value.message === 'string' && typeof value.statusCode === 'number'\n\nconst isSurfaceDecisionResponse = (value: unknown): value is SurfaceDecisionResponse =>\n isRecord(value) &&\n value.status === 'success' &&\n isRecord(value.identity) &&\n isRecord(value.features) &&\n isRecord(value.customer) &&\n isRecord(value.surfaceBehavior) &&\n typeof value.componentsSkipped === 'boolean' &&\n isRecord(value.componentBehaviors)\n"]}
|
|
@@ -28,6 +28,7 @@ export default async function getSurfaceDecisions(ctx, request, response, apiFet
|
|
|
28
28
|
clientMetadata,
|
|
29
29
|
resource,
|
|
30
30
|
userAgent: request.headers.get('User-Agent') ?? undefined,
|
|
31
|
+
referer: request.headers.get('Referer') ?? undefined,
|
|
31
32
|
originStatus: response.status,
|
|
32
33
|
}, apiFetcher);
|
|
33
34
|
if (!result.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surfaceDecisions.js","sourceRoot":"","sources":["../../src/stages/surfaceDecisions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClientMetadataProvider } from '../adapters/ClientMetadataProvider'\nimport type { Fetcher } from '../adapters/Fetcher'\nimport type { HtmlRewriterAdapter } from '../adapters/HtmlRewriterAdapter'\nimport { defaultPersistIdentity, defaultResolveIdentity, type Identity, type IdentityProvider } from '../adapters/IdentityProvider'\nimport type { ResourceProvider } from '../adapters/ResourceProvider'\nimport type { PipelineContext } from '../context'\nimport type { SurfaceDecisionResponse } from '../types'\nimport fetchSurfaceDecisions from './fetchSurfaceDecisions'\nimport { parsePageMetadata } from './pageMetadata'\n\nexport default async function getSurfaceDecisions(\n ctx: PipelineContext,\n request: Request,\n response: Response,\n apiFetcher: Fetcher,\n rewriter: HtmlRewriterAdapter | null,\n clientMetadataProvider: ClientMetadataProvider | null,\n identityProvider: IdentityProvider | null,\n resourceProvider: ResourceProvider | null,\n): Promise<[Response, SurfaceDecisionResponse | null]> {\n const { config, logger } = ctx\n\n const resolve = identityProvider?.resolve ?? defaultResolveIdentity\n let identity: Identity\n try {\n identity = await resolve({ request, originResponse: response, config, logger })\n } catch (error) {\n logger.log({\n level: 'warn',\n code: 'identity-resolve-failed',\n message: 'Identity provider resolve threw; skipping surface decisions and returning origin response.',\n error,\n })\n return [response, null]\n }\n\n const [metadataStream, passThroughStream] = response.body?.tee() ?? [null, null]\n const pageMetadata = metadataStream && rewriter ? await parsePageMetadata(ctx, new Response(metadataStream, response), rewriter) : {}\n let modifiedResponse = passThroughStream ? new Response(passThroughStream, response) : response\n\n const clientMetadata = clientMetadataProvider?.build(request) ?? {}\n\n const resource = { id: new URL(request.url).pathname, meta: pageMetadata, ...resourceProvider?.build(request) }\n\n const result = await fetchSurfaceDecisions(\n ctx,\n {\n identity,\n url: request.url,\n clientMetadata,\n resource,\n userAgent: request.headers.get('User-Agent') ?? undefined,\n originStatus: response.status,\n },\n apiFetcher,\n )\n\n if (!result.ok) {\n logger.log({\n level: 'warn',\n code: 'surface-decisions-api-failed',\n message: 'Surface decisions API failed; continuing with the origin response.',\n context: {\n reason: result.reason,\n status: result.status,\n statusCode: result.statusCode,\n },\n error: result.error,\n })\n return [modifiedResponse, null]\n }\n\n const surfaceDecisions = result.data\n\n const persist = identityProvider?.persist ?? defaultPersistIdentity\n try {\n modifiedResponse = await persist({\n resolved: identity,\n decisions: surfaceDecisions,\n response: modifiedResponse,\n request,\n config,\n logger,\n })\n } catch (error) {\n logger.log({\n level: 'warn',\n code: 'identity-persist-failed',\n message: 'Identity provider persist threw; keeping pre-persist response.',\n error,\n })\n }\n\n return [modifiedResponse, surfaceDecisions]\n}\n"]}
|
|
1
|
+
{"version":3,"file":"surfaceDecisions.js","sourceRoot":"","sources":["../../src/stages/surfaceDecisions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClientMetadataProvider } from '../adapters/ClientMetadataProvider'\nimport type { Fetcher } from '../adapters/Fetcher'\nimport type { HtmlRewriterAdapter } from '../adapters/HtmlRewriterAdapter'\nimport { defaultPersistIdentity, defaultResolveIdentity, type Identity, type IdentityProvider } from '../adapters/IdentityProvider'\nimport type { ResourceProvider } from '../adapters/ResourceProvider'\nimport type { PipelineContext } from '../context'\nimport type { SurfaceDecisionResponse } from '../types'\nimport fetchSurfaceDecisions from './fetchSurfaceDecisions'\nimport { parsePageMetadata } from './pageMetadata'\n\nexport default async function getSurfaceDecisions(\n ctx: PipelineContext,\n request: Request,\n response: Response,\n apiFetcher: Fetcher,\n rewriter: HtmlRewriterAdapter | null,\n clientMetadataProvider: ClientMetadataProvider | null,\n identityProvider: IdentityProvider | null,\n resourceProvider: ResourceProvider | null,\n): Promise<[Response, SurfaceDecisionResponse | null]> {\n const { config, logger } = ctx\n\n const resolve = identityProvider?.resolve ?? defaultResolveIdentity\n let identity: Identity\n try {\n identity = await resolve({ request, originResponse: response, config, logger })\n } catch (error) {\n logger.log({\n level: 'warn',\n code: 'identity-resolve-failed',\n message: 'Identity provider resolve threw; skipping surface decisions and returning origin response.',\n error,\n })\n return [response, null]\n }\n\n const [metadataStream, passThroughStream] = response.body?.tee() ?? [null, null]\n const pageMetadata = metadataStream && rewriter ? await parsePageMetadata(ctx, new Response(metadataStream, response), rewriter) : {}\n let modifiedResponse = passThroughStream ? new Response(passThroughStream, response) : response\n\n const clientMetadata = clientMetadataProvider?.build(request) ?? {}\n\n const resource = { id: new URL(request.url).pathname, meta: pageMetadata, ...resourceProvider?.build(request) }\n\n const result = await fetchSurfaceDecisions(\n ctx,\n {\n identity,\n url: request.url,\n clientMetadata,\n resource,\n userAgent: request.headers.get('User-Agent') ?? undefined,\n referer: request.headers.get('Referer') ?? undefined,\n originStatus: response.status,\n },\n apiFetcher,\n )\n\n if (!result.ok) {\n logger.log({\n level: 'warn',\n code: 'surface-decisions-api-failed',\n message: 'Surface decisions API failed; continuing with the origin response.',\n context: {\n reason: result.reason,\n status: result.status,\n statusCode: result.statusCode,\n },\n error: result.error,\n })\n return [modifiedResponse, null]\n }\n\n const surfaceDecisions = result.data\n\n const persist = identityProvider?.persist ?? defaultPersistIdentity\n try {\n modifiedResponse = await persist({\n resolved: identity,\n decisions: surfaceDecisions,\n response: modifiedResponse,\n request,\n config,\n logger,\n })\n } catch (error) {\n logger.log({\n level: 'warn',\n code: 'identity-persist-failed',\n message: 'Identity provider persist threw; keeping pre-persist response.',\n error,\n })\n }\n\n return [modifiedResponse, surfaceDecisions]\n}\n"]}
|