@metamask/ramps-controller 2.0.0 → 2.1.0
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.
- package/CHANGELOG.md +16 -1
- package/dist/RampsController.cjs +226 -6
- package/dist/RampsController.cjs.map +1 -1
- package/dist/RampsController.d.cts +80 -10
- package/dist/RampsController.d.cts.map +1 -1
- package/dist/RampsController.d.mts +80 -10
- package/dist/RampsController.d.mts.map +1 -1
- package/dist/RampsController.mjs +226 -6
- package/dist/RampsController.mjs.map +1 -1
- package/dist/RampsService-method-action-types.cjs.map +1 -1
- package/dist/RampsService-method-action-types.d.cts +22 -1
- package/dist/RampsService-method-action-types.d.cts.map +1 -1
- package/dist/RampsService-method-action-types.d.mts +22 -1
- package/dist/RampsService-method-action-types.d.mts.map +1 -1
- package/dist/RampsService-method-action-types.mjs.map +1 -1
- package/dist/RampsService.cjs +106 -24
- package/dist/RampsService.cjs.map +1 -1
- package/dist/RampsService.d.cts +124 -1
- package/dist/RampsService.d.cts.map +1 -1
- package/dist/RampsService.d.mts +124 -1
- package/dist/RampsService.d.mts.map +1 -1
- package/dist/RampsService.mjs +102 -23
- package/dist/RampsService.mjs.map +1 -1
- package/dist/RequestCache.cjs +98 -0
- package/dist/RequestCache.cjs.map +1 -0
- package/dist/RequestCache.d.cts +93 -0
- package/dist/RequestCache.d.cts.map +1 -0
- package/dist/RequestCache.d.mts +93 -0
- package/dist/RequestCache.d.mts.map +1 -0
- package/dist/RequestCache.mjs +90 -0
- package/dist/RequestCache.mjs.map +1 -0
- package/dist/index.cjs +14 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +8 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3 -1
- package/dist/index.mjs.map +1 -1
- package/dist/selectors.cjs +81 -0
- package/dist/selectors.cjs.map +1 -0
- package/dist/selectors.d.cts +75 -0
- package/dist/selectors.d.cts.map +1 -0
- package/dist/selectors.d.mts +75 -0
- package/dist/selectors.d.mts.map +1 -0
- package/dist/selectors.mjs +77 -0
- package/dist/selectors.mjs.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RampsService.mjs","sourceRoot":"","sources":["../src/RampsService.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CreateServicePolicyOptions,\n ServicePolicy,\n} from '@metamask/controller-utils';\nimport { createServicePolicy, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\n\nimport type { RampsServiceMethodActions } from './RampsService-method-action-types';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link RampsService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'RampsService';\n\n/**\n * The environment to use for API requests.\n */\nexport enum RampsEnvironment {\n Production = 'production',\n Staging = 'staging',\n Development = 'development',\n}\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = ['getGeolocation'] as const;\n\n/**\n * Actions that {@link RampsService} exposes to other consumers.\n */\nexport type RampsServiceActions = RampsServiceMethodActions;\n\n/**\n * Actions from other messengers that {@link RampsService} calls.\n */\ntype AllowedActions = never;\n\n/**\n * Events that {@link RampsService} exposes to other consumers.\n */\nexport type RampsServiceEvents = never;\n\n/**\n * Events from other messengers that {@link RampsService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link RampsService}.\n */\nexport type RampsServiceMessenger = Messenger<\n typeof serviceName,\n RampsServiceActions | AllowedActions,\n RampsServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\n/**\n * Gets the base URL for API requests based on the environment.\n *\n * @param environment - The environment to use.\n * @returns The base URL for API requests.\n */\nfunction getBaseUrl(environment: RampsEnvironment): string {\n switch (environment) {\n case RampsEnvironment.Production:\n return 'https://on-ramp.api.cx.metamask.io';\n case RampsEnvironment.Staging:\n return 'https://on-ramp.uat-api.cx.metamask.io';\n case RampsEnvironment.Development:\n return 'http://localhost:3000';\n default:\n throw new Error(`Invalid environment: ${String(environment)}`);\n }\n}\n\n/**\n * This service object is responsible for interacting with the Ramps API.\n *\n * @example\n *\n * ``` ts\n * import { Messenger } from '@metamask/messenger';\n * import type {\n * RampsServiceActions,\n * RampsServiceEvents,\n * } from '@metamask/ramps-controller';\n *\n * const rootMessenger = new Messenger<\n * 'Root',\n * RampsServiceActions\n * RampsServiceEvents\n * >({ namespace: 'Root' });\n * const rampsServiceMessenger = new Messenger<\n * 'RampsService',\n * RampsServiceActions,\n * RampsServiceEvents,\n * typeof rootMessenger,\n * >({\n * namespace: 'RampsService',\n * parent: rootMessenger,\n * });\n * // Instantiate the service to register its actions on the messenger\n * new RampsService({\n * messenger: rampsServiceMessenger,\n * environment: RampsEnvironment.Production,\n * fetch,\n * });\n *\n * // Later...\n * // Get the user's geolocation\n * const geolocation = await rootMessenger.call(\n * 'RampsService:getGeolocation',\n * );\n * // ... Do something with the geolocation ...\n * ```\n */\nexport class RampsService {\n /**\n * The name of the service.\n */\n readonly name: typeof serviceName;\n\n /**\n * The messenger suited for this service.\n */\n readonly #messenger: ConstructorParameters<\n typeof RampsService\n >[0]['messenger'];\n\n /**\n * A function that can be used to make an HTTP request.\n */\n readonly #fetch: ConstructorParameters<typeof RampsService>[0]['fetch'];\n\n /**\n * The policy that wraps the request.\n *\n * @see {@link createServicePolicy}\n */\n readonly #policy: ServicePolicy;\n\n /**\n * The base URL for API requests.\n */\n readonly #baseUrl: string;\n\n /**\n * Constructs a new RampsService object.\n *\n * @param args - The constructor arguments.\n * @param args.messenger - The messenger suited for this service.\n * @param args.environment - The environment to use for API requests.\n * @param args.fetch - A function that can be used to make an HTTP request. If\n * your JavaScript environment supports `fetch` natively, you'll probably want\n * to pass that; otherwise you can pass an equivalent (such as `fetch` via\n * `node-fetch`).\n * @param args.policyOptions - Options to pass to `createServicePolicy`, which\n * is used to wrap each request. See {@link CreateServicePolicyOptions}.\n */\n constructor({\n messenger,\n environment = RampsEnvironment.Staging,\n fetch: fetchFunction,\n policyOptions = {},\n }: {\n messenger: RampsServiceMessenger;\n environment?: RampsEnvironment;\n fetch: typeof fetch;\n policyOptions?: CreateServicePolicyOptions;\n }) {\n this.name = serviceName;\n this.#messenger = messenger;\n this.#fetch = fetchFunction;\n this.#policy = createServicePolicy(policyOptions);\n this.#baseUrl = getBaseUrl(environment);\n\n this.#messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Registers a handler that will be called after a request returns a non-500\n * response, causing a retry. Primarily useful in tests where timers are being\n * mocked.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler. See\n * {@link CockatielEvent}.\n * @see {@link createServicePolicy}\n */\n onRetry(\n listener: Parameters<ServicePolicy['onRetry']>[0],\n ): ReturnType<ServicePolicy['onRetry']> {\n return this.#policy.onRetry(listener);\n }\n\n /**\n * Registers a handler that will be called after a set number of retry rounds\n * prove that requests to the API endpoint consistently return a 5xx response.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler. See\n * {@link CockatielEvent}.\n * @see {@link createServicePolicy}\n */\n onBreak(\n listener: Parameters<ServicePolicy['onBreak']>[0],\n ): ReturnType<ServicePolicy['onBreak']> {\n return this.#policy.onBreak(listener);\n }\n\n /**\n * Registers a handler that will be called under one of two circumstances:\n *\n * 1. After a set number of retries prove that requests to the API\n * consistently result in one of the following failures:\n * 1. A connection initiation error\n * 2. A connection reset error\n * 3. A timeout error\n * 4. A non-JSON response\n * 5. A 502, 503, or 504 response\n * 2. After a successful request is made to the API, but the response takes\n * longer than a set duration to return.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler. See\n * {@link CockatielEvent}.\n */\n onDegraded(\n listener: Parameters<ServicePolicy['onDegraded']>[0],\n ): ReturnType<ServicePolicy['onDegraded']> {\n return this.#policy.onDegraded(listener);\n }\n\n /**\n * Makes a request to the API in order to retrieve the user's geolocation\n * based on their IP address.\n *\n * @returns The user's country/region code (e.g., \"US-UT\" for Utah, USA).\n */\n async getGeolocation(): Promise<string> {\n const responseData = await this.#policy.execute(async () => {\n const url = new URL('geolocation', this.#baseUrl);\n const localResponse = await this.#fetch(url);\n if (!localResponse.ok) {\n throw new HttpError(\n localResponse.status,\n `Fetching '${url.toString()}' failed with status '${localResponse.status}'`,\n );\n }\n const textResponse = await localResponse.text();\n // Return both response and text content since we consumed the body\n return { response: localResponse, text: textResponse };\n });\n\n const textResponse = responseData.text;\n const trimmedResponse = textResponse.trim();\n\n if (trimmedResponse.length > 0) {\n return trimmedResponse;\n }\n\n throw new Error('Malformed response received from geolocation API');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RampsService.mjs","sourceRoot":"","sources":["../src/RampsService.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CreateServicePolicyOptions,\n ServicePolicy,\n} from '@metamask/controller-utils';\nimport { createServicePolicy, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\n\nimport type { RampsServiceMethodActions } from './RampsService-method-action-types';\nimport packageJson from '../package.json';\n\n/**\n * Represents phone number information for a country.\n */\nexport type CountryPhone = {\n prefix: string;\n placeholder: string;\n template: string;\n};\n\n/**\n * Represents a state/province within a country.\n */\nexport type State = {\n /**\n * State identifier. Can be in path format (e.g., \"/regions/us-ut\") or ISO code format (e.g., \"us-ut\").\n */\n id?: string;\n /**\n * State name.\n */\n name?: string;\n /**\n * ISO state code (e.g., \"UT\", \"NY\").\n */\n stateId?: string;\n /**\n * Whether this state is supported for ramps.\n */\n supported?: boolean;\n /**\n * Whether this state is recommended.\n */\n recommended?: boolean;\n};\n\n/**\n * Represents eligibility information for a region.\n * Returned from the /regions/countries/{isoCode} endpoint.\n */\nexport type Eligibility = {\n /**\n * Whether aggregator providers are available.\n */\n aggregator?: boolean;\n /**\n * Whether deposit (buy) is available.\n */\n deposit?: boolean;\n /**\n * Whether global providers are available.\n */\n global?: boolean;\n};\n\n/**\n * Represents a country returned from the regions/countries API.\n */\nexport type Country = {\n /**\n * ISO-2 country code (e.g., \"US\", \"GB\").\n */\n isoCode: string;\n /**\n * Country identifier. Can be in path format (e.g., \"/regions/us\") or ISO code format.\n * If not provided, defaults to isoCode.\n */\n id?: string;\n /**\n * Country flag emoji or code.\n */\n flag: string;\n /**\n * Country name.\n */\n name: string;\n /**\n * Phone number information.\n */\n phone: CountryPhone;\n /**\n * Default currency code.\n */\n currency: string;\n /**\n * Whether this country is supported for ramps.\n */\n supported: boolean;\n /**\n * Whether this country is recommended.\n */\n recommended?: boolean;\n /**\n * Array of state objects.\n */\n states?: State[];\n};\n\n/**\n * The SDK version to send with API requests. (backwards-compatibility)\n */\nexport const RAMPS_SDK_VERSION = '2.1.6';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link RampsService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'RampsService';\n\n/**\n * The environment to use for API requests.\n */\nexport enum RampsEnvironment {\n Production = 'production',\n Staging = 'staging',\n Development = 'development',\n}\n\n/**\n * The type of ramps API service.\n * Determines which base URL to use (cache vs standard).\n */\nexport enum RampsApiService {\n Regions = 'regions',\n Orders = 'orders',\n}\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getGeolocation',\n 'getCountries',\n 'getEligibility',\n] as const;\n\n/**\n * Actions that {@link RampsService} exposes to other consumers.\n */\nexport type RampsServiceActions = RampsServiceMethodActions;\n\n/**\n * Actions from other messengers that {@link RampsService} calls.\n */\ntype AllowedActions = never;\n\n/**\n * Events that {@link RampsService} exposes to other consumers.\n */\nexport type RampsServiceEvents = never;\n\n/**\n * Events from other messengers that {@link RampsService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link RampsService}.\n */\nexport type RampsServiceMessenger = Messenger<\n typeof serviceName,\n RampsServiceActions | AllowedActions,\n RampsServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\n/**\n * Gets the base URL for API requests based on the environment and service type.\n * The Regions service uses a cache URL, while other services use the standard URL.\n *\n * @param environment - The environment to use.\n * @param service - The API service type (determines if cache URL is used).\n * @returns The base URL for API requests.\n */\nfunction getBaseUrl(\n environment: RampsEnvironment,\n service: RampsApiService,\n): string {\n const cache = service === RampsApiService.Regions ? '-cache' : '';\n\n switch (environment) {\n case RampsEnvironment.Production:\n return `https://on-ramp${cache}.api.cx.metamask.io`;\n case RampsEnvironment.Staging:\n case RampsEnvironment.Development:\n return `https://on-ramp${cache}.uat-api.cx.metamask.io`;\n default:\n throw new Error(`Invalid environment: ${String(environment)}`);\n }\n}\n\n/**\n * This service object is responsible for interacting with the Ramps API.\n *\n * @example\n *\n * ``` ts\n * import { Messenger } from '@metamask/messenger';\n * import type {\n * RampsServiceActions,\n * RampsServiceEvents,\n * } from '@metamask/ramps-controller';\n *\n * const rootMessenger = new Messenger<\n * 'Root',\n * RampsServiceActions\n * RampsServiceEvents\n * >({ namespace: 'Root' });\n * const rampsServiceMessenger = new Messenger<\n * 'RampsService',\n * RampsServiceActions,\n * RampsServiceEvents,\n * typeof rootMessenger,\n * >({\n * namespace: 'RampsService',\n * parent: rootMessenger,\n * });\n * // Instantiate the service to register its actions on the messenger\n * new RampsService({\n * messenger: rampsServiceMessenger,\n * environment: RampsEnvironment.Production,\n * context: 'mobile-ios',\n * fetch,\n * });\n *\n * // Later...\n * // Get the user's geolocation\n * const geolocation = await rootMessenger.call(\n * 'RampsService:getGeolocation',\n * );\n * // ... Do something with the geolocation ...\n * ```\n */\nexport class RampsService {\n /**\n * The name of the service.\n */\n readonly name: typeof serviceName;\n\n /**\n * The messenger suited for this service.\n */\n readonly #messenger: ConstructorParameters<\n typeof RampsService\n >[0]['messenger'];\n\n /**\n * A function that can be used to make an HTTP request.\n */\n readonly #fetch: ConstructorParameters<typeof RampsService>[0]['fetch'];\n\n /**\n * The policy that wraps the request.\n *\n * @see {@link createServicePolicy}\n */\n readonly #policy: ServicePolicy;\n\n /**\n * The environment used for API requests.\n */\n readonly #environment: RampsEnvironment;\n\n /**\n * The context for API requests (e.g., 'mobile-ios', 'mobile-android').\n */\n readonly #context: string;\n\n /**\n * Constructs a new RampsService object.\n *\n * @param args - The constructor arguments.\n * @param args.messenger - The messenger suited for this service.\n * @param args.environment - The environment to use for API requests.\n * @param args.context - The context for API requests (e.g., 'mobile-ios', 'mobile-android').\n * @param args.fetch - A function that can be used to make an HTTP request. If\n * your JavaScript environment supports `fetch` natively, you'll probably want\n * to pass that; otherwise you can pass an equivalent (such as `fetch` via\n * `node-fetch`).\n * @param args.policyOptions - Options to pass to `createServicePolicy`, which\n * is used to wrap each request. See {@link CreateServicePolicyOptions}.\n */\n constructor({\n messenger,\n environment = RampsEnvironment.Staging,\n context,\n fetch: fetchFunction,\n policyOptions = {},\n }: {\n messenger: RampsServiceMessenger;\n environment?: RampsEnvironment;\n context: string;\n fetch: typeof fetch;\n policyOptions?: CreateServicePolicyOptions;\n }) {\n this.name = serviceName;\n this.#messenger = messenger;\n this.#fetch = fetchFunction;\n this.#policy = createServicePolicy(policyOptions);\n this.#environment = environment;\n this.#context = context;\n\n this.#messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Registers a handler that will be called after a request returns a non-500\n * response, causing a retry. Primarily useful in tests where timers are being\n * mocked.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler. See\n * {@link CockatielEvent}.\n * @see {@link createServicePolicy}\n */\n onRetry(\n listener: Parameters<ServicePolicy['onRetry']>[0],\n ): ReturnType<ServicePolicy['onRetry']> {\n return this.#policy.onRetry(listener);\n }\n\n /**\n * Registers a handler that will be called after a set number of retry rounds\n * prove that requests to the API endpoint consistently return a 5xx response.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler. See\n * {@link CockatielEvent}.\n * @see {@link createServicePolicy}\n */\n onBreak(\n listener: Parameters<ServicePolicy['onBreak']>[0],\n ): ReturnType<ServicePolicy['onBreak']> {\n return this.#policy.onBreak(listener);\n }\n\n /**\n * Registers a handler that will be called under one of two circumstances:\n *\n * 1. After a set number of retries prove that requests to the API\n * consistently result in one of the following failures:\n * 1. A connection initiation error\n * 2. A connection reset error\n * 3. A timeout error\n * 4. A non-JSON response\n * 5. A 502, 503, or 504 response\n * 2. After a successful request is made to the API, but the response takes\n * longer than a set duration to return.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler. See\n * {@link CockatielEvent}.\n */\n onDegraded(\n listener: Parameters<ServicePolicy['onDegraded']>[0],\n ): ReturnType<ServicePolicy['onDegraded']> {\n return this.#policy.onDegraded(listener);\n }\n\n /**\n * Adds common request parameters to a URL.\n *\n * @param url - The URL to add parameters to.\n * @param action - The ramp action type (optional, not all endpoints require it).\n */\n #addCommonParams(url: URL, action?: 'buy' | 'sell'): void {\n if (action) {\n url.searchParams.set('action', action);\n }\n url.searchParams.set('sdk', RAMPS_SDK_VERSION);\n url.searchParams.set('controller', packageJson.version);\n url.searchParams.set('context', this.#context);\n }\n\n /**\n * Makes an API request with retry policy and error handling.\n *\n * @param service - The API service type (determines base URL).\n * @param path - The endpoint path.\n * @param options - Request options.\n * @param options.action - The ramp action type (optional).\n * @param options.responseType - How to parse the response ('json' or 'text').\n * @returns The parsed response data.\n */\n async #request<TResponse>(\n service: RampsApiService,\n path: string,\n options: {\n action?: 'buy' | 'sell';\n responseType: 'json' | 'text';\n },\n ): Promise<TResponse> {\n return this.#policy.execute(async () => {\n const baseUrl = getBaseUrl(this.#environment, service);\n const url = new URL(path, baseUrl);\n this.#addCommonParams(url, options.action);\n\n const response = await this.#fetch(url);\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Fetching '${url.toString()}' failed with status '${response.status}'`,\n );\n }\n\n return options.responseType === 'json'\n ? (response.json() as Promise<TResponse>)\n : (response.text() as Promise<TResponse>);\n });\n }\n\n /**\n * Makes a request to the API in order to retrieve the user's geolocation\n * based on their IP address.\n *\n * @returns The user's country/region code (e.g., \"US-UT\" for Utah, USA).\n */\n async getGeolocation(): Promise<string> {\n const textResponse = await this.#request<string>(\n RampsApiService.Orders,\n 'geolocation',\n { responseType: 'text' },\n );\n\n const trimmedResponse = textResponse.trim();\n if (trimmedResponse.length > 0) {\n return trimmedResponse;\n }\n\n throw new Error('Malformed response received from geolocation API');\n }\n\n /**\n * Makes a request to the cached API to retrieve the list of supported countries.\n * Filters countries based on aggregator support (preserves OnRampSDK logic).\n *\n * @param action - The ramp action type ('buy' or 'sell').\n * @returns An array of countries filtered by aggregator support.\n */\n async getCountries(action: 'buy' | 'sell' = 'buy'): Promise<Country[]> {\n const countries = await this.#request<Country[]>(\n RampsApiService.Regions,\n 'regions/countries',\n { action, responseType: 'json' },\n );\n\n if (!Array.isArray(countries)) {\n throw new Error('Malformed response received from countries API');\n }\n\n return countries.filter((country) => {\n if (country.states && country.states.length > 0) {\n const hasSupportedState = country.states.some(\n (state) => state.supported !== false,\n );\n return country.supported || hasSupportedState;\n }\n\n return country.supported;\n });\n }\n\n /**\n * Fetches eligibility information for a specific region.\n *\n * @param isoCode - The ISO code for the region (e.g., \"us\", \"fr\", \"us-ny\").\n * @returns Eligibility information for the region.\n */\n async getEligibility(isoCode: string): Promise<Eligibility> {\n const normalizedIsoCode = isoCode.toLowerCase().trim();\n return this.#request<Eligibility>(\n RampsApiService.Regions,\n `regions/countries/${normalizedIsoCode}`,\n { responseType: 'json' },\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createErrorState = exports.createSuccessState = exports.createLoadingState = exports.isCacheExpired = exports.createCacheKey = exports.DEFAULT_REQUEST_CACHE_MAX_SIZE = exports.DEFAULT_REQUEST_CACHE_TTL = exports.RequestStatus = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Status of a cached request.
|
|
6
|
+
*/
|
|
7
|
+
var RequestStatus;
|
|
8
|
+
(function (RequestStatus) {
|
|
9
|
+
RequestStatus["IDLE"] = "idle";
|
|
10
|
+
RequestStatus["LOADING"] = "loading";
|
|
11
|
+
RequestStatus["SUCCESS"] = "success";
|
|
12
|
+
RequestStatus["ERROR"] = "error";
|
|
13
|
+
})(RequestStatus || (exports.RequestStatus = RequestStatus = {}));
|
|
14
|
+
/**
|
|
15
|
+
* Default TTL for cached requests in milliseconds (15 minutes).
|
|
16
|
+
*/
|
|
17
|
+
exports.DEFAULT_REQUEST_CACHE_TTL = 15 * 60 * 1000;
|
|
18
|
+
/**
|
|
19
|
+
* Default maximum number of entries in the request cache.
|
|
20
|
+
*/
|
|
21
|
+
exports.DEFAULT_REQUEST_CACHE_MAX_SIZE = 250;
|
|
22
|
+
/**
|
|
23
|
+
* Creates a cache key from a method name and parameters.
|
|
24
|
+
*
|
|
25
|
+
* @param method - The method name.
|
|
26
|
+
* @param params - The parameters passed to the method.
|
|
27
|
+
* @returns A unique cache key string.
|
|
28
|
+
*/
|
|
29
|
+
function createCacheKey(method, params) {
|
|
30
|
+
return `${method}:${JSON.stringify(params)}`;
|
|
31
|
+
}
|
|
32
|
+
exports.createCacheKey = createCacheKey;
|
|
33
|
+
/**
|
|
34
|
+
* Checks if a cached request has expired based on TTL.
|
|
35
|
+
*
|
|
36
|
+
* @param requestState - The cached request state.
|
|
37
|
+
* @param ttl - Time to live in milliseconds.
|
|
38
|
+
* @returns True if the cache entry has expired.
|
|
39
|
+
*/
|
|
40
|
+
function isCacheExpired(requestState, ttl = exports.DEFAULT_REQUEST_CACHE_TTL) {
|
|
41
|
+
if (requestState.status !== RequestStatus.SUCCESS) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
const now = Date.now();
|
|
45
|
+
return now - requestState.timestamp > ttl;
|
|
46
|
+
}
|
|
47
|
+
exports.isCacheExpired = isCacheExpired;
|
|
48
|
+
/**
|
|
49
|
+
* Creates an initial loading state for a request.
|
|
50
|
+
*
|
|
51
|
+
* @returns A new RequestState in loading status.
|
|
52
|
+
*/
|
|
53
|
+
function createLoadingState() {
|
|
54
|
+
const now = Date.now();
|
|
55
|
+
return {
|
|
56
|
+
status: RequestStatus.LOADING,
|
|
57
|
+
data: null,
|
|
58
|
+
error: null,
|
|
59
|
+
timestamp: now,
|
|
60
|
+
lastFetchedAt: now,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
exports.createLoadingState = createLoadingState;
|
|
64
|
+
/**
|
|
65
|
+
* Creates a success state for a request.
|
|
66
|
+
*
|
|
67
|
+
* @param data - The data returned by the request.
|
|
68
|
+
* @param lastFetchedAt - When the fetch started.
|
|
69
|
+
* @returns A new RequestState in success status.
|
|
70
|
+
*/
|
|
71
|
+
function createSuccessState(data, lastFetchedAt) {
|
|
72
|
+
return {
|
|
73
|
+
status: RequestStatus.SUCCESS,
|
|
74
|
+
data,
|
|
75
|
+
error: null,
|
|
76
|
+
timestamp: Date.now(),
|
|
77
|
+
lastFetchedAt,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
exports.createSuccessState = createSuccessState;
|
|
81
|
+
/**
|
|
82
|
+
* Creates an error state for a request.
|
|
83
|
+
*
|
|
84
|
+
* @param error - The error message.
|
|
85
|
+
* @param lastFetchedAt - When the fetch started.
|
|
86
|
+
* @returns A new RequestState in error status.
|
|
87
|
+
*/
|
|
88
|
+
function createErrorState(error, lastFetchedAt) {
|
|
89
|
+
return {
|
|
90
|
+
status: RequestStatus.ERROR,
|
|
91
|
+
data: null,
|
|
92
|
+
error,
|
|
93
|
+
timestamp: Date.now(),
|
|
94
|
+
lastFetchedAt,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
exports.createErrorState = createErrorState;
|
|
98
|
+
//# sourceMappingURL=RequestCache.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestCache.cjs","sourceRoot":"","sources":["../src/RequestCache.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,6BAAb,aAAa,QAKxB;AAwBD;;GAEG;AACU,QAAA,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAExD;;GAEG;AACU,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAElD;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,MAAc,EAAE,MAAiB;IAC9D,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/C,CAAC;AAFD,wCAEC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAC5B,YAA0B,EAC1B,MAAc,iCAAyB;IAEvC,IAAI,YAAY,CAAC,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,GAAG,GAAG,YAAY,CAAC,SAAS,GAAG,GAAG,CAAC;AAC5C,CAAC;AATD,wCASC;AAED;;;;GAIG;AACH,SAAgB,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,OAAO;QAC7B,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,GAAG;QACd,aAAa,EAAE,GAAG;KACnB,CAAC;AACJ,CAAC;AATD,gDASC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAChC,IAAU,EACV,aAAqB;IAErB,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,OAAO;QAC7B,IAAI;QACJ,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,aAAa;KACd,CAAC;AACJ,CAAC;AAXD,gDAWC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,KAAa,EACb,aAAqB;IAErB,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,KAAK;QAC3B,IAAI,EAAE,IAAI;QACV,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,aAAa;KACd,CAAC;AACJ,CAAC;AAXD,4CAWC","sourcesContent":["import type { Json } from '@metamask/utils';\n\n/**\n * Status of a cached request.\n */\nexport enum RequestStatus {\n IDLE = 'idle',\n LOADING = 'loading',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n/**\n * State of a single cached request.\n * All properties must be JSON-serializable to satisfy StateConstraint.\n */\nexport type RequestState = {\n /** Current status of the request */\n status: `${RequestStatus}`;\n /** The data returned by the request, if successful */\n data: Json | null;\n /** Error message if the request failed */\n error: string | null;\n /** Timestamp when the request completed (for TTL calculation) */\n timestamp: number;\n /** Timestamp when the fetch started */\n lastFetchedAt: number;\n};\n\n/**\n * Cache of request states, keyed by cache key.\n */\nexport type RequestCache = Record<string, RequestState>;\n\n/**\n * Default TTL for cached requests in milliseconds (15 minutes).\n */\nexport const DEFAULT_REQUEST_CACHE_TTL = 15 * 60 * 1000;\n\n/**\n * Default maximum number of entries in the request cache.\n */\nexport const DEFAULT_REQUEST_CACHE_MAX_SIZE = 250;\n\n/**\n * Creates a cache key from a method name and parameters.\n *\n * @param method - The method name.\n * @param params - The parameters passed to the method.\n * @returns A unique cache key string.\n */\nexport function createCacheKey(method: string, params: unknown[]): string {\n return `${method}:${JSON.stringify(params)}`;\n}\n\n/**\n * Checks if a cached request has expired based on TTL.\n *\n * @param requestState - The cached request state.\n * @param ttl - Time to live in milliseconds.\n * @returns True if the cache entry has expired.\n */\nexport function isCacheExpired(\n requestState: RequestState,\n ttl: number = DEFAULT_REQUEST_CACHE_TTL,\n): boolean {\n if (requestState.status !== RequestStatus.SUCCESS) {\n return true;\n }\n const now = Date.now();\n return now - requestState.timestamp > ttl;\n}\n\n/**\n * Creates an initial loading state for a request.\n *\n * @returns A new RequestState in loading status.\n */\nexport function createLoadingState(): RequestState {\n const now = Date.now();\n return {\n status: RequestStatus.LOADING,\n data: null,\n error: null,\n timestamp: now,\n lastFetchedAt: now,\n };\n}\n\n/**\n * Creates a success state for a request.\n *\n * @param data - The data returned by the request.\n * @param lastFetchedAt - When the fetch started.\n * @returns A new RequestState in success status.\n */\nexport function createSuccessState(\n data: Json,\n lastFetchedAt: number,\n): RequestState {\n return {\n status: RequestStatus.SUCCESS,\n data,\n error: null,\n timestamp: Date.now(),\n lastFetchedAt,\n };\n}\n\n/**\n * Creates an error state for a request.\n *\n * @param error - The error message.\n * @param lastFetchedAt - When the fetch started.\n * @returns A new RequestState in error status.\n */\nexport function createErrorState(\n error: string,\n lastFetchedAt: number,\n): RequestState {\n return {\n status: RequestStatus.ERROR,\n data: null,\n error,\n timestamp: Date.now(),\n lastFetchedAt,\n };\n}\n\n/**\n * Options for executing a cached request.\n */\nexport type ExecuteRequestOptions = {\n /** Force a refresh even if cached data exists */\n forceRefresh?: boolean;\n /** Custom TTL for this request in milliseconds */\n ttl?: number;\n};\n\n/**\n * Represents a pending request with its promise and abort controller.\n */\nexport type PendingRequest<TResult = unknown> = {\n promise: Promise<TResult>;\n abortController: AbortController;\n};\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Json } from "@metamask/utils";
|
|
2
|
+
/**
|
|
3
|
+
* Status of a cached request.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum RequestStatus {
|
|
6
|
+
IDLE = "idle",
|
|
7
|
+
LOADING = "loading",
|
|
8
|
+
SUCCESS = "success",
|
|
9
|
+
ERROR = "error"
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* State of a single cached request.
|
|
13
|
+
* All properties must be JSON-serializable to satisfy StateConstraint.
|
|
14
|
+
*/
|
|
15
|
+
export type RequestState = {
|
|
16
|
+
/** Current status of the request */
|
|
17
|
+
status: `${RequestStatus}`;
|
|
18
|
+
/** The data returned by the request, if successful */
|
|
19
|
+
data: Json | null;
|
|
20
|
+
/** Error message if the request failed */
|
|
21
|
+
error: string | null;
|
|
22
|
+
/** Timestamp when the request completed (for TTL calculation) */
|
|
23
|
+
timestamp: number;
|
|
24
|
+
/** Timestamp when the fetch started */
|
|
25
|
+
lastFetchedAt: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Cache of request states, keyed by cache key.
|
|
29
|
+
*/
|
|
30
|
+
export type RequestCache = Record<string, RequestState>;
|
|
31
|
+
/**
|
|
32
|
+
* Default TTL for cached requests in milliseconds (15 minutes).
|
|
33
|
+
*/
|
|
34
|
+
export declare const DEFAULT_REQUEST_CACHE_TTL: number;
|
|
35
|
+
/**
|
|
36
|
+
* Default maximum number of entries in the request cache.
|
|
37
|
+
*/
|
|
38
|
+
export declare const DEFAULT_REQUEST_CACHE_MAX_SIZE = 250;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a cache key from a method name and parameters.
|
|
41
|
+
*
|
|
42
|
+
* @param method - The method name.
|
|
43
|
+
* @param params - The parameters passed to the method.
|
|
44
|
+
* @returns A unique cache key string.
|
|
45
|
+
*/
|
|
46
|
+
export declare function createCacheKey(method: string, params: unknown[]): string;
|
|
47
|
+
/**
|
|
48
|
+
* Checks if a cached request has expired based on TTL.
|
|
49
|
+
*
|
|
50
|
+
* @param requestState - The cached request state.
|
|
51
|
+
* @param ttl - Time to live in milliseconds.
|
|
52
|
+
* @returns True if the cache entry has expired.
|
|
53
|
+
*/
|
|
54
|
+
export declare function isCacheExpired(requestState: RequestState, ttl?: number): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Creates an initial loading state for a request.
|
|
57
|
+
*
|
|
58
|
+
* @returns A new RequestState in loading status.
|
|
59
|
+
*/
|
|
60
|
+
export declare function createLoadingState(): RequestState;
|
|
61
|
+
/**
|
|
62
|
+
* Creates a success state for a request.
|
|
63
|
+
*
|
|
64
|
+
* @param data - The data returned by the request.
|
|
65
|
+
* @param lastFetchedAt - When the fetch started.
|
|
66
|
+
* @returns A new RequestState in success status.
|
|
67
|
+
*/
|
|
68
|
+
export declare function createSuccessState(data: Json, lastFetchedAt: number): RequestState;
|
|
69
|
+
/**
|
|
70
|
+
* Creates an error state for a request.
|
|
71
|
+
*
|
|
72
|
+
* @param error - The error message.
|
|
73
|
+
* @param lastFetchedAt - When the fetch started.
|
|
74
|
+
* @returns A new RequestState in error status.
|
|
75
|
+
*/
|
|
76
|
+
export declare function createErrorState(error: string, lastFetchedAt: number): RequestState;
|
|
77
|
+
/**
|
|
78
|
+
* Options for executing a cached request.
|
|
79
|
+
*/
|
|
80
|
+
export type ExecuteRequestOptions = {
|
|
81
|
+
/** Force a refresh even if cached data exists */
|
|
82
|
+
forceRefresh?: boolean;
|
|
83
|
+
/** Custom TTL for this request in milliseconds */
|
|
84
|
+
ttl?: number;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Represents a pending request with its promise and abort controller.
|
|
88
|
+
*/
|
|
89
|
+
export type PendingRequest<TResult = unknown> = {
|
|
90
|
+
promise: Promise<TResult>;
|
|
91
|
+
abortController: AbortController;
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=RequestCache.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestCache.d.cts","sourceRoot":"","sources":["../src/RequestCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,wBAAwB;AAE5C;;GAEG;AACH,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,oCAAoC;IACpC,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,sDAAsD;IACtD,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,yBAAyB,QAAiB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAExE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,YAAY,EAC1B,GAAG,GAAE,MAAkC,GACtC,OAAO,CAMT;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CASjD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,GACpB,YAAY,CAQd;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,GACpB,YAAY,CAQd;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,GAAG,OAAO,IAAI;IAC9C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Json } from "@metamask/utils";
|
|
2
|
+
/**
|
|
3
|
+
* Status of a cached request.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum RequestStatus {
|
|
6
|
+
IDLE = "idle",
|
|
7
|
+
LOADING = "loading",
|
|
8
|
+
SUCCESS = "success",
|
|
9
|
+
ERROR = "error"
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* State of a single cached request.
|
|
13
|
+
* All properties must be JSON-serializable to satisfy StateConstraint.
|
|
14
|
+
*/
|
|
15
|
+
export type RequestState = {
|
|
16
|
+
/** Current status of the request */
|
|
17
|
+
status: `${RequestStatus}`;
|
|
18
|
+
/** The data returned by the request, if successful */
|
|
19
|
+
data: Json | null;
|
|
20
|
+
/** Error message if the request failed */
|
|
21
|
+
error: string | null;
|
|
22
|
+
/** Timestamp when the request completed (for TTL calculation) */
|
|
23
|
+
timestamp: number;
|
|
24
|
+
/** Timestamp when the fetch started */
|
|
25
|
+
lastFetchedAt: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Cache of request states, keyed by cache key.
|
|
29
|
+
*/
|
|
30
|
+
export type RequestCache = Record<string, RequestState>;
|
|
31
|
+
/**
|
|
32
|
+
* Default TTL for cached requests in milliseconds (15 minutes).
|
|
33
|
+
*/
|
|
34
|
+
export declare const DEFAULT_REQUEST_CACHE_TTL: number;
|
|
35
|
+
/**
|
|
36
|
+
* Default maximum number of entries in the request cache.
|
|
37
|
+
*/
|
|
38
|
+
export declare const DEFAULT_REQUEST_CACHE_MAX_SIZE = 250;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a cache key from a method name and parameters.
|
|
41
|
+
*
|
|
42
|
+
* @param method - The method name.
|
|
43
|
+
* @param params - The parameters passed to the method.
|
|
44
|
+
* @returns A unique cache key string.
|
|
45
|
+
*/
|
|
46
|
+
export declare function createCacheKey(method: string, params: unknown[]): string;
|
|
47
|
+
/**
|
|
48
|
+
* Checks if a cached request has expired based on TTL.
|
|
49
|
+
*
|
|
50
|
+
* @param requestState - The cached request state.
|
|
51
|
+
* @param ttl - Time to live in milliseconds.
|
|
52
|
+
* @returns True if the cache entry has expired.
|
|
53
|
+
*/
|
|
54
|
+
export declare function isCacheExpired(requestState: RequestState, ttl?: number): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Creates an initial loading state for a request.
|
|
57
|
+
*
|
|
58
|
+
* @returns A new RequestState in loading status.
|
|
59
|
+
*/
|
|
60
|
+
export declare function createLoadingState(): RequestState;
|
|
61
|
+
/**
|
|
62
|
+
* Creates a success state for a request.
|
|
63
|
+
*
|
|
64
|
+
* @param data - The data returned by the request.
|
|
65
|
+
* @param lastFetchedAt - When the fetch started.
|
|
66
|
+
* @returns A new RequestState in success status.
|
|
67
|
+
*/
|
|
68
|
+
export declare function createSuccessState(data: Json, lastFetchedAt: number): RequestState;
|
|
69
|
+
/**
|
|
70
|
+
* Creates an error state for a request.
|
|
71
|
+
*
|
|
72
|
+
* @param error - The error message.
|
|
73
|
+
* @param lastFetchedAt - When the fetch started.
|
|
74
|
+
* @returns A new RequestState in error status.
|
|
75
|
+
*/
|
|
76
|
+
export declare function createErrorState(error: string, lastFetchedAt: number): RequestState;
|
|
77
|
+
/**
|
|
78
|
+
* Options for executing a cached request.
|
|
79
|
+
*/
|
|
80
|
+
export type ExecuteRequestOptions = {
|
|
81
|
+
/** Force a refresh even if cached data exists */
|
|
82
|
+
forceRefresh?: boolean;
|
|
83
|
+
/** Custom TTL for this request in milliseconds */
|
|
84
|
+
ttl?: number;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Represents a pending request with its promise and abort controller.
|
|
88
|
+
*/
|
|
89
|
+
export type PendingRequest<TResult = unknown> = {
|
|
90
|
+
promise: Promise<TResult>;
|
|
91
|
+
abortController: AbortController;
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=RequestCache.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestCache.d.mts","sourceRoot":"","sources":["../src/RequestCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,wBAAwB;AAE5C;;GAEG;AACH,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,oCAAoC;IACpC,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,sDAAsD;IACtD,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,yBAAyB,QAAiB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAExE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,YAAY,EAC1B,GAAG,GAAE,MAAkC,GACtC,OAAO,CAMT;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CASjD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,GACpB,YAAY,CAQd;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,GACpB,YAAY,CAQd;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,GAAG,OAAO,IAAI;IAC9C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status of a cached request.
|
|
3
|
+
*/
|
|
4
|
+
export var RequestStatus;
|
|
5
|
+
(function (RequestStatus) {
|
|
6
|
+
RequestStatus["IDLE"] = "idle";
|
|
7
|
+
RequestStatus["LOADING"] = "loading";
|
|
8
|
+
RequestStatus["SUCCESS"] = "success";
|
|
9
|
+
RequestStatus["ERROR"] = "error";
|
|
10
|
+
})(RequestStatus || (RequestStatus = {}));
|
|
11
|
+
/**
|
|
12
|
+
* Default TTL for cached requests in milliseconds (15 minutes).
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_REQUEST_CACHE_TTL = 15 * 60 * 1000;
|
|
15
|
+
/**
|
|
16
|
+
* Default maximum number of entries in the request cache.
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_REQUEST_CACHE_MAX_SIZE = 250;
|
|
19
|
+
/**
|
|
20
|
+
* Creates a cache key from a method name and parameters.
|
|
21
|
+
*
|
|
22
|
+
* @param method - The method name.
|
|
23
|
+
* @param params - The parameters passed to the method.
|
|
24
|
+
* @returns A unique cache key string.
|
|
25
|
+
*/
|
|
26
|
+
export function createCacheKey(method, params) {
|
|
27
|
+
return `${method}:${JSON.stringify(params)}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Checks if a cached request has expired based on TTL.
|
|
31
|
+
*
|
|
32
|
+
* @param requestState - The cached request state.
|
|
33
|
+
* @param ttl - Time to live in milliseconds.
|
|
34
|
+
* @returns True if the cache entry has expired.
|
|
35
|
+
*/
|
|
36
|
+
export function isCacheExpired(requestState, ttl = DEFAULT_REQUEST_CACHE_TTL) {
|
|
37
|
+
if (requestState.status !== RequestStatus.SUCCESS) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
const now = Date.now();
|
|
41
|
+
return now - requestState.timestamp > ttl;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Creates an initial loading state for a request.
|
|
45
|
+
*
|
|
46
|
+
* @returns A new RequestState in loading status.
|
|
47
|
+
*/
|
|
48
|
+
export function createLoadingState() {
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
return {
|
|
51
|
+
status: RequestStatus.LOADING,
|
|
52
|
+
data: null,
|
|
53
|
+
error: null,
|
|
54
|
+
timestamp: now,
|
|
55
|
+
lastFetchedAt: now,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Creates a success state for a request.
|
|
60
|
+
*
|
|
61
|
+
* @param data - The data returned by the request.
|
|
62
|
+
* @param lastFetchedAt - When the fetch started.
|
|
63
|
+
* @returns A new RequestState in success status.
|
|
64
|
+
*/
|
|
65
|
+
export function createSuccessState(data, lastFetchedAt) {
|
|
66
|
+
return {
|
|
67
|
+
status: RequestStatus.SUCCESS,
|
|
68
|
+
data,
|
|
69
|
+
error: null,
|
|
70
|
+
timestamp: Date.now(),
|
|
71
|
+
lastFetchedAt,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates an error state for a request.
|
|
76
|
+
*
|
|
77
|
+
* @param error - The error message.
|
|
78
|
+
* @param lastFetchedAt - When the fetch started.
|
|
79
|
+
* @returns A new RequestState in error status.
|
|
80
|
+
*/
|
|
81
|
+
export function createErrorState(error, lastFetchedAt) {
|
|
82
|
+
return {
|
|
83
|
+
status: RequestStatus.ERROR,
|
|
84
|
+
data: null,
|
|
85
|
+
error,
|
|
86
|
+
timestamp: Date.now(),
|
|
87
|
+
lastFetchedAt,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=RequestCache.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestCache.mjs","sourceRoot":"","sources":["../src/RequestCache.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAwBD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,MAAiB;IAC9D,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,YAA0B,EAC1B,MAAc,yBAAyB;IAEvC,IAAI,YAAY,CAAC,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,GAAG,GAAG,YAAY,CAAC,SAAS,GAAG,GAAG,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,OAAO;QAC7B,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,GAAG;QACd,aAAa,EAAE,GAAG;KACnB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAU,EACV,aAAqB;IAErB,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,OAAO;QAC7B,IAAI;QACJ,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,aAAqB;IAErB,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,KAAK;QAC3B,IAAI,EAAE,IAAI;QACV,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,aAAa;KACd,CAAC;AACJ,CAAC","sourcesContent":["import type { Json } from '@metamask/utils';\n\n/**\n * Status of a cached request.\n */\nexport enum RequestStatus {\n IDLE = 'idle',\n LOADING = 'loading',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n/**\n * State of a single cached request.\n * All properties must be JSON-serializable to satisfy StateConstraint.\n */\nexport type RequestState = {\n /** Current status of the request */\n status: `${RequestStatus}`;\n /** The data returned by the request, if successful */\n data: Json | null;\n /** Error message if the request failed */\n error: string | null;\n /** Timestamp when the request completed (for TTL calculation) */\n timestamp: number;\n /** Timestamp when the fetch started */\n lastFetchedAt: number;\n};\n\n/**\n * Cache of request states, keyed by cache key.\n */\nexport type RequestCache = Record<string, RequestState>;\n\n/**\n * Default TTL for cached requests in milliseconds (15 minutes).\n */\nexport const DEFAULT_REQUEST_CACHE_TTL = 15 * 60 * 1000;\n\n/**\n * Default maximum number of entries in the request cache.\n */\nexport const DEFAULT_REQUEST_CACHE_MAX_SIZE = 250;\n\n/**\n * Creates a cache key from a method name and parameters.\n *\n * @param method - The method name.\n * @param params - The parameters passed to the method.\n * @returns A unique cache key string.\n */\nexport function createCacheKey(method: string, params: unknown[]): string {\n return `${method}:${JSON.stringify(params)}`;\n}\n\n/**\n * Checks if a cached request has expired based on TTL.\n *\n * @param requestState - The cached request state.\n * @param ttl - Time to live in milliseconds.\n * @returns True if the cache entry has expired.\n */\nexport function isCacheExpired(\n requestState: RequestState,\n ttl: number = DEFAULT_REQUEST_CACHE_TTL,\n): boolean {\n if (requestState.status !== RequestStatus.SUCCESS) {\n return true;\n }\n const now = Date.now();\n return now - requestState.timestamp > ttl;\n}\n\n/**\n * Creates an initial loading state for a request.\n *\n * @returns A new RequestState in loading status.\n */\nexport function createLoadingState(): RequestState {\n const now = Date.now();\n return {\n status: RequestStatus.LOADING,\n data: null,\n error: null,\n timestamp: now,\n lastFetchedAt: now,\n };\n}\n\n/**\n * Creates a success state for a request.\n *\n * @param data - The data returned by the request.\n * @param lastFetchedAt - When the fetch started.\n * @returns A new RequestState in success status.\n */\nexport function createSuccessState(\n data: Json,\n lastFetchedAt: number,\n): RequestState {\n return {\n status: RequestStatus.SUCCESS,\n data,\n error: null,\n timestamp: Date.now(),\n lastFetchedAt,\n };\n}\n\n/**\n * Creates an error state for a request.\n *\n * @param error - The error message.\n * @param lastFetchedAt - When the fetch started.\n * @returns A new RequestState in error status.\n */\nexport function createErrorState(\n error: string,\n lastFetchedAt: number,\n): RequestState {\n return {\n status: RequestStatus.ERROR,\n data: null,\n error,\n timestamp: Date.now(),\n lastFetchedAt,\n };\n}\n\n/**\n * Options for executing a cached request.\n */\nexport type ExecuteRequestOptions = {\n /** Force a refresh even if cached data exists */\n forceRefresh?: boolean;\n /** Custom TTL for this request in milliseconds */\n ttl?: number;\n};\n\n/**\n * Represents a pending request with its promise and abort controller.\n */\nexport type PendingRequest<TResult = unknown> = {\n promise: Promise<TResult>;\n abortController: AbortController;\n};\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RampsEnvironment = exports.RampsService = exports.getDefaultRampsControllerState = exports.RampsController = void 0;
|
|
3
|
+
exports.createRequestSelector = exports.createErrorState = exports.createSuccessState = exports.createLoadingState = exports.isCacheExpired = exports.createCacheKey = exports.DEFAULT_REQUEST_CACHE_MAX_SIZE = exports.DEFAULT_REQUEST_CACHE_TTL = exports.RequestStatus = exports.RAMPS_SDK_VERSION = exports.RampsApiService = exports.RampsEnvironment = exports.RampsService = exports.getDefaultRampsControllerState = exports.RampsController = void 0;
|
|
4
4
|
var RampsController_1 = require("./RampsController.cjs");
|
|
5
5
|
Object.defineProperty(exports, "RampsController", { enumerable: true, get: function () { return RampsController_1.RampsController; } });
|
|
6
6
|
Object.defineProperty(exports, "getDefaultRampsControllerState", { enumerable: true, get: function () { return RampsController_1.getDefaultRampsControllerState; } });
|
|
7
7
|
var RampsService_1 = require("./RampsService.cjs");
|
|
8
8
|
Object.defineProperty(exports, "RampsService", { enumerable: true, get: function () { return RampsService_1.RampsService; } });
|
|
9
9
|
Object.defineProperty(exports, "RampsEnvironment", { enumerable: true, get: function () { return RampsService_1.RampsEnvironment; } });
|
|
10
|
+
Object.defineProperty(exports, "RampsApiService", { enumerable: true, get: function () { return RampsService_1.RampsApiService; } });
|
|
11
|
+
Object.defineProperty(exports, "RAMPS_SDK_VERSION", { enumerable: true, get: function () { return RampsService_1.RAMPS_SDK_VERSION; } });
|
|
12
|
+
var RequestCache_1 = require("./RequestCache.cjs");
|
|
13
|
+
Object.defineProperty(exports, "RequestStatus", { enumerable: true, get: function () { return RequestCache_1.RequestStatus; } });
|
|
14
|
+
Object.defineProperty(exports, "DEFAULT_REQUEST_CACHE_TTL", { enumerable: true, get: function () { return RequestCache_1.DEFAULT_REQUEST_CACHE_TTL; } });
|
|
15
|
+
Object.defineProperty(exports, "DEFAULT_REQUEST_CACHE_MAX_SIZE", { enumerable: true, get: function () { return RequestCache_1.DEFAULT_REQUEST_CACHE_MAX_SIZE; } });
|
|
16
|
+
Object.defineProperty(exports, "createCacheKey", { enumerable: true, get: function () { return RequestCache_1.createCacheKey; } });
|
|
17
|
+
Object.defineProperty(exports, "isCacheExpired", { enumerable: true, get: function () { return RequestCache_1.isCacheExpired; } });
|
|
18
|
+
Object.defineProperty(exports, "createLoadingState", { enumerable: true, get: function () { return RequestCache_1.createLoadingState; } });
|
|
19
|
+
Object.defineProperty(exports, "createSuccessState", { enumerable: true, get: function () { return RequestCache_1.createSuccessState; } });
|
|
20
|
+
Object.defineProperty(exports, "createErrorState", { enumerable: true, get: function () { return RequestCache_1.createErrorState; } });
|
|
21
|
+
var selectors_1 = require("./selectors.cjs");
|
|
22
|
+
Object.defineProperty(exports, "createRequestSelector", { enumerable: true, get: function () { return selectors_1.createRequestSelector; } });
|
|
10
23
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AASA,yDAG2B;AAFzB,kHAAA,eAAe,OAAA;AACf,iIAAA,8BAA8B,OAAA;AAWhC,mDAKwB;AAJtB,4GAAA,YAAY,OAAA;AACZ,gHAAA,gBAAgB,OAAA;AAChB,+GAAA,eAAe,OAAA;AACf,iHAAA,iBAAiB,OAAA;AAanB,mDASwB;AARtB,6GAAA,aAAa,OAAA;AACb,yHAAA,yBAAyB,OAAA;AACzB,8HAAA,8BAA8B,OAAA;AAC9B,8GAAA,cAAc,OAAA;AACd,8GAAA,cAAc,OAAA;AACd,kHAAA,kBAAkB,OAAA;AAClB,kHAAA,kBAAkB,OAAA;AAClB,gHAAA,gBAAgB,OAAA;AAGlB,6CAAoD;AAA3C,kHAAA,qBAAqB,OAAA","sourcesContent":["export type {\n RampsControllerActions,\n RampsControllerEvents,\n RampsControllerGetStateAction,\n RampsControllerMessenger,\n RampsControllerState,\n RampsControllerStateChangeEvent,\n RampsControllerOptions,\n} from './RampsController';\nexport {\n RampsController,\n getDefaultRampsControllerState,\n} from './RampsController';\nexport type {\n RampsServiceActions,\n RampsServiceEvents,\n RampsServiceMessenger,\n Country,\n State,\n Eligibility,\n CountryPhone,\n} from './RampsService';\nexport {\n RampsService,\n RampsEnvironment,\n RampsApiService,\n RAMPS_SDK_VERSION,\n} from './RampsService';\nexport type {\n RampsServiceGetGeolocationAction,\n RampsServiceGetCountriesAction,\n RampsServiceGetEligibilityAction,\n} from './RampsService-method-action-types';\nexport type {\n RequestCache,\n RequestState,\n ExecuteRequestOptions,\n PendingRequest,\n} from './RequestCache';\nexport {\n RequestStatus,\n DEFAULT_REQUEST_CACHE_TTL,\n DEFAULT_REQUEST_CACHE_MAX_SIZE,\n createCacheKey,\n isCacheExpired,\n createLoadingState,\n createSuccessState,\n createErrorState,\n} from './RequestCache';\nexport type { RequestSelectorResult } from './selectors';\nexport { createRequestSelector } from './selectors';\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
export type { RampsControllerActions, RampsControllerEvents, RampsControllerGetStateAction, RampsControllerMessenger, RampsControllerState, RampsControllerStateChangeEvent, } from "./RampsController.cjs";
|
|
1
|
+
export type { RampsControllerActions, RampsControllerEvents, RampsControllerGetStateAction, RampsControllerMessenger, RampsControllerState, RampsControllerStateChangeEvent, RampsControllerOptions, } from "./RampsController.cjs";
|
|
2
2
|
export { RampsController, getDefaultRampsControllerState, } from "./RampsController.cjs";
|
|
3
|
-
export type { RampsServiceActions, RampsServiceEvents, RampsServiceMessenger, } from "./RampsService.cjs";
|
|
4
|
-
export { RampsService, RampsEnvironment } from "./RampsService.cjs";
|
|
5
|
-
export type { RampsServiceGetGeolocationAction } from "./RampsService-method-action-types.cjs";
|
|
3
|
+
export type { RampsServiceActions, RampsServiceEvents, RampsServiceMessenger, Country, State, Eligibility, CountryPhone, } from "./RampsService.cjs";
|
|
4
|
+
export { RampsService, RampsEnvironment, RampsApiService, RAMPS_SDK_VERSION, } from "./RampsService.cjs";
|
|
5
|
+
export type { RampsServiceGetGeolocationAction, RampsServiceGetCountriesAction, RampsServiceGetEligibilityAction, } from "./RampsService-method-action-types.cjs";
|
|
6
|
+
export type { RequestCache, RequestState, ExecuteRequestOptions, PendingRequest, } from "./RequestCache.cjs";
|
|
7
|
+
export { RequestStatus, DEFAULT_REQUEST_CACHE_TTL, DEFAULT_REQUEST_CACHE_MAX_SIZE, createCacheKey, isCacheExpired, createLoadingState, createSuccessState, createErrorState, } from "./RequestCache.cjs";
|
|
8
|
+
export type { RequestSelectorResult } from "./selectors.cjs";
|
|
9
|
+
export { createRequestSelector } from "./selectors.cjs";
|
|
6
10
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,wBAAwB,EACxB,oBAAoB,EACpB,+BAA+B,
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,wBAAwB,EACxB,oBAAoB,EACpB,+BAA+B,EAC/B,sBAAsB,GACvB,8BAA0B;AAC3B,OAAO,EACL,eAAe,EACf,8BAA8B,GAC/B,8BAA0B;AAC3B,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,OAAO,EACP,KAAK,EACL,WAAW,EACX,YAAY,GACb,2BAAuB;AACxB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,2BAAuB;AACxB,YAAY,EACV,gCAAgC,EAChC,8BAA8B,EAC9B,gCAAgC,GACjC,+CAA2C;AAC5C,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,2BAAuB;AACxB,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,8BAA8B,EAC9B,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,2BAAuB;AACxB,YAAY,EAAE,qBAAqB,EAAE,wBAAoB;AACzD,OAAO,EAAE,qBAAqB,EAAE,wBAAoB"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
export type { RampsControllerActions, RampsControllerEvents, RampsControllerGetStateAction, RampsControllerMessenger, RampsControllerState, RampsControllerStateChangeEvent, } from "./RampsController.mjs";
|
|
1
|
+
export type { RampsControllerActions, RampsControllerEvents, RampsControllerGetStateAction, RampsControllerMessenger, RampsControllerState, RampsControllerStateChangeEvent, RampsControllerOptions, } from "./RampsController.mjs";
|
|
2
2
|
export { RampsController, getDefaultRampsControllerState, } from "./RampsController.mjs";
|
|
3
|
-
export type { RampsServiceActions, RampsServiceEvents, RampsServiceMessenger, } from "./RampsService.mjs";
|
|
4
|
-
export { RampsService, RampsEnvironment } from "./RampsService.mjs";
|
|
5
|
-
export type { RampsServiceGetGeolocationAction } from "./RampsService-method-action-types.mjs";
|
|
3
|
+
export type { RampsServiceActions, RampsServiceEvents, RampsServiceMessenger, Country, State, Eligibility, CountryPhone, } from "./RampsService.mjs";
|
|
4
|
+
export { RampsService, RampsEnvironment, RampsApiService, RAMPS_SDK_VERSION, } from "./RampsService.mjs";
|
|
5
|
+
export type { RampsServiceGetGeolocationAction, RampsServiceGetCountriesAction, RampsServiceGetEligibilityAction, } from "./RampsService-method-action-types.mjs";
|
|
6
|
+
export type { RequestCache, RequestState, ExecuteRequestOptions, PendingRequest, } from "./RequestCache.mjs";
|
|
7
|
+
export { RequestStatus, DEFAULT_REQUEST_CACHE_TTL, DEFAULT_REQUEST_CACHE_MAX_SIZE, createCacheKey, isCacheExpired, createLoadingState, createSuccessState, createErrorState, } from "./RequestCache.mjs";
|
|
8
|
+
export type { RequestSelectorResult } from "./selectors.mjs";
|
|
9
|
+
export { createRequestSelector } from "./selectors.mjs";
|
|
6
10
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,wBAAwB,EACxB,oBAAoB,EACpB,+BAA+B,
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,wBAAwB,EACxB,oBAAoB,EACpB,+BAA+B,EAC/B,sBAAsB,GACvB,8BAA0B;AAC3B,OAAO,EACL,eAAe,EACf,8BAA8B,GAC/B,8BAA0B;AAC3B,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,OAAO,EACP,KAAK,EACL,WAAW,EACX,YAAY,GACb,2BAAuB;AACxB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,2BAAuB;AACxB,YAAY,EACV,gCAAgC,EAChC,8BAA8B,EAC9B,gCAAgC,GACjC,+CAA2C;AAC5C,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,2BAAuB;AACxB,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,8BAA8B,EAC9B,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,2BAAuB;AACxB,YAAY,EAAE,qBAAqB,EAAE,wBAAoB;AACzD,OAAO,EAAE,qBAAqB,EAAE,wBAAoB"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { RampsController, getDefaultRampsControllerState } from "./RampsController.mjs";
|
|
2
|
-
export { RampsService, RampsEnvironment } from "./RampsService.mjs";
|
|
2
|
+
export { RampsService, RampsEnvironment, RampsApiService, RAMPS_SDK_VERSION } from "./RampsService.mjs";
|
|
3
|
+
export { RequestStatus, DEFAULT_REQUEST_CACHE_TTL, DEFAULT_REQUEST_CACHE_MAX_SIZE, createCacheKey, isCacheExpired, createLoadingState, createSuccessState, createErrorState } from "./RequestCache.mjs";
|
|
4
|
+
export { createRequestSelector } from "./selectors.mjs";
|
|
3
5
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,eAAe,EACf,8BAA8B,EAC/B,8BAA0B;AAU3B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,2BAAuB;AAYxB,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,8BAA8B,EAC9B,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EACjB,2BAAuB;AAExB,OAAO,EAAE,qBAAqB,EAAE,wBAAoB","sourcesContent":["export type {\n RampsControllerActions,\n RampsControllerEvents,\n RampsControllerGetStateAction,\n RampsControllerMessenger,\n RampsControllerState,\n RampsControllerStateChangeEvent,\n RampsControllerOptions,\n} from './RampsController';\nexport {\n RampsController,\n getDefaultRampsControllerState,\n} from './RampsController';\nexport type {\n RampsServiceActions,\n RampsServiceEvents,\n RampsServiceMessenger,\n Country,\n State,\n Eligibility,\n CountryPhone,\n} from './RampsService';\nexport {\n RampsService,\n RampsEnvironment,\n RampsApiService,\n RAMPS_SDK_VERSION,\n} from './RampsService';\nexport type {\n RampsServiceGetGeolocationAction,\n RampsServiceGetCountriesAction,\n RampsServiceGetEligibilityAction,\n} from './RampsService-method-action-types';\nexport type {\n RequestCache,\n RequestState,\n ExecuteRequestOptions,\n PendingRequest,\n} from './RequestCache';\nexport {\n RequestStatus,\n DEFAULT_REQUEST_CACHE_TTL,\n DEFAULT_REQUEST_CACHE_MAX_SIZE,\n createCacheKey,\n isCacheExpired,\n createLoadingState,\n createSuccessState,\n createErrorState,\n} from './RequestCache';\nexport type { RequestSelectorResult } from './selectors';\nexport { createRequestSelector } from './selectors';\n"]}
|