@adcp/sdk 6.11.0 → 6.13.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.
- package/bin/adcp-config.js +7 -1
- package/bin/adcp.js +191 -4
- package/dist/lib/adapters/index.d.ts +0 -2
- package/dist/lib/adapters/index.d.ts.map +1 -1
- package/dist/lib/adapters/index.js +1 -8
- package/dist/lib/adapters/index.js.map +1 -1
- package/dist/lib/auth/oauth/index.d.ts +1 -0
- package/dist/lib/auth/oauth/index.d.ts.map +1 -1
- package/dist/lib/auth/oauth/index.js +17 -1
- package/dist/lib/auth/oauth/index.js.map +1 -1
- package/dist/lib/auth/oauth/web-flow.d.ts +270 -0
- package/dist/lib/auth/oauth/web-flow.d.ts.map +1 -0
- package/dist/lib/auth/oauth/web-flow.js +413 -0
- package/dist/lib/auth/oauth/web-flow.js.map +1 -0
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +2 -7
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/mock-server/index.d.ts +2 -0
- package/dist/lib/mock-server/index.d.ts.map +1 -1
- package/dist/lib/mock-server/index.js +17 -0
- package/dist/lib/mock-server/index.js.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/recipe.d.ts +155 -0
- package/dist/lib/mock-server/sales-guaranteed/recipe.d.ts.map +1 -0
- package/dist/lib/mock-server/sales-guaranteed/recipe.js +107 -0
- package/dist/lib/mock-server/sales-guaranteed/recipe.js.map +1 -0
- package/dist/lib/mock-server/sales-guaranteed/server.d.ts.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/server.js +212 -0
- package/dist/lib/mock-server/sales-guaranteed/server.js.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.d.ts +123 -0
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.d.ts.map +1 -0
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.js +81 -0
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.js.map +1 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/ctx-metadata/index.d.ts +1 -1
- package/dist/lib/server/ctx-metadata/index.d.ts.map +1 -1
- package/dist/lib/server/ctx-metadata/index.js +3 -1
- package/dist/lib/server/ctx-metadata/index.js.map +1 -1
- package/dist/lib/server/ctx-metadata/wire-shape.d.ts +21 -0
- package/dist/lib/server/ctx-metadata/wire-shape.d.ts.map +1 -1
- package/dist/lib/server/ctx-metadata/wire-shape.js +111 -0
- package/dist/lib/server/ctx-metadata/wire-shape.js.map +1 -1
- package/dist/lib/server/decisioning/context.d.ts +19 -0
- package/dist/lib/server/decisioning/context.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.d.ts +3 -0
- package/dist/lib/server/decisioning/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.js +16 -1
- package/dist/lib/server/decisioning/index.js.map +1 -1
- package/dist/lib/server/decisioning/platform.d.ts +17 -0
- package/dist/lib/server/decisioning/platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/platform.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/dispatch.d.ts +203 -0
- package/dist/lib/server/decisioning/proposal/dispatch.d.ts.map +1 -0
- package/dist/lib/server/decisioning/proposal/dispatch.js +395 -0
- package/dist/lib/server/decisioning/proposal/dispatch.js.map +1 -0
- package/dist/lib/server/decisioning/proposal/index.d.ts +21 -0
- package/dist/lib/server/decisioning/proposal/index.d.ts.map +1 -0
- package/dist/lib/server/decisioning/proposal/index.js +37 -0
- package/dist/lib/server/decisioning/proposal/index.js.map +1 -0
- package/dist/lib/server/decisioning/proposal/lifecycle.d.ts +195 -0
- package/dist/lib/server/decisioning/proposal/lifecycle.d.ts.map +1 -0
- package/dist/lib/server/decisioning/proposal/lifecycle.js +366 -0
- package/dist/lib/server/decisioning/proposal/lifecycle.js.map +1 -0
- package/dist/lib/server/decisioning/proposal/mock-manager.d.ts +93 -0
- package/dist/lib/server/decisioning/proposal/mock-manager.d.ts.map +1 -0
- package/dist/lib/server/decisioning/proposal/mock-manager.js +109 -0
- package/dist/lib/server/decisioning/proposal/mock-manager.js.map +1 -0
- package/dist/lib/server/decisioning/proposal/store.d.ts +279 -0
- package/dist/lib/server/decisioning/proposal/store.d.ts.map +1 -0
- package/dist/lib/server/decisioning/proposal/store.js +291 -0
- package/dist/lib/server/decisioning/proposal/store.js.map +1 -0
- package/dist/lib/server/decisioning/proposal/types.d.ts +394 -0
- package/dist/lib/server/decisioning/proposal/types.d.ts.map +1 -0
- package/dist/lib/server/decisioning/proposal/types.js +58 -0
- package/dist/lib/server/decisioning/proposal/types.js.map +1 -0
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts +25 -0
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +198 -15
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/index.d.ts +1 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +3 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/testing/client.d.ts.map +1 -1
- package/dist/lib/testing/client.js +7 -1
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/task-map.js +1 -0
- package/dist/lib/testing/storyboard/task-map.js.map +1 -1
- package/dist/lib/testing/storyboard/test-kit.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/test-kit.js +4 -0
- package/dist/lib/testing/storyboard/test-kit.js.map +1 -1
- package/dist/lib/testing/types.d.ts +10 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/examples/hello_seller_adapter_guaranteed.ts +29 -2
- package/examples/hello_seller_adapter_proposal_mode.ts +575 -0
- package/package.json +1 -1
- package/dist/lib/adapters/proposal-manager.d.ts +0 -142
- package/dist/lib/adapters/proposal-manager.d.ts.map +0 -1
- package/dist/lib/adapters/proposal-manager.js +0 -184
- package/dist/lib/adapters/proposal-manager.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/decisioning/proposal/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Proposal-dispatch — the v1.5 framework intercept seams.
|
|
4
|
+
*
|
|
5
|
+
* Pure functions that the runtime calls from the wire-handler shims
|
|
6
|
+
* (`getProducts`, `createMediaBuy`, `updateMediaBuy`,
|
|
7
|
+
* `getMediaBuyDelivery`). Each helper short-circuits when no manager /
|
|
8
|
+
* store is wired for the request, so the v1 path is preserved
|
|
9
|
+
* byte-for-byte.
|
|
10
|
+
*
|
|
11
|
+
* Five integration points (parity with `adcp-client-python.src/adcp/decisioning/proposal_dispatch.py`):
|
|
12
|
+
*
|
|
13
|
+
* - {@link maybeInterceptFinalize} — `getProducts` shim. Detects
|
|
14
|
+
* `refine[i].action: 'finalize'`, calls the manager's
|
|
15
|
+
* `finalizeProposal`, commits the proposal, returns the wire
|
|
16
|
+
* response. Returns `null` when no finalize entry / no
|
|
17
|
+
* finalize-capable manager.
|
|
18
|
+
* - {@link maybePersistDraftAfterGetProducts} — `getProducts` shim
|
|
19
|
+
* (post-call). Walks the response's `proposals[]`, validates
|
|
20
|
+
* `overlap ⊆ wire`, persists each as a draft.
|
|
21
|
+
* - {@link maybeReserveProposalForCreateMediaBuy} — `createMediaBuy`
|
|
22
|
+
* shim. When `proposal_id` is set, validates expiry + capability
|
|
23
|
+
* overlap, reserves the proposal (`COMMITTED → CONSUMING`), returns
|
|
24
|
+
* the recipes map for `ctx.recipes` hydration.
|
|
25
|
+
* - {@link finalizeProposalConsumption} — `createMediaBuy` shim
|
|
26
|
+
* (post-success). Promotes `CONSUMING → CONSUMED` and records the
|
|
27
|
+
* `mediaBuyId` back-reference.
|
|
28
|
+
* - {@link releaseProposalReservation} — `createMediaBuy` shim
|
|
29
|
+
* (failure rollback). Restores `CONSUMING → COMMITTED`.
|
|
30
|
+
* - {@link maybeHydrateRecipesForMediaBuyId} —
|
|
31
|
+
* `updateMediaBuy` / `getMediaBuyDelivery` shims. Reverse-index
|
|
32
|
+
* hydration via `getByMediaBuyId`. Re-runs capability-overlap
|
|
33
|
+
* validation per Resolutions §5.
|
|
34
|
+
*
|
|
35
|
+
* @public
|
|
36
|
+
* @packageDocumentation
|
|
37
|
+
*/
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.maybeInterceptFinalize = maybeInterceptFinalize;
|
|
40
|
+
exports.maybePersistDraftAfterGetProducts = maybePersistDraftAfterGetProducts;
|
|
41
|
+
exports.maybeReserveProposalForCreateMediaBuy = maybeReserveProposalForCreateMediaBuy;
|
|
42
|
+
exports.finalizeProposalConsumption = finalizeProposalConsumption;
|
|
43
|
+
exports.releaseProposalReservation = releaseProposalReservation;
|
|
44
|
+
exports.maybeHydrateRecipesForMediaBuyId = maybeHydrateRecipesForMediaBuyId;
|
|
45
|
+
const async_outcome_1 = require("../async-outcome");
|
|
46
|
+
const lifecycle_1 = require("./lifecycle");
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Capability detection
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* Per Resolutions §7: framework detects finalize via method-presence +
|
|
52
|
+
* `capabilities.finalize` flag. Adopters opt in by both implementing
|
|
53
|
+
* AND declaring; flipping only one half is an adopter bug.
|
|
54
|
+
*/
|
|
55
|
+
function hasFinalizeCapability(manager) {
|
|
56
|
+
if (!manager)
|
|
57
|
+
return false;
|
|
58
|
+
if (!manager.capabilities.finalize)
|
|
59
|
+
return false;
|
|
60
|
+
return typeof manager.finalizeProposal === 'function';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Intercept `buying_mode: 'refine'` requests carrying a
|
|
64
|
+
* `refine[i].action: 'finalize'` entry. Hydrates the draft, calls the
|
|
65
|
+
* manager's `finalizeProposal`, and returns the raw adopter result + a
|
|
66
|
+
* projection callback. The runtime threads them through the framework's
|
|
67
|
+
* standard `routeIfHandoff` so:
|
|
68
|
+
*
|
|
69
|
+
* - Sync `FinalizeProposalSuccess` returns: projection runs inline,
|
|
70
|
+
* buyer sees the committed proposal in the response.
|
|
71
|
+
* - HITL `TaskHandoff<FinalizeProposalSuccess>` returns: framework
|
|
72
|
+
* returns the Submitted envelope to the buyer, runs the adopter's
|
|
73
|
+
* handoff fn in background; projection runs when the handoff
|
|
74
|
+
* resolves, commits the proposal, projects the terminal task
|
|
75
|
+
* artifact.
|
|
76
|
+
*
|
|
77
|
+
* Same machinery as `createMediaBuy` HITL — finalize inherits whatever
|
|
78
|
+
* cancellation, restart-via-durable-store, deadline, and webhook
|
|
79
|
+
* delivery semantics the framework's task lifecycle provides for every
|
|
80
|
+
* other unified-hybrid tool. No special-case wrapper.
|
|
81
|
+
*
|
|
82
|
+
* @public
|
|
83
|
+
*/
|
|
84
|
+
async function maybeInterceptFinalize(args) {
|
|
85
|
+
const { request, manager, store, ctx } = args;
|
|
86
|
+
const finalizeEntry = (0, lifecycle_1.detectFinalizeAction)(request);
|
|
87
|
+
if (!finalizeEntry)
|
|
88
|
+
return { kind: 'pass' };
|
|
89
|
+
if (!hasFinalizeCapability(manager) || !store)
|
|
90
|
+
return { kind: 'pass' };
|
|
91
|
+
const fieldPath = `refine[${finalizeEntry.index}].proposal_id`;
|
|
92
|
+
const accountId = ctx.account.id;
|
|
93
|
+
const record = await store.get(finalizeEntry.proposalId, { expectedAccountId: accountId });
|
|
94
|
+
if (!record) {
|
|
95
|
+
throw new async_outcome_1.AdcpError('PROPOSAL_NOT_FOUND', {
|
|
96
|
+
recovery: 'terminal',
|
|
97
|
+
message: `Proposal ${JSON.stringify(finalizeEntry.proposalId)} not found. The buyer must call ` +
|
|
98
|
+
`get_products with buying_mode='brief' or 'refine' to obtain a draft proposal_id ` +
|
|
99
|
+
`before finalizing it.`,
|
|
100
|
+
field: fieldPath,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (record.state !== 'draft') {
|
|
104
|
+
throw new async_outcome_1.AdcpError('PROPOSAL_NOT_COMMITTED', {
|
|
105
|
+
recovery: 'correctable',
|
|
106
|
+
message: `Proposal ${JSON.stringify(finalizeEntry.proposalId)} is in state ` +
|
|
107
|
+
`${JSON.stringify(record.state)}; only draft proposals can be finalized. ` +
|
|
108
|
+
`Already-committed proposals should be accepted via create_media_buy(proposal_id=...) ` +
|
|
109
|
+
`directly.`,
|
|
110
|
+
field: fieldPath,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const finalizeReq = {
|
|
114
|
+
proposalId: finalizeEntry.proposalId,
|
|
115
|
+
recipes: record.recipes,
|
|
116
|
+
proposalPayload: record.proposalPayload,
|
|
117
|
+
parentRequest: request,
|
|
118
|
+
...(finalizeEntry.ask !== undefined && { ask: finalizeEntry.ask }),
|
|
119
|
+
};
|
|
120
|
+
// manager + finalizeProposal are non-undefined per hasFinalizeCapability.
|
|
121
|
+
const result = await manager.finalizeProposal(finalizeReq, ctx);
|
|
122
|
+
// Pre-determine the path label by checking whether the adopter
|
|
123
|
+
// returned a TaskHandoff up-front. `routeIfHandoff` runs `project`
|
|
124
|
+
// synchronously for the sync arm and inside the background task for
|
|
125
|
+
// the handoff arm; either way, we want the log to reflect which arm
|
|
126
|
+
// the adopter chose.
|
|
127
|
+
const path = (0, async_outcome_1.isTaskHandoff)(result) ? 'handoff' : 'inline';
|
|
128
|
+
const finalizeProposalId = finalizeEntry.proposalId;
|
|
129
|
+
const project = async (success) => {
|
|
130
|
+
if (!isFinalizeSuccess(success)) {
|
|
131
|
+
throw new async_outcome_1.AdcpError('INTERNAL_ERROR', {
|
|
132
|
+
recovery: 'terminal',
|
|
133
|
+
message: `finalizeProposal resolved to an unexpected shape; expected FinalizeProposalSuccess ` +
|
|
134
|
+
`with 'proposal' and 'expiresAt' fields.`,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
await store.commit(finalizeProposalId, {
|
|
138
|
+
expiresAt: success.expiresAt,
|
|
139
|
+
proposalPayload: success.proposal,
|
|
140
|
+
});
|
|
141
|
+
(0, lifecycle_1.logFinalizeSucceeded)({
|
|
142
|
+
proposalId: finalizeProposalId,
|
|
143
|
+
accountId,
|
|
144
|
+
expiresAt: success.expiresAt,
|
|
145
|
+
path,
|
|
146
|
+
});
|
|
147
|
+
return projectFinalizeResponse({
|
|
148
|
+
request,
|
|
149
|
+
committedProposal: success.proposal,
|
|
150
|
+
finalizeProposalId,
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
return { kind: 'intercepted', result, project };
|
|
154
|
+
}
|
|
155
|
+
function isFinalizeSuccess(v) {
|
|
156
|
+
if (!v || typeof v !== 'object')
|
|
157
|
+
return false;
|
|
158
|
+
const r = v;
|
|
159
|
+
return r.proposal != null && r.expiresAt instanceof Date;
|
|
160
|
+
}
|
|
161
|
+
function projectFinalizeResponse(args) {
|
|
162
|
+
const refineEntries = args.request.refine;
|
|
163
|
+
const refinementApplied = [];
|
|
164
|
+
if (refineEntries) {
|
|
165
|
+
for (const entry of refineEntries) {
|
|
166
|
+
const scope = entry.scope;
|
|
167
|
+
if (scope === 'proposal') {
|
|
168
|
+
refinementApplied.push({
|
|
169
|
+
scope: 'proposal',
|
|
170
|
+
proposal_id: typeof entry.proposal_id === 'string' ? entry.proposal_id : args.finalizeProposalId,
|
|
171
|
+
status: 'applied',
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
else if (scope === 'product') {
|
|
175
|
+
refinementApplied.push({
|
|
176
|
+
scope: 'product',
|
|
177
|
+
product_id: typeof entry.product_id === 'string' ? entry.product_id : '',
|
|
178
|
+
status: 'applied',
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
refinementApplied.push({ scope: 'request', status: 'applied' });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// **Decision: `products: []` on the finalize response by design.** The
|
|
187
|
+
// committed proposal carries `allocations[]` keyed by `product_id`;
|
|
188
|
+
// the buyer either has the products from the prior `brief_with_proposals`
|
|
189
|
+
// step (the natural flow) or fetches by id. Echoing the products here
|
|
190
|
+
// would require the framework to either re-emit from the persisted
|
|
191
|
+
// draft (extra wire bytes the buyer already has) or call back into the
|
|
192
|
+
// adopter (extra round-trip to upstream). Buyers who explicitly want
|
|
193
|
+
// products on the finalize response can fetch them via a follow-up
|
|
194
|
+
// `get_products({ product_ids: [...] })` keyed off
|
|
195
|
+
// `proposals[0].allocations[].product_id`.
|
|
196
|
+
return {
|
|
197
|
+
products: [],
|
|
198
|
+
proposals: [args.committedProposal],
|
|
199
|
+
refinement_applied: refinementApplied,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
// getProducts / refineProducts — post-call draft persistence
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
/**
|
|
206
|
+
* Persist proposals returned by `getProducts` / `refineProducts` as
|
|
207
|
+
* drafts in the wired {@link ProposalStore}. Validates `overlap ⊆ wire`
|
|
208
|
+
* for any returned recipes before persisting.
|
|
209
|
+
*
|
|
210
|
+
* Quietly returns when no store is wired, no `proposals[]` in the
|
|
211
|
+
* response, or no typed recipes attached to products.
|
|
212
|
+
*
|
|
213
|
+
* @public
|
|
214
|
+
*/
|
|
215
|
+
async function maybePersistDraftAfterGetProducts(args) {
|
|
216
|
+
const { response, store, ctx } = args;
|
|
217
|
+
if (!store)
|
|
218
|
+
return;
|
|
219
|
+
const proposals = response.proposals;
|
|
220
|
+
if (!proposals || proposals.length === 0)
|
|
221
|
+
return;
|
|
222
|
+
const products = response.products ?? [];
|
|
223
|
+
for (const proposal of proposals) {
|
|
224
|
+
const proposalId = proposal.proposal_id;
|
|
225
|
+
if (!proposalId)
|
|
226
|
+
continue;
|
|
227
|
+
const proposalPayload = toPlainObject(proposal);
|
|
228
|
+
const recipes = collectRecipesFromProducts(products, proposalPayload);
|
|
229
|
+
if (recipes.size > 0) {
|
|
230
|
+
(0, lifecycle_1.validateOverlapSubsetOfWire)({ recipes, products });
|
|
231
|
+
}
|
|
232
|
+
await store.putDraft({
|
|
233
|
+
proposalId,
|
|
234
|
+
accountId: ctx.account.id,
|
|
235
|
+
recipes,
|
|
236
|
+
proposalPayload,
|
|
237
|
+
});
|
|
238
|
+
(0, lifecycle_1.logDraftPersisted)({
|
|
239
|
+
proposalId,
|
|
240
|
+
accountId: ctx.account.id,
|
|
241
|
+
recipesCount: recipes.size,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
function collectRecipesFromProducts(products, proposalPayload) {
|
|
246
|
+
// Filter to products referenced by the proposal's allocations[] (per
|
|
247
|
+
// spec) or legacy products[] string array when present.
|
|
248
|
+
let referenced = null;
|
|
249
|
+
const allocations = proposalPayload.allocations;
|
|
250
|
+
if (Array.isArray(allocations)) {
|
|
251
|
+
referenced = new Set(allocations
|
|
252
|
+
.map((a) => a.product_id)
|
|
253
|
+
.filter((id) => typeof id === 'string'));
|
|
254
|
+
}
|
|
255
|
+
else if (Array.isArray(proposalPayload.products)) {
|
|
256
|
+
referenced = new Set(proposalPayload.products.filter((p) => typeof p === 'string'));
|
|
257
|
+
}
|
|
258
|
+
const recipes = new Map();
|
|
259
|
+
for (const product of products) {
|
|
260
|
+
const productId = product.product_id;
|
|
261
|
+
if (!productId)
|
|
262
|
+
continue;
|
|
263
|
+
if (referenced && !referenced.has(productId))
|
|
264
|
+
continue;
|
|
265
|
+
const implConfig = product.implementation_config;
|
|
266
|
+
if (isRecipe(implConfig)) {
|
|
267
|
+
recipes.set(productId, implConfig);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return recipes;
|
|
271
|
+
}
|
|
272
|
+
function isRecipe(v) {
|
|
273
|
+
return v != null && typeof v === 'object' && typeof v.recipe_kind === 'string';
|
|
274
|
+
}
|
|
275
|
+
function toPlainObject(v) {
|
|
276
|
+
if (v == null || typeof v !== 'object')
|
|
277
|
+
return {};
|
|
278
|
+
// Deep clone via JSON to drop class-instance prototypes — the stored
|
|
279
|
+
// payload must round-trip through a durable backing.
|
|
280
|
+
return JSON.parse(JSON.stringify(v));
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Reserve the proposal for consumption and hydrate `ctx.recipes`.
|
|
284
|
+
*
|
|
285
|
+
* Atomic CAS via {@link ProposalStore.tryReserveConsumption} — the
|
|
286
|
+
* proposal transitions `COMMITTED → CONSUMING` before the adapter runs.
|
|
287
|
+
* Two parallel `createMediaBuy(proposal_id=X)` calls cannot both
|
|
288
|
+
* reserve; the loser raises `PROPOSAL_NOT_COMMITTED`.
|
|
289
|
+
*
|
|
290
|
+
* Validates per § D7 (expiry) BEFORE reserving — an expired proposal
|
|
291
|
+
* surfaces `PROPOSAL_EXPIRED` without flipping the state.
|
|
292
|
+
*
|
|
293
|
+
* @public
|
|
294
|
+
*/
|
|
295
|
+
async function maybeReserveProposalForCreateMediaBuy(args) {
|
|
296
|
+
const { request, manager, store, ctx, now } = args;
|
|
297
|
+
const proposalId = request.proposal_id;
|
|
298
|
+
if (!proposalId || !store)
|
|
299
|
+
return null;
|
|
300
|
+
const graceSeconds = manager?.capabilities.expiresAtGraceSeconds ?? 0;
|
|
301
|
+
// Expiry check BEFORE reserving — keep the buyer's slot uncommitted
|
|
302
|
+
// when telling them they're expired.
|
|
303
|
+
await (0, lifecycle_1.enforceProposalExpiry)(proposalId, {
|
|
304
|
+
proposalStore: store,
|
|
305
|
+
expectedAccountId: ctx.account.id,
|
|
306
|
+
graceSeconds,
|
|
307
|
+
...(now && { now }),
|
|
308
|
+
});
|
|
309
|
+
const reserved = await store.tryReserveConsumption(proposalId, {
|
|
310
|
+
expectedAccountId: ctx.account.id,
|
|
311
|
+
});
|
|
312
|
+
// Capability-overlap gate per D4. Buyer's packages may be empty when
|
|
313
|
+
// proposal_id is set (the spec allows the seller to derive packages
|
|
314
|
+
// from allocations); skip the gate in that case.
|
|
315
|
+
const packages = request.packages;
|
|
316
|
+
if (packages && Array.isArray(packages) && packages.length > 0) {
|
|
317
|
+
(0, lifecycle_1.validateCapabilityOverlap)({
|
|
318
|
+
packages: packages,
|
|
319
|
+
recipes: reserved.recipes,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
return reserved;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Promote `CONSUMING → CONSUMED` after the adapter's `createMediaBuy`
|
|
326
|
+
* succeeded.
|
|
327
|
+
*
|
|
328
|
+
* @public
|
|
329
|
+
*/
|
|
330
|
+
async function finalizeProposalConsumption(args) {
|
|
331
|
+
const { store, record, mediaBuyId } = args;
|
|
332
|
+
if (!store)
|
|
333
|
+
return;
|
|
334
|
+
await store.finalizeConsumption(record.proposalId, {
|
|
335
|
+
mediaBuyId,
|
|
336
|
+
expectedAccountId: record.accountId,
|
|
337
|
+
});
|
|
338
|
+
(0, lifecycle_1.logConsumed)({
|
|
339
|
+
proposalId: record.proposalId,
|
|
340
|
+
accountId: record.accountId,
|
|
341
|
+
mediaBuyId,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Roll back the reservation: `CONSUMING → COMMITTED`. Best-effort.
|
|
346
|
+
*
|
|
347
|
+
* @public
|
|
348
|
+
*/
|
|
349
|
+
async function releaseProposalReservation(args) {
|
|
350
|
+
const { store, record, logger } = args;
|
|
351
|
+
if (!store)
|
|
352
|
+
return;
|
|
353
|
+
try {
|
|
354
|
+
await store.releaseConsumption(record.proposalId, {
|
|
355
|
+
expectedAccountId: record.accountId,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
360
|
+
logger?.warn(`[adcp/decisioning] failed to release consumption reservation for proposal ` +
|
|
361
|
+
`${record.proposalId}: ${message}. The record may stay in CONSUMING until eviction.`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// ---------------------------------------------------------------------------
|
|
365
|
+
// updateMediaBuy / getMediaBuyDelivery — reverse-index recipe hydration
|
|
366
|
+
// ---------------------------------------------------------------------------
|
|
367
|
+
/**
|
|
368
|
+
* Hydrate `ctx.recipes` for post-acceptance buy operations via the
|
|
369
|
+
* `getByMediaBuyId` reverse-index. Returns the record (so the caller
|
|
370
|
+
* can re-validate overlap if a packages-shaped patch is provided);
|
|
371
|
+
* returns `null` when no proposal backs this buy.
|
|
372
|
+
*
|
|
373
|
+
* Per Resolutions §5: re-validates capability overlap on every call
|
|
374
|
+
* with packages.
|
|
375
|
+
*
|
|
376
|
+
* @public
|
|
377
|
+
*/
|
|
378
|
+
async function maybeHydrateRecipesForMediaBuyId(args) {
|
|
379
|
+
const { mediaBuyId, store, ctx, packages } = args;
|
|
380
|
+
if (!mediaBuyId || !store)
|
|
381
|
+
return null;
|
|
382
|
+
const record = await store.getByMediaBuyId(mediaBuyId, {
|
|
383
|
+
expectedAccountId: ctx.account.id,
|
|
384
|
+
});
|
|
385
|
+
if (!record)
|
|
386
|
+
return null;
|
|
387
|
+
if (packages && Array.isArray(packages) && packages.length > 0) {
|
|
388
|
+
(0, lifecycle_1.validateCapabilityOverlap)({
|
|
389
|
+
packages: packages,
|
|
390
|
+
recipes: record.recipes,
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
return record;
|
|
394
|
+
}
|
|
395
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../../../src/lib/server/decisioning/proposal/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProposalManager — primitives for the two-platform composition.
|
|
3
|
+
*
|
|
4
|
+
* Splits proposal assembly (`get_products`, refine, finalize) from media-buy
|
|
5
|
+
* execution (`create_media_buy`, lifecycle), mirroring `adcp-client-python`'s
|
|
6
|
+
* v1.5 ProposalManager. Either side can be mock-backed independently.
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
export type { ProposalManager, ProposalCapabilities, ProposalSalesSpecialism, Recipe, CapabilityOverlap, FinalizeProposalRequest, FinalizeProposalSuccess, } from './types';
|
|
12
|
+
export { validateProposalCapabilities } from './types';
|
|
13
|
+
export type { ProposalState, ProposalRecord, ProposalStore, InMemoryProposalStoreOptions } from './store';
|
|
14
|
+
export { InMemoryProposalStore } from './store';
|
|
15
|
+
export { MockProposalManager } from './mock-manager';
|
|
16
|
+
export type { MockProposalManagerOptions } from './mock-manager';
|
|
17
|
+
export { enforceProposalExpiry, validateCapabilityOverlap, validateOverlapSubsetOfWire, detectFinalizeAction, setProposalLifecycleLogger, logDraftPersisted, logFinalizeSucceeded, logExpired, logConsumed, } from './lifecycle';
|
|
18
|
+
export type { FinalizeActionRef, ProposalLifecycleLogger } from './lifecycle';
|
|
19
|
+
export { maybeInterceptFinalize, maybePersistDraftAfterGetProducts, maybeReserveProposalForCreateMediaBuy, finalizeProposalConsumption, releaseProposalReservation, maybeHydrateRecipesForMediaBuyId, } from './dispatch';
|
|
20
|
+
export type { FinalizeInterceptResult, ReservedProposal } from './dispatch';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/server/decisioning/proposal/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,MAAM,EACN,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAEvD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAEjE,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,oBAAoB,EACpB,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE9E,OAAO,EACL,sBAAsB,EACtB,iCAAiC,EACjC,qCAAqC,EACrC,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,GACjC,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ProposalManager — primitives for the two-platform composition.
|
|
4
|
+
*
|
|
5
|
+
* Splits proposal assembly (`get_products`, refine, finalize) from media-buy
|
|
6
|
+
* execution (`create_media_buy`, lifecycle), mirroring `adcp-client-python`'s
|
|
7
|
+
* v1.5 ProposalManager. Either side can be mock-backed independently.
|
|
8
|
+
*
|
|
9
|
+
* @public
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.maybeHydrateRecipesForMediaBuyId = exports.releaseProposalReservation = exports.finalizeProposalConsumption = exports.maybeReserveProposalForCreateMediaBuy = exports.maybePersistDraftAfterGetProducts = exports.maybeInterceptFinalize = exports.logConsumed = exports.logExpired = exports.logFinalizeSucceeded = exports.logDraftPersisted = exports.setProposalLifecycleLogger = exports.detectFinalizeAction = exports.validateOverlapSubsetOfWire = exports.validateCapabilityOverlap = exports.enforceProposalExpiry = exports.MockProposalManager = exports.InMemoryProposalStore = exports.validateProposalCapabilities = void 0;
|
|
14
|
+
var types_1 = require("./types");
|
|
15
|
+
Object.defineProperty(exports, "validateProposalCapabilities", { enumerable: true, get: function () { return types_1.validateProposalCapabilities; } });
|
|
16
|
+
var store_1 = require("./store");
|
|
17
|
+
Object.defineProperty(exports, "InMemoryProposalStore", { enumerable: true, get: function () { return store_1.InMemoryProposalStore; } });
|
|
18
|
+
var mock_manager_1 = require("./mock-manager");
|
|
19
|
+
Object.defineProperty(exports, "MockProposalManager", { enumerable: true, get: function () { return mock_manager_1.MockProposalManager; } });
|
|
20
|
+
var lifecycle_1 = require("./lifecycle");
|
|
21
|
+
Object.defineProperty(exports, "enforceProposalExpiry", { enumerable: true, get: function () { return lifecycle_1.enforceProposalExpiry; } });
|
|
22
|
+
Object.defineProperty(exports, "validateCapabilityOverlap", { enumerable: true, get: function () { return lifecycle_1.validateCapabilityOverlap; } });
|
|
23
|
+
Object.defineProperty(exports, "validateOverlapSubsetOfWire", { enumerable: true, get: function () { return lifecycle_1.validateOverlapSubsetOfWire; } });
|
|
24
|
+
Object.defineProperty(exports, "detectFinalizeAction", { enumerable: true, get: function () { return lifecycle_1.detectFinalizeAction; } });
|
|
25
|
+
Object.defineProperty(exports, "setProposalLifecycleLogger", { enumerable: true, get: function () { return lifecycle_1.setProposalLifecycleLogger; } });
|
|
26
|
+
Object.defineProperty(exports, "logDraftPersisted", { enumerable: true, get: function () { return lifecycle_1.logDraftPersisted; } });
|
|
27
|
+
Object.defineProperty(exports, "logFinalizeSucceeded", { enumerable: true, get: function () { return lifecycle_1.logFinalizeSucceeded; } });
|
|
28
|
+
Object.defineProperty(exports, "logExpired", { enumerable: true, get: function () { return lifecycle_1.logExpired; } });
|
|
29
|
+
Object.defineProperty(exports, "logConsumed", { enumerable: true, get: function () { return lifecycle_1.logConsumed; } });
|
|
30
|
+
var dispatch_1 = require("./dispatch");
|
|
31
|
+
Object.defineProperty(exports, "maybeInterceptFinalize", { enumerable: true, get: function () { return dispatch_1.maybeInterceptFinalize; } });
|
|
32
|
+
Object.defineProperty(exports, "maybePersistDraftAfterGetProducts", { enumerable: true, get: function () { return dispatch_1.maybePersistDraftAfterGetProducts; } });
|
|
33
|
+
Object.defineProperty(exports, "maybeReserveProposalForCreateMediaBuy", { enumerable: true, get: function () { return dispatch_1.maybeReserveProposalForCreateMediaBuy; } });
|
|
34
|
+
Object.defineProperty(exports, "finalizeProposalConsumption", { enumerable: true, get: function () { return dispatch_1.finalizeProposalConsumption; } });
|
|
35
|
+
Object.defineProperty(exports, "releaseProposalReservation", { enumerable: true, get: function () { return dispatch_1.releaseProposalReservation; } });
|
|
36
|
+
Object.defineProperty(exports, "maybeHydrateRecipesForMediaBuyId", { enumerable: true, get: function () { return dispatch_1.maybeHydrateRecipesForMediaBuyId; } });
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/server/decisioning/proposal/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAYH,iCAAuD;AAA9C,qHAAA,4BAA4B,OAAA;AAIrC,iCAAgD;AAAvC,8GAAA,qBAAqB,OAAA;AAE9B,+CAAqD;AAA5C,mHAAA,mBAAmB,OAAA;AAG5B,yCAUqB;AATnB,kHAAA,qBAAqB,OAAA;AACrB,sHAAA,yBAAyB,OAAA;AACzB,wHAAA,2BAA2B,OAAA;AAC3B,iHAAA,oBAAoB,OAAA;AACpB,uHAAA,0BAA0B,OAAA;AAC1B,8GAAA,iBAAiB,OAAA;AACjB,iHAAA,oBAAoB,OAAA;AACpB,uGAAA,UAAU,OAAA;AACV,wGAAA,WAAW,OAAA;AAIb,uCAOoB;AANlB,kHAAA,sBAAsB,OAAA;AACtB,6HAAA,iCAAiC,OAAA;AACjC,iIAAA,qCAAqC,OAAA;AACrC,uHAAA,2BAA2B,OAAA;AAC3B,sHAAA,0BAA0B,OAAA;AAC1B,4HAAA,gCAAgC,OAAA"}
|