@firebaseextensions/firestore-bigquery-change-tracker 1.1.15 → 1.1.16

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.
@@ -42,7 +42,7 @@ Object.defineProperty(exports, "RawChangelogViewSchema", { enumerable: true, get
42
42
  class FirestoreBigQueryEventHistoryTracker {
43
43
  constructor(config) {
44
44
  this.config = config;
45
- this.initialized = false;
45
+ this._initialized = false;
46
46
  this.bq = new bigquery.BigQuery();
47
47
  this.bq.projectId = config.bqProjectId || process.env.PROJECT_ID;
48
48
  if (!this.config.datasetLocation) {
@@ -138,16 +138,25 @@ class FirestoreBigQueryEventHistoryTracker {
138
138
  * A half a second delay is added per check while the function
139
139
  * continually re-checks until the referenced dataset and table become available.
140
140
  */
141
- async waitForInitialization(dataset, table) {
141
+ async waitForInitialization() {
142
142
  return new Promise((resolve) => {
143
143
  let handle = setInterval(async () => {
144
- const [datasetExists] = await dataset.exists();
145
- const [tableExists] = await table.exists();
146
- if (datasetExists && tableExists) {
144
+ try {
145
+ const dataset = this.bigqueryDataset();
146
+ const changelogName = this.rawChangeLogTableName();
147
+ const table = dataset.table(changelogName);
148
+ const [datasetExists] = await dataset.exists();
149
+ const [tableExists] = await table.exists();
150
+ if (datasetExists && tableExists) {
151
+ clearInterval(handle);
152
+ return resolve(table);
153
+ }
154
+ }
155
+ catch (ex) {
147
156
  clearInterval(handle);
148
- return resolve(table);
157
+ logs.failedToInitializeWait(ex.message);
149
158
  }
150
- }, 500);
159
+ }, 5000);
151
160
  });
152
161
  }
153
162
  /**
@@ -163,7 +172,6 @@ class FirestoreBigQueryEventHistoryTracker {
163
172
  try {
164
173
  const dataset = this.bigqueryDataset();
165
174
  const table = dataset.table(this.rawChangeLogTableName());
166
- await this.waitForInitialization(dataset, table);
167
175
  logs.dataInserting(rows.length);
168
176
  await table.insert(rows, options);
169
177
  logs.dataInserted(rows.length);
@@ -179,7 +187,7 @@ class FirestoreBigQueryEventHistoryTracker {
179
187
  await handleFailedTransactions_1.default(rows, this.config, e);
180
188
  }
181
189
  // Reinitializing in case the destintation table is modified.
182
- this.initialized = false;
190
+ this._initialized = false;
183
191
  logs.bigQueryTableInsertErrors(e.errors);
184
192
  throw e;
185
193
  }
@@ -189,13 +197,19 @@ class FirestoreBigQueryEventHistoryTracker {
189
197
  * After the first invokation, it skips initialization assuming these resources are still there.
190
198
  */
191
199
  async initialize() {
192
- if (this.initialized) {
193
- return;
200
+ try {
201
+ if (this._initialized) {
202
+ return;
203
+ }
204
+ await this.initializeDataset();
205
+ await this.initializeRawChangeLogTable();
206
+ await this.initializeLatestView();
207
+ this._initialized = true;
208
+ }
209
+ catch (ex) {
210
+ await this.waitForInitialization();
211
+ this._initialized = true;
194
212
  }
195
- await this.initializeDataset();
196
- await this.initializeRawChangeLogTable();
197
- await this.initializeLatestView();
198
- this.initialized = true;
199
213
  }
200
214
  /**
201
215
  * Creates the specified dataset if it doesn't already exists.
package/lib/logs.js CHANGED
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.tableCreationError = exports.invalidClustering = exports.hourAndDatePartitioningWarning = exports.invalidTableReference = exports.invalidProjectIdWarning = exports.cannotPartitionExistingTable = exports.removedClustering = exports.updatedClustering = exports.bigQueryTableInsertErrors = exports.firestoreTimePartitioningParametersWarning = exports.firestoreTimePartitionFieldError = exports.addPartitionFieldColumn = exports.addNewColumn = exports.timestampMissingValue = exports.error = exports.dataTypeInvalid = exports.dataInserting = exports.dataInsertRetried = exports.dataInserted = exports.complete = exports.bigQueryViewValidating = exports.bigQueryViewValidated = exports.bigQueryViewUpToDate = exports.bigQueryViewUpdating = exports.bigQueryViewUpdated = exports.bigQueryViewAlreadyExists = exports.bigQueryViewCreating = exports.bigQueryViewCreated = exports.bigQueryUserDefinedFunctionCreated = exports.bigQueryUserDefinedFunctionCreating = exports.bigQueryTableValidating = exports.bigQueryTableValidated = exports.bigQueryTableUpToDate = exports.bigQueryTableUpdating = exports.bigQueryTableUpdated = exports.bigQueryTableCreating = exports.bigQueryTableCreated = exports.bigQueryTableAlreadyExists = exports.bigQuerySchemaViewCreated = exports.bigQueryLatestSnapshotViewQueryCreated = exports.bigQueryErrorRecordingDocumentChange = exports.bigQueryDatasetExists = exports.bigQueryDatasetCreating = exports.bigQueryDatasetCreated = exports.arrayFieldInvalid = void 0;
18
+ exports.failedToInitializeWait = exports.tableCreationError = exports.invalidClustering = exports.hourAndDatePartitioningWarning = exports.invalidTableReference = exports.invalidProjectIdWarning = exports.cannotPartitionExistingTable = exports.removedClustering = exports.updatedClustering = exports.bigQueryTableInsertErrors = exports.firestoreTimePartitioningParametersWarning = exports.firestoreTimePartitionFieldError = exports.addPartitionFieldColumn = exports.addNewColumn = exports.timestampMissingValue = exports.error = exports.dataTypeInvalid = exports.dataInserting = exports.dataInsertRetried = exports.dataInserted = exports.complete = exports.bigQueryViewValidating = exports.bigQueryViewValidated = exports.bigQueryViewUpToDate = exports.bigQueryViewUpdating = exports.bigQueryViewUpdated = exports.bigQueryViewAlreadyExists = exports.bigQueryViewCreating = exports.bigQueryViewCreated = exports.bigQueryUserDefinedFunctionCreated = exports.bigQueryUserDefinedFunctionCreating = exports.bigQueryTableValidating = exports.bigQueryTableValidated = exports.bigQueryTableUpToDate = exports.bigQueryTableUpdating = exports.bigQueryTableUpdated = exports.bigQueryTableCreating = exports.bigQueryTableCreated = exports.bigQueryTableAlreadyExists = exports.bigQuerySchemaViewCreated = exports.bigQueryLatestSnapshotViewQueryCreated = exports.bigQueryErrorRecordingDocumentChange = exports.bigQueryDatasetExists = exports.bigQueryDatasetCreating = exports.bigQueryDatasetCreated = exports.arrayFieldInvalid = void 0;
19
19
  const firebase_functions_1 = require("firebase-functions");
20
20
  exports.arrayFieldInvalid = (fieldName) => {
21
21
  firebase_functions_1.logger.warn(`Array field '${fieldName}' does not contain an array, skipping`);
@@ -137,7 +137,9 @@ exports.bigQueryTableInsertErrors = (insertErrors) => {
137
137
  insertErrors.forEach((error) => {
138
138
  firebase_functions_1.logger.warn("ROW DATA JSON:");
139
139
  firebase_functions_1.logger.warn(error.row);
140
- error.errors.forEach((error) => firebase_functions_1.logger.warn(`ROW ERROR MESSAGE: ${error.message}`));
140
+ if (error && error.errors) {
141
+ error.errors.forEach((error) => firebase_functions_1.logger.warn(`ROW ERROR MESSAGE: ${error.message}`));
142
+ }
141
143
  });
142
144
  };
143
145
  exports.updatedClustering = (fields) => {
@@ -168,3 +170,6 @@ exports.invalidClustering = invalidClustering;
168
170
  exports.tableCreationError = (table, message) => {
169
171
  firebase_functions_1.logger.warn(`Error caught creating table`, message);
170
172
  };
173
+ exports.failedToInitializeWait = (message) => {
174
+ firebase_functions_1.logger.warn(`Failed while waiting to initialize.`, message);
175
+ };
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "url": "github.com/firebase/extensions.git",
6
6
  "directory": "firestore-bigquery-export/firestore-bigquery-change-tracker"
7
7
  },
8
- "version": "1.1.15",
8
+ "version": "1.1.16",
9
9
  "description": "Core change-tracker library for Cloud Firestore Collection BigQuery Exports",
10
10
  "main": "./lib/index.js",
11
11
  "scripts": {