emberflow 1.3.4 → 1.3.5

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