@adcp/sdk 9.2.2 → 9.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +23 -0
  2. package/dist/lib/discovery/inline-publisher-properties.js +10 -3
  3. package/dist/lib/discovery/inline-publisher-properties.js.map +1 -1
  4. package/dist/lib/discovery/resolve-agent-properties.d.ts +39 -11
  5. package/dist/lib/discovery/resolve-agent-properties.d.ts.map +1 -1
  6. package/dist/lib/discovery/resolve-agent-properties.js +136 -16
  7. package/dist/lib/discovery/resolve-agent-properties.js.map +1 -1
  8. package/dist/lib/discovery/types.d.ts +9 -2
  9. package/dist/lib/discovery/types.d.ts.map +1 -1
  10. package/dist/lib/discovery/validate-adagents.d.ts +2 -0
  11. package/dist/lib/discovery/validate-adagents.d.ts.map +1 -1
  12. package/dist/lib/discovery/validate-adagents.js +14 -6
  13. package/dist/lib/discovery/validate-adagents.js.map +1 -1
  14. package/dist/lib/index.d.ts +4 -3
  15. package/dist/lib/index.d.ts.map +1 -1
  16. package/dist/lib/index.js +24 -12
  17. package/dist/lib/index.js.map +1 -1
  18. package/dist/lib/registry/feed-stream.d.ts +147 -0
  19. package/dist/lib/registry/feed-stream.d.ts.map +1 -0
  20. package/dist/lib/registry/feed-stream.js +378 -0
  21. package/dist/lib/registry/feed-stream.js.map +1 -0
  22. package/dist/lib/registry/index.d.ts +52 -3
  23. package/dist/lib/registry/index.d.ts.map +1 -1
  24. package/dist/lib/registry/index.js +205 -2
  25. package/dist/lib/registry/index.js.map +1 -1
  26. package/dist/lib/registry/sync.d.ts +175 -10
  27. package/dist/lib/registry/sync.d.ts.map +1 -1
  28. package/dist/lib/registry/sync.js +601 -43
  29. package/dist/lib/registry/sync.js.map +1 -1
  30. package/dist/lib/registry/types.d.ts +38 -2
  31. package/dist/lib/registry/types.d.ts.map +1 -1
  32. package/dist/lib/registry/types.generated.d.ts +231 -8
  33. package/dist/lib/registry/types.generated.d.ts.map +1 -1
  34. package/dist/lib/registry/types.generated.js +1 -1
  35. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  36. package/dist/lib/signing/agent-fetch.d.ts +5 -4
  37. package/dist/lib/signing/agent-fetch.d.ts.map +1 -1
  38. package/dist/lib/signing/agent-fetch.js +31 -4
  39. package/dist/lib/signing/agent-fetch.js.map +1 -1
  40. package/dist/lib/signing/verifier.d.ts.map +1 -1
  41. package/dist/lib/signing/verifier.js +10 -37
  42. package/dist/lib/signing/verifier.js.map +1 -1
  43. package/dist/lib/signing/webhook-auth-detection.d.ts +10 -0
  44. package/dist/lib/signing/webhook-auth-detection.d.ts.map +1 -0
  45. package/dist/lib/signing/webhook-auth-detection.js +37 -0
  46. package/dist/lib/signing/webhook-auth-detection.js.map +1 -0
  47. package/dist/lib/version.d.ts +3 -3
  48. package/dist/lib/version.js +3 -3
  49. package/package.json +1 -1
@@ -1,18 +1,67 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import type { RegistryClient } from './index';
3
- import type { CatalogEvent, AgentSearchResult, AgentCompliance, AuthorizationEntry } from './types.generated';
3
+ import type { CatalogEvent, AgentSearchResult, AgentCompliance, AuthorizationEntry, FeedFreshness } from './types.generated';
4
+ import type { ResolvedBrand } from './types';
4
5
  import type { CursorStore } from './cursor-store';
5
6
  export interface RegistrySyncConfig {
6
7
  /** RegistryClient instance to use for API calls. */
7
8
  client: RegistryClient;
9
+ /**
10
+ * Feed transport for tailing changes after bootstrap:
11
+ * - `'auto'` (default): try the SSE stream, fall back to polling on an
12
+ * unsupported endpoint (404/406), proxy/network failure, or stream parse
13
+ * failure.
14
+ * - `'stream'`: SSE only; reconnect on failure and never fall back to polling.
15
+ * - `'poll'`: polling only.
16
+ */
17
+ transport?: 'auto' | 'stream' | 'poll';
8
18
  /** Polling interval in milliseconds. Default: 30000 (30s). */
9
19
  pollIntervalMs?: number;
20
+ /**
21
+ * Comma-separated event type filter (glob, e.g. `authorization.*`) applied to
22
+ * every feed read (bootstrap drain, polling, and SSE).
23
+ *
24
+ * A persisted cursor is scoped to the logical `types` subscription it was
25
+ * minted under: a cursor from a broader subscription can skip events that were
26
+ * filtered out previously. This is NOT enforced by the cursor store (the store
27
+ * holds only the cursor string), so if you change `types` you must
28
+ * `reset()` before `start()`. With a persistent {@link FileCursorStore} that
29
+ * survives restarts, changing `types` between deploys against the same store
30
+ * path will silently resume from a foreign cursor — point each subscription at
31
+ * its own store path, or clear the store when the filter changes.
32
+ */
33
+ types?: string;
34
+ /** Max events requested per feed page (polling and SSE). Default: 1000. */
35
+ feedPageLimit?: number;
36
+ /**
37
+ * Server-side caught-up interval hint for the SSE stream, in **seconds** (5–60,
38
+ * default 15) — maps to the `poll_interval_seconds` query param. Note the unit:
39
+ * `pollIntervalMs` and `streamIdleTimeoutMs` are milliseconds.
40
+ */
41
+ streamPollIntervalSeconds?: number;
42
+ /**
43
+ * Client-side idle watchdog: reconnect the stream if no feed page or heartbeat
44
+ * arrives within this window. Must exceed the server poll interval.
45
+ * Default: 90000 (90s).
46
+ */
47
+ streamIdleTimeoutMs?: number;
48
+ /** Reconnect backoff floor in ms. Default: 1000. */
49
+ streamReconnectMinMs?: number;
50
+ /** Reconnect backoff ceiling in ms. Default: 30000. */
51
+ streamReconnectMaxMs?: number;
52
+ /**
53
+ * Consecutive stream failures (with no successful message in between) before
54
+ * `'auto'` mode falls back to polling. Default: 3. Ignored in `'stream'` mode.
55
+ */
56
+ maxStreamFailures?: number;
10
57
  /** Choose which indexes to maintain. */
11
58
  indexes?: {
12
59
  /** Agent inventory profiles. Default: true. */
13
60
  agents?: boolean;
14
61
  /** Authorization entries (agent→domain mappings). Default: true. */
15
62
  authorizations?: boolean;
63
+ /** Ordered brand hierarchy chains (self → parents → house). Default: true. */
64
+ brandHierarchies?: boolean;
16
65
  };
17
66
  /** Optional cursor store for persisting the feed cursor between restarts. */
18
67
  cursorStore?: CursorStore;
@@ -20,6 +69,8 @@ export interface RegistrySyncConfig {
20
69
  onError?: (error: Error) => void;
21
70
  }
22
71
  export type RegistrySyncState = 'idle' | 'bootstrapping' | 'syncing' | 'error';
72
+ /** Active feed transport once syncing. */
73
+ export type RegistrySyncTransport = 'stream' | 'poll';
23
74
  export interface RegistrySyncEvents {
24
75
  bootstrap: [{
25
76
  agentCount: number;
@@ -48,6 +99,14 @@ export interface RegistrySyncEvents {
48
99
  from: RegistrySyncState;
49
100
  to: RegistrySyncState;
50
101
  }];
102
+ /** Emitted whenever a feed page or heartbeat carries freshness metadata, for lag monitoring. */
103
+ freshness: [{
104
+ freshness: FeedFreshness;
105
+ }];
106
+ /** Emitted when the active feed transport changes (e.g. stream → polling fallback). */
107
+ transport: [{
108
+ transport: RegistrySyncTransport;
109
+ }];
51
110
  }
52
111
  export interface AgentFilter {
53
112
  type?: string;
@@ -64,44 +123,93 @@ export interface AgentFilter {
64
123
  /**
65
124
  * In-memory replica of the AdCP registry.
66
125
  *
67
- * Bootstraps from the agent search endpoint, then polls the event feed
68
- * to maintain up-to-date indexes for zero-latency lookups.
126
+ * Bootstraps from the agent search endpoint, then tails the change feed
127
+ * Server-Sent Events by default (`transport: 'auto'`), falling back to polling
128
+ * `/api/registry/feed` when streaming is unavailable — to keep its indexes
129
+ * current for zero-latency lookups.
130
+ *
131
+ * **Staleness:** lookups (`getAgent`, `isAuthorized`, the authorization getters)
132
+ * return the last synced state. After a transient failure the engine keeps
133
+ * reconnecting/polling, but a fatal error (e.g. `401`) leaves `state === 'error'`
134
+ * while the indexes still hold their last values. For decisions where staleness
135
+ * is unsafe (e.g. authorization enforcement), gate on `state` and
136
+ * `getLagSeconds()` / `getFreshness()` rather than trusting a lookup blindly.
137
+ * Index size is bounded only by registry trust — a replica mirrors the whole
138
+ * registry, so an untrusted/compromised feed could grow memory without limit.
69
139
  *
70
140
  * @example
71
141
  * ```ts
72
142
  * const client = new RegistryClient({ apiKey: 'sk_...' });
73
- * const sync = new RegistrySync({ client });
74
- * await sync.start();
143
+ * const sync = new RegistrySync({ client }); // transport: 'auto' (SSE, polling fallback)
75
144
  *
76
145
  * // Zero-latency lookups
146
+ * sync.on('event', ({ event }) => console.log('registry change:', event.event_type));
147
+ *
148
+ * // Lag monitoring for the SSE feed
149
+ * sync.on('transport', ({ transport }) => console.log('feed transport:', transport));
150
+ * sync.on('freshness', ({ freshness }) => {
151
+ * if ((freshness.lag_seconds ?? 0) > 300) console.warn('registry feed lag > 5m');
152
+ * });
153
+ *
154
+ * await sync.start();
77
155
  * const agent = sync.getAgent('https://ads.example.com');
78
156
  * const authorized = sync.isAuthorized('https://ads.example.com', 'publisher.com');
79
157
  * const ctv = sync.findAgents({ channels: ['ctv'], markets: ['US'] });
80
- *
81
- * sync.on('event', ({ event }) => console.log('registry change:', event.event_type));
82
158
  * sync.stop();
83
159
  * ```
84
160
  */
85
161
  export declare class RegistrySync extends EventEmitter<RegistrySyncEvents> {
86
162
  private readonly client;
163
+ private readonly transportMode;
87
164
  private readonly pollIntervalMs;
165
+ private readonly types;
166
+ private readonly feedPageLimit;
167
+ private readonly streamPollIntervalSeconds;
168
+ private readonly streamIdleTimeoutMs;
169
+ private readonly streamReconnectMinMs;
170
+ private readonly streamReconnectMaxMs;
171
+ private readonly maxStreamFailures;
88
172
  private readonly indexAgents;
89
173
  private readonly indexAuthorizations;
174
+ private readonly indexBrandHierarchies;
90
175
  private readonly errorHandler;
91
176
  private readonly cursorStore;
92
177
  private _state;
93
178
  private cursor;
94
179
  private pollTimer;
180
+ private activeTransport;
181
+ private streamController;
182
+ private streamIdleTimer;
183
+ private lastFreshness;
184
+ /**
185
+ * Incremented by stop()/reset() and each start(). Async work (bootstrap,
186
+ * rebootstrap, the stream loop) captures its generation and bails the moment
187
+ * it no longer matches — so a stop() that lands mid-bootstrap is honored and
188
+ * a stale loop can never resume after the caller stopped or restarted.
189
+ */
190
+ private generation;
95
191
  private agents;
96
192
  private authByDomain;
97
193
  private authByAgent;
194
+ private brandAncestorsByDomain;
195
+ private brandHierarchyByDomain;
196
+ private brandHierarchyKeysByEntity;
197
+ private brandHierarchyEntityByKey;
98
198
  constructor(config: RegistrySyncConfig);
99
- /** Bootstrap from the registry and begin polling the event feed. */
199
+ /** Bootstrap from the registry and begin tailing the event feed. */
100
200
  start(): Promise<void>;
101
- /** Stop polling. In-memory state is preserved. */
201
+ /** Stop tailing the feed. In-memory state is preserved. */
102
202
  stop(): void;
103
- /** Stop, clear all state. Call start() again to re-bootstrap. */
203
+ /**
204
+ * Stop, clear all in-memory state, and drop the persisted cursor. Call start()
205
+ * again to re-bootstrap from scratch. Because this clears the stored cursor,
206
+ * it is the correct way to switch the `types` subscription: `reset()` then
207
+ * `start()` begins a fresh subscription rather than resuming a cursor minted
208
+ * under the previous filter.
209
+ */
104
210
  reset(): Promise<void>;
211
+ /** Begin tailing the feed using the configured transport. Bootstrap leaves state at 'syncing'. */
212
+ private beginSync;
105
213
  /** Get an agent by URL. */
106
214
  getAgent(url: string): AgentSearchResult | undefined;
107
215
  /** Get all agents in the index. */
@@ -116,15 +224,42 @@ export declare class RegistrySync extends EventEmitter<RegistrySyncEvents> {
116
224
  * Check if an agent has any authorization for a publisher domain.
117
225
  * Does not evaluate property_id scoping, time bounds, or effective dates.
118
226
  * For scoped checks, use getAuthorizationsForDomain() and inspect entries directly.
227
+ *
228
+ * Returns the last synced state — see the class-level staleness note. For
229
+ * enforcement, confirm `state === 'syncing'` and an acceptable `getLagSeconds()`
230
+ * before trusting an allow decision, so a stalled feed can't serve a stale
231
+ * authorization after a missed revocation.
119
232
  */
120
233
  isAuthorized(agentUrl: string, domain: string): boolean;
234
+ /**
235
+ * Get the ordered corporate ancestor domain chain for a brand domain.
236
+ *
237
+ * The returned array includes the resolved brand itself as the first entry and
238
+ * the house domain as the last entry when known.
239
+ */
240
+ getAncestors(domain: string): string[];
241
+ /** Get the ordered resolved brand chain for a brand domain, when the feed supplied it. */
242
+ getBrandHierarchy(domain: string): ResolvedBrand[];
121
243
  get state(): RegistrySyncState;
122
244
  getCursor(): string | null;
123
245
  getStats(): {
124
246
  agents: number;
125
247
  authorizations: number;
248
+ brandHierarchies: number;
126
249
  };
250
+ /** The active feed transport once syncing, or null when idle. */
251
+ getTransport(): RegistrySyncTransport | null;
252
+ /**
253
+ * Latest feed freshness metadata, or null if the registry has not reported it
254
+ * yet (e.g. before the first feed page/heartbeat lands). For push updates,
255
+ * prefer the `freshness` event over polling this right after `start()`.
256
+ */
257
+ getFreshness(): FeedFreshness | null;
258
+ /** Latest feed lag in seconds, or null when unavailable. Convenience over getFreshness(). */
259
+ getLagSeconds(): number | null;
127
260
  private bootstrap;
261
+ /** Clear all state, drop the persisted cursor, and bootstrap again from scratch. */
262
+ private rebootstrap;
128
263
  private schedulePoll;
129
264
  private pollLoop;
130
265
  private poll;
@@ -132,8 +267,38 @@ export declare class RegistrySync extends EventEmitter<RegistrySyncEvents> {
132
267
  * Drain all available feed pages. Used during bootstrap (does not emit 'event' per event).
133
268
  */
134
269
  private drainFeed;
270
+ private runStream;
271
+ /**
272
+ * Consume one SSE connection. Invokes `onMessage(isFeed)` for each feed page
273
+ * (true) or heartbeat (false) received. Returns the disposition for the
274
+ * reconnect loop: `closed` on a clean server EOF, `reconnect` on a server
275
+ * `feed_stream_error`, `rebootstrap` on `cursor_expired`, `stopped` if the
276
+ * engine was stopped mid-stream.
277
+ */
278
+ private streamConnection;
279
+ /** Apply one SSE feed page: events, freshness, then advance + persist the cursor. */
280
+ private applyStreamPage;
281
+ private classifyStreamError;
282
+ private shouldFallBack;
283
+ private fallBackToPolling;
284
+ private armStreamIdleTimer;
285
+ private clearStreamIdleTimer;
286
+ private abortStream;
287
+ private reconnectBackoffMs;
288
+ private delay;
289
+ private feedQuery;
290
+ private observeFreshness;
291
+ private persistCursor;
292
+ private setTransport;
135
293
  private applyEvent;
136
294
  private clearIndexes;
295
+ private applyBrandHierarchyEvent;
296
+ private deleteBrandHierarchy;
297
+ private clearBrandHierarchyEntity;
298
+ private extractResolvedBrandChain;
299
+ private extractDomainChain;
300
+ private domainFromBrand;
301
+ private normalizeDomainKey;
137
302
  private setState;
138
303
  }
139
304
  //# sourceMappingURL=sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/lib/registry/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/lib/registry/sync.ts"],"names":[],"mappings":"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"}