Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/ramps-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- Export `TERMINAL_ORDER_STATUSES` and `isTerminalOrderStatus()` so consuming clients can share the controller's terminal order status set instead of maintaining duplicate copies. ([#9679](https://github.com/MetaMask/core/pull/9679))

## [20.0.0]

### Changed
Expand Down
18 changes: 4 additions & 14 deletions packages/ramps-controller/src/RampsController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ import {
isHeadlessAllProvidersEnabled,
normalizeHeadlessProviderId,
} from './featureFlags.js';
import {
PENDING_ORDER_STATUSES,
TERMINAL_ORDER_STATUSES,
} from './orderStatus.js';
import {
getProvidersServingAsset,
providerServesAsset,
Expand Down Expand Up @@ -780,20 +784,6 @@ export function getInternalOrderCode(

// === ORDER POLLING CONSTANTS ===

const TERMINAL_ORDER_STATUSES = new Set<RampsOrderStatus>([
RampsOrderStatus.Completed,
RampsOrderStatus.Failed,
RampsOrderStatus.Cancelled,
RampsOrderStatus.IdExpired,
]);

const PENDING_ORDER_STATUSES = new Set<RampsOrderStatus>([
RampsOrderStatus.Pending,
RampsOrderStatus.Created,
RampsOrderStatus.Unknown,
RampsOrderStatus.Precreated,
]);

const DEFAULT_POLLING_INTERVAL_MS = 30_000;
const MAX_ERROR_COUNT = 5;

Expand Down
4 changes: 4 additions & 0 deletions packages/ramps-controller/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,10 @@ export {
isCustomActionQuote,
isInAppOnlyQuote,
} from './quoteClassification.js';
export {
TERMINAL_ORDER_STATUSES,
isTerminalOrderStatus,
} from './orderStatus.js';
export type { TypedError } from './errorNormalization.js';
export {
getErrorMessage,
Expand Down
43 changes: 43 additions & 0 deletions packages/ramps-controller/src/orderStatus.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import {
TERMINAL_ORDER_STATUSES,
isTerminalOrderStatus,
} from './orderStatus.js';
import { RampsOrderStatus } from './RampsService.js';

describe('TERMINAL_ORDER_STATUSES', () => {
it('includes completed, failed, cancelled, and id expired', () => {
expect(TERMINAL_ORDER_STATUSES.has(RampsOrderStatus.Completed)).toBe(true);
expect(TERMINAL_ORDER_STATUSES.has(RampsOrderStatus.Failed)).toBe(true);
expect(TERMINAL_ORDER_STATUSES.has(RampsOrderStatus.Cancelled)).toBe(true);
expect(TERMINAL_ORDER_STATUSES.has(RampsOrderStatus.IdExpired)).toBe(true);
});

it('excludes non-terminal statuses', () => {
expect(TERMINAL_ORDER_STATUSES.has(RampsOrderStatus.Unknown)).toBe(false);
expect(TERMINAL_ORDER_STATUSES.has(RampsOrderStatus.Precreated)).toBe(
false,
);
expect(TERMINAL_ORDER_STATUSES.has(RampsOrderStatus.Created)).toBe(false);
expect(TERMINAL_ORDER_STATUSES.has(RampsOrderStatus.Pending)).toBe(false);
});
});

describe('isTerminalOrderStatus', () => {
it.each([
RampsOrderStatus.Completed,
RampsOrderStatus.Failed,
RampsOrderStatus.Cancelled,
RampsOrderStatus.IdExpired,
])('returns true for terminal status %s', (status) => {
expect(isTerminalOrderStatus(status)).toBe(true);
});

it.each([
RampsOrderStatus.Unknown,
RampsOrderStatus.Precreated,
RampsOrderStatus.Created,
RampsOrderStatus.Pending,
])('returns false for non-terminal status %s', (status) => {
expect(isTerminalOrderStatus(status)).toBe(false);
});
});
32 changes: 32 additions & 0 deletions packages/ramps-controller/src/orderStatus.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { RampsOrderStatus } from './RampsService.js';

/**
* Order statuses that no longer require polling or in-flow navigation.
* Shared by the controller and consuming clients so terminal checks stay in sync.
*/
export const TERMINAL_ORDER_STATUSES: ReadonlySet<RampsOrderStatus> = new Set([
RampsOrderStatus.Completed,
RampsOrderStatus.Failed,
RampsOrderStatus.Cancelled,
RampsOrderStatus.IdExpired,
]);

/**
* Whether a ramps order has reached a terminal status.
*
* @param status - The order status to test.
* @returns Whether the status is terminal.
*/
export function isTerminalOrderStatus(status: RampsOrderStatus): boolean {
return TERMINAL_ORDER_STATUSES.has(status);
}

/**
* Order statuses that are still in progress and may be polled.
*/
export const PENDING_ORDER_STATUSES: ReadonlySet<RampsOrderStatus> = new Set([
RampsOrderStatus.Pending,
RampsOrderStatus.Created,
RampsOrderStatus.Unknown,
RampsOrderStatus.Precreated,
]);