emberflow 1.3.4 → 1.3.6

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.
@@ -1,3 +1,3 @@
1
1
  import { FormData } from "emberflow-admin-client/lib/types";
2
2
  export declare function waitForSubmitFormQueueToEmpty(): Promise<void>;
3
- export declare function queueSubmitForm(formData: FormData): void;
3
+ export declare function queueSubmitForm(formData: FormData): Promise<void>;
@@ -3,15 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.queueSubmitForm = exports.waitForSubmitFormQueueToEmpty = void 0;
4
4
  const lib_1 = require("emberflow-admin-client/lib");
5
5
  const index_1 = require("../index");
6
- const queue = [];
7
- let activeCount = 0;
8
6
  let resolveQueueEmpty;
9
7
  let queueEmptyPromise = new Promise((resolve) => {
10
8
  resolveQueueEmpty = resolve;
11
9
  });
10
+ let maxConcurrentSubmit = 10;
11
+ let running = false;
12
+ let activeCount = 0;
13
+ const queue = [];
12
14
  function waitForSubmitFormQueueToEmpty() {
13
15
  // If the queue is already empty and there are no active submissions, resolve immediately
14
- if (queue.length === 0 && activeCount === 0) {
16
+ if (!running) {
15
17
  return Promise.resolve();
16
18
  }
17
19
  // Otherwise, return the existing promise or create a new one if necessary
@@ -27,39 +29,70 @@ function waitForSubmitFormQueueToEmpty() {
27
29
  return queueEmptyPromise;
28
30
  }
29
31
  exports.waitForSubmitFormQueueToEmpty = waitForSubmitFormQueueToEmpty;
30
- function queueSubmitForm(formData) {
32
+ async function queueSubmitForm(formData) {
31
33
  // Add the formData and the current timestamp to the queue
32
34
  console.log("Queueing form submission", formData);
33
- queue.push({ formData, timestamp: Date.now() });
35
+ await index_1.db.runTransaction(async (transaction) => {
36
+ const queueRef = index_1.db.collection("@internal/submitFormExecutor/queue");
37
+ const docRef = queueRef.doc();
38
+ transaction.set(docRef, { formData, timestamp: new Date() });
39
+ });
34
40
  // Process the queue
35
41
  processQueue();
36
42
  }
37
43
  exports.queueSubmitForm = queueSubmitForm;
44
+ function updateQueueInfo() {
45
+ return index_1.db.runTransaction(async (transaction) => {
46
+ const execRef = index_1.db.doc("@internal/submitFormExecutor");
47
+ const queueRef = index_1.db.collection("@internal/submitFormExecutor/queue");
48
+ const queueDoc = await transaction.get(execRef);
49
+ ({ activeCount, maxConcurrentSubmit } = queueDoc.data() || { activeCount: 0, maxConcurrentSubmit: 10 });
50
+ if (queue.length <= 1) {
51
+ const queryRef = queueRef.orderBy("timestamp", "asc")
52
+ .limit(2 * maxConcurrentSubmit);
53
+ const queueSnapshot = await transaction.get(queryRef);
54
+ queueSnapshot.forEach((doc) => {
55
+ queue.push(Object.assign(Object.assign({}, doc.data()), { "@id": doc.id }));
56
+ });
57
+ }
58
+ });
59
+ }
38
60
  async function processQueue() {
39
- const { maxConcurrentSubmitForms } = (await index_1.db.doc("@server/config").get()).data() ||
40
- { maxConcurrentSubmitForms: 10 };
41
- console.debug("maxConcurrentSubmitForms", maxConcurrentSubmitForms);
61
+ await updateQueueInfo();
62
+ console.debug("maxConcurrentSubmit", maxConcurrentSubmit);
63
+ if (!running && activeCount > 0) {
64
+ console.debug("Another executor is already running");
65
+ return;
66
+ }
42
67
  // While there are items in the queue and we haven't hit the max concurrency
43
- while (queue.length > 0 && activeCount < maxConcurrentSubmitForms) {
68
+ while (queue.length > 0 && activeCount < maxConcurrentSubmit) {
69
+ running = true;
44
70
  // Get the next item from the queue
45
71
  const queueItem = queue.shift();
46
72
  if (!queueItem) {
47
73
  continue;
48
74
  }
75
+ await index_1.db.runTransaction(async (transaction) => {
76
+ const execRef = index_1.db.doc("@internal/submitFormExecutor");
77
+ const queueRef = index_1.db.collection("@internal/submitFormExecutor/queue");
78
+ transaction.delete(queueRef.doc(queueItem["@id"]));
79
+ transaction.update(execRef, { activeCount: index_1.admin.firestore.FieldValue.increment(1) });
80
+ });
49
81
  const { formData, timestamp } = queueItem;
50
- // Increment the active count
51
- activeCount++;
52
82
  // Submit the form
53
- _submitForm(formData).then(() => {
83
+ _submitForm(formData).then(async () => {
54
84
  // Decrement the active count
55
- activeCount--;
85
+ const execRef = index_1.db.doc("@internal/submitFormExecutor");
86
+ await execRef.update({ activeCount: index_1.admin.firestore.FieldValue.increment(-1) });
87
+ await updateQueueInfo();
56
88
  // Check if the queue is empty and all submissions have been processed
57
89
  if (queue.length === 0 && activeCount === 0) {
58
90
  resolveQueueEmpty(); // Resolve the waitForQueueToEmpty promise
59
91
  queueEmptyPromise = undefined;
92
+ running = false;
60
93
  }
61
94
  // Calculate the time spent in the queue
62
- const timeSpent = (Date.now() - timestamp) / 1000; // time in seconds
95
+ const timeSpent = (Date.now() - timestamp.getTime()) / 1000; // time in seconds
63
96
  // Log the time spent in the queue
64
97
  console.log(`formData spent ${timeSpent.toFixed(2)} seconds in the queue.`);
65
98
  // Process the next item in the queue
@@ -69,7 +102,6 @@ async function processQueue() {
69
102
  }
70
103
  function _submitForm(formData) {
71
104
  return new Promise((resolve) => {
72
- // Assuming submitFormRequest is the function actually handling the form submission.
73
105
  (0, lib_1.submitForm)(formData, (status, data, isLastUpdate) => {
74
106
  console.log("status", status, "data", data, "isLastUpdate", isLastUpdate);
75
107
  if (isLastUpdate) {
@@ -1 +1 @@
1
- {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/utils/forms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/utils/forms.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emberflow",
3
- "version": "1.3.4",
3
+ "version": "1.3.6",
4
4
  "description": "A Firebase Cloud Functions library for handling document changes in a structured way",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.js",