@adcp/sdk 16.0.0-beta.2 → 16.0.0-beta.4

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 (248) hide show
  1. package/README.md +54 -0
  2. package/dist/lib/auth/oauth/diagnose.js +3 -11
  3. package/dist/lib/auth/oauth/diagnose.mjs +4 -12
  4. package/dist/lib/auth/oauth/diagnostics.d.mts +2 -1
  5. package/dist/lib/auth/oauth/diagnostics.d.ts +2 -1
  6. package/dist/lib/auth/oauth/diagnostics.js +8 -10
  7. package/dist/lib/auth/oauth/diagnostics.mjs +7 -10
  8. package/dist/lib/core/ConversationTypes.d.mts +8 -3
  9. package/dist/lib/core/ConversationTypes.d.ts +8 -3
  10. package/dist/lib/core/SingleAgentClient.d.mts +5 -3
  11. package/dist/lib/core/SingleAgentClient.d.ts +5 -3
  12. package/dist/lib/core/TaskExecutor.js +5 -1
  13. package/dist/lib/core/TaskExecutor.mjs +5 -1
  14. package/dist/lib/errors/index.d.mts +9 -4
  15. package/dist/lib/errors/index.d.ts +9 -4
  16. package/dist/lib/index.d.mts +3 -3
  17. package/dist/lib/index.d.ts +3 -3
  18. package/dist/lib/index.js +8 -0
  19. package/dist/lib/index.mjs +14 -2
  20. package/dist/lib/negotiation/types.d.mts +20 -39
  21. package/dist/lib/negotiation/types.d.ts +20 -39
  22. package/dist/lib/protocols/index.d.mts +60 -24
  23. package/dist/lib/protocols/index.d.ts +60 -24
  24. package/dist/lib/protocols/index.js +9 -4
  25. package/dist/lib/protocols/index.mjs +3 -0
  26. package/dist/lib/protocols/mcp-modern.js +1 -0
  27. package/dist/lib/protocols/mcp-modern.mjs +2 -1
  28. package/dist/lib/protocols/mcp.js +1 -0
  29. package/dist/lib/protocols/mcp.mjs +2 -1
  30. package/dist/lib/protocols/responseSizeLimit.d.mts +91 -5
  31. package/dist/lib/protocols/responseSizeLimit.d.ts +91 -5
  32. package/dist/lib/protocols/responseSizeLimit.js +195 -31
  33. package/dist/lib/protocols/responseSizeLimit.mjs +192 -31
  34. package/dist/lib/reporting/consumer-runtime.js +2 -1
  35. package/dist/lib/reporting/consumer-runtime.mjs +2 -1
  36. package/dist/lib/reporting/ledger/handler.js +50 -11
  37. package/dist/lib/reporting/ledger/handler.mjs +50 -12
  38. package/dist/lib/reporting/ledger/index.d.mts +17 -14
  39. package/dist/lib/reporting/ledger/index.d.ts +17 -14
  40. package/dist/lib/reporting/ledger/index.js +32 -20
  41. package/dist/lib/reporting/ledger/index.mjs +21 -10
  42. package/dist/lib/reporting/ledger/offering-validation.d.mts +9 -0
  43. package/dist/lib/reporting/ledger/offering-validation.d.ts +9 -0
  44. package/dist/lib/reporting/{gcs/bucket-policy.js → ledger/offering-validation.js} +9 -8
  45. package/dist/lib/reporting/ledger/offering-validation.mjs +8 -0
  46. package/dist/lib/reporting/ledger/receipts.d.mts +48 -0
  47. package/dist/lib/reporting/ledger/receipts.d.ts +48 -0
  48. package/dist/lib/reporting/ledger/receipts.js +186 -0
  49. package/dist/lib/reporting/ledger/receipts.mjs +161 -0
  50. package/dist/lib/reporting/ledger/status-ingest.js +3 -3
  51. package/dist/lib/reporting/ledger/status-ingest.mjs +4 -5
  52. package/dist/lib/reporting/ledger/types.d.mts +43 -0
  53. package/dist/lib/reporting/ledger/types.d.ts +43 -0
  54. package/dist/lib/reporting/ledger/types.js +31 -2
  55. package/dist/lib/reporting/ledger/types.mjs +26 -1
  56. package/dist/lib/reporting/pagination.d.mts +6 -0
  57. package/dist/lib/reporting/pagination.d.ts +6 -0
  58. package/dist/lib/reporting/{gcs/errors.js → pagination.js} +12 -17
  59. package/dist/lib/reporting/pagination.mjs +12 -0
  60. package/dist/lib/reporting/reconciliation.d.mts +1 -0
  61. package/dist/lib/reporting/reconciliation.d.ts +1 -0
  62. package/dist/lib/reporting/reconciliation.js +3 -2
  63. package/dist/lib/reporting/reconciliation.mjs +3 -2
  64. package/dist/lib/reporting/service/index.d.mts +79 -153
  65. package/dist/lib/reporting/service/index.d.ts +79 -153
  66. package/dist/lib/reporting/service/index.js +34 -491
  67. package/dist/lib/reporting/service/index.mjs +36 -510
  68. package/dist/lib/reporting/service/scheduler-support.d.mts +43 -0
  69. package/dist/lib/reporting/service/scheduler-support.d.ts +43 -0
  70. package/dist/lib/reporting/service/scheduler-support.js +125 -0
  71. package/dist/lib/reporting/service/scheduler-support.mjs +96 -0
  72. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  73. package/dist/lib/signing/canonicalize.d.mts +4 -0
  74. package/dist/lib/signing/canonicalize.d.ts +4 -0
  75. package/dist/lib/signing/canonicalize.js +14 -8
  76. package/dist/lib/signing/canonicalize.mjs +14 -8
  77. package/dist/lib/signing/content-digest.d.mts +8 -0
  78. package/dist/lib/signing/content-digest.d.ts +8 -0
  79. package/dist/lib/signing/content-digest.js +11 -5
  80. package/dist/lib/signing/content-digest.mjs +10 -5
  81. package/dist/lib/signing/crypto.d.mts +15 -0
  82. package/dist/lib/signing/crypto.d.ts +15 -0
  83. package/dist/lib/signing/crypto.js +75 -3
  84. package/dist/lib/signing/crypto.mjs +78 -3
  85. package/dist/lib/signing/server.d.mts +1 -1
  86. package/dist/lib/signing/server.d.ts +1 -1
  87. package/dist/lib/signing/server.js +2 -0
  88. package/dist/lib/signing/server.mjs +2 -1
  89. package/dist/lib/signing/signer.js +11 -14
  90. package/dist/lib/signing/signer.mjs +13 -16
  91. package/dist/lib/signing/testing.js +2 -6
  92. package/dist/lib/signing/testing.mjs +3 -7
  93. package/dist/lib/signing/verifier.js +2 -2
  94. package/dist/lib/signing/verifier.mjs +3 -3
  95. package/dist/lib/signing/web-bot-auth.js +122 -43
  96. package/dist/lib/signing/web-bot-auth.mjs +128 -44
  97. package/dist/lib/signing/webhook-verifier.js +2 -2
  98. package/dist/lib/signing/webhook-verifier.mjs +3 -3
  99. package/dist/lib/substitution/compile.js +2 -1
  100. package/dist/lib/substitution/compile.mjs +2 -1
  101. package/dist/lib/substitution/consent-macros.d.mts +4 -0
  102. package/dist/lib/substitution/consent-macros.d.ts +4 -0
  103. package/dist/lib/substitution/consent-macros.js +45 -0
  104. package/dist/lib/substitution/consent-macros.mjs +20 -0
  105. package/dist/lib/substitution/index.d.mts +1 -1
  106. package/dist/lib/substitution/index.d.ts +1 -1
  107. package/dist/lib/substitution/index.js +2 -0
  108. package/dist/lib/substitution/index.mjs +2 -1
  109. package/dist/lib/substitution/translate.d.mts +15 -2
  110. package/dist/lib/substitution/translate.d.ts +15 -2
  111. package/dist/lib/substitution/translate.js +148 -26
  112. package/dist/lib/substitution/translate.mjs +147 -26
  113. package/dist/lib/testing/client.js +2 -1
  114. package/dist/lib/testing/client.mjs +2 -1
  115. package/dist/lib/testing/scenarios/capabilities.js +1 -1
  116. package/dist/lib/testing/scenarios/capabilities.mjs +1 -1
  117. package/dist/lib/testing/storyboard/junit.js +16 -3
  118. package/dist/lib/testing/storyboard/junit.mjs +16 -3
  119. package/dist/lib/testing/storyboard/request-signing/builder.js +12 -14
  120. package/dist/lib/testing/storyboard/request-signing/builder.mjs +13 -15
  121. package/dist/lib/testing/storyboard/runner.js +94 -25
  122. package/dist/lib/testing/storyboard/runner.mjs +94 -25
  123. package/dist/lib/testing/storyboard/signer-grader/grader.js +2 -7
  124. package/dist/lib/testing/storyboard/signer-grader/grader.mjs +2 -7
  125. package/dist/lib/testing/storyboard/types.d.mts +6 -0
  126. package/dist/lib/testing/storyboard/types.d.ts +6 -0
  127. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  128. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  129. package/dist/lib/types/enums.generated.d.mts +3 -0
  130. package/dist/lib/types/enums.generated.d.ts +3 -0
  131. package/dist/lib/types/enums.generated.js +9 -0
  132. package/dist/lib/types/enums.generated.mjs +6 -0
  133. package/dist/lib/validation/schema-loader.js +25 -0
  134. package/dist/lib/validation/schema-loader.mjs +24 -0
  135. package/dist/lib/version.d.mts +3 -3
  136. package/dist/lib/version.d.ts +3 -3
  137. package/dist/lib/version.js +3 -3
  138. package/dist/lib/version.mjs +3 -3
  139. package/docs/TYPE-SUMMARY.md +28 -5
  140. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +3 -2
  141. package/docs/guides/REPORTING-GCS-FENCE.md +3 -3
  142. package/docs/guides/REPORTING-GCS-MANAGED.md +4 -4
  143. package/docs/guides/REPORTING-LEDGER-CUTOVER.md +7 -7
  144. package/docs/guides/REPORTING-LEDGER.md +107 -51
  145. package/docs/guides/REPORTING-OPERATIONS.md +66 -5
  146. package/docs/guides/REPORTING-STABILITY.md +36 -32
  147. package/docs/guides/UNIVERSAL-MACRO-COMPILATION.md +38 -0
  148. package/docs/guides/VALIDATE-YOUR-AGENT.md +12 -0
  149. package/docs/llms.txt +4 -3
  150. package/docs/migration-14.x-rc-worksheet.md +4 -7
  151. package/docs/migration-reporting-storage-package.md +186 -0
  152. package/examples/README.md +1 -1
  153. package/package.json +14 -78
  154. package/dist/lib/reporting/azure/index.d.mts +0 -31
  155. package/dist/lib/reporting/azure/index.d.ts +0 -31
  156. package/dist/lib/reporting/azure/index.js +0 -266
  157. package/dist/lib/reporting/azure/index.mjs +0 -249
  158. package/dist/lib/reporting/bigquery/index.d.mts +0 -246
  159. package/dist/lib/reporting/bigquery/index.d.ts +0 -246
  160. package/dist/lib/reporting/bigquery/index.js +0 -633
  161. package/dist/lib/reporting/bigquery/index.mjs +0 -594
  162. package/dist/lib/reporting/gcs/adapter.d.mts +0 -38
  163. package/dist/lib/reporting/gcs/adapter.d.ts +0 -38
  164. package/dist/lib/reporting/gcs/adapter.js +0 -342
  165. package/dist/lib/reporting/gcs/adapter.mjs +0 -325
  166. package/dist/lib/reporting/gcs/bucket-policy.d.mts +0 -3
  167. package/dist/lib/reporting/gcs/bucket-policy.d.ts +0 -3
  168. package/dist/lib/reporting/gcs/bucket-policy.mjs +0 -7
  169. package/dist/lib/reporting/gcs/errors.d.mts +0 -11
  170. package/dist/lib/reporting/gcs/errors.d.ts +0 -11
  171. package/dist/lib/reporting/gcs/errors.mjs +0 -16
  172. package/dist/lib/reporting/gcs/fence.d.mts +0 -41
  173. package/dist/lib/reporting/gcs/fence.d.ts +0 -41
  174. package/dist/lib/reporting/gcs/fence.js +0 -250
  175. package/dist/lib/reporting/gcs/fence.mjs +0 -230
  176. package/dist/lib/reporting/gcs/index.d.mts +0 -18
  177. package/dist/lib/reporting/gcs/index.d.ts +0 -18
  178. package/dist/lib/reporting/gcs/index.js +0 -44
  179. package/dist/lib/reporting/gcs/index.mjs +0 -14
  180. package/dist/lib/reporting/gcs/io.d.mts +0 -7
  181. package/dist/lib/reporting/gcs/io.d.ts +0 -7
  182. package/dist/lib/reporting/gcs/io.js +0 -95
  183. package/dist/lib/reporting/gcs/io.mjs +0 -69
  184. package/dist/lib/reporting/gcs/reader.d.mts +0 -67
  185. package/dist/lib/reporting/gcs/reader.d.ts +0 -67
  186. package/dist/lib/reporting/gcs/reader.js +0 -193
  187. package/dist/lib/reporting/gcs/reader.mjs +0 -169
  188. package/dist/lib/reporting/gcs/row-provider.d.mts +0 -39
  189. package/dist/lib/reporting/gcs/row-provider.d.ts +0 -39
  190. package/dist/lib/reporting/gcs/row-provider.js +0 -225
  191. package/dist/lib/reporting/gcs/row-provider.mjs +0 -208
  192. package/dist/lib/reporting/gcs/validation.d.mts +0 -5
  193. package/dist/lib/reporting/gcs/validation.d.ts +0 -5
  194. package/dist/lib/reporting/gcs/validation.js +0 -49
  195. package/dist/lib/reporting/gcs/validation.mjs +0 -25
  196. package/dist/lib/reporting/ledger/change-feed.d.mts +0 -69
  197. package/dist/lib/reporting/ledger/change-feed.d.ts +0 -69
  198. package/dist/lib/reporting/ledger/change-feed.js +0 -107
  199. package/dist/lib/reporting/ledger/change-feed.mjs +0 -80
  200. package/dist/lib/reporting/ledger/managed-postgres.d.mts +0 -293
  201. package/dist/lib/reporting/ledger/managed-postgres.d.ts +0 -293
  202. package/dist/lib/reporting/ledger/managed-postgres.js +0 -2346
  203. package/dist/lib/reporting/ledger/managed-postgres.mjs +0 -2332
  204. package/dist/lib/reporting/ledger/managed-router.d.mts +0 -148
  205. package/dist/lib/reporting/ledger/managed-router.d.ts +0 -148
  206. package/dist/lib/reporting/ledger/managed-router.js +0 -280
  207. package/dist/lib/reporting/ledger/managed-router.mjs +0 -258
  208. package/dist/lib/reporting/ledger/managed.d.mts +0 -535
  209. package/dist/lib/reporting/ledger/managed.d.ts +0 -535
  210. package/dist/lib/reporting/ledger/managed.js +0 -761
  211. package/dist/lib/reporting/ledger/managed.mjs +0 -729
  212. package/dist/lib/reporting/ledger/notification-activity.d.mts +0 -332
  213. package/dist/lib/reporting/ledger/notification-activity.d.ts +0 -332
  214. package/dist/lib/reporting/ledger/notification-activity.js +0 -1366
  215. package/dist/lib/reporting/ledger/notification-activity.mjs +0 -1337
  216. package/dist/lib/reporting/ledger/object-writes.d.mts +0 -128
  217. package/dist/lib/reporting/ledger/object-writes.d.ts +0 -128
  218. package/dist/lib/reporting/ledger/object-writes.js +0 -147
  219. package/dist/lib/reporting/ledger/object-writes.mjs +0 -114
  220. package/dist/lib/reporting/ledger/postgres.d.mts +0 -689
  221. package/dist/lib/reporting/ledger/postgres.d.ts +0 -689
  222. package/dist/lib/reporting/ledger/postgres.js +0 -4462
  223. package/dist/lib/reporting/ledger/postgres.mjs +0 -4462
  224. package/dist/lib/reporting/ledger/row-storage-migration.d.mts +0 -59
  225. package/dist/lib/reporting/ledger/row-storage-migration.d.ts +0 -59
  226. package/dist/lib/reporting/ledger/row-storage-migration.js +0 -365
  227. package/dist/lib/reporting/ledger/row-storage-migration.mjs +0 -339
  228. package/dist/lib/reporting/ledger/row-storage-object.d.mts +0 -203
  229. package/dist/lib/reporting/ledger/row-storage-object.d.ts +0 -203
  230. package/dist/lib/reporting/ledger/row-storage-object.js +0 -379
  231. package/dist/lib/reporting/ledger/row-storage-object.mjs +0 -335
  232. package/dist/lib/reporting/ledger/row-storage-provider-io.d.mts +0 -44
  233. package/dist/lib/reporting/ledger/row-storage-provider-io.d.ts +0 -44
  234. package/dist/lib/reporting/ledger/row-storage-provider-io.js +0 -142
  235. package/dist/lib/reporting/ledger/row-storage-provider-io.mjs +0 -111
  236. package/dist/lib/reporting/ledger/row-storage.d.mts +0 -316
  237. package/dist/lib/reporting/ledger/row-storage.d.ts +0 -316
  238. package/dist/lib/reporting/ledger/row-storage.js +0 -812
  239. package/dist/lib/reporting/ledger/row-storage.mjs +0 -802
  240. package/dist/lib/reporting/s3/index.d.mts +0 -34
  241. package/dist/lib/reporting/s3/index.d.ts +0 -34
  242. package/dist/lib/reporting/s3/index.js +0 -347
  243. package/dist/lib/reporting/s3/index.mjs +0 -340
  244. package/dist/lib/reporting/service/maintenance.d.mts +0 -148
  245. package/dist/lib/reporting/service/maintenance.d.ts +0 -148
  246. package/dist/lib/reporting/service/maintenance.js +0 -185
  247. package/dist/lib/reporting/service/maintenance.mjs +0 -159
  248. package/examples/reliable-reporting-service/README.md +0 -169
@@ -1,633 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var bigquery_exports = {};
30
- __export(bigquery_exports, {
31
- REPORTING_WAREHOUSE_SINK_MIGRATION: () => REPORTING_WAREHOUSE_SINK_MIGRATION,
32
- createBigQueryReportingWarehouseSinkV1: () => createBigQueryReportingWarehouseSinkV1,
33
- reportingWarehouseCurrentRowsViewSqlV1: () => reportingWarehouseCurrentRowsViewSqlV1,
34
- reportingWarehouseDefaultTablesSqlV1: () => reportingWarehouseDefaultTablesSqlV1,
35
- reportingWarehouseJobIdV1: () => reportingWarehouseJobIdV1,
36
- reportingWarehouseLoadDeadlineV1: () => reportingWarehouseLoadDeadlineV1
37
- });
38
- module.exports = __toCommonJS(bigquery_exports);
39
- var import_crypto = require("crypto");
40
- var import_fs = require("fs");
41
- var import_os = require("os");
42
- var path = __toESM(require("path"));
43
- var import_change_feed = require('../ledger/change-feed.js');
44
- var import_schedule = require('../ledger/schedule.js');
45
- const REPORTING_WAREHOUSE_SINK_MIGRATION = `
46
- CREATE TABLE IF NOT EXISTS adcp_reporting_warehouse_sinks (
47
- sink_name TEXT PRIMARY KEY CHECK (sink_name ~ '^[A-Za-z0-9_.:-]{1,128}$'),
48
- committed_cursor TEXT,
49
- planned_from_cursor TEXT,
50
- planned_to_cursor TEXT,
51
- planned_revisions JSONB,
52
- planned_rows_attempt INTEGER NOT NULL DEFAULT 0 CHECK (planned_rows_attempt >= 0),
53
- planned_revisions_attempt INTEGER NOT NULL DEFAULT 0 CHECK (planned_revisions_attempt >= 0),
54
- planned_rows_timeouts INTEGER NOT NULL DEFAULT 0 CHECK (planned_rows_timeouts >= 0),
55
- planned_revisions_timeouts INTEGER NOT NULL DEFAULT 0 CHECK (planned_revisions_timeouts >= 0),
56
- reset_generation INTEGER NOT NULL DEFAULT 0 CHECK (reset_generation >= 0),
57
- updated_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
58
- CHECK ((planned_to_cursor IS NULL) = (planned_revisions IS NULL))
59
- );
60
- ALTER TABLE adcp_reporting_warehouse_sinks
61
- ADD COLUMN IF NOT EXISTS reset_generation INTEGER NOT NULL DEFAULT 0 CHECK (reset_generation >= 0);
62
- ALTER TABLE adcp_reporting_warehouse_sinks
63
- ADD COLUMN IF NOT EXISTS planned_rows_timeouts INTEGER NOT NULL DEFAULT 0 CHECK (planned_rows_timeouts >= 0);
64
- ALTER TABLE adcp_reporting_warehouse_sinks
65
- ADD COLUMN IF NOT EXISTS planned_revisions_timeouts INTEGER NOT NULL DEFAULT 0 CHECK (planned_revisions_timeouts >= 0);
66
- `.trim();
67
- const MAX_LOAD_TIMEOUT = 6 * 36e5;
68
- const MAX_TIMEOUT_DOUBLINGS = 16;
69
- let warnedLabelsIgnored = false;
70
- let warnedLocationUnset = false;
71
- const PROJECT = /^[a-z][a-z0-9-]{4,61}[a-z0-9]$/;
72
- const DATASET_OR_TABLE = /^[A-Za-z_][A-Za-z0-9_]{0,1023}$/;
73
- const NAME = /^[A-Za-z0-9_.:-]{1,128}$/;
74
- function createBigQueryReportingWarehouseSinkV1(options) {
75
- if (!NAME.test(options.name)) throw new TypeError("Warehouse sink name must be a bounded non-secret identifier");
76
- if (options.projectId !== void 0 && !PROJECT.test(options.projectId)) {
77
- throw new TypeError("BigQuery projectId is invalid");
78
- }
79
- for (const [label, value] of [
80
- ["datasetId", options.datasetId],
81
- ["rowsTableId", options.rowsTableId],
82
- ["revisionsTableId", options.revisionsTableId]
83
- ]) {
84
- if (!DATASET_OR_TABLE.test(value)) throw new TypeError(`BigQuery ${label} is invalid`);
85
- }
86
- const loadTimeout = options.loadTimeoutMilliseconds ?? 6e5;
87
- if (!Number.isSafeInteger(loadTimeout) || loadTimeout < 1e3 || loadTimeout > MAX_LOAD_TIMEOUT) {
88
- throw new RangeError("loadTimeoutMilliseconds must be between 1 second and 6 hours");
89
- }
90
- const maxRevisions = options.maxRevisionsPerBatch ?? 200;
91
- if (!Number.isSafeInteger(maxRevisions) || maxRevisions < 1 || maxRevisions > 1e4) {
92
- throw new RangeError("maxRevisionsPerBatch must be between 1 and 10000");
93
- }
94
- if (options.labels && Object.keys(options.labels).length > 0 && !warnedLabelsIgnored) {
95
- warnedLabelsIgnored = true;
96
- process.emitWarning(
97
- "BigQuery warehouse sink option `labels` has no effect: BigQuery ignores labels inside a load job's configuration.load and the official client cannot set configuration.labels for local-file loads. Attribute cost through INFORMATION_SCHEMA.JOBS by destination table or the adcp_rr_ job ID prefix.",
98
- { code: "ADCP_BIGQUERY_SINK_LABELS_IGNORED", type: "DeprecationWarning" }
99
- );
100
- }
101
- if (!options.location && !warnedLocationUnset) {
102
- warnedLocationUnset = true;
103
- process.emitWarning(
104
- 'BigQuery warehouse sink option `location` is not set. Replay lookups of load jobs need it for datasets outside the US and EU multi-regions: without it BigQuery answers 404, the sink uploads again, gets a 409, and then fails with a "check projectId and location" error.',
105
- { code: "ADCP_BIGQUERY_SINK_LOCATION_UNSET" }
106
- );
107
- }
108
- const tables = {
109
- projectId: options.projectId,
110
- datasetId: options.datasetId,
111
- rowsTableId: options.rowsTableId,
112
- revisionsTableId: options.revisionsTableId
113
- };
114
- const dataset = options.bigquery.dataset(options.datasetId, {
115
- ...options.projectId ? { projectId: options.projectId } : {},
116
- ...options.location ? { location: options.location } : {}
117
- });
118
- const matchesPlan = `WHERE sink_name = $1
119
- AND committed_cursor IS NOT DISTINCT FROM $2
120
- AND planned_from_cursor IS NOT DISTINCT FROM $2
121
- AND planned_to_cursor = $3 AND planned_revisions = $4::jsonb
122
- AND planned_rows_attempt = $5 AND planned_revisions_attempt = $6
123
- AND reset_generation = $7`;
124
- const stalePlan = () => new Error("Warehouse sink plan changed during an overlapping run; retry runOnce()");
125
- const jobOptions = options.projectId || options.location ? {
126
- ...options.projectId ? { projectId: options.projectId } : {},
127
- ...options.location ? { location: options.location } : {}
128
- } : void 0;
129
- const uploads = /* @__PURE__ */ new Map();
130
- function startUpload(tableId, jobId, lines) {
131
- const entry = {
132
- startedAt: Date.now(),
133
- done: Promise.resolve()
134
- };
135
- const cleanup = async () => {
136
- if (uploads.get(jobId) === entry) uploads.delete(jobId);
137
- if (entry.directory) await import_fs.promises.rm(entry.directory, { recursive: true, force: true }).catch(() => {
138
- });
139
- };
140
- entry.done = (async () => {
141
- const directory = await import_fs.promises.mkdtemp(path.join((0, import_os.tmpdir)(), "adcp-warehouse-"));
142
- entry.directory = directory;
143
- const file = path.join(directory, `${jobId}.ndjson`);
144
- await import_fs.promises.writeFile(file, lines.length ? lines.join("\n") + "\n" : "", { mode: 384 });
145
- return dataset.table(tableId).load(file, {
146
- jobId,
147
- sourceFormat: "NEWLINE_DELIMITED_JSON",
148
- writeDisposition: "WRITE_APPEND",
149
- ...options.location ? { location: options.location } : {}
150
- });
151
- })();
152
- const replaced = uploads.get(jobId);
153
- uploads.set(jobId, entry);
154
- void entry.done.then(cleanup, cleanup);
155
- if (replaced?.directory) void import_fs.promises.rm(replaced.directory, { recursive: true, force: true }).catch(() => {
156
- });
157
- return entry.done;
158
- }
159
- async function jobStatus(jobId, signal, boundMilliseconds = loadTimeout, context) {
160
- let metadata;
161
- try {
162
- metadata = await withinDeadline(
163
- () => options.bigquery.job(jobId, jobOptions).getMetadata(),
164
- boundMilliseconds,
165
- signal,
166
- context
167
- );
168
- } catch (error) {
169
- if (error?.code === 404) return "missing";
170
- throw error;
171
- }
172
- const record = Array.isArray(metadata) ? metadata[0] : metadata;
173
- if (record?.status?.state !== "DONE") return "running";
174
- if (record.status.errorResult) {
175
- const failure = new Error("A BigQuery load job for this batch failed; it will be retried as a new attempt");
176
- Object.defineProperty(failure, "adcpJobFailed", { value: true });
177
- throw failure;
178
- }
179
- return "done";
180
- }
181
- async function loadOnce(role, tableId, jobId, lines, timeouts, signal) {
182
- signal?.throwIfAborted();
183
- const table = `the ${role} table "${tableId}" (timeout count ${timeouts})`;
184
- let status = await jobStatus(jobId, signal, loadTimeout, table);
185
- if (status === "done") return;
186
- const loadDeadline = reportingWarehouseLoadDeadlineV1(loadTimeout, timeouts);
187
- const deadlineAt = Date.now() + loadDeadline;
188
- const timedOut = (what) => {
189
- const error = new Error(
190
- `${what} exceeded this run's ${loadDeadline} ms deadline for ${table}; the next run checks the job again`
191
- );
192
- Object.defineProperty(error, "adcpDeadlineExceeded", { value: true });
193
- Object.defineProperty(error, "adcpLoadTimedOut", { value: true });
194
- return error;
195
- };
196
- if (status === "missing") {
197
- try {
198
- const running = uploads.get(jobId);
199
- const upload = running && Date.now() - running.startedAt < MAX_LOAD_TIMEOUT ? running.done : startUpload(tableId, jobId, lines);
200
- await withinDeadline(() => upload, Math.max(deadlineAt - Date.now(), 1), signal);
201
- return;
202
- } catch (error) {
203
- if (isDeadlineExceeded(error)) throw timedOut("Uploading the load");
204
- if (!isAlreadyExists(error)) throw error;
205
- status = await jobStatus(jobId, signal, loadTimeout, table);
206
- if (status === "missing") {
207
- throw new Error(
208
- "BigQuery refused the load job ID as already existing, but the job cannot be found. Check that projectId and location match the dataset (location is required for datasets outside the US and EU multi-regions)",
209
- { cause: error }
210
- );
211
- }
212
- }
213
- }
214
- const pollMilliseconds = Math.min(5e3, Math.max(250, Math.floor(loadDeadline / 10)));
215
- while (status !== "done") {
216
- const remaining = deadlineAt - Date.now();
217
- if (remaining <= 0) throw timedOut("Waiting for the running load job");
218
- await sleep(Math.min(pollMilliseconds, remaining), signal);
219
- const bound = Math.max(Math.min(loadTimeout, deadlineAt - Date.now()), 1);
220
- try {
221
- status = await jobStatus(jobId, signal, bound, table);
222
- } catch (error) {
223
- if (isDeadlineExceeded(error) && bound < loadTimeout) throw timedOut("Waiting for the running load job");
224
- throw error;
225
- }
226
- if (status === "missing") throw new Error("A BigQuery load job for this batch disappeared while it was awaited");
227
- }
228
- }
229
- return {
230
- defaultTablesSql: reportingWarehouseDefaultTablesSqlV1(tables),
231
- currentRowsViewSql: reportingWarehouseCurrentRowsViewSqlV1(tables),
232
- async reset(resetOptions = {}) {
233
- const removeConsumer = options.store.removeFeedConsumer?.bind(options.store);
234
- if (!removeConsumer) {
235
- throw new TypeError("reset() needs a store with removeFeedConsumer (PostgresReportingLedgerStore has it)");
236
- }
237
- const cleared = await options.db.query(
238
- `UPDATE adcp_reporting_warehouse_sinks
239
- SET committed_cursor = NULL, planned_from_cursor = NULL, planned_to_cursor = NULL,
240
- planned_revisions = NULL, planned_rows_attempt = 0, planned_revisions_attempt = 0,
241
- planned_rows_timeouts = 0, planned_revisions_timeouts = 0,
242
- reset_generation = reset_generation + 1, updated_at = clock_timestamp()
243
- WHERE sink_name = $1 AND ($2::boolean OR planned_to_cursor IS NULL)
244
- RETURNING sink_name`,
245
- [options.name, resetOptions.discardRetainedPlan === true]
246
- ).catch(missingMigration);
247
- if (cleared.rows.length === 0) {
248
- const exists = await options.db.query(`SELECT 1 FROM adcp_reporting_warehouse_sinks WHERE sink_name = $1`, [
249
- options.name
250
- ]);
251
- if (exists.rows.length > 0) {
252
- throw new Error(
253
- "Warehouse sink has a retained batch plan whose load jobs may have succeeded; reconcile it against BigQuery, then call reset({ discardRetainedPlan: true })"
254
- );
255
- }
256
- }
257
- try {
258
- await removeConsumer(options.name);
259
- } catch (cause) {
260
- throw new Error(
261
- "Warehouse sink state was cleared but its feed consumer could not be unregistered; call reset() again before restarting workers",
262
- { cause }
263
- );
264
- }
265
- return { cleared: cleared.rows.length > 0 };
266
- },
267
- async runOnce(runOptions = {}) {
268
- const signal = runOptions.signal;
269
- await options.db.query(
270
- `INSERT INTO adcp_reporting_warehouse_sinks (sink_name) VALUES ($1) ON CONFLICT DO NOTHING`,
271
- [options.name]
272
- );
273
- const state = (await options.db.query(
274
- `SELECT committed_cursor, planned_from_cursor, planned_to_cursor, planned_revisions,
275
- planned_rows_attempt, planned_revisions_attempt,
276
- planned_rows_timeouts, planned_revisions_timeouts, reset_generation
277
- FROM adcp_reporting_warehouse_sinks WHERE sink_name = $1`,
278
- [options.name]
279
- ).catch(missingMigration)).rows[0];
280
- if (state.planned_to_cursor !== null && state.planned_from_cursor !== state.committed_cursor) {
281
- throw new Error(
282
- "Warehouse sink has an inconsistent retained plan; reconcile the plan and BigQuery jobs before resuming"
283
- );
284
- }
285
- if (options.account_id && state.planned_revisions?.some((planned) => planned.account_id !== options.account_id)) {
286
- throw new Error(
287
- "Warehouse sink has a retained plan for another account; this sink name is shared across feed scopes"
288
- );
289
- }
290
- let plan = state.planned_to_cursor && state.planned_revisions ? {
291
- from: state.planned_from_cursor,
292
- to: state.planned_to_cursor,
293
- revisions: state.planned_revisions,
294
- rowsAttempt: state.planned_rows_attempt,
295
- revisionsAttempt: state.planned_revisions_attempt,
296
- rowsTimeouts: state.planned_rows_timeouts,
297
- revisionsTimeouts: state.planned_revisions_timeouts
298
- } : void 0;
299
- if (!plan) {
300
- const position = {
301
- ...state.committed_cursor ? { cursor: state.committed_cursor } : {},
302
- ...options.account_id ? { account_id: options.account_id } : {},
303
- limit: maxRevisions
304
- };
305
- let page;
306
- let readCursor = position.cursor;
307
- try {
308
- page = await options.store.changesAfter({ ...position, kinds: ["revision"] });
309
- if (page.records.length === 0) {
310
- readCursor = page.cursor;
311
- page = await options.store.changesAfter({ ...position, cursor: readCursor });
312
- }
313
- } catch (error) {
314
- if (error?.code === "CURSOR_EXPIRED" && state.committed_cursor === null) {
315
- const cursor = readCursor ?? error.cursor;
316
- if (cursor !== void 0 && typeof cursor !== "string") throw error;
317
- if (cursor !== void 0) {
318
- try {
319
- (0, import_change_feed.decodeReportingChangeCursorV1)(cursor, position.account_id ?? null);
320
- } catch {
321
- throw error;
322
- }
323
- await options.db.query(
324
- `UPDATE adcp_reporting_warehouse_sinks SET committed_cursor = $2, updated_at = clock_timestamp()
325
- WHERE sink_name = $1 AND committed_cursor IS NULL AND reset_generation = $3
326
- AND planned_from_cursor IS NULL AND planned_to_cursor IS NULL AND planned_revisions IS NULL`,
327
- [options.name, cursor, state.reset_generation]
328
- );
329
- }
330
- }
331
- throw error;
332
- }
333
- if (page.records.length === 0 && page.cursor === state.committed_cursor) {
334
- if (state.committed_cursor) {
335
- await options.store.saveFeedConsumerCursor(options.name, state.committed_cursor, {
336
- refreshUnchanged: false
337
- });
338
- }
339
- return { idle: true, revisions: 0, rows: 0, missing: [] };
340
- }
341
- plan = {
342
- from: state.committed_cursor,
343
- to: page.cursor,
344
- revisions: page.records.filter((record) => record.kind === "revision").map((record) => ({ id: record.record_id, account_id: record.account_id })),
345
- rowsAttempt: 0,
346
- revisionsAttempt: 0,
347
- rowsTimeouts: 0,
348
- revisionsTimeouts: 0
349
- };
350
- const claimed = await options.db.query(
351
- `UPDATE adcp_reporting_warehouse_sinks
352
- SET planned_from_cursor = $2, planned_to_cursor = $3, planned_revisions = $4::jsonb,
353
- planned_rows_attempt = 0, planned_revisions_attempt = 0,
354
- planned_rows_timeouts = 0, planned_revisions_timeouts = 0, updated_at = clock_timestamp()
355
- WHERE sink_name = $1 AND committed_cursor IS NOT DISTINCT FROM $2
356
- AND planned_to_cursor IS NULL AND planned_revisions IS NULL AND reset_generation = $5
357
- RETURNING sink_name`,
358
- [options.name, plan.from, plan.to, JSON.stringify(plan.revisions), state.reset_generation]
359
- );
360
- if (claimed.rows.length === 0) throw stalePlan();
361
- }
362
- const planValues = [
363
- options.name,
364
- plan.from,
365
- plan.to,
366
- JSON.stringify(plan.revisions),
367
- plan.rowsAttempt,
368
- plan.revisionsAttempt,
369
- state.reset_generation
370
- ];
371
- const rowLines = [];
372
- const revisionLines = [];
373
- const missing = [];
374
- const resolved = [];
375
- for (const planned of plan.revisions) {
376
- signal?.throwIfAborted();
377
- const revision = await options.store.getRevisionMetadata(planned.id, planned.account_id);
378
- if (!revision) {
379
- missing.push(planned.id);
380
- continue;
381
- }
382
- resolved.push({ planned, revision, periodDate: periodDateOf(revision) });
383
- }
384
- for (const { planned, revision, periodDate } of resolved) {
385
- signal?.throwIfAborted();
386
- const base = {
387
- reporting_revision_id: revision.reporting_revision_id,
388
- reporting_obligation_id: revision.reporting_obligation_id,
389
- account_id: planned.account_id,
390
- revision_number: revision.revisionNumber,
391
- finality: revision.finality,
392
- period_date: periodDate
393
- };
394
- for (let offset = 0; offset < revision.binding.rowCount; ) {
395
- const page = await options.store.readRevisionRows({
396
- reporting_revision_id: revision.reporting_revision_id,
397
- account_id: planned.account_id,
398
- offset,
399
- limit: 5e3,
400
- ...signal ? { signal } : {}
401
- });
402
- if (!page || page.rows.length === 0) throw new Error("Reporting revision rows ended early");
403
- page.rows.forEach((row, index) => {
404
- const ordinal = offset + index;
405
- const mapped = options.mapRow ? options.mapRow(row, { revision, ordinal }) : { row };
406
- rowLines.push(JSON.stringify({ ...mapped, ...base, ordinal }));
407
- });
408
- offset += page.rows.length;
409
- }
410
- revisionLines.push(
411
- JSON.stringify({
412
- ...base,
413
- supersedes_reporting_revision_id: revision.supersedes_reporting_revision_id ?? null,
414
- period_start: revision.wireRevision.period.start,
415
- period_end: revision.wireRevision.period.end,
416
- source_timezone: revision.wireRevision.period.source_timezone,
417
- observed_at: revision.observedAt,
418
- data_through: revision.dataThrough,
419
- revision_content_sha256: revision.binding.sha256,
420
- row_count: revision.binding.rowCount,
421
- control_totals: revision.wireRevision.control_totals ?? []
422
- })
423
- );
424
- }
425
- const baseJobId = reportingWarehouseJobIdV1(options.name, plan.from, plan.to, state.reset_generation);
426
- const suffix = (attempt) => attempt ? `_a${attempt}` : "";
427
- const steps = [
428
- {
429
- table: options.rowsTableId,
430
- role: "rows",
431
- kind: "rows",
432
- lines: rowLines,
433
- attempt: plan.rowsAttempt,
434
- timeouts: plan.rowsTimeouts,
435
- timeoutColumn: "planned_rows_timeouts",
436
- attemptColumn: "planned_rows_attempt"
437
- },
438
- {
439
- table: options.revisionsTableId,
440
- role: "revisions",
441
- kind: "revs",
442
- lines: revisionLines,
443
- attempt: plan.revisionsAttempt,
444
- timeouts: plan.revisionsTimeouts,
445
- timeoutColumn: "planned_revisions_timeouts",
446
- attemptColumn: "planned_revisions_attempt"
447
- }
448
- ];
449
- for (const step of steps) {
450
- if (!step.lines.length) continue;
451
- try {
452
- await loadOnce(
453
- step.role,
454
- step.table,
455
- `${baseJobId}_${step.kind}${suffix(step.attempt)}`,
456
- [...step.lines],
457
- step.timeouts,
458
- signal
459
- );
460
- } catch (error) {
461
- if (isFinishedWithError(error)) {
462
- await options.db.query(
463
- `UPDATE adcp_reporting_warehouse_sinks SET ${step.attemptColumn} = ${step.attemptColumn} + 1,
464
- updated_at = clock_timestamp() ${matchesPlan}`,
465
- planValues
466
- );
467
- } else if (isLoadTimedOut(error)) {
468
- await options.db.query(
469
- `UPDATE adcp_reporting_warehouse_sinks
470
- SET ${step.timeoutColumn} = $8::integer + 1, updated_at = clock_timestamp()
471
- ${matchesPlan} AND ${step.timeoutColumn} = $8::integer`,
472
- [...planValues, step.timeouts]
473
- );
474
- }
475
- throw error;
476
- }
477
- }
478
- const committed = await options.db.query(
479
- `UPDATE adcp_reporting_warehouse_sinks
480
- SET committed_cursor = $3, planned_from_cursor = NULL, planned_to_cursor = NULL,
481
- planned_revisions = NULL, planned_rows_attempt = 0, planned_revisions_attempt = 0,
482
- planned_rows_timeouts = 0, planned_revisions_timeouts = 0, updated_at = clock_timestamp()
483
- ${matchesPlan} RETURNING sink_name`,
484
- planValues
485
- );
486
- if (committed.rows.length === 0) throw stalePlan();
487
- await options.store.saveFeedConsumerCursor(options.name, plan.to);
488
- return { idle: plan.revisions.length === 0, revisions: revisionLines.length, rows: rowLines.length, missing };
489
- }
490
- };
491
- }
492
- function missingMigration(error) {
493
- if (error?.code === "42703") {
494
- throw new Error(
495
- "The adcp_reporting_warehouse_sinks table is missing columns; apply REPORTING_WAREHOUSE_SINK_MIGRATION again (it is idempotent)",
496
- { cause: error }
497
- );
498
- }
499
- throw error;
500
- }
501
- function reportingWarehouseLoadDeadlineV1(baseMilliseconds, timeouts) {
502
- return Math.min(baseMilliseconds * 2 ** Math.min(Math.max(timeouts, 0), MAX_TIMEOUT_DOUBLINGS), MAX_LOAD_TIMEOUT);
503
- }
504
- function reportingWarehouseJobIdV1(name, from, to, generation = 0) {
505
- return `adcp_rr_${(0, import_crypto.createHash)("sha256").update(JSON.stringify(generation > 0 ? [name, from, to, generation] : [name, from, to])).digest("hex").slice(0, 40)}`;
506
- }
507
- function qualified(tables, table) {
508
- return `\`${tables.projectId ? `${tables.projectId}.` : ""}${tables.datasetId}.${table}\``;
509
- }
510
- function reportingWarehouseDefaultTablesSqlV1(tables) {
511
- return `
512
- CREATE TABLE IF NOT EXISTS ${qualified(tables, tables.rowsTableId)} (
513
- reporting_revision_id STRING NOT NULL,
514
- reporting_obligation_id STRING NOT NULL,
515
- account_id STRING NOT NULL,
516
- revision_number INT64 NOT NULL,
517
- finality STRING NOT NULL,
518
- period_date DATE,
519
- ordinal INT64 NOT NULL,
520
- row JSON
521
- )
522
- PARTITION BY period_date
523
- CLUSTER BY account_id, reporting_revision_id;
524
-
525
- CREATE TABLE IF NOT EXISTS ${qualified(tables, tables.revisionsTableId)} (
526
- reporting_revision_id STRING NOT NULL,
527
- reporting_obligation_id STRING NOT NULL,
528
- account_id STRING NOT NULL,
529
- revision_number INT64 NOT NULL,
530
- finality STRING NOT NULL,
531
- period_date DATE,
532
- supersedes_reporting_revision_id STRING,
533
- period_start TIMESTAMP,
534
- period_end TIMESTAMP,
535
- source_timezone STRING,
536
- observed_at TIMESTAMP,
537
- data_through TIMESTAMP,
538
- revision_content_sha256 STRING NOT NULL,
539
- row_count INT64 NOT NULL,
540
- control_totals JSON
541
- )
542
- PARTITION BY period_date
543
- CLUSTER BY account_id, reporting_obligation_id;`.trim();
544
- }
545
- function reportingWarehouseCurrentRowsViewSqlV1(tables) {
546
- const view = tables.viewId ?? "current_rows";
547
- if (!DATASET_OR_TABLE.test(view)) throw new TypeError("BigQuery viewId is invalid");
548
- return `
549
- CREATE OR REPLACE VIEW ${qualified(tables, view)} AS
550
- SELECT row_data.*
551
- FROM ${qualified(tables, tables.rowsTableId)} AS row_data
552
- JOIN (
553
- SELECT reporting_obligation_id,
554
- ARRAY_AGG(reporting_revision_id ORDER BY revision_number DESC LIMIT 1)[OFFSET(0)] AS reporting_revision_id
555
- FROM ${qualified(tables, tables.revisionsTableId)}
556
- GROUP BY reporting_obligation_id
557
- ) AS current_revision
558
- USING (reporting_obligation_id, reporting_revision_id);`.trim();
559
- }
560
- function periodDateOf(revision) {
561
- const period = revision.wireRevision.period;
562
- try {
563
- if (!period) throw new TypeError("the revision carries no period");
564
- return (0, import_schedule.reportingPeriodDate)(period.start, period.source_timezone);
565
- } catch (error) {
566
- throw new Error(
567
- `Cannot compute period_date for revision ${revision.reporting_revision_id}: ${error instanceof Error ? error.message : String(error)}. The batch stays retained and every run fails until the revision's period is repaired (or, if this runtime's timezone data is older than the writer's, until it is upgraded); reset({ discardRetainedPlan: true }) restarts from the beginning, so empty the destination tables first.`,
568
- { cause: error }
569
- );
570
- }
571
- }
572
- async function withinDeadline(operation, milliseconds, signal, context) {
573
- signal?.throwIfAborted();
574
- let timer;
575
- let onAbort;
576
- try {
577
- return await Promise.race([
578
- operation(),
579
- new Promise((_, reject) => {
580
- timer = setTimeout(() => {
581
- const error = new Error(
582
- `BigQuery call exceeded its deadline${context ? ` of ${milliseconds} ms for ${context}` : ""}; the batch will be retried`
583
- );
584
- Object.defineProperty(error, "adcpDeadlineExceeded", { value: true });
585
- reject(error);
586
- }, milliseconds);
587
- if (signal) {
588
- onAbort = () => reject(signal.reason ?? new Error("aborted"));
589
- signal.addEventListener("abort", onAbort, { once: true });
590
- }
591
- })
592
- ]);
593
- } finally {
594
- if (timer) clearTimeout(timer);
595
- if (signal && onAbort) signal.removeEventListener("abort", onAbort);
596
- }
597
- }
598
- function isDeadlineExceeded(error) {
599
- return error?.adcpDeadlineExceeded === true;
600
- }
601
- function isAlreadyExists(error) {
602
- const record = error;
603
- return record?.code === 409 || !!record?.errors?.some((entry) => entry.reason === "duplicate");
604
- }
605
- function isLoadTimedOut(error) {
606
- return error?.adcpLoadTimedOut === true;
607
- }
608
- function sleep(milliseconds, signal) {
609
- signal?.throwIfAborted();
610
- return new Promise((resolve, reject) => {
611
- const onAbort = () => {
612
- clearTimeout(timer);
613
- reject(signal?.reason ?? new Error("aborted"));
614
- };
615
- const timer = setTimeout(() => {
616
- signal?.removeEventListener("abort", onAbort);
617
- resolve();
618
- }, milliseconds);
619
- signal?.addEventListener("abort", onAbort, { once: true });
620
- });
621
- }
622
- function isFinishedWithError(error) {
623
- return error?.adcpJobFailed === true;
624
- }
625
- // Annotate the CommonJS export names for ESM import in node:
626
- 0 && (module.exports = {
627
- REPORTING_WAREHOUSE_SINK_MIGRATION,
628
- createBigQueryReportingWarehouseSinkV1,
629
- reportingWarehouseCurrentRowsViewSqlV1,
630
- reportingWarehouseDefaultTablesSqlV1,
631
- reportingWarehouseJobIdV1,
632
- reportingWarehouseLoadDeadlineV1
633
- });