@a-cube-io/ereceipts-js-sdk 1.0.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/LICENSE +41 -0
- package/README.md +444 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/auth-D6UEILKY.cjs +56 -0
- package/dist/auth-D6UEILKY.cjs.map +1 -0
- package/dist/auth-RZRIC4PK.js +7 -0
- package/dist/auth-RZRIC4PK.js.map +1 -0
- package/dist/chunk-24ZJ6SNG.cjs +624 -0
- package/dist/chunk-24ZJ6SNG.cjs.map +1 -0
- package/dist/chunk-C3YEL4ED.js +511 -0
- package/dist/chunk-C3YEL4ED.js.map +1 -0
- package/dist/chunk-K65HAAAO.js +44 -0
- package/dist/chunk-K65HAAAO.js.map +1 -0
- package/dist/chunk-NARXAXFL.cjs +215 -0
- package/dist/chunk-NARXAXFL.cjs.map +1 -0
- package/dist/chunk-UBEIMFLN.js +209 -0
- package/dist/chunk-UBEIMFLN.js.map +1 -0
- package/dist/chunk-UVUWF5FV.cjs +3964 -0
- package/dist/chunk-UVUWF5FV.cjs.map +1 -0
- package/dist/chunk-UXVFQRZK.cjs +533 -0
- package/dist/chunk-UXVFQRZK.cjs.map +1 -0
- package/dist/chunk-VDHN3FKS.js +3929 -0
- package/dist/chunk-VDHN3FKS.js.map +1 -0
- package/dist/chunk-XQKCXG4I.cjs +52 -0
- package/dist/chunk-XQKCXG4I.cjs.map +1 -0
- package/dist/chunk-YX3PJ4FC.js +590 -0
- package/dist/chunk-YX3PJ4FC.js.map +1 -0
- package/dist/client-WPBRHPKX.cjs +31 -0
- package/dist/client-WPBRHPKX.cjs.map +1 -0
- package/dist/client-Z2LXQJMF.js +6 -0
- package/dist/client-Z2LXQJMF.js.map +1 -0
- package/dist/index.cjs +1326 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +960 -0
- package/dist/index.d.ts +960 -0
- package/dist/index.js +1065 -0
- package/dist/index.js.map +1 -0
- package/dist/metafile-cjs.json +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/queue-D7PJ536B.js +4 -0
- package/dist/queue-D7PJ536B.js.map +1 -0
- package/dist/queue-JHWXWX2B.cjs +13 -0
- package/dist/queue-JHWXWX2B.cjs.map +1 -0
- package/dist/token-3CIX4E64.cjs +13 -0
- package/dist/token-3CIX4E64.cjs.map +1 -0
- package/dist/token-4OAGWTVG.js +4 -0
- package/dist/token-4OAGWTVG.js.map +1 -0
- package/openapi.yaml +2732 -0
- package/package.json +115 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/validation.ts","../src/api/auth.ts"],"names":["validateEmail","email","errors","trim","push","field","message","code","emailRegex","test","isValid","length","validatePassword","password","validateFiscalId","fiscalId","fiscalIdRegex","validateZipCode","zipCode","zipCodeRegex","validateProvinceCode","province","provinceRegex","toUpperCase","validateAddress","address","street_address","city","zipValidation","zip_code","provinceValidation","validateReceiptItem","item","quantity","quantityRegex","description","unit_price","priceRegex","validateMoneyAmount","amount","fieldName","required","amountRegex","combineValidationResults","results","allErrors","flatMap","result","validateRequired","value","undefined","AuthenticationError","Error","status","name","validateLoginCredentials","emailValidation","passwordValidation","loginProvider","authLogger","info","validation","error","authFailure","client","getAPIClient","response","post","MF1_PATHS","LOGIN","username","grant_type","headers","tokenData","access_token","data","token_type","expires_in","SecureTokenStorage","storeToken","storeUserInfo","authSuccess","authError","detail","loginMerchant","loginCashier","logout","removeToken","processOfflineQueue","isAuthenticated","token","getToken","isTokenValid","getCurrentUser","getUserEmail","role","getUserRole","refreshToken","warn","getAuthHeaders","Authorization","hasRole","userRole"],"mappings":"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","file":"chunk-C3YEL4ED.js","sourcesContent":["// Input validation utilities for A-Cube SDK\n\nexport interface ValidationError {\n field: string;\n message: string;\n code: string;\n}\n\nexport interface ValidationResult {\n isValid: boolean;\n errors: ValidationError[];\n}\n\n/**\n * Email validation\n */\nexport const validateEmail = (email: string): ValidationResult => {\n const errors: ValidationError[] = [];\n \n if (!email || email.trim() === '') {\n errors.push({\n field: 'email',\n message: 'Email is required',\n code: 'EMAIL_REQUIRED'\n });\n } else {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n errors.push({\n field: 'email',\n message: 'Invalid email format',\n code: 'EMAIL_INVALID'\n });\n }\n }\n \n return {\n isValid: errors.length === 0,\n errors\n };\n};\n\n/**\n * Password validation (A-Cube requirements)\n */\nexport const validatePassword = (password: string): ValidationResult => {\n const errors: ValidationError[] = [];\n \n if (!password) {\n errors.push({\n field: 'password',\n message: 'Password is required',\n code: 'PASSWORD_REQUIRED'\n });\n return { isValid: false, errors };\n }\n \n // Minimum length\n if (password.length < 8) {\n errors.push({\n field: 'password',\n message: 'Password must be at least 8 characters long',\n code: 'PASSWORD_TOO_SHORT'\n });\n }\n \n // Maximum length\n if (password.length > 40) {\n errors.push({\n field: 'password',\n message: 'Password must not exceed 40 characters',\n code: 'PASSWORD_TOO_LONG'\n });\n }\n \n // Must contain uppercase letter\n if (!/[A-Z]/.test(password)) {\n errors.push({\n field: 'password',\n message: 'Password must contain at least one uppercase letter',\n code: 'PASSWORD_NO_UPPERCASE'\n });\n }\n \n // Must contain lowercase letter\n if (!/[a-z]/.test(password)) {\n errors.push({\n field: 'password',\n message: 'Password must contain at least one lowercase letter',\n code: 'PASSWORD_NO_LOWERCASE'\n });\n }\n \n // Must contain digit\n if (!/[0-9]/.test(password)) {\n errors.push({\n field: 'password',\n message: 'Password must contain at least one digit',\n code: 'PASSWORD_NO_DIGIT'\n });\n }\n \n // Must contain special character\n if (!/[!@#$%^&*]/.test(password)) {\n errors.push({\n field: 'password',\n message: 'Password must contain at least one special character (!@#$%^&*)',\n code: 'PASSWORD_NO_SPECIAL'\n });\n }\n \n return {\n isValid: errors.length === 0,\n errors\n };\n};\n\n/**\n * Italian fiscal ID validation (Partita IVA)\n */\nexport const validateFiscalId = (fiscalId: string): ValidationResult => {\n const errors: ValidationError[] = [];\n \n if (!fiscalId || fiscalId.trim() === '') {\n errors.push({\n field: 'fiscal_id',\n message: 'Fiscal ID is required',\n code: 'FISCAL_ID_REQUIRED'\n });\n } else {\n // Must be exactly 11 digits\n const fiscalIdRegex = /^\\d{11}$/;\n if (!fiscalIdRegex.test(fiscalId)) {\n errors.push({\n field: 'fiscal_id',\n message: 'Fiscal ID must be exactly 11 digits',\n code: 'FISCAL_ID_INVALID'\n });\n }\n }\n \n return {\n isValid: errors.length === 0,\n errors\n };\n};\n\n/**\n * Italian postal code validation\n */\nexport const validateZipCode = (zipCode: string): ValidationResult => {\n const errors: ValidationError[] = [];\n \n if (!zipCode || zipCode.trim() === '') {\n errors.push({\n field: 'zip_code',\n message: 'ZIP code is required',\n code: 'ZIP_CODE_REQUIRED'\n });\n } else {\n // Must be exactly 5 digits\n const zipCodeRegex = /^\\d{5}$/;\n if (!zipCodeRegex.test(zipCode)) {\n errors.push({\n field: 'zip_code',\n message: 'ZIP code must be exactly 5 digits',\n code: 'ZIP_CODE_INVALID'\n });\n }\n }\n \n return {\n isValid: errors.length === 0,\n errors\n };\n};\n\n/**\n * Italian province code validation\n */\nexport const validateProvinceCode = (province: string): ValidationResult => {\n const errors: ValidationError[] = [];\n \n if (!province || province.trim() === '') {\n errors.push({\n field: 'province',\n message: 'Province code is required',\n code: 'PROVINCE_REQUIRED'\n });\n } else {\n // Must be exactly 2 letters\n const provinceRegex = /^[A-Z]{2}$/;\n if (!provinceRegex.test(province.toUpperCase())) {\n errors.push({\n field: 'province',\n message: 'Province code must be exactly 2 letters',\n code: 'PROVINCE_INVALID'\n });\n }\n }\n \n return {\n isValid: errors.length === 0,\n errors\n };\n};\n\n/**\n * Address validation\n */\nexport const validateAddress = (address: {\n street_address: string;\n zip_code: string;\n city: string;\n province: string;\n}): ValidationResult => {\n const errors: ValidationError[] = [];\n \n // Street address\n if (!address.street_address || address.street_address.trim() === '') {\n errors.push({\n field: 'street_address',\n message: 'Street address is required',\n code: 'STREET_ADDRESS_REQUIRED'\n });\n }\n \n // City\n if (!address.city || address.city.trim() === '') {\n errors.push({\n field: 'city',\n message: 'City is required',\n code: 'CITY_REQUIRED'\n });\n }\n \n // ZIP code\n const zipValidation = validateZipCode(address.zip_code);\n errors.push(...zipValidation.errors);\n \n // Province\n const provinceValidation = validateProvinceCode(address.province);\n errors.push(...provinceValidation.errors);\n \n return {\n isValid: errors.length === 0,\n errors\n };\n};\n\n/**\n * Receipt item validation\n */\nexport const validateReceiptItem = (item: {\n quantity: string;\n description: string;\n unit_price: string;\n}): ValidationResult => {\n const errors: ValidationError[] = [];\n \n // Quantity validation\n if (!item.quantity) {\n errors.push({\n field: 'quantity',\n message: 'Quantity is required',\n code: 'QUANTITY_REQUIRED'\n });\n } else {\n const quantityRegex = /^\\d+\\.\\d{2}$/;\n if (!quantityRegex.test(item.quantity)) {\n errors.push({\n field: 'quantity',\n message: 'Quantity must be in format X.XX (e.g., 1.00, 2.50)',\n code: 'QUANTITY_INVALID_FORMAT'\n });\n }\n }\n \n // Description validation\n if (!item.description || item.description.trim() === '') {\n errors.push({\n field: 'description',\n message: 'Description is required',\n code: 'DESCRIPTION_REQUIRED'\n });\n } else if (item.description.length > 1000) {\n errors.push({\n field: 'description',\n message: 'Description must not exceed 1000 characters',\n code: 'DESCRIPTION_TOO_LONG'\n });\n }\n \n // Unit price validation\n if (!item.unit_price) {\n errors.push({\n field: 'unit_price',\n message: 'Unit price is required',\n code: 'UNIT_PRICE_REQUIRED'\n });\n } else {\n const priceRegex = /^\\d+(\\.\\d{1,8})?$/;\n if (!priceRegex.test(item.unit_price)) {\n errors.push({\n field: 'unit_price',\n message: 'Unit price must be a valid decimal number with up to 8 decimal places',\n code: 'UNIT_PRICE_INVALID_FORMAT'\n });\n }\n }\n \n return {\n isValid: errors.length === 0,\n errors\n };\n};\n\n/**\n * Money amount validation (for payments, discounts, etc.)\n */\nexport const validateMoneyAmount = (\n amount: string,\n fieldName: string,\n required: boolean = false\n): ValidationResult => {\n const errors: ValidationError[] = [];\n \n if (!amount || amount.trim() === '') {\n if (required) {\n errors.push({\n field: fieldName,\n message: `${fieldName} is required`,\n code: `${fieldName.toUpperCase()}_REQUIRED`\n });\n }\n } else {\n const amountRegex = /^\\d+(\\.\\d{2,8})?$/;\n if (!amountRegex.test(amount)) {\n errors.push({\n field: fieldName,\n message: `${fieldName} must be a valid decimal number with 2-8 decimal places`,\n code: `${fieldName.toUpperCase()}_INVALID_FORMAT`\n });\n }\n }\n \n return {\n isValid: errors.length === 0,\n errors\n };\n};\n\n/**\n * Combine multiple validation results\n */\nexport const combineValidationResults = (...results: ValidationResult[]): ValidationResult => {\n const allErrors = results.flatMap(result => result.errors);\n \n return {\n isValid: allErrors.length === 0,\n errors: allErrors\n };\n};\n\n/**\n * Generic field validation\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const validateRequired = (value: any, fieldName: string): ValidationResult => {\n if (value === null || value === undefined || value === '') {\n return {\n isValid: false,\n errors: [{\n field: fieldName,\n message: `${fieldName} is required`,\n code: `${fieldName.toUpperCase()}_REQUIRED`\n }]\n };\n }\n \n return { isValid: true, errors: [] };\n};","import { getAPIClient } from './client';\nimport { SecureTokenStorage } from '../storage/token';\nimport { MF1_PATHS } from '../constants/endpoints';\nimport { AuthToken } from './types.generated';\nimport { ValidationResult, validateEmail, validatePassword } from '../utils/validation';\nimport { authLogger } from '../utils/logger';\n\nexport interface LoginResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n}\n\nexport class AuthenticationError extends Error {\n constructor(\n message: string,\n public code: string,\n public status?: number\n ) {\n super(message);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Validate login credentials\n */\nexport const validateLoginCredentials = (email: string, password: string): ValidationResult => {\n const emailValidation = validateEmail(email);\n const passwordValidation = validatePassword(password);\n \n return {\n isValid: emailValidation.isValid && passwordValidation.isValid,\n errors: [...emailValidation.errors, ...passwordValidation.errors],\n };\n};\n\n/**\n * Login as Provider (MF2 system)\n */\nexport const loginProvider = async (email: string, password: string): Promise<AuthToken> => {\n authLogger.info('Attempting provider login', { email });\n \n // Validate credentials\n const validation = validateLoginCredentials(email, password);\n if (!validation.isValid) {\n const error = new AuthenticationError(\n 'Invalid credentials format',\n 'INVALID_CREDENTIALS_FORMAT'\n );\n authLogger.authFailure('provider', error);\n throw error;\n }\n\n try {\n const client = getAPIClient();\n const response = await client.post<LoginResponse>(MF1_PATHS.LOGIN, {\n username: email, // OAuth2 password flow uses 'username' field\n password,\n grant_type: 'password',\n }, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n\n const tokenData: AuthToken = {\n access_token: response.data.access_token,\n token_type: response.data.token_type,\n expires_in: response.data.expires_in,\n };\n\n // Store token securely\n await SecureTokenStorage.storeToken(tokenData);\n await SecureTokenStorage.storeUserInfo(tokenData.access_token);\n\n authLogger.authSuccess('provider', { email });\n return tokenData;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const authError = new AuthenticationError(\n error.response?.data?.detail || 'Login failed',\n 'LOGIN_FAILED',\n error.response?.status\n );\n \n authLogger.authFailure('provider', authError);\n throw authError;\n }\n};\n\n/**\n * Login as Merchant (MF1 system)\n */\nexport const loginMerchant = async (email: string, password: string): Promise<AuthToken> => {\n authLogger.info('Attempting merchant login', { email });\n \n // Validate credentials\n const validation = validateLoginCredentials(email, password);\n if (!validation.isValid) {\n const error = new AuthenticationError(\n 'Invalid credentials format',\n 'INVALID_CREDENTIALS_FORMAT'\n );\n authLogger.authFailure('merchant', error);\n throw error;\n }\n\n try {\n const client = getAPIClient();\n const response = await client.post<LoginResponse>(MF1_PATHS.LOGIN, {\n username: email, // OAuth2 password flow uses 'username' field\n password,\n grant_type: 'password',\n }, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n\n const tokenData: AuthToken = {\n access_token: response.data.access_token,\n token_type: response.data.token_type,\n expires_in: response.data.expires_in,\n };\n\n // Store token securely\n await SecureTokenStorage.storeToken(tokenData);\n await SecureTokenStorage.storeUserInfo(tokenData.access_token);\n\n authLogger.authSuccess('merchant', { email });\n return tokenData;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const authError = new AuthenticationError(\n error.response?.data?.detail || 'Login failed',\n 'LOGIN_FAILED',\n error.response?.status\n );\n \n authLogger.authFailure('merchant', authError);\n throw authError;\n }\n};\n\n/**\n * Login as Cashier (MF1 system)\n */\nexport const loginCashier = async (email: string, password: string): Promise<AuthToken> => {\n authLogger.info('Attempting cashier login', { email });\n \n // Validate credentials\n const validation = validateLoginCredentials(email, password);\n if (!validation.isValid) {\n const error = new AuthenticationError(\n 'Invalid credentials format',\n 'INVALID_CREDENTIALS_FORMAT'\n );\n authLogger.authFailure('cashier', error);\n throw error;\n }\n\n try {\n const client = getAPIClient();\n const response = await client.post<LoginResponse>(MF1_PATHS.LOGIN, {\n username: email, // OAuth2 password flow uses 'username' field\n password,\n grant_type: 'password',\n }, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n\n const tokenData: AuthToken = {\n access_token: response.data.access_token,\n token_type: response.data.token_type,\n expires_in: response.data.expires_in,\n };\n\n // Store token securely\n await SecureTokenStorage.storeToken(tokenData);\n await SecureTokenStorage.storeUserInfo(tokenData.access_token);\n\n authLogger.authSuccess('cashier', { email });\n return tokenData;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const authError = new AuthenticationError(\n error.response?.data?.detail || 'Login failed',\n 'LOGIN_FAILED',\n error.response?.status\n );\n \n authLogger.authFailure('cashier', authError);\n throw authError;\n }\n};\n\n/**\n * Logout user and clear all authentication data\n */\nexport const logout = async (): Promise<void> => {\n authLogger.info('Logging out user');\n \n try {\n // Clear all stored authentication data\n await SecureTokenStorage.removeToken();\n \n // Process any pending offline requests before logout\n const client = getAPIClient();\n await client.processOfflineQueue();\n \n authLogger.info('Logout successful');\n } catch (error) {\n authLogger.error('Error during logout', error);\n // Still clear token even if other operations fail\n await SecureTokenStorage.removeToken();\n }\n};\n\n/**\n * Check if user is currently authenticated\n */\nexport const isAuthenticated = async (): Promise<boolean> => {\n try {\n const token = await SecureTokenStorage.getToken();\n if (!token) {\n return false;\n }\n\n const isValid = await SecureTokenStorage.isTokenValid();\n if (!isValid) {\n // Clean up expired token\n await SecureTokenStorage.removeToken();\n return false;\n }\n\n return true;\n } catch (error) {\n authLogger.error('Error checking authentication status', error);\n return false;\n }\n};\n\n/**\n * Get current user information from stored token\n */\nexport const getCurrentUser = async (): Promise<{\n email: string;\n role: string;\n} | null> => {\n try {\n const email = await SecureTokenStorage.getUserEmail();\n const role = await SecureTokenStorage.getUserRole();\n \n if (!email || !role) {\n return null;\n }\n\n return { email, role };\n } catch (error) {\n authLogger.error('Error getting current user', error);\n return null;\n }\n};\n\n/**\n * Refresh authentication token (if refresh token is available)\n */\nexport const refreshToken = async (): Promise<AuthToken | null> => {\n authLogger.info('Attempting to refresh token');\n \n try {\n // Note: The current API spec doesn't show refresh token endpoint\n // This is a placeholder for future implementation\n \n // For now, we'll check if current token is still valid\n const isValid = await SecureTokenStorage.isTokenValid();\n if (isValid) {\n const token = await SecureTokenStorage.getToken();\n if (token) {\n return {\n access_token: token,\n token_type: 'Bearer',\n };\n }\n }\n\n authLogger.warn('Token refresh not available, user needs to re-login');\n return null;\n } catch (error) {\n authLogger.error('Token refresh failed', error);\n return null;\n }\n};\n\n/**\n * Get authentication headers for API requests\n */\nexport const getAuthHeaders = async (): Promise<Record<string, string>> => {\n const token = await SecureTokenStorage.getToken();\n \n if (!token || !await SecureTokenStorage.isTokenValid()) {\n return {};\n }\n\n return {\n Authorization: `Bearer ${token}`,\n };\n};\n\n/**\n * Check if current user has specific role\n */\nexport const hasRole = async (role: string): Promise<boolean> => {\n try {\n const userRole = await SecureTokenStorage.getUserRole();\n return userRole === role;\n } catch (error) {\n authLogger.error('Error checking user role', error);\n return false;\n }\n};"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* A-Cube SDK - Professional TypeScript SDK for Italian e-receipt system */
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
10
|
+
|
|
11
|
+
// src/constants/keys.ts
|
|
12
|
+
var STORAGE_KEYS = {
|
|
13
|
+
// Authentication tokens
|
|
14
|
+
ACCESS_TOKEN: "acube_access_token",
|
|
15
|
+
REFRESH_TOKEN: "acube_refresh_token",
|
|
16
|
+
TOKEN_EXPIRY: "acube_token_expiry",
|
|
17
|
+
USER_ROLE: "acube_user_role",
|
|
18
|
+
USER_EMAIL: "acube_user_email",
|
|
19
|
+
// mTLS Certificates (stored securely)
|
|
20
|
+
MTLS_CERTIFICATE_PREFIX: "acube_mtls_cert_",
|
|
21
|
+
MTLS_PRIVATE_KEY_PREFIX: "acube_mtls_key_",
|
|
22
|
+
// Offline queue
|
|
23
|
+
FAILED_REQUESTS_QUEUE: "acube_failed_requests",
|
|
24
|
+
LAST_SYNC_TIMESTAMP: "acube_last_sync",
|
|
25
|
+
// User preferences
|
|
26
|
+
ENVIRONMENT: "acube_environment",
|
|
27
|
+
BASE_URL: "acube_base_url",
|
|
28
|
+
// Onboarding state
|
|
29
|
+
ONBOARDING_STEP: "acube_onboarding_step",
|
|
30
|
+
MERCHANT_UUID: "acube_merchant_uuid",
|
|
31
|
+
CURRENT_POS_SERIAL: "acube_current_pos_serial"
|
|
32
|
+
};
|
|
33
|
+
var SECURE_KEYS = /* @__PURE__ */ new Set([
|
|
34
|
+
STORAGE_KEYS.ACCESS_TOKEN,
|
|
35
|
+
STORAGE_KEYS.REFRESH_TOKEN,
|
|
36
|
+
STORAGE_KEYS.MTLS_CERTIFICATE_PREFIX,
|
|
37
|
+
STORAGE_KEYS.MTLS_PRIVATE_KEY_PREFIX
|
|
38
|
+
]);
|
|
39
|
+
var getMTLSCertificateKey = /* @__PURE__ */ __name((uuid) => `${STORAGE_KEYS.MTLS_CERTIFICATE_PREFIX}${uuid}`, "getMTLSCertificateKey");
|
|
40
|
+
var getMTLSPrivateKeyKey = /* @__PURE__ */ __name((uuid) => `${STORAGE_KEYS.MTLS_PRIVATE_KEY_PREFIX}${uuid}`, "getMTLSPrivateKeyKey");
|
|
41
|
+
|
|
42
|
+
export { SECURE_KEYS, STORAGE_KEYS, __export, __name, __publicField, getMTLSCertificateKey, getMTLSPrivateKeyKey };
|
|
43
|
+
//# sourceMappingURL=chunk-K65HAAAO.js.map
|
|
44
|
+
//# sourceMappingURL=chunk-K65HAAAO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants/keys.ts"],"names":["STORAGE_KEYS","ACCESS_TOKEN","REFRESH_TOKEN","TOKEN_EXPIRY","USER_ROLE","USER_EMAIL","MTLS_CERTIFICATE_PREFIX","MTLS_PRIVATE_KEY_PREFIX","FAILED_REQUESTS_QUEUE","LAST_SYNC_TIMESTAMP","ENVIRONMENT","BASE_URL","ONBOARDING_STEP","MERCHANT_UUID","CURRENT_POS_SERIAL","SECURE_KEYS","Set","getMTLSCertificateKey","uuid","getMTLSPrivateKeyKey"],"mappings":";;;;;;;;;;;AACO,IAAMA,YAAAA,GAAe;;EAE1BC,YAAAA,EAAc,oBAAA;EACdC,aAAAA,EAAe,qBAAA;EACfC,YAAAA,EAAc,oBAAA;EACdC,SAAAA,EAAW,iBAAA;EACXC,UAAAA,EAAY,kBAAA;;EAGZC,uBAAAA,EAAyB,kBAAA;EACzBC,uBAAAA,EAAyB,iBAAA;;EAGzBC,qBAAAA,EAAuB,uBAAA;EACvBC,mBAAAA,EAAqB,iBAAA;;EAGrBC,WAAAA,EAAa,mBAAA;EACbC,QAAAA,EAAU,gBAAA;;EAGVC,eAAAA,EAAiB,uBAAA;EACjBC,aAAAA,EAAe,qBAAA;EACfC,kBAAAA,EAAoB;AACtB;AAWO,IAAMC,WAAAA,uBAAkBC,GAAAA,CAAI;EACjChB,YAAAA,CAAaC,YAAAA;EACbD,YAAAA,CAAaE,aAAAA;EACbF,YAAAA,CAAaM,uBAAAA;EACbN,YAAAA,CAAaO;AACd,CAAA;AAEM,IAAMU,qBAAAA,2BAAyBC,IAAAA,KACpC,CAAA,EAAGlB,aAAaM,uBAAuB,CAAA,EAAGY,IAAAA,CAAAA,CAAAA,EADP,uBAAA;AAG9B,IAAMC,oBAAAA,2BAAwBD,IAAAA,KACnC,CAAA,EAAGlB,aAAaO,uBAAuB,CAAA,EAAGW,IAAAA,CAAAA,CAAAA,EADR,sBAAA","file":"chunk-K65HAAAO.js","sourcesContent":["// Storage keys for AsyncStorage and SecureStore\nexport const STORAGE_KEYS = {\n // Authentication tokens\n ACCESS_TOKEN: 'acube_access_token',\n REFRESH_TOKEN: 'acube_refresh_token',\n TOKEN_EXPIRY: 'acube_token_expiry',\n USER_ROLE: 'acube_user_role',\n USER_EMAIL: 'acube_user_email',\n \n // mTLS Certificates (stored securely)\n MTLS_CERTIFICATE_PREFIX: 'acube_mtls_cert_',\n MTLS_PRIVATE_KEY_PREFIX: 'acube_mtls_key_',\n \n // Offline queue\n FAILED_REQUESTS_QUEUE: 'acube_failed_requests',\n LAST_SYNC_TIMESTAMP: 'acube_last_sync',\n \n // User preferences\n ENVIRONMENT: 'acube_environment',\n BASE_URL: 'acube_base_url',\n \n // Onboarding state\n ONBOARDING_STEP: 'acube_onboarding_step',\n MERCHANT_UUID: 'acube_merchant_uuid',\n CURRENT_POS_SERIAL: 'acube_current_pos_serial',\n} as const;\n\n// Security levels for different types of data\nexport const SECURITY_LEVELS = {\n // Use regular AsyncStorage for non-sensitive data\n REGULAR: 'regular',\n // Use SecureStore/Keychain for sensitive data\n SECURE: 'secure',\n} as const;\n\n// Define which keys require secure storage\nexport const SECURE_KEYS = new Set([\n STORAGE_KEYS.ACCESS_TOKEN,\n STORAGE_KEYS.REFRESH_TOKEN,\n STORAGE_KEYS.MTLS_CERTIFICATE_PREFIX,\n STORAGE_KEYS.MTLS_PRIVATE_KEY_PREFIX,\n]);\n\nexport const getMTLSCertificateKey = (uuid: string): string => \n `${STORAGE_KEYS.MTLS_CERTIFICATE_PREFIX}${uuid}`;\n\nexport const getMTLSPrivateKeyKey = (uuid: string): string => \n `${STORAGE_KEYS.MTLS_PRIVATE_KEY_PREFIX}${uuid}`;\n\nexport type StorageKey = typeof STORAGE_KEYS[keyof typeof STORAGE_KEYS];\nexport type SecurityLevel = typeof SECURITY_LEVELS[keyof typeof SECURITY_LEVELS];"]}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkXQKCXG4I_cjs = require('./chunk-XQKCXG4I.cjs');
|
|
4
|
+
var AsyncStorage = require('@react-native-async-storage/async-storage');
|
|
5
|
+
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var AsyncStorage__default = /*#__PURE__*/_interopDefault(AsyncStorage);
|
|
9
|
+
|
|
10
|
+
/* A-Cube SDK - Professional TypeScript SDK for Italian e-receipt system */
|
|
11
|
+
var _RequestQueue = class _RequestQueue {
|
|
12
|
+
/**
|
|
13
|
+
* Add a failed request to the queue
|
|
14
|
+
*/
|
|
15
|
+
static async enqueueRequest(config, priority = "medium", maxRetries = this.DEFAULT_MAX_RETRIES) {
|
|
16
|
+
try {
|
|
17
|
+
const queue = await this.getQueue();
|
|
18
|
+
const queuedRequest = {
|
|
19
|
+
id: this.generateRequestId(),
|
|
20
|
+
config: {
|
|
21
|
+
...config,
|
|
22
|
+
// Remove sensitive headers that might have expired
|
|
23
|
+
headers: this.sanitizeHeaders(config.headers ?? {})
|
|
24
|
+
},
|
|
25
|
+
timestamp: Date.now(),
|
|
26
|
+
retryCount: 0,
|
|
27
|
+
maxRetries,
|
|
28
|
+
priority
|
|
29
|
+
};
|
|
30
|
+
if (priority === "high") {
|
|
31
|
+
queue.unshift(queuedRequest);
|
|
32
|
+
} else {
|
|
33
|
+
queue.push(queuedRequest);
|
|
34
|
+
}
|
|
35
|
+
if (queue.length > this.MAX_QUEUE_SIZE) {
|
|
36
|
+
queue.splice(this.MAX_QUEUE_SIZE);
|
|
37
|
+
}
|
|
38
|
+
await this.saveQueue(queue);
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.warn("Failed to enqueue request:", error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get all queued requests
|
|
45
|
+
*/
|
|
46
|
+
static async getQueue() {
|
|
47
|
+
try {
|
|
48
|
+
const queueData = await AsyncStorage__default.default.getItem(chunkXQKCXG4I_cjs.STORAGE_KEYS.FAILED_REQUESTS_QUEUE);
|
|
49
|
+
return queueData ? JSON.parse(queueData) : [];
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.warn("Failed to get request queue:", error);
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Save queue to storage
|
|
57
|
+
*/
|
|
58
|
+
static async saveQueue(queue) {
|
|
59
|
+
try {
|
|
60
|
+
await AsyncStorage__default.default.setItem(chunkXQKCXG4I_cjs.STORAGE_KEYS.FAILED_REQUESTS_QUEUE, JSON.stringify(queue));
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.warn("Failed to save request queue:", error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Remove a request from the queue
|
|
67
|
+
*/
|
|
68
|
+
static async removeRequest(requestId) {
|
|
69
|
+
try {
|
|
70
|
+
const queue = await this.getQueue();
|
|
71
|
+
const filteredQueue = queue.filter((req) => req.id !== requestId);
|
|
72
|
+
await this.saveQueue(filteredQueue);
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.warn("Failed to remove request from queue:", error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the next request to retry (sorted by priority and timestamp)
|
|
79
|
+
*/
|
|
80
|
+
static async getNextRequest() {
|
|
81
|
+
try {
|
|
82
|
+
const queue = await this.getQueue();
|
|
83
|
+
if (queue.length === 0) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
const sortedQueue = queue.sort((a, b) => {
|
|
87
|
+
const priorityOrder = {
|
|
88
|
+
high: 3,
|
|
89
|
+
medium: 2,
|
|
90
|
+
low: 1
|
|
91
|
+
};
|
|
92
|
+
const priorityDiff = priorityOrder[b.priority] - priorityOrder[a.priority];
|
|
93
|
+
if (priorityDiff !== 0) {
|
|
94
|
+
return priorityDiff;
|
|
95
|
+
}
|
|
96
|
+
return a.timestamp - b.timestamp;
|
|
97
|
+
});
|
|
98
|
+
return sortedQueue[0];
|
|
99
|
+
} catch (error) {
|
|
100
|
+
console.warn("Failed to get next request:", error);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Increment retry count for a request
|
|
106
|
+
*/
|
|
107
|
+
static async incrementRetryCount(requestId) {
|
|
108
|
+
try {
|
|
109
|
+
const queue = await this.getQueue();
|
|
110
|
+
const requestIndex = queue.findIndex((req) => req.id === requestId);
|
|
111
|
+
if (requestIndex !== -1) {
|
|
112
|
+
queue[requestIndex].retryCount += 1;
|
|
113
|
+
await this.saveQueue(queue);
|
|
114
|
+
}
|
|
115
|
+
} catch (error) {
|
|
116
|
+
console.warn("Failed to increment retry count:", error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Remove requests that have exceeded max retries
|
|
121
|
+
*/
|
|
122
|
+
static async cleanupExpiredRequests() {
|
|
123
|
+
try {
|
|
124
|
+
const queue = await this.getQueue();
|
|
125
|
+
const validRequests = queue.filter((req) => req.retryCount < req.maxRetries);
|
|
126
|
+
if (validRequests.length !== queue.length) {
|
|
127
|
+
await this.saveQueue(validRequests);
|
|
128
|
+
}
|
|
129
|
+
} catch (error) {
|
|
130
|
+
console.warn("Failed to cleanup expired requests:", error);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Clear the entire queue
|
|
135
|
+
*/
|
|
136
|
+
static async clearQueue() {
|
|
137
|
+
try {
|
|
138
|
+
await AsyncStorage__default.default.removeItem(chunkXQKCXG4I_cjs.STORAGE_KEYS.FAILED_REQUESTS_QUEUE);
|
|
139
|
+
} catch (error) {
|
|
140
|
+
console.warn("Failed to clear request queue:", error);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get queue statistics
|
|
145
|
+
*/
|
|
146
|
+
static async getQueueStats() {
|
|
147
|
+
try {
|
|
148
|
+
const queue = await this.getQueue();
|
|
149
|
+
const stats = {
|
|
150
|
+
total: queue.length,
|
|
151
|
+
byPriority: {
|
|
152
|
+
high: 0,
|
|
153
|
+
medium: 0,
|
|
154
|
+
low: 0
|
|
155
|
+
},
|
|
156
|
+
oldestTimestamp: void 0,
|
|
157
|
+
newestTimestamp: void 0
|
|
158
|
+
};
|
|
159
|
+
if (queue.length > 0) {
|
|
160
|
+
stats.oldestTimestamp = Math.min(...queue.map((req) => req.timestamp));
|
|
161
|
+
stats.newestTimestamp = Math.max(...queue.map((req) => req.timestamp));
|
|
162
|
+
queue.forEach((req) => {
|
|
163
|
+
stats.byPriority[req.priority] += 1;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return stats;
|
|
167
|
+
} catch (error) {
|
|
168
|
+
console.warn("Failed to get queue stats:", error);
|
|
169
|
+
return {
|
|
170
|
+
total: 0,
|
|
171
|
+
byPriority: {
|
|
172
|
+
high: 0,
|
|
173
|
+
medium: 0,
|
|
174
|
+
low: 0
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Generate a unique request ID
|
|
181
|
+
*/
|
|
182
|
+
static generateRequestId() {
|
|
183
|
+
return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Sanitize headers to remove potentially expired tokens
|
|
187
|
+
*/
|
|
188
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
189
|
+
static sanitizeHeaders(headers) {
|
|
190
|
+
const sanitized = {
|
|
191
|
+
...headers
|
|
192
|
+
};
|
|
193
|
+
delete sanitized.Authorization;
|
|
194
|
+
delete sanitized.authorization;
|
|
195
|
+
return sanitized;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Check if a request should be retried based on error type
|
|
199
|
+
*/
|
|
200
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
201
|
+
static shouldRetryRequest(error) {
|
|
202
|
+
if (error.response?.status >= 400 && error.response?.status < 500) {
|
|
203
|
+
return error.response.status === 401;
|
|
204
|
+
}
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
chunkXQKCXG4I_cjs.__name(_RequestQueue, "RequestQueue");
|
|
209
|
+
chunkXQKCXG4I_cjs.__publicField(_RequestQueue, "MAX_QUEUE_SIZE", 100);
|
|
210
|
+
chunkXQKCXG4I_cjs.__publicField(_RequestQueue, "DEFAULT_MAX_RETRIES", 3);
|
|
211
|
+
var RequestQueue = _RequestQueue;
|
|
212
|
+
|
|
213
|
+
exports.RequestQueue = RequestQueue;
|
|
214
|
+
//# sourceMappingURL=chunk-NARXAXFL.cjs.map
|
|
215
|
+
//# sourceMappingURL=chunk-NARXAXFL.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/queue.ts"],"names":["RequestQueue","enqueueRequest","config","priority","maxRetries","DEFAULT_MAX_RETRIES","queue","getQueue","queuedRequest","id","generateRequestId","headers","sanitizeHeaders","timestamp","Date","now","retryCount","unshift","push","length","MAX_QUEUE_SIZE","splice","saveQueue","error","console","warn","queueData","AsyncStorage","getItem","STORAGE_KEYS","FAILED_REQUESTS_QUEUE","JSON","parse","setItem","stringify","removeRequest","requestId","filteredQueue","filter","req","getNextRequest","sortedQueue","sort","a","b","priorityOrder","high","medium","low","priorityDiff","incrementRetryCount","requestIndex","findIndex","cleanupExpiredRequests","validRequests","clearQueue","removeItem","getQueueStats","stats","total","byPriority","oldestTimestamp","undefined","newestTimestamp","Math","min","map","max","forEach","random","toString","substr","sanitized","Authorization","authorization","shouldRetryRequest","response","status","__publicField"],"mappings":"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","file":"chunk-NARXAXFL.cjs","sourcesContent":["import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { STORAGE_KEYS } from '../constants/keys';\nimport { AxiosRequestConfig } from 'axios';\n\nexport interface QueuedRequest {\n id: string;\n config: AxiosRequestConfig;\n timestamp: number;\n retryCount: number;\n maxRetries: number;\n priority: 'high' | 'medium' | 'low';\n}\n\nexport class RequestQueue {\n private static readonly MAX_QUEUE_SIZE = 100;\n private static readonly DEFAULT_MAX_RETRIES = 3;\n\n /**\n * Add a failed request to the queue\n */\n static async enqueueRequest(\n config: AxiosRequestConfig,\n priority: 'high' | 'medium' | 'low' = 'medium',\n maxRetries: number = this.DEFAULT_MAX_RETRIES\n ): Promise<void> {\n try {\n const queue = await this.getQueue();\n \n const queuedRequest: QueuedRequest = {\n id: this.generateRequestId(),\n config: {\n ...config,\n // Remove sensitive headers that might have expired\n headers: this.sanitizeHeaders(config.headers ?? {}),\n },\n timestamp: Date.now(),\n retryCount: 0,\n maxRetries,\n priority,\n };\n\n // Add to front of queue based on priority\n if (priority === 'high') {\n queue.unshift(queuedRequest);\n } else {\n queue.push(queuedRequest);\n }\n\n // Limit queue size\n if (queue.length > this.MAX_QUEUE_SIZE) {\n queue.splice(this.MAX_QUEUE_SIZE);\n }\n\n await this.saveQueue(queue);\n } catch (error) {\n console.warn('Failed to enqueue request:', error);\n }\n }\n\n /**\n * Get all queued requests\n */\n static async getQueue(): Promise<QueuedRequest[]> {\n try {\n const queueData = await AsyncStorage.getItem(STORAGE_KEYS.FAILED_REQUESTS_QUEUE);\n return queueData ? JSON.parse(queueData) : [];\n } catch (error) {\n console.warn('Failed to get request queue:', error);\n return [];\n }\n }\n\n /**\n * Save queue to storage\n */\n private static async saveQueue(queue: QueuedRequest[]): Promise<void> {\n try {\n await AsyncStorage.setItem(\n STORAGE_KEYS.FAILED_REQUESTS_QUEUE,\n JSON.stringify(queue)\n );\n } catch (error) {\n console.warn('Failed to save request queue:', error);\n }\n }\n\n /**\n * Remove a request from the queue\n */\n static async removeRequest(requestId: string): Promise<void> {\n try {\n const queue = await this.getQueue();\n const filteredQueue = queue.filter(req => req.id !== requestId);\n await this.saveQueue(filteredQueue);\n } catch (error) {\n console.warn('Failed to remove request from queue:', error);\n }\n }\n\n /**\n * Get the next request to retry (sorted by priority and timestamp)\n */\n static async getNextRequest(): Promise<QueuedRequest | null> {\n try {\n const queue = await this.getQueue();\n \n if (queue.length === 0) {\n return null;\n }\n\n // Sort by priority (high -> medium -> low) then by timestamp (oldest first)\n const sortedQueue = queue.sort((a, b) => {\n const priorityOrder = { high: 3, medium: 2, low: 1 };\n const priorityDiff = priorityOrder[b.priority] - priorityOrder[a.priority];\n \n if (priorityDiff !== 0) {\n return priorityDiff;\n }\n \n return a.timestamp - b.timestamp;\n });\n\n return sortedQueue[0];\n } catch (error) {\n console.warn('Failed to get next request:', error);\n return null;\n }\n }\n\n /**\n * Increment retry count for a request\n */\n static async incrementRetryCount(requestId: string): Promise<void> {\n try {\n const queue = await this.getQueue();\n const requestIndex = queue.findIndex(req => req.id === requestId);\n \n if (requestIndex !== -1) {\n queue[requestIndex].retryCount += 1;\n await this.saveQueue(queue);\n }\n } catch (error) {\n console.warn('Failed to increment retry count:', error);\n }\n }\n\n /**\n * Remove requests that have exceeded max retries\n */\n static async cleanupExpiredRequests(): Promise<void> {\n try {\n const queue = await this.getQueue();\n const validRequests = queue.filter(req => req.retryCount < req.maxRetries);\n \n if (validRequests.length !== queue.length) {\n await this.saveQueue(validRequests);\n }\n } catch (error) {\n console.warn('Failed to cleanup expired requests:', error);\n }\n }\n\n /**\n * Clear the entire queue\n */\n static async clearQueue(): Promise<void> {\n try {\n await AsyncStorage.removeItem(STORAGE_KEYS.FAILED_REQUESTS_QUEUE);\n } catch (error) {\n console.warn('Failed to clear request queue:', error);\n }\n }\n\n /**\n * Get queue statistics\n */\n static async getQueueStats(): Promise<{\n total: number;\n byPriority: { high: number; medium: number; low: number };\n oldestTimestamp?: number;\n newestTimestamp?: number;\n }> {\n try {\n const queue = await this.getQueue();\n \n const stats = {\n total: queue.length,\n byPriority: { high: 0, medium: 0, low: 0 },\n oldestTimestamp: undefined as number | undefined,\n newestTimestamp: undefined as number | undefined,\n };\n\n if (queue.length > 0) {\n stats.oldestTimestamp = Math.min(...queue.map(req => req.timestamp));\n stats.newestTimestamp = Math.max(...queue.map(req => req.timestamp));\n \n queue.forEach(req => {\n stats.byPriority[req.priority] += 1;\n });\n }\n\n return stats;\n } catch (error) {\n console.warn('Failed to get queue stats:', error);\n return {\n total: 0,\n byPriority: { high: 0, medium: 0, low: 0 },\n };\n }\n }\n\n /**\n * Generate a unique request ID\n */\n private static generateRequestId(): string {\n return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Sanitize headers to remove potentially expired tokens\n */\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static sanitizeHeaders(headers: Record<string, any>): Record<string, any> {\n const sanitized = { ...headers };\n \n // Remove Authorization header as it might be expired\n // It will be re-added when the request is retried\n delete sanitized.Authorization;\n delete sanitized.authorization;\n \n return sanitized;\n }\n\n /**\n * Check if a request should be retried based on error type\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static shouldRetryRequest(error: any): boolean {\n // Don't retry client errors (4xx) except for 401 (unauthorized)\n if (error.response?.status >= 400 && error.response?.status < 500) {\n return error.response.status === 401;\n }\n \n // Retry server errors (5xx) and network errors\n return true;\n }\n}"]}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { __name, __publicField, STORAGE_KEYS } from './chunk-K65HAAAO.js';
|
|
2
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
3
|
+
|
|
4
|
+
/* A-Cube SDK - Professional TypeScript SDK for Italian e-receipt system */
|
|
5
|
+
var _RequestQueue = class _RequestQueue {
|
|
6
|
+
/**
|
|
7
|
+
* Add a failed request to the queue
|
|
8
|
+
*/
|
|
9
|
+
static async enqueueRequest(config, priority = "medium", maxRetries = this.DEFAULT_MAX_RETRIES) {
|
|
10
|
+
try {
|
|
11
|
+
const queue = await this.getQueue();
|
|
12
|
+
const queuedRequest = {
|
|
13
|
+
id: this.generateRequestId(),
|
|
14
|
+
config: {
|
|
15
|
+
...config,
|
|
16
|
+
// Remove sensitive headers that might have expired
|
|
17
|
+
headers: this.sanitizeHeaders(config.headers ?? {})
|
|
18
|
+
},
|
|
19
|
+
timestamp: Date.now(),
|
|
20
|
+
retryCount: 0,
|
|
21
|
+
maxRetries,
|
|
22
|
+
priority
|
|
23
|
+
};
|
|
24
|
+
if (priority === "high") {
|
|
25
|
+
queue.unshift(queuedRequest);
|
|
26
|
+
} else {
|
|
27
|
+
queue.push(queuedRequest);
|
|
28
|
+
}
|
|
29
|
+
if (queue.length > this.MAX_QUEUE_SIZE) {
|
|
30
|
+
queue.splice(this.MAX_QUEUE_SIZE);
|
|
31
|
+
}
|
|
32
|
+
await this.saveQueue(queue);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.warn("Failed to enqueue request:", error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get all queued requests
|
|
39
|
+
*/
|
|
40
|
+
static async getQueue() {
|
|
41
|
+
try {
|
|
42
|
+
const queueData = await AsyncStorage.getItem(STORAGE_KEYS.FAILED_REQUESTS_QUEUE);
|
|
43
|
+
return queueData ? JSON.parse(queueData) : [];
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.warn("Failed to get request queue:", error);
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Save queue to storage
|
|
51
|
+
*/
|
|
52
|
+
static async saveQueue(queue) {
|
|
53
|
+
try {
|
|
54
|
+
await AsyncStorage.setItem(STORAGE_KEYS.FAILED_REQUESTS_QUEUE, JSON.stringify(queue));
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.warn("Failed to save request queue:", error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Remove a request from the queue
|
|
61
|
+
*/
|
|
62
|
+
static async removeRequest(requestId) {
|
|
63
|
+
try {
|
|
64
|
+
const queue = await this.getQueue();
|
|
65
|
+
const filteredQueue = queue.filter((req) => req.id !== requestId);
|
|
66
|
+
await this.saveQueue(filteredQueue);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.warn("Failed to remove request from queue:", error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get the next request to retry (sorted by priority and timestamp)
|
|
73
|
+
*/
|
|
74
|
+
static async getNextRequest() {
|
|
75
|
+
try {
|
|
76
|
+
const queue = await this.getQueue();
|
|
77
|
+
if (queue.length === 0) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
const sortedQueue = queue.sort((a, b) => {
|
|
81
|
+
const priorityOrder = {
|
|
82
|
+
high: 3,
|
|
83
|
+
medium: 2,
|
|
84
|
+
low: 1
|
|
85
|
+
};
|
|
86
|
+
const priorityDiff = priorityOrder[b.priority] - priorityOrder[a.priority];
|
|
87
|
+
if (priorityDiff !== 0) {
|
|
88
|
+
return priorityDiff;
|
|
89
|
+
}
|
|
90
|
+
return a.timestamp - b.timestamp;
|
|
91
|
+
});
|
|
92
|
+
return sortedQueue[0];
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.warn("Failed to get next request:", error);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Increment retry count for a request
|
|
100
|
+
*/
|
|
101
|
+
static async incrementRetryCount(requestId) {
|
|
102
|
+
try {
|
|
103
|
+
const queue = await this.getQueue();
|
|
104
|
+
const requestIndex = queue.findIndex((req) => req.id === requestId);
|
|
105
|
+
if (requestIndex !== -1) {
|
|
106
|
+
queue[requestIndex].retryCount += 1;
|
|
107
|
+
await this.saveQueue(queue);
|
|
108
|
+
}
|
|
109
|
+
} catch (error) {
|
|
110
|
+
console.warn("Failed to increment retry count:", error);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Remove requests that have exceeded max retries
|
|
115
|
+
*/
|
|
116
|
+
static async cleanupExpiredRequests() {
|
|
117
|
+
try {
|
|
118
|
+
const queue = await this.getQueue();
|
|
119
|
+
const validRequests = queue.filter((req) => req.retryCount < req.maxRetries);
|
|
120
|
+
if (validRequests.length !== queue.length) {
|
|
121
|
+
await this.saveQueue(validRequests);
|
|
122
|
+
}
|
|
123
|
+
} catch (error) {
|
|
124
|
+
console.warn("Failed to cleanup expired requests:", error);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Clear the entire queue
|
|
129
|
+
*/
|
|
130
|
+
static async clearQueue() {
|
|
131
|
+
try {
|
|
132
|
+
await AsyncStorage.removeItem(STORAGE_KEYS.FAILED_REQUESTS_QUEUE);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
console.warn("Failed to clear request queue:", error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get queue statistics
|
|
139
|
+
*/
|
|
140
|
+
static async getQueueStats() {
|
|
141
|
+
try {
|
|
142
|
+
const queue = await this.getQueue();
|
|
143
|
+
const stats = {
|
|
144
|
+
total: queue.length,
|
|
145
|
+
byPriority: {
|
|
146
|
+
high: 0,
|
|
147
|
+
medium: 0,
|
|
148
|
+
low: 0
|
|
149
|
+
},
|
|
150
|
+
oldestTimestamp: void 0,
|
|
151
|
+
newestTimestamp: void 0
|
|
152
|
+
};
|
|
153
|
+
if (queue.length > 0) {
|
|
154
|
+
stats.oldestTimestamp = Math.min(...queue.map((req) => req.timestamp));
|
|
155
|
+
stats.newestTimestamp = Math.max(...queue.map((req) => req.timestamp));
|
|
156
|
+
queue.forEach((req) => {
|
|
157
|
+
stats.byPriority[req.priority] += 1;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return stats;
|
|
161
|
+
} catch (error) {
|
|
162
|
+
console.warn("Failed to get queue stats:", error);
|
|
163
|
+
return {
|
|
164
|
+
total: 0,
|
|
165
|
+
byPriority: {
|
|
166
|
+
high: 0,
|
|
167
|
+
medium: 0,
|
|
168
|
+
low: 0
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Generate a unique request ID
|
|
175
|
+
*/
|
|
176
|
+
static generateRequestId() {
|
|
177
|
+
return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Sanitize headers to remove potentially expired tokens
|
|
181
|
+
*/
|
|
182
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
183
|
+
static sanitizeHeaders(headers) {
|
|
184
|
+
const sanitized = {
|
|
185
|
+
...headers
|
|
186
|
+
};
|
|
187
|
+
delete sanitized.Authorization;
|
|
188
|
+
delete sanitized.authorization;
|
|
189
|
+
return sanitized;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Check if a request should be retried based on error type
|
|
193
|
+
*/
|
|
194
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
195
|
+
static shouldRetryRequest(error) {
|
|
196
|
+
if (error.response?.status >= 400 && error.response?.status < 500) {
|
|
197
|
+
return error.response.status === 401;
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
__name(_RequestQueue, "RequestQueue");
|
|
203
|
+
__publicField(_RequestQueue, "MAX_QUEUE_SIZE", 100);
|
|
204
|
+
__publicField(_RequestQueue, "DEFAULT_MAX_RETRIES", 3);
|
|
205
|
+
var RequestQueue = _RequestQueue;
|
|
206
|
+
|
|
207
|
+
export { RequestQueue };
|
|
208
|
+
//# sourceMappingURL=chunk-UBEIMFLN.js.map
|
|
209
|
+
//# sourceMappingURL=chunk-UBEIMFLN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/queue.ts"],"names":["RequestQueue","enqueueRequest","config","priority","maxRetries","DEFAULT_MAX_RETRIES","queue","getQueue","queuedRequest","id","generateRequestId","headers","sanitizeHeaders","timestamp","Date","now","retryCount","unshift","push","length","MAX_QUEUE_SIZE","splice","saveQueue","error","console","warn","queueData","AsyncStorage","getItem","STORAGE_KEYS","FAILED_REQUESTS_QUEUE","JSON","parse","setItem","stringify","removeRequest","requestId","filteredQueue","filter","req","getNextRequest","sortedQueue","sort","a","b","priorityOrder","high","medium","low","priorityDiff","incrementRetryCount","requestIndex","findIndex","cleanupExpiredRequests","validRequests","clearQueue","removeItem","getQueueStats","stats","total","byPriority","oldestTimestamp","undefined","newestTimestamp","Math","min","map","max","forEach","random","toString","substr","sanitized","Authorization","authorization","shouldRetryRequest","response","status"],"mappings":"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","file":"chunk-UBEIMFLN.js","sourcesContent":["import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { STORAGE_KEYS } from '../constants/keys';\nimport { AxiosRequestConfig } from 'axios';\n\nexport interface QueuedRequest {\n id: string;\n config: AxiosRequestConfig;\n timestamp: number;\n retryCount: number;\n maxRetries: number;\n priority: 'high' | 'medium' | 'low';\n}\n\nexport class RequestQueue {\n private static readonly MAX_QUEUE_SIZE = 100;\n private static readonly DEFAULT_MAX_RETRIES = 3;\n\n /**\n * Add a failed request to the queue\n */\n static async enqueueRequest(\n config: AxiosRequestConfig,\n priority: 'high' | 'medium' | 'low' = 'medium',\n maxRetries: number = this.DEFAULT_MAX_RETRIES\n ): Promise<void> {\n try {\n const queue = await this.getQueue();\n \n const queuedRequest: QueuedRequest = {\n id: this.generateRequestId(),\n config: {\n ...config,\n // Remove sensitive headers that might have expired\n headers: this.sanitizeHeaders(config.headers ?? {}),\n },\n timestamp: Date.now(),\n retryCount: 0,\n maxRetries,\n priority,\n };\n\n // Add to front of queue based on priority\n if (priority === 'high') {\n queue.unshift(queuedRequest);\n } else {\n queue.push(queuedRequest);\n }\n\n // Limit queue size\n if (queue.length > this.MAX_QUEUE_SIZE) {\n queue.splice(this.MAX_QUEUE_SIZE);\n }\n\n await this.saveQueue(queue);\n } catch (error) {\n console.warn('Failed to enqueue request:', error);\n }\n }\n\n /**\n * Get all queued requests\n */\n static async getQueue(): Promise<QueuedRequest[]> {\n try {\n const queueData = await AsyncStorage.getItem(STORAGE_KEYS.FAILED_REQUESTS_QUEUE);\n return queueData ? JSON.parse(queueData) : [];\n } catch (error) {\n console.warn('Failed to get request queue:', error);\n return [];\n }\n }\n\n /**\n * Save queue to storage\n */\n private static async saveQueue(queue: QueuedRequest[]): Promise<void> {\n try {\n await AsyncStorage.setItem(\n STORAGE_KEYS.FAILED_REQUESTS_QUEUE,\n JSON.stringify(queue)\n );\n } catch (error) {\n console.warn('Failed to save request queue:', error);\n }\n }\n\n /**\n * Remove a request from the queue\n */\n static async removeRequest(requestId: string): Promise<void> {\n try {\n const queue = await this.getQueue();\n const filteredQueue = queue.filter(req => req.id !== requestId);\n await this.saveQueue(filteredQueue);\n } catch (error) {\n console.warn('Failed to remove request from queue:', error);\n }\n }\n\n /**\n * Get the next request to retry (sorted by priority and timestamp)\n */\n static async getNextRequest(): Promise<QueuedRequest | null> {\n try {\n const queue = await this.getQueue();\n \n if (queue.length === 0) {\n return null;\n }\n\n // Sort by priority (high -> medium -> low) then by timestamp (oldest first)\n const sortedQueue = queue.sort((a, b) => {\n const priorityOrder = { high: 3, medium: 2, low: 1 };\n const priorityDiff = priorityOrder[b.priority] - priorityOrder[a.priority];\n \n if (priorityDiff !== 0) {\n return priorityDiff;\n }\n \n return a.timestamp - b.timestamp;\n });\n\n return sortedQueue[0];\n } catch (error) {\n console.warn('Failed to get next request:', error);\n return null;\n }\n }\n\n /**\n * Increment retry count for a request\n */\n static async incrementRetryCount(requestId: string): Promise<void> {\n try {\n const queue = await this.getQueue();\n const requestIndex = queue.findIndex(req => req.id === requestId);\n \n if (requestIndex !== -1) {\n queue[requestIndex].retryCount += 1;\n await this.saveQueue(queue);\n }\n } catch (error) {\n console.warn('Failed to increment retry count:', error);\n }\n }\n\n /**\n * Remove requests that have exceeded max retries\n */\n static async cleanupExpiredRequests(): Promise<void> {\n try {\n const queue = await this.getQueue();\n const validRequests = queue.filter(req => req.retryCount < req.maxRetries);\n \n if (validRequests.length !== queue.length) {\n await this.saveQueue(validRequests);\n }\n } catch (error) {\n console.warn('Failed to cleanup expired requests:', error);\n }\n }\n\n /**\n * Clear the entire queue\n */\n static async clearQueue(): Promise<void> {\n try {\n await AsyncStorage.removeItem(STORAGE_KEYS.FAILED_REQUESTS_QUEUE);\n } catch (error) {\n console.warn('Failed to clear request queue:', error);\n }\n }\n\n /**\n * Get queue statistics\n */\n static async getQueueStats(): Promise<{\n total: number;\n byPriority: { high: number; medium: number; low: number };\n oldestTimestamp?: number;\n newestTimestamp?: number;\n }> {\n try {\n const queue = await this.getQueue();\n \n const stats = {\n total: queue.length,\n byPriority: { high: 0, medium: 0, low: 0 },\n oldestTimestamp: undefined as number | undefined,\n newestTimestamp: undefined as number | undefined,\n };\n\n if (queue.length > 0) {\n stats.oldestTimestamp = Math.min(...queue.map(req => req.timestamp));\n stats.newestTimestamp = Math.max(...queue.map(req => req.timestamp));\n \n queue.forEach(req => {\n stats.byPriority[req.priority] += 1;\n });\n }\n\n return stats;\n } catch (error) {\n console.warn('Failed to get queue stats:', error);\n return {\n total: 0,\n byPriority: { high: 0, medium: 0, low: 0 },\n };\n }\n }\n\n /**\n * Generate a unique request ID\n */\n private static generateRequestId(): string {\n return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Sanitize headers to remove potentially expired tokens\n */\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static sanitizeHeaders(headers: Record<string, any>): Record<string, any> {\n const sanitized = { ...headers };\n \n // Remove Authorization header as it might be expired\n // It will be re-added when the request is retried\n delete sanitized.Authorization;\n delete sanitized.authorization;\n \n return sanitized;\n }\n\n /**\n * Check if a request should be retried based on error type\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static shouldRetryRequest(error: any): boolean {\n // Don't retry client errors (4xx) except for 401 (unauthorized)\n if (error.response?.status >= 400 && error.response?.status < 500) {\n return error.response.status === 401;\n }\n \n // Retry server errors (5xx) and network errors\n return true;\n }\n}"]}
|