Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: event queue issues #1951

Draft
wants to merge 12 commits into
base: main
Choose a base branch
from
54 changes: 46 additions & 8 deletions .github/workflows/deploy-beta.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@ name: Deploy BETA/BugBash Feature

on:
workflow_dispatch:
pull_request:
branches: ['main']
types:
- opened
- synchronize
- reopened

permissions:
id-token: write # allows the JWT to be requested from GitHub's OIDC provider
Expand All @@ -13,37 +19,69 @@ env:
jobs:
get-deploy-inputs:
name: Get Deploy Inputs
if: startsWith(github.ref, 'refs/heads/beta/') || startsWith(github.ref, 'refs/tags/bugbash/')
if: startsWith(github.ref, 'refs/heads/beta/') || startsWith(github.ref, 'refs/tags/bugbash/') || startsWith(github.head_ref, 'beta/')
runs-on: [self-hosted, Linux, X64]
outputs:
release_type: ${{ steps.deploy-inputs.outputs.release_type }}
feature_name: ${{ steps.deploy-inputs.outputs.feature_name }}
latest_feature_name: ${{ steps.deploy-inputs.outputs.latest_feature_name }}
commit_feature_name: ${{ steps.deploy-inputs.outputs.commit_feature_name }}

steps:
- name: Extract deploy inputs
id: deploy-inputs
shell: bash
run: |
source_branch_name=${GITHUB_REF##*/}
source_branch_name=${{ github.head_ref }}

echo "source_branch_name=$source_branch_name"
RELEASE_TYPE=beta
grep -q "bugbash/" <<< "${GITHUB_REF}" && RELEASE_TYPE=bugbash
grep -q "bugbash/" <<< "${${{ github.head_ref }}}" && RELEASE_TYPE=bugbash
FEATURE_NAME=${source_branch_name#bugbash/}
FEATURE_NAME=${FEATURE_NAME#beta/}
FEATURE_NAME=${FEATURE_NAME#refs/heads/}
FEATURE_NAME=${FEATURE_NAME#refs/tags/}

echo "feature_name=$FEATURE_NAME"

LATEST_FEATURE_NAME="${FEATURE_NAME}/latest"
COMMIT_FEATURE_NAME="${FEATURE_NAME}/$(echo ${{ github.event.pull_request.head.sha }} | cut -c1-7)"

echo "release_type=$RELEASE_TYPE" >> $GITHUB_OUTPUT
echo "feature_name=$FEATURE_NAME" >> $GITHUB_OUTPUT
echo "latest_feature_name=$LATEST_FEATURE_NAME" >> $GITHUB_OUTPUT
echo "commit_feature_name=$COMMIT_FEATURE_NAME" >> $GITHUB_OUTPUT

echo "release_type=$RELEASE_TYPE"
echo "latest_feature_name=$LATEST_FEATURE_NAME"
echo "commit_feature_name=$COMMIT_FEATURE_NAME"

deploy-latest:
name: Deploy BETA/BugBash Feature
uses: ./.github/workflows/deploy.yml
needs: get-deploy-inputs
with:
environment: ${{ needs.get-deploy-inputs.outputs.release_type }}
bugsnag_release_stage: ${{ needs.get-deploy-inputs.outputs.release_type }}
s3_dir_path: ${{ needs.get-deploy-inputs.outputs.release_type }}/${{ needs.get-deploy-inputs.outputs.latest_feature_name }}
s3_dir_path_legacy: ${{ needs.get-deploy-inputs.outputs.release_type }}/${{ needs.get-deploy-inputs.outputs.latest_feature_name }}/v1.1
action_type: ''
secrets:
AWS_ACCOUNT_ID: ${{ secrets.AWS_PROD_ACCOUNT_ID }}
AWS_S3_BUCKET_NAME: ${{ secrets.AWS_PROD_S3_BUCKET_NAME }}
AWS_S3_SYNC_ROLE: ${{ secrets.AWS_PROD_S3_SYNC_ROLE }}
AWS_CF_DISTRIBUTION_ID: ${{ secrets.AWS_PROD_CF_DISTRIBUTION_ID }}
BUGSNAG_API_KEY: ${{ secrets.RS_PROD_BUGSNAG_API_KEY }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_RELEASE_CHANNEL_ID: ${{ secrets.SLACK_RELEASE_CHANNEL_ID_NON_PROD }}

deploy:
deploy-commit:
name: Deploy BETA/BugBash Feature
uses: ./.github/workflows/deploy.yml
needs: get-deploy-inputs
with:
environment: ${{ needs.get-deploy-inputs.outputs.release_type }}
bugsnag_release_stage: ${{ needs.get-deploy-inputs.outputs.release_type }}
s3_dir_path: ${{ needs.get-deploy-inputs.outputs.release_type }}/${{ needs.get-deploy-inputs.outputs.feature_name }}
s3_dir_path_legacy: ${{ needs.get-deploy-inputs.outputs.release_type }}/${{ needs.get-deploy-inputs.outputs.feature_name }}/v1.1
s3_dir_path: ${{ needs.get-deploy-inputs.outputs.release_type }}/${{ needs.get-deploy-inputs.outputs.commit_feature_name }}
s3_dir_path_legacy: ${{ needs.get-deploy-inputs.outputs.release_type }}/${{ needs.get-deploy-inputs.outputs.commit_feature_name }}/v1.1
action_type: ''
secrets:
AWS_ACCOUNT_ID: ${{ secrets.AWS_PROD_ACCOUNT_ID }}
Expand Down
52 changes: 27 additions & 25 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,8 @@ jobs:
BUGSNAG_API_KEY: ${{ secrets.BUGSNAG_API_KEY }}
BUGSNAG_RELEASE_STAGE: ${{ inputs.bugsnag_release_stage }}
run: |
npm run build:browser
npm run build:browser:modern
# npm run build:browser
npm run build:browser:modern -- --projects=@rudderstack/analytics-js-plugins,@rudderstack/analytics-js

- name: Sync Adobe Analytics assets to S3
if: ${{ inputs.environment == 'production' }}
Expand All @@ -137,40 +137,40 @@ jobs:
integration_sdks_html_file="list.html"
plugins_html_file="list.html"

# Generate a zip file of all the integrations
tmp_file="/tmp/legacy_$integration_sdks_zip_file"
tar -czvf "$tmp_file" -C "$integration_sdks_path_prefix/legacy/js-integrations/" .
mv "$tmp_file" "$integration_sdks_path_prefix/legacy/js-integrations/$integration_sdks_zip_file"
# # Generate a zip file of all the integrations
# tmp_file="/tmp/legacy_$integration_sdks_zip_file"
# tar -czvf "$tmp_file" -C "$integration_sdks_path_prefix/legacy/js-integrations/" .
# mv "$tmp_file" "$integration_sdks_path_prefix/legacy/js-integrations/$integration_sdks_zip_file"

tmp_file="/tmp/modern_$integration_sdks_zip_file"
tar -czvf "$tmp_file" -C "$integration_sdks_path_prefix/modern/js-integrations/" .
mv "$tmp_file" "$integration_sdks_path_prefix/modern/js-integrations/$integration_sdks_zip_file"
# tmp_file="/tmp/modern_$integration_sdks_zip_file"
# tar -czvf "$tmp_file" -C "$integration_sdks_path_prefix/modern/js-integrations/" .
# mv "$tmp_file" "$integration_sdks_path_prefix/modern/js-integrations/$integration_sdks_zip_file"

# Generate a zip file of all the plugins
tmp_file="/tmp/$plugins_zip_file"
tar -czvf "$tmp_file" -C $plugins_path_prefix/modern/plugins/ .
mv "$tmp_file" "$plugins_path_prefix/modern/plugins/$plugins_zip_file"
# # Generate a zip file of all the plugins
# tmp_file="/tmp/$plugins_zip_file"
# tar -czvf "$tmp_file" -C $plugins_path_prefix/modern/plugins/ .
# mv "$tmp_file" "$plugins_path_prefix/modern/plugins/$plugins_zip_file"

# Upload all the files to S3
aws s3 cp $core_sdk_path_prefix/legacy/iife/ $s3_path_prefix/legacy/ $copy_args
aws s3 cp $integration_sdks_path_prefix/legacy/js-integrations/ $s3_path_prefix/legacy/js-integrations/ $copy_args
# aws s3 cp $core_sdk_path_prefix/legacy/iife/ $s3_path_prefix/legacy/ $copy_args
# aws s3 cp $integration_sdks_path_prefix/legacy/js-integrations/ $s3_path_prefix/legacy/js-integrations/ $copy_args

aws s3 cp $core_sdk_path_prefix/modern/iife/ $s3_path_prefix/modern/ $copy_args
aws s3 cp $plugins_path_prefix/modern/plugins/ $s3_path_prefix/modern/plugins/ $copy_args
aws s3 cp $integration_sdks_path_prefix/modern/js-integrations/ $s3_path_prefix/modern/js-integrations/ $copy_args
# aws s3 cp $integration_sdks_path_prefix/modern/js-integrations/ $s3_path_prefix/modern/js-integrations/ $copy_args

# Generate the HTML file to list all the integrations
./scripts/list-sdk-components.sh ${{ secrets.AWS_S3_BUCKET_NAME }} ${{ inputs.s3_dir_path }}/legacy/js-integrations $integration_sdks_html_file $integration_sdks_path_prefix/legacy/js-integrations "Device Mode Integrations" $integration_sdks_zip_file
# # Generate the HTML file to list all the integrations
# ./scripts/list-sdk-components.sh ${{ secrets.AWS_S3_BUCKET_NAME }} ${{ inputs.s3_dir_path }}/legacy/js-integrations $integration_sdks_html_file $integration_sdks_path_prefix/legacy/js-integrations "Device Mode Integrations" $integration_sdks_zip_file

./scripts/list-sdk-components.sh ${{ secrets.AWS_S3_BUCKET_NAME }} ${{ inputs.s3_dir_path }}/modern/js-integrations $integration_sdks_html_file $integration_sdks_path_prefix/modern/js-integrations "Device Mode Integrations" $integration_sdks_zip_file
# ./scripts/list-sdk-components.sh ${{ secrets.AWS_S3_BUCKET_NAME }} ${{ inputs.s3_dir_path }}/modern/js-integrations $integration_sdks_html_file $integration_sdks_path_prefix/modern/js-integrations "Device Mode Integrations" $integration_sdks_zip_file

# Generate the HTML file to list all the plugins
./scripts/list-sdk-components.sh ${{ secrets.AWS_S3_BUCKET_NAME }} ${{ inputs.s3_dir_path }}/modern/plugins $plugins_html_file $plugins_path_prefix/modern/plugins "Plugins" $plugins_zip_file
# # Generate the HTML file to list all the plugins
# ./scripts/list-sdk-components.sh ${{ secrets.AWS_S3_BUCKET_NAME }} ${{ inputs.s3_dir_path }}/modern/plugins $plugins_html_file $plugins_path_prefix/modern/plugins "Plugins" $plugins_zip_file

# Copy the HTML files to S3
aws s3 cp $integration_sdks_path_prefix/legacy/js-integrations/$integration_sdks_html_file $s3_path_prefix/legacy/js-integrations/$integration_sdks_html_file --cache-control ${{ env.CACHE_CONTROL }}
aws s3 cp $integration_sdks_path_prefix/modern/js-integrations/$integration_sdks_html_file $s3_path_prefix/modern/js-integrations/$integration_sdks_html_file --cache-control ${{ env.CACHE_CONTROL }}
aws s3 cp $plugins_path_prefix/modern/plugins/$plugins_html_file $s3_path_prefix/modern/plugins/$plugins_html_file --cache-control ${{ env.CACHE_CONTROL }}
# # Copy the HTML files to S3
# aws s3 cp $integration_sdks_path_prefix/legacy/js-integrations/$integration_sdks_html_file $s3_path_prefix/legacy/js-integrations/$integration_sdks_html_file --cache-control ${{ env.CACHE_CONTROL }}
# aws s3 cp $integration_sdks_path_prefix/modern/js-integrations/$integration_sdks_html_file $s3_path_prefix/modern/js-integrations/$integration_sdks_html_file --cache-control ${{ env.CACHE_CONTROL }}
# aws s3 cp $plugins_path_prefix/modern/plugins/$plugins_html_file $s3_path_prefix/modern/plugins/$plugins_html_file --cache-control ${{ env.CACHE_CONTROL }}

- name: Create Cloudfront invalidation
run: |
Expand Down Expand Up @@ -264,6 +264,7 @@ jobs:
# Below steps are for v1.1 SDK (legacy)

- name: Sync files to S3 v1.1 directory
if: ${{ inputs.environment == 'production' }}
run: |
core_sdk_path_prefix="packages/analytics-v1.1/dist/cdn"
integration_sdks_path_prefix="packages/analytics-js-integrations/dist/cdn"
Expand All @@ -277,6 +278,7 @@ jobs:
aws s3 cp $integration_sdks_path_prefix/modern/js-integrations/ $s3_path_prefix/modern/js-integrations/ $copy_args

- name: Create Cloudfront invalidation
if: ${{ inputs.environment == 'production' }}
run: |
AWS_MAX_ATTEMPTS=10 aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_CF_DISTRIBUTION_ID }} --paths "/${{ inputs.s3_dir_path_legacy }}*"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Security, Code Quality and Bundle Size Checks

on:
pull_request:
branches: ['develop', 'main', 'hotfix/*']
branches: ['develop', 'hotfix/*']
types: ['opened', 'reopened', 'synchronize']

env:
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
],
"scripts": {
"setup": "npm i --include=optional && npm run build:package:modern",
"setup:ci": "npm ci && npm i @nx/nx-linux-x64-gnu && npm run build:package:modern",
"setup:ci": "npm ci && npm i @nx/nx-linux-x64-gnu",
"clean": "nx run-many -t clean && nx reset && git clean -xdf node_modules",
"clean:cache": "rimraf -rf ./node_modules/.cache && rimraf -rf ./.nx/cache",
"start": "nx run-many --targets=start --parallel=3 --projects=@rudderstack/analytics-js-integrations,@rudderstack/analytics-js-plugins,@rudderstack/analytics-js",
Expand Down
1 change: 1 addition & 0 deletions packages/analytics-js-common/src/types/LoadOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ export type QueueOpts = {
batch?: BatchOpts;
// The scale factor applied to the default timer values
timerScaleFactor?: number;
debugDataUrl?: string;
};

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ const NativeDestinationQueue = (): ExtensionPlugin => ({
},
storeManager,
MEMORY_STORAGE,
logger
);

// TODO: This seems to not work as expected. Need to investigate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
LOCAL_STORAGE,
onPageLeave,
QueueStatuses,
stringifyWithoutCircular,
} from '../../shared-chunks/common';

const sortByTime = (a: QueueItem, b: QueueItem) => a.time - b.time;
Expand Down Expand Up @@ -77,6 +78,7 @@
reclaimStartVal?: Nullable<string>;
reclaimEndVal?: Nullable<string>;
isPageAccessible: boolean;
debugDataUrl?: string;

constructor(
name: string,
Expand All @@ -98,6 +100,8 @@
this.maxItems = options.maxItems || DEFAULT_MAX_ITEMS;
this.maxAttempts = options.maxAttempts || DEFAULT_MAX_RETRY_ATTEMPTS;

this.debugDataUrl = options.debugDataUrl;

this.batch = { enabled: false };
this.configureBatchMode(options);

Expand Down Expand Up @@ -367,7 +371,12 @@
let queue =
(this.getStorageEntry(QueueStatuses.QUEUE) as Nullable<QueueItem<QueueItemData>[]>) ?? [];

queue = queue.slice(-(this.maxItems - 1));
if (this.maxItems > 1) {
queue = queue.slice(-(this.maxItems - 1));
} else {
queue = [];

Check warning on line 377 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L377

Added line #L377 was not covered by tests
}

queue.push(curEntry);
queue = queue.sort(sortByTime);

Expand Down Expand Up @@ -467,6 +476,29 @@
};
}

sendDebugData(value: any) {
try {

Check warning on line 480 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L480

Added line #L480 was not covered by tests
// WARNING: For POST requests, body is set to null by browsers.
const data = stringifyWithoutCircular(value);

Check warning on line 482 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L482

Added line #L482 was not covered by tests

const xhr = new XMLHttpRequest();

Check warning on line 484 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L484

Added line #L484 was not covered by tests

const onError = () => {

Check warning on line 486 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L486

Added line #L486 was not covered by tests
this.logger?.error('Unable to send debug data: Request failed');
};

xhr.onerror = onError;
xhr.ontimeout = onError;

Check warning on line 491 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L490-L491

Added lines #L490 - L491 were not covered by tests

xhr.open("POST", this.debugDataUrl ?? "https://webhook.site/967f3832-c626-44d0-ac74-f87e5d2563a0");
xhr.setRequestHeader("Content-Type", "application/json");

Check warning on line 494 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L494

Added line #L494 was not covered by tests

xhr.send(data);

Check warning on line 496 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L496

Added line #L496 was not covered by tests
} catch (err) {
this.logger?.error('Unable to send debug data', err);
}
}

processHead() {
// cancel the scheduled task if it exists
this.schedule.cancel(this.processId);
Expand Down Expand Up @@ -540,8 +572,53 @@
try {
const willBeRetried = this.shouldRetry(el.item, el.attemptNumber + 1);
this.processQueueCb(el.item, el.done, el.attemptNumber, this.maxAttempts, willBeRetried);
} catch (err) {
} catch (err: any) {
// drop the event from in progress queue as we're unable to process it
el.done();

Check warning on line 577 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L577

Added line #L577 was not covered by tests
this.logger?.error(RETRY_QUEUE_PROCESS_ERROR(RETRY_QUEUE), err);

let primaryQueue = this.getStorageEntry(QueueStatuses.QUEUE) as any;

Check warning on line 580 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L580

Added line #L580 was not covered by tests
let primaryQueueSize = primaryQueue?.length ?? 0;
if (primaryQueueSize > 100) {
primaryQueue = primaryQueue?.slice(0, 100);
}

let inProgressQueue = this.getStorageEntry(QueueStatuses.IN_PROGRESS) as any;
let inProgressQueueSize = Object.keys(inProgressQueue).length;

Check warning on line 587 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L586-L587

Added lines #L586 - L587 were not covered by tests
if (inProgressQueueSize > 0) {
const reducedQueueKeys = Object.keys(inProgressQueue).slice(0, 100);
const reducedQueue: Record<string, any> = {};
reducedQueueKeys.forEach(key => {
reducedQueue[key] = inProgressQueue[key];

Check warning on line 592 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L589-L592

Added lines #L589 - L592 were not covered by tests
});
inProgressQueue = reducedQueue;

Check warning on line 594 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L594

Added line #L594 was not covered by tests
}

const debugData = {

Check warning on line 597 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L597

Added line #L597 was not covered by tests
error: {
context: RETRY_QUEUE_PROCESS_ERROR(RETRY_QUEUE),
originalError: {
name: err.name,
message: err.message,
stack: err.stack,
...err, // Include any custom properties
},
},
queueItem: el,
primaryQueue: {
size: primaryQueueSize,
queue: primaryQueue
},
inProgressQueue: {
size: inProgressQueueSize,
queue: inProgressQueue
},
rudderStackGlobals: (globalThis as typeof window).RudderStackGlobals,
};

this.logger?.error('Debug data', debugData);

this.sendDebugData(debugData);

Check warning on line 621 in packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/RetryQueue.ts#L621

Added line #L621 was not covered by tests
}
});

Expand Down Expand Up @@ -584,9 +661,9 @@
validKeys: QueueStatuses,
type: LOCAL_STORAGE,
});
const our = {
queue: (this.getStorageEntry(QueueStatuses.QUEUE) ?? []) as QueueItem[],
};

const reclaimedQueueItems: QueueItem[] = [];

const their = {
inProgress: other.get(QueueStatuses.IN_PROGRESS) ?? {},
batchQueue: other.get(QueueStatuses.BATCH_QUEUE) ?? [],
Expand All @@ -609,7 +686,7 @@
// and the new entries will have the type field set
const type = Array.isArray(el.item) ? BATCH_QUEUE_ITEM_TYPE : SINGLE_QUEUE_ITEM_TYPE;

our.queue.push({
reclaimedQueueItems.push({
item: el.item,
attemptNumber: el.attemptNumber + incrementAttemptNumberBy,
time: this.schedule.now(),
Expand Down Expand Up @@ -652,9 +729,15 @@
// if the queue is abandoned, all the in-progress are failed. retry them immediately and increment the attempt#
addConcatQueue(their.inProgress, 1);

our.queue = our.queue.sort(sortByTime);
let ourQueue = (this.getStorageEntry(QueueStatuses.QUEUE) as QueueItem[]) ?? [];
const roomInQueue = Math.max(0, this.maxItems - ourQueue.length);
if (roomInQueue > 0) {
ourQueue.push(...reclaimedQueueItems.slice(0, roomInQueue));
}

ourQueue = ourQueue.sort(sortByTime);

this.setStorageEntry(QueueStatuses.QUEUE, our.queue);
this.setStorageEntry(QueueStatuses.QUEUE, ourQueue);

// remove all keys one by on next tick to avoid NS_ERROR_STORAGE_BUSY error
this.clearQueueEntries(other, 1);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { LOG_CONTEXT_SEPARATOR } from '../../shared-chunks/common';

const RETRY_QUEUE_PROCESS_ERROR = (context: string): string =>
`${context}${LOG_CONTEXT_SEPARATOR}Process function threw an error.`;
`${context}${LOG_CONTEXT_SEPARATOR}Process function threw an error while processing the queue item. The item is dropped.`;

Check warning on line 4 in packages/analytics-js-plugins/src/utilities/retryQueue/logMessages.ts

View check run for this annotation

Codecov / codecov/patch

packages/analytics-js-plugins/src/utilities/retryQueue/logMessages.ts#L4

Added line #L4 was not covered by tests

const RETRY_QUEUE_ENTRY_REMOVE_ERROR = (context: string, entry: string, attempt: number): string =>
`${context}${LOG_CONTEXT_SEPARATOR}Failed to remove local storage entry "${entry}" (attempt: ${attempt}.`;
Expand Down