skapi-js 2.0.0-rc.6 → 2.0.0-rc.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/polyfills/global.ts","../src/main/error.ts","../src/utils/utils.ts","../src/utils/validator.ts","../src/methods/user.ts","../src/utils/network.ts","../src/methods/param_restrictions.ts","../src/methods/database.ts","../src/methods/webrtc.ts","../src/methods/realtime.ts","../src/methods/request.ts","../src/methods/subscription.ts","../src/methods/admin.ts","../src/methods/notification.ts","../src/methods/vivian.ts","../src/main/skapi.ts","../src/Types.ts"],"names":["root","win","toBase64Url","input","binary","bytes","chunk","slice","NodeFileReader","blob","buffer","base64","mimeType","err","encoding","text","NodeXMLHttpRequest","method","url","name","value","body","fetchOptions","response","error","message","key","fs","path","filePath","dirPath","constraints","SkapiError","options","msg","BASE62_ALPHABET","BASE62","MAX_FORM_DATA_SIZE","USER_ATTRIBUTE_EXCLUDES","USER_ATTRIBUTE_CONVERTS","SERVICE_REGION_ALPHABET","SERVICE_REGION_KEYS","textEncoder","getGlobalBuffer","encodeUtf8","i","toUint8Array","BufferCtor","_MD5","str","x","a","b","c","d","lastA","lastB","lastC","lastD","n","s","j","y","l","q","t","numBlocks","blocks","MD5","toBase62","num","result","fromBase62","chars","prev","curr","generateRandom","length","characters","charactersLength","counter","isNodeRuntime","isBrowserRuntime","assertMaxFormDataSize","serialized","isDefaultTruthyInputValue","isDefaultFalsyInputValue","appendNamedElementValue","data","element","appendData","isBrowser","hasSubmitEvent","hasHTMLFormElement","extractFormData","form","callback","files","val","v","keys","k","numb","obj","handleFile","idx","file","handleInput","pair","json","inputs","selects","textarea","parseUserAttributes","attr","user","addr_main","decodeProjectId","service","decompressCompoundId","idSplit","region","owner","formatServiceId","serviceId","ownerId","regionIndex","regionChar","formattedServiceId","compressCompoundId","b62ToBigInt","ch","bigIntToB62","minLength","output","current","remainder","bigIntToBytes","bytesToBigInt","buf","uuidToBytes","uuid","hex","bytesToUuid","buf16","inputString","match","firstPart","secondPart","movedPrefix","movedFirstPart","movedMiddlePart","part1","uuidBytes","part2","token","tokenString","split","secondLength","compacted","movedMiddleLength","uuidValue","uuidRaw","UserId","id","param","uuid_regex","PhoneNumber","Birthdate","birthdate","date_regex","Password","password","Email","email","paramName","Url","hasWindow","baseUrl","check","cu","curr_loc","_url","u","Params","params","struct","required","ext","p","toCheck","cocochex","validator_default","cognitoUser","map_ticket_obj","mapper","new_obj","tkid","rand","timestampStr","consumeTicket","ticket_id","resp","request","getTickets","tickets","getConsumedTickets","registerTicket","unregisterTicket","TOKEN_REFRESH_SKEW_SECONDS","getJwtToken","currentTime","idTokenExp","authentication","_out","refreshSession","session","res","rej","refreshErr","refreshedSession","getUserProfile","getSession","option","refreshToken","skipUserUpdateEventTrigger","respond","sessionAttribute","r","idToken","isExpired","createCognitoUser","un","raw","username","CognitoUser","is_openid","initUser","authenticationDetails","AuthenticationDetails","userAttributes","requiredAttributes","_","parsed","code","cognitoErrorParser","cognitoMessage","errCode","errMsg","attributes","original_code","err_msg","custom","err_code","err_msg_custom","getProfile","openIdLogin","item","payload","oplog","logger","decodeBase64Utf8","getUserFromToken","accessToken","parts","decoded","loginWithToken","idTokenPayload","CognitoUserSession","CognitoIdToken","CognitoAccessToken","CognitoRefreshToken","up","symbols","descriptors","e","checkAdmin","logout","global","toReturn","to_be_erased","resendSignupConfirmation","recoverAccount","redirect","login","signup","paramRestrictions","logUser","newUser","signup_key","signup_ticket","attributeList","CognitoUserAttribute","customParams","disableAccount","resetPassword","new_password","verifyAttribute","attribute","clientMetadata","verificationMid","verifyPhoneNumber","verifyEmail","forgotPassword","mappedCode","changePassword","updateProfile","collision","toRemove","parseValue","toSet","getUsers","searchForTypes","checker","lastVerifiedEmail","requestUsernameChange","requestQueue","request_counter","getRetryDelayMs","retryAfter","seconds","dateMs","toPercent","loaded","total","selectGateway","auth","type","endpoints","stable","admin","record","gateways_admin_round_robin","gateways_record_round_robin","getEndpoint","dest","stableGateway","query","__pendingRequest","terminatePendingRequests","_etc","bypassAwaitConnection","__connection","endpoint","wantsIdTokenHeader","fetchMore","progress","requestFingerprint","hashedParams","sortObject","requestKey","requestKeyWithStartKey","load_startKey_keys","headers","configuredContentType","resolveTokenValue","configuredValue","fallbackValue","meta","opt","stringValue","separator","encoded","config","cb","Qpass","promise","_fetch","update_startKey_keys","hashedParams_cached","list_of_startKeys","last_startKey_key","xhr","retryDelayMs","status","cause","hashedParam","fetched","startKey_string","uploadFiles","fileList","record_id","getSignedParams","fetchProgress","progressCallback","base62Chars","completed","failed","bin_endpoints","f","signedParams","fields","cdn","pendPromise","formHandler","preventMultipleCalls","target","propertyKey","descriptor","fn","arg","storeResponseKey","formEl","actionDestination","fileBase64String","refreshPage","currentUrl","href","placeholders","inputElement","reader","handleResponse","handleError","executeMethod","resolved","pendingKey","getFormResponse","responseKey","stored","MAX_TABLE_NAME_LENGTH","MAX_TAG_LENGTH","MAX_INDEX_NAME_LENGTH","MAX_INDEX_STRING_VALUE_LENGTH","SENTINEL_CHAR","CONTROL_OR_SENTINEL_REGEX","DELIMITER_ENCODING_MAP","DELIMITER_DECODING_MAP","encodeReservedDelimiters","char","decodeReservedDelimiters","validateStringByPolicy","fieldName","allowEmpty","maxLength","blockKeyDelimiters","disallowLeadingDollar","onlyAlphanumeric","validateTableName","validateTag","validateCustomIndexName","validateIndexStringValue","isNestIndexName","validateNestIndexSegment","recordIdOrUniqueId","outputObj","accessGroup","__index_number_range","indexValue","indexRange","pendingPrivateAccessKeyRequest","PRIVATE_FILE_BROWSER_CACHE_SECONDS","PRIVATE_FILE_URL_EXPIRES_SECONDS","MINT_CACHE_GENERATION","mintCacheToken","expiresSeconds","refresh","windowMs","canBrowserCacheRecordFile","splitPath","access_group","user_access_group","blobToText","resolve","reject","fr","normalizeRecord","_called_from","_skipDataFetch","is_anonymous","dataFileUrls","access_group_set","split_ip","ip","base62timestamp","uploaded","rSplit","normalizeTypedString","tag","binObj","_ref","parsedBin","filename","pathKey","size","url_endpoint","privateCache","getFile","dataType","base","tokenPath","restriction","markerPath","rawUrl","sp","toWait","exec","splitDec","calcNumb","deleteFiles","updatedRec","to_process","requestedUrl","splitQuery","queryString","validatedBaseUrl","isValidEndpoint","splitUrl","splitHost","subdomain","target_key","needAuth","expires","browserCache","mintOptions","uid","currTime","retryErr","cacheScope","getScopedUniqueId","scope","unique_id","bucket","setScopedUniqueId","deleteScopedUniqueId","getQuery","isDel","is_reference_fetch","rec_or_uniq","cached","isAdmin","ref","ref_user_is_me","buildStruct","indexTypes","tp","getRecords","setupPostRecordConfig","is_reference_post","_config","qq","vv","arr","pc","hasEnabledSubscriptionOptions","bulkPostRecords","reference_posts","postData","mangled","recList","records","rec","postRecord","postConf","to_bin","extractedForm","bin_formData","uploadFileParams","dataOffloaded","getTables","convert","gk","getIndexes","iSplit","getTags","tSplit","getUniqueId","deleteRecords","grantPrivateRecordAccess","recordAccess","removePrivateRecordAccess","listPrivateRecordAccess","list","requestPrivateRecordAccessKey","reference_id","privateKey","req","__peerConnection","__dataChannel","__caller_ringing","__receiver_ringing","__rtcEvents","__rtcCandidatesBuffer","__rtcSdpOfferBuffer","setBuffer","recipient","processBuffer","proceed","process","answerSdpOffer","offer","socket","sendAnswer","answer","receiveIceCandidate","candidate","closeRTC","cid","close_all","close","channel","track","createMediaStream","media","dummyStream","canvas","dummyVideoTrack","connectRTC","ice","configuration","protocol","dataChannel","handleDataChannel","peerConnectionHandler","sendOffer","respondRTC","sender","event","sdpoffer","sendIceCandidate","skipKey","skip","peer","handlers","state","handler","events","closed","__current_socket_room","__keepAliveInterval","closedByIntention","reconnectAttempts","prepareWebsocket","visibilitychange","closeRealtime","joinRealtime","connectRealtime","delay","reconnect","workerScript","rtc","postRealtime","notification","notificationStr","group","getRealtimeUsers","getRealtimeGroups","hasFormData","queuePromiseList","queueJobId","activePolls","stoppedResult","isPollStopped","pollClientSecretResponse","latency","queue","onResponse","onError","entry","release","prom","settled","interval","publicStop","outer","outerSettled","jobId","stopClientSecretPolling","stopped","ids","clientSecretRequestQueueCount","clientSecretRequest","hasSecret","checkClientSecretPlaceholder","lo","req_prom","fullId","base_queue","polling","clientSecretRequestHistory","his_req","cancelClientSecretRequest","base_id","sendInquiry","secureRequest","formData","paramsStruct","mock","responseType","contentType","tokenHeaders","forwardRequest","el","metaHeader","decoder","whole","done","getFeed","recs","cannotBeSelfId","getSubscriptions","subscription","subSplit","subscribe","unsubscribe","user_id","blockSubscriber","unblockSubscriber","getNewsletterSubscription","sub","subt","active","subscribeNewsletter","unsubscribeNewsletter","param_send","getNewsletters","searchType","endpointTarget","mails","remap","defaults","m","remapped","blockAccount","unblockAccount","deleteAccount","inviteUser","createAccount","grantAccess","getInvitations","cancelInvitation","resendInvitation","updateUserAttributes","reqData","subscribeNotification","unsubscribeNotification","vapidPublicKey","pushNotification","user_ids","title","spellcast","getspell","dopamine","Skapi","__etc","schema","placeholderForm","idSplitLen","autoLogin","refetchServiceInfo","cdn_domain","sreg","restore","admin_endpoint","poolSetting","CognitoUserPool","uniqueIdScope","uniqueids","connection","storeClassProperties","to_be_cached","storageKey","slim","conn","listener","ua","__decorateClass","Types_exports"],"mappings":"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","file":"skapi.cjs","sourcesContent":["// Platform-aware global polyfill\nconst root = typeof globalThis !== 'undefined' ? (globalThis as any) : undefined;\nconst win = root?.window;\n\nfunction toBase64Url(input) {\n if (Buffer) {\n return Buffer.from(input).toString('base64');\n }\n\n let binary = '';\n const bytes = new Uint8Array(input);\n const chunk = 0x8000;\n\n for (let i = 0; i < bytes.length; i += chunk) {\n const slice = bytes.subarray(i, i + chunk);\n binary += String.fromCharCode.apply(null, Array.from(slice));\n }\n\n if (typeof btoa === 'function') {\n return btoa(binary);\n }\n\n throw new Error('No base64 encoder available in this environment.');\n}\n\nif (win) {\n win.global = win;\n win.global._runningInNodeJS = false;\n} else if (root) {\n root.global = root;\n \n // Polyfill browser APIs for Node.js\n if (typeof root.window === 'undefined') {\n // FileReader polyfill for Node.js\n class NodeFileReader {\n result: string | ArrayBuffer | null = null;\n error: Error | null = null;\n onload: ((this: NodeFileReader, ev: any) => any) | null = null;\n onloadend: ((this: NodeFileReader, ev: any) => any) | null = null;\n onerror: ((this: NodeFileReader, ev: any) => any) | null = null;\n\n readAsDataURL(blob: Blob) {\n blob.arrayBuffer().then(buffer => {\n const base64 = toBase64Url(buffer);\n const mimeType = (blob as any).type || 'application/octet-stream';\n this.result = `data:${mimeType};base64,${base64}`;\n if (this.onload) this.onload({ target: this });\n if (this.onloadend) this.onloadend({ target: this });\n }).catch(err => {\n this.error = err;\n if (this.onerror) this.onerror({ target: this });\n });\n }\n\n readAsArrayBuffer(blob: Blob) {\n blob.arrayBuffer().then(buffer => {\n this.result = buffer;\n if (this.onload) this.onload({ target: this });\n if (this.onloadend) this.onloadend({ target: this });\n }).catch(err => {\n this.error = err;\n if (this.onerror) this.onerror({ target: this });\n });\n }\n\n readAsText(blob: Blob, encoding = 'utf-8') {\n blob.text().then(text => {\n this.result = text;\n if (this.onload) this.onload({ target: this });\n if (this.onloadend) this.onloadend({ target: this });\n }).catch(err => {\n this.error = err;\n if (this.onerror) this.onerror({ target: this });\n });\n }\n }\n\n root.FileReader = NodeFileReader;\n\n // XMLHttpRequest polyfill for Node.js using node-fetch\n class NodeXMLHttpRequest {\n status: number = 0;\n statusText: string = '';\n readyState: number = 0;\n responseText: string = '';\n response: any = null;\n responseType: string = '';\n responseURL: string = '';\n timeout: number = 0;\n withCredentials: boolean = false;\n \n onload: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n onerror: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n onabort: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n ontimeout: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n onprogress: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n onreadystatechange: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n \n upload: { onprogress: ((this: NodeXMLHttpRequest, ev: any) => any) | null } = { onprogress: null };\n\n private _method: string = 'GET';\n private _url: string = '';\n private _headers: Record<string, string> = {};\n private _aborted: boolean = false;\n\n open(method: string, url: string) {\n this._method = method;\n this._url = url;\n this.readyState = 1;\n }\n\n setRequestHeader(name: string, value: string) {\n this._headers[name] = value;\n }\n\n getResponseHeader(name: string): string | null {\n return null; // Simplified implementation\n }\n\n abort() {\n this._aborted = true;\n if (this.onabort) this.onabort({});\n }\n\n send(body?: any) {\n if (this._aborted) return;\n \n const fetchOptions: RequestInit = {\n method: this._method,\n headers: this._headers,\n };\n \n if (body && this._method !== 'GET' && this._method !== 'HEAD') {\n fetchOptions.body = body;\n }\n\n fetch(this._url, fetchOptions)\n .then(async response => {\n if (this._aborted) return;\n \n this.status = response.status;\n this.statusText = response.statusText;\n this.responseURL = response.url;\n this.readyState = 4;\n\n if (this.responseType === 'blob') {\n this.response = await response.blob();\n } else if (this.responseType === 'json') {\n try {\n this.response = await response.json();\n } catch {\n this.response = null;\n }\n } else if (this.responseType === 'arraybuffer') {\n this.response = await response.arrayBuffer();\n } else {\n this.responseText = await response.text();\n this.response = this.responseText;\n }\n\n if (this.onload) this.onload({});\n })\n .catch(error => {\n if (this._aborted) return;\n if (this.onerror) this.onerror(error);\n });\n }\n }\n\n root.XMLHttpRequest = NodeXMLHttpRequest;\n\n root.window = {\n _runningInNodeJS: true,\n alert: (message: string) => console.error('[Alert]', message),\n sessionStorage: {\n getItem: (key: string) => null,\n setItem: (key: string, value: string) => {},\n removeItem: (key: string) => {},\n },\n localStorage: {\n getItem: (key: string) => {\n const fs = require('fs');\n const path = require('path');\n // read file \"{key}.skapi\" in ./states/localStorage/ as string\n try {\n const filePath = path.resolve(process.cwd(), 'states', 'localStorage', `${key}.skapi`);\n if (fs.existsSync(filePath)) {\n return fs.readFileSync(filePath, 'utf8');\n }\n return null;\n } catch (e) {\n return null;\n }\n },\n setItem: (key: string, value: string) => {\n const fs = require('fs');\n const path = require('path');\n // write file \"{key}.skapi\" in ./states/localStorage/ with value as content\n try {\n const dirPath = path.resolve(process.cwd(), 'states', 'localStorage');\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n const filePath = path.resolve(dirPath, `${key}.skapi`);\n fs.writeFileSync(filePath, value, 'utf8');\n } catch (e) {\n // ignore write errors\n }\n },\n removeItem: (key: string) => {\n const fs = require('fs');\n const path = require('path');\n try {\n const filePath = path.resolve(process.cwd(), 'states', 'localStorage', `${key}.skapi`);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n } catch (e) {\n // ignore delete errors\n }\n },\n },\n location: { \n href: '', \n origin: '', \n hostname: '', \n protocol: '', \n replace: (url: string) => {} \n },\n navigator: { \n userAgent: `nodejs/${root?.process?.versions?.node || 'unknown'}`,\n mediaDevices: {\n getUserMedia: async (constraints: any) => {\n throw new Error('getUserMedia is not supported in Node.js environment.');\n }\n }\n },\n addEventListener: () => {},\n removeEventListener: () => {}\n };\n }\n}","export default class SkapiError extends Error {\n code: string | number;\n cause: Error;\n\n constructor(\n error: any,\n options?: {\n name?: string;\n code?: string;\n cause?: Error;\n }) {\n\n if (Array.isArray(error) && error.length <= 2) {\n // \"code: msg\".split(':') => [\"code\", \"msg\"]\n\n let msg = error[1];\n if (error.length > 2) {\n for (let i = 2; i < error.length; i++) {\n if (typeof error[i] === 'string') {\n msg += error[i];\n }\n else {\n break;\n }\n }\n }\n\n super((msg || 'Something went wrong.').trim());\n this.name = options?.name || \"SKAPI\";\n this.code = options?.code || error[0] || \"ERROR\";\n if (options?.cause) {\n this.cause = options.cause;\n }\n }\n else {\n super((error?.message || ((typeof error === 'string') ? error : 'Something went wrong.')).trim());\n\n if (typeof error === 'string') {\n this.name = options?.name || \"SKAPI\";\n this.code = options?.code || 'ERROR';\n if (options?.cause) {\n this.cause = options.cause;\n }\n }\n\n else if (error instanceof Error) {\n this.cause = error;\n this.name = error.name;\n if (error.hasOwnProperty('code')) {\n this.code = (error as any).code;\n }\n }\n\n else if (typeof error === 'object' && error?.code && error?.message) {\n this.name = options?.name || \"SKAPI\";\n this.code = options?.code || 'ERROR';\n this.cause = error?.cause;\n }\n }\n }\n}","import SkapiError from \"../main/error\";\n\nconst BASE62_ALPHABET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\nconst BASE62 = BigInt(BASE62_ALPHABET.length);\nconst MAX_FORM_DATA_SIZE = 2 * 1024 * 1024;\nconst USER_ATTRIBUTE_EXCLUDES = ['aud', 'cognito:username', 'event_id', 'exp', 'iat', 'iss', 'jti', 'origin_jti', 'secret_key', 'token_use'];\nconst USER_ATTRIBUTE_CONVERTS = {\n auth_time: 'log',\n sub: 'user_id'\n};\nconst SERVICE_REGION_ALPHABET = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',\n 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'\n];\nconst SERVICE_REGION_KEYS = [\n 'us31', 'us72', 'ap51', 'ap22', 'ap41', 'eu71', 'ap21', 'us32', 'us71',\n 'af51', 'ap31', 'ap43', 'ap23', 'ap42', 'ca01', 'eu01', 'eu72', 'eu51',\n 'eu73', 'eu11', 'me51', 'sa31'\n];\n\nconst textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;\n\nfunction getGlobalBuffer() {\n if (typeof globalThis !== 'undefined') {\n return (globalThis as any).Buffer;\n }\n return undefined;\n}\n\nfunction encodeUtf8(value: string): Uint8Array {\n if (textEncoder) {\n return textEncoder.encode(value);\n }\n\n const binary = unescape(encodeURIComponent(value));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction toUint8Array(input: any): Uint8Array {\n if (input instanceof Uint8Array) {\n return input;\n }\n if (typeof input === 'string') {\n return encodeUtf8(input);\n }\n if (typeof ArrayBuffer !== 'undefined' && input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(input)) {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n if (Array.isArray(input)) {\n return Uint8Array.from(input);\n }\n\n const BufferCtor = getGlobalBuffer();\n if (BufferCtor) {\n return new Uint8Array(BufferCtor.from(input));\n }\n\n throw new Error('No byte conversion available in this environment.');\n}\n\nclass MD5 {\n private static readonly alphabet = '0123456789abcdef';\n\n public static hash(str?: string): string {\n if (typeof str !== 'string') {\n console.warn('coercing non-string value to empty string');\n str = '';\n }\n\n const x = MD5.sb(str);\n let a = 1732584193;\n let b = -271733879;\n let c = -1732584194;\n let d = 271733878;\n let lastA;\n let lastB;\n let lastC;\n let lastD;\n for (let i = 0; i < x.length; i += 16) {\n lastA = a;\n lastB = b;\n lastC = c;\n lastD = d;\n\n a = MD5.ff(a, b, c, d, x[i], 7, -680876936);\n d = MD5.ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = MD5.ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = MD5.ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = MD5.ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = MD5.ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = MD5.ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = MD5.ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = MD5.ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = MD5.ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = MD5.ff(c, d, a, b, x[i + 10], 17, -42063);\n b = MD5.ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = MD5.ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = MD5.ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = MD5.ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = MD5.ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = MD5.gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = MD5.gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = MD5.gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = MD5.gg(b, c, d, a, x[i], 20, -373897302);\n a = MD5.gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = MD5.gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = MD5.gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = MD5.gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = MD5.gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = MD5.gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = MD5.gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = MD5.gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = MD5.gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = MD5.gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = MD5.gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = MD5.gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = MD5.hh(a, b, c, d, x[i + 5], 4, -378558);\n d = MD5.hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = MD5.hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = MD5.hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = MD5.hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = MD5.hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = MD5.hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = MD5.hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = MD5.hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = MD5.hh(d, a, b, c, x[i], 11, -358537222);\n c = MD5.hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = MD5.hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = MD5.hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = MD5.hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = MD5.hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = MD5.hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = MD5.ii(a, b, c, d, x[i], 6, -198630844);\n d = MD5.ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = MD5.ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = MD5.ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = MD5.ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = MD5.ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = MD5.ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = MD5.ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = MD5.ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = MD5.ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = MD5.ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = MD5.ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = MD5.ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = MD5.ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = MD5.ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = MD5.ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = MD5.ad(a, lastA);\n b = MD5.ad(b, lastB);\n c = MD5.ad(c, lastC);\n d = MD5.ad(d, lastD);\n }\n\n return MD5.rh(a) + MD5.rh(b) + MD5.rh(c) + MD5.rh(d);\n }\n\n private static rh(n: number): string {\n let s = '';\n for (let j = 0; j <= 3; j++) {\n s += MD5.alphabet.charAt((n >> (j * 8 + 4)) & 0x0F) + MD5.alphabet.charAt((n >> (j * 8)) & 0x0F);\n }\n\n return s;\n }\n\n private static ad(x: number, y: number): number {\n const l = (x & 0xFFFF) + (y & 0xFFFF);\n const m = (x >> 16) + (y >> 16) + (l >> 16);\n\n return (m << 16) | (l & 0xFFFF);\n }\n\n private static rl(n: number, c: number): number {\n return (n << c) | (n >>> (32 - c));\n }\n\n private static cm(q: number, a: number, b: number, x: number, s: number, t: number): number {\n return MD5.ad(MD5.rl(MD5.ad(MD5.ad(a, q), MD5.ad(x, t)), s), b);\n }\n\n private static ff(a: number, b: number, c: number, d: number, x: number, s: number, t: number): number {\n return MD5.cm(b & c | ~b & d, a, b, x, s, t);\n }\n\n private static gg(a: number, b: number, c: number, d: number, x: number, s: number, t: number): number {\n return MD5.cm(b & d | c & ~d, a, b, x, s, t);\n }\n\n private static hh(a: number, b: number, c: number, d: number, x: number, s: number, t: number): number {\n return MD5.cm(b ^ c ^ d, a, b, x, s, t);\n }\n\n private static ii(a: number, b: number, c: number, d: number, x: number, s: number, t: number): number {\n return MD5.cm(c ^ (b | ~d), a, b, x, s, t);\n }\n\n private static sb(x: string): number[] {\n let i;\n const numBlocks = ((x.length + 8) >> 6) + 1;\n\n const blocks = new Array(numBlocks * 16);\n for (i = 0; i < numBlocks * 16; i++) {\n blocks[i] = 0;\n }\n\n for (i = 0; i < x.length; i++) {\n blocks[i >> 2] |= x.charCodeAt(i) << ((i % 4) * 8);\n }\n\n blocks[i >> 2] |= 0x80 << ((i % 4) * 8);\n blocks[numBlocks * 16 - 2] = x.length * 8;\n\n return blocks;\n }\n}\n\nfunction toBase62(num: number): string {\n if (num === 0) return BASE62_ALPHABET[0];\n let result = '';\n while (num > 0) {\n result = BASE62_ALPHABET[num % 62] + result;\n num = Math.floor(num / 62);\n }\n return result;\n}\n\nfunction fromBase62(chars: string): number {\n return chars.split('').reverse().reduce((prev, curr, i) =>\n prev + (BASE62_ALPHABET.indexOf(curr) * (62 ** i)), 0);\n}\n\nfunction generateRandom(length: number = 6): string {\n let result = '';\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n const charactersLength = characters.length;\n let counter = 0;\n while (counter < length) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n counter += 1;\n }\n return result;\n}\n\nfunction isNodeRuntime(): boolean {\n return typeof window === 'undefined' || !!(window as any)?._runningInNodeJS;\n}\n\nfunction isBrowserRuntime(): boolean {\n return !isNodeRuntime()\n && typeof document !== 'undefined'\n && typeof document.createElement === 'function';\n}\n\nfunction assertMaxFormDataSize(value: any): void {\n let serialized: string;\n\n try {\n serialized = JSON.stringify(value);\n }\n catch (e) {\n throw new SkapiError('Invalid data type.', { code: 'INVALID_REQUEST' });\n }\n\n if (new Blob([serialized]).size > MAX_FORM_DATA_SIZE) {\n throw new SkapiError('Data should not exceed 2MB', { code: 'INVALID_REQUEST' });\n }\n}\n\nfunction isDefaultTruthyInputValue(value: string): boolean {\n return value === '' || value === 'on' || value === 'true';\n}\n\nfunction isDefaultFalsyInputValue(value: string): boolean {\n return value === 'false';\n}\n\nfunction appendNamedElementValue(\n data: Record<string, any>,\n element: { name: string; value: string },\n appendData: (data: Record<string, any>, key: string, value: any) => void\n): void {\n if (element.name) {\n appendData(data, element.name, element.value);\n }\n}\n\n// Check if we're in a browser environment\nconst isBrowser = isBrowserRuntime();\nconst hasSubmitEvent = typeof SubmitEvent !== 'undefined';\nconst hasHTMLFormElement = typeof HTMLFormElement !== 'undefined';\n\nfunction extractFormData(\n form: FormData | HTMLFormElement | SubmitEvent | { [key: string]: any } | number | string | boolean | null,\n options?: {\n nullIfEmpty?: boolean,\n ignoreEmpty?: boolean,\n },\n callback?: (name: string, value: any) => any\n): { data: any, files: { name: string, file: File }[] } {\n let data = {};\n let files = [];\n\n function appendData(data, key, val) {\n if (options?.ignoreEmpty && val === '') {\n return;\n }\n if (options?.nullIfEmpty && val === '') {\n val = null;\n }\n if (typeof callback === 'function') {\n let v = callback(key, val);\n if (v !== undefined) {\n val = v;\n }\n }\n // key is a[b][c]\n // a[b][c][0] when array\n // if a[b][c] exists, then a[b][c] = [a[b][c], val]\n let keys = key.split('[').map(k => {\n let key = k.replace(']', '')\n let numb = Number(key);\n if (!isNaN(numb) && !key.includes('.')) {\n key = numb;\n }\n else if (key[0] === '\"' && key[key.length - 1] === '\"' || key[0] === \"'\" && key[key.length - 1] === \"'\") {\n key = key.replace(/\"/g, '').replace(/'/g, '');\n }\n return key;\n });\n let obj = data;\n if (typeof keys[0] === 'number') {\n throw new SkapiError('Form key cannot start with an array index.', { code: 'INVALID_REQUEST' });\n }\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i < keys.length - 1) {\n if (obj[k] === undefined) {\n let next = keys[i + 1];\n if (typeof next === 'number') {\n obj[k] = [];\n }\n else {\n obj[k] = {};\n }\n }\n obj = obj[k];\n }\n else {\n if (obj[k] === undefined) {\n obj[k] = val;\n }\n else if (Array.isArray(obj[k])) {\n obj[k].push(val);\n }\n else {\n obj[k] = [obj[k], val];\n }\n }\n }\n }\n\n function handleFile(files, name, v) {\n if (v instanceof File) {\n files.push({ name, file: v });\n }\n else if (v instanceof FileList) {\n if (v && v.length > 0) {\n for (let idx = 0; idx <= v.length - 1; idx++) {\n let file = v.item(idx)\n if (file) {\n files.push({ name, file });\n }\n }\n }\n }\n }\n\n let handleInput = (i: HTMLInputElement) => {\n if (i.name) {\n if (i.type === 'number') {\n if (i.value) {\n appendData(data, i.name, Number(i.value));\n }\n }\n else if (i.type === 'checkbox' || i.type === 'radio') {\n if (i.checked) {\n if ((i.type === 'checkbox' && i.value === '') || isDefaultTruthyInputValue(i.value)) {\n appendData(data, i.name, true);\n }\n else if (isDefaultFalsyInputValue(i.value)) {\n appendData(data, i.name, false);\n }\n else if (i.value) {\n appendData(data, i.name, i.value);\n }\n }\n else if (i.type === 'checkbox') {\n if (isDefaultTruthyInputValue(i.value)) {\n appendData(data, i.name, false);\n }\n else if (isDefaultFalsyInputValue(i.value)) {\n appendData(data, i.name, true);\n }\n }\n }\n else if (i.type === 'file') {\n if (i.files && i.files.length > 0) {\n handleFile(files, i.name, i.files);\n }\n }\n else {\n appendData(data, i.name, i.value);\n }\n }\n }\n\n if (isBrowser && (form instanceof HTMLInputElement || form instanceof HTMLSelectElement || form instanceof HTMLTextAreaElement)) {\n handleInput(form as HTMLInputElement);\n assertMaxFormDataSize(data);\n return { data, files };\n }\n\n else {\n if (isBrowser && form instanceof FormData) {\n for (let pair of form.entries()) {\n let name = pair[0];\n let v = pair[1];\n if ((v instanceof File) || ((v as any) instanceof FileList)) {\n handleFile(files, name, v);\n }\n else if ((v as any) instanceof Blob) {\n let j = v as any;\n if (j.type === 'application/json') {\n try {\n let json = JSON.parse(j.text());\n appendData(data, name, json);\n }\n catch (err) {\n appendData(data, name, j);\n }\n }\n }\n else {\n appendData(data, name, v);\n }\n }\n assertMaxFormDataSize(data);\n return { data, files };\n }\n if (isBrowser && hasSubmitEvent && form instanceof SubmitEvent) {\n form = form.target;\n }\n if (isBrowser && hasHTMLFormElement && form instanceof HTMLFormElement) {\n let inputs = form.querySelectorAll('input');\n let selects = form.querySelectorAll('select');\n let textarea = form.querySelectorAll('textarea');\n for (let idx = 0; idx < selects.length; idx++) {\n appendNamedElementValue(data, selects[idx], appendData);\n }\n for (let idx = 0; idx < textarea.length; idx++) {\n appendNamedElementValue(data, textarea[idx], appendData);\n }\n for (let idx = 0; idx < inputs.length; idx++) {\n handleInput(inputs[idx]);\n }\n\n assertMaxFormDataSize(data);\n return { data, files };\n }\n }\n\n assertMaxFormDataSize(form);\n\n return { data: form, files };\n}\n\nfunction parseUserAttributes(attr: { [key: string]: any }) {\n let user: any = {};\n // parse attribute structure: [ { Name, Value }, ... ]\n for (let name in attr) {\n let value = attr[name];\n\n if (USER_ATTRIBUTE_EXCLUDES.includes(name)) continue;\n\n if (USER_ATTRIBUTE_CONVERTS[name]) {\n user[USER_ATTRIBUTE_CONVERTS[name]] = value;\n }\n\n else if (name.includes('custom:')) {\n // if (name === 'custom:service' && value !== this.service) {\n // throw new SkapiError('The user is not registered to the service.', { code: 'INVALID_REQUEST' });\n // }\n user[name.replace('custom:', '')] = value;\n }\n\n else if (name === 'address') {\n let addr_main: any = value;\n if (addr_main && typeof addr_main === 'object' && Object.keys(addr_main).length) {\n if (addr_main?.formatted) {\n try {\n user[name] = JSON.parse(addr_main.formatted);\n }\n catch (err) {\n user[name] = addr_main.formatted;\n }\n }\n }\n else {\n user[name] = addr_main;\n }\n }\n else {\n user[name] = value;\n }\n }\n\n for (let k of [\n 'address_public',\n 'birthdate_public',\n 'email_public',\n 'gender_public',\n 'phone_number_public',\n 'access_group'\n ]) {\n if (k.includes('_public')) {\n if (user.hasOwnProperty(k.split('_')[0])) user[k] = user.hasOwnProperty(k) ? !!Number(user[k]) : false;\n else delete user[k];\n }\n else user[k] = user.hasOwnProperty(k) ? Number(user[k]) : 0;\n }\n\n for (let k of [\n 'email',\n 'phone_number'\n ]) {\n if (user.hasOwnProperty(k)) {\n user[k + '_verified'] = user[k + '_verified'] === true;\n }\n else {\n delete user[k + '_verified'];\n }\n }\n\n return user;\n}\n\nfunction decodeProjectId(service) {\n service = decompressCompoundId(service); // validate format and throw if invalid\n if (service.split(\"-\").length === 7) {\n const idSplit = service.split(\"-\");\n let region;\n let owner;\n\n try {\n region = SERVICE_REGION_KEYS[fromBase62(idSplit[1][0])];\n owner = idSplit.slice(2).join(\"-\");\n }\n catch (err) {\n throw new Error('INVALID_PARAMETER: Service ID is invalid: ' + service);\n }\n\n if (!region) {\n throw new Error('INVALID_PARAMETER: Service ID is invalid: ' + service);\n }\n\n return { service: region + idSplit[0] + idSplit[1].slice(1), owner };\n }\n\n return { service, owner: \"\" };\n}\n\nfunction formatServiceId(serviceId, ownerId) {\n // format service ID\n const regionIndex = SERVICE_REGION_KEYS.indexOf(serviceId.slice(0, 4));\n const regionChar = SERVICE_REGION_ALPHABET[regionIndex];\n const subRegionId = serviceId.slice(4, -4);\n\n let formattedServiceId = `${subRegionId}-${regionChar}${serviceId.slice(-4)}-${ownerId}`;\n return compressCompoundId(formattedServiceId);\n}\n\nfunction b62ToBigInt(str) {\n let value = 0n;\n\n for (const ch of str) {\n const idx = BASE62_ALPHABET.indexOf(ch);\n if (idx < 0) {\n throw new Error(`INVALID_PARAMETER: Invalid base62 character: ${ch}`);\n }\n value = value * BASE62 + BigInt(idx);\n }\n\n return value;\n}\n\nfunction bigIntToB62(value, minLength = 1) {\n if (value < 0n) {\n throw new Error('INVALID_PARAMETER: Negative values are not supported.');\n }\n\n if (value === 0n) {\n return '0'.repeat(Math.max(1, minLength));\n }\n\n let output = '';\n let current = value;\n\n while (current > 0n) {\n const remainder = Number(current % BASE62);\n output = BASE62_ALPHABET[remainder] + output;\n current /= BASE62;\n }\n\n if (output.length < minLength) {\n output = '0'.repeat(minLength - output.length) + output;\n }\n\n return output;\n}\n\nfunction bigIntToBytes(value) {\n if (value === 0n) {\n return Uint8Array.from([0]);\n }\n\n const bytes = [];\n let current = value;\n\n while (current > 0n) {\n bytes.push(Number(current & 0xffn));\n current >>= 8n;\n }\n\n bytes.reverse();\n return Uint8Array.from(bytes);\n}\n\nfunction bytesToBigInt(buf) {\n let value = 0n;\n\n for (const b of buf) {\n value = (value << 8n) + BigInt(b);\n }\n\n return value;\n}\n\nfunction uuidToBytes(uuid) {\n const hex = String(uuid).replace(/-/g, '');\n\n if (!/^[0-9a-fA-F]{32}$/.test(hex)) {\n throw new Error('INVALID_PARAMETER: Invalid UUID format.');\n }\n\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i++) {\n bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n\n return bytes;\n}\n\nfunction bytesToUuid(buf16) {\n const hex = Array.from(toUint8Array(buf16), b => b.toString(16).padStart(2, '0')).join('');\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20)\n ].join('-');\n}\n\n\nfunction compressCompoundId(input) {\n const inputString = String(input);\n\n if (inputString.split('-').length === 2) {\n return inputString;\n }\n\n const match = inputString.match(/^([0-9A-Za-z]+)-([0-9A-Za-z]+)-([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/);\n\n if (!match) {\n throw new Error('INVALID_PARAMETER: Input must match <base62>-<base62>-<uuid>.');\n }\n\n const [, firstPart, secondPart, uuid] = match;\n\n if (firstPart.length < 2) {\n throw new Error('INVALID_PARAMETER: The first part must contain at least 2 characters.');\n }\n\n if (secondPart.length >= BASE62_ALPHABET.length) {\n throw new Error('INVALID_PARAMETER: The middle section is too long to encode.');\n }\n\n const movedPrefix = firstPart.slice(0, 2);\n const movedFirstPart = firstPart.slice(2);\n const movedMiddlePart = secondPart + movedPrefix;\n\n // Part1 token format: [secondPartLength(base62:1char)][movedFirstPart][movedMiddlePart]\n const part1 = BASE62_ALPHABET[secondPart.length] + movedFirstPart + movedMiddlePart;\n\n const uuidBytes = uuidToBytes(uuid);\n const part2 = bigIntToB62(bytesToBigInt(uuidBytes));\n\n return `${part1}-${part2}`;\n}\n\nfunction decompressCompoundId(token) {\n const tokenString = String(token);\n\n if (tokenString.split('-').length !== 2) {\n return tokenString;\n }\n\n const split = tokenString.split('-');\n\n if (split.length !== 2 || !split[0] || !split[1]) {\n throw new Error('INVALID_PARAMETER: Corrupt compressed token: ' + tokenString);\n }\n\n const [part1, part2] = split;\n const secondLength = BASE62_ALPHABET.indexOf(part1[0]);\n\n if (secondLength < 0) {\n throw new Error('INVALID_PARAMETER: Corrupt compressed token: ' + tokenString);\n }\n\n const compacted = part1.slice(1);\n const movedMiddleLength = secondLength + 2;\n\n if (compacted.length < movedMiddleLength) {\n throw new Error('INVALID_PARAMETER: Corrupt compressed token: ' + tokenString);\n }\n\n const movedFirstPart = compacted.slice(0, compacted.length - movedMiddleLength);\n const movedMiddlePart = compacted.slice(compacted.length - movedMiddleLength);\n\n const movedPrefix = movedMiddlePart.slice(secondLength);\n const secondPart = movedMiddlePart.slice(0, secondLength);\n const firstPart = movedPrefix + movedFirstPart;\n\n if (!/^[0-9A-Za-z]+$/.test(firstPart) || !/^[0-9A-Za-z]+$/.test(secondPart)) {\n throw new Error('INVALID_PARAMETER: Corrupt compressed token: ' + tokenString);\n }\n\n const uuidValue = b62ToBigInt(part2);\n const uuidRaw = bigIntToBytes(uuidValue);\n\n if (uuidRaw.length > 16) {\n throw new Error('INVALID_PARAMETER: Corrupt compressed token: ' + tokenString);\n }\n\n const uuidBytes = new Uint8Array(16);\n uuidBytes.set(uuidRaw, 16 - uuidRaw.length);\n const uuid = bytesToUuid(uuidBytes);\n\n return `${firstPart}-${secondPart}-${uuid}`;\n}\n\n\nexport {\n fromBase62,\n toBase62,\n isNodeRuntime,\n isBrowserRuntime,\n extractFormData,\n MD5,\n generateRandom,\n parseUserAttributes,\n compressCompoundId,\n decompressCompoundId,\n formatServiceId,\n decodeProjectId\n};","\nimport SkapiError from '../main/error';\nimport { extractFormData } from './utils';\nimport cocochex from \"cocochex\";\n\nfunction UserId(id: string, param = 'User ID') {\n // let uuid_regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n // let uuid_regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n let uuid_regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (!id) {\n throw new SkapiError(`${param} is empty.`, { code: 'INVALID_PARAMETER' });\n }\n else if (typeof id !== 'string') {\n throw new SkapiError(`${param} should be type: string.`, { code: 'INVALID_PARAMETER' });\n }\n else if (!id.match(uuid_regex)) {\n throw new SkapiError(`${param} is invalid.`, { code: 'INVALID_PARAMETER' });\n }\n\n return id;\n}\n\nfunction PhoneNumber(value: string) {\n if (value) {\n if (typeof value !== 'string' || value.charAt(0) !== '+' || isNaN(Number(value.substring(1)))) {\n throw new SkapiError('\"phone_number\" is invalid. The format should be \"+00123456789\". Type: string.', { code: 'INVALID_PARAMETER' });\n }\n }\n return value || '';\n}\n\nfunction Birthdate(birthdate: string) {\n // yyyy-mm-dd\n if (birthdate) {\n if (typeof birthdate !== 'string') {\n throw new SkapiError('\"birthdate\" is invalid. The format should be \"yyyy-mm-dd\". Type: string.', { code: 'INVALID_PARAMETER' });\n }\n\n else {\n let date_regex = new RegExp(/([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))/);\n if (birthdate.length !== 10 || birthdate.split('-').length !== 3 || !date_regex.test(birthdate)) {\n throw new SkapiError('\"birthdate\" is invalid. The format should be \"yyyy-mm-dd\". Type: string.', { code: 'INVALID_PARAMETER' });\n }\n }\n }\n return birthdate || '';\n}\n\nfunction Password(password: string) {\n if (!password) {\n throw new SkapiError('\"password\" is required.', { code: 'INVALID_PARAMETER' });\n }\n else if (typeof password !== 'string') {\n throw new SkapiError('\"password\" should be type: string.', { code: 'INVALID_PARAMETER' });\n }\n else if (password.length < 6) {\n throw new SkapiError('\"password\" should be at least 6 characters.', { code: 'INVALID_PARAMETER' });\n }\n else if (password.length > 60) {\n throw new SkapiError('\"password\" can be up to 60 characters max.', { code: 'INVALID_PARAMETER' });\n }\n\n return password;\n}\n\nfunction Email(email: string, paramName: string = 'email') {\n if (!email) {\n throw new SkapiError(`\"${paramName}\" is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n else if (typeof email !== 'string') {\n throw new SkapiError(`\"${paramName}\"should be type: string.`, { code: 'INVALID_PARAMETER' });\n }\n\n else if (email.length < 5) {\n throw new SkapiError(`\"${paramName}\" should be at least 5 characters.`, { code: 'INVALID_PARAMETER' });\n }\n\n else if (/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/.test(email)) {\n email = email.trim();\n let splitAt = email.split('@');\n let tld = splitAt[1].split('.');\n\n if (tld.length >= 2) {\n return email.toLowerCase();\n }\n }\n\n throw new SkapiError(`\"${email}\" is an invalid email.`, { code: 'INVALID_PARAMETER' });\n}\n\nfunction Url(url: string | string[]) {\n const hasWindow = typeof window !== 'undefined';\n const baseUrl = (() => {\n let baseUrl = hasWindow ? window.location.origin || null : null;\n if (baseUrl && baseUrl.slice(-1) === '/') {\n baseUrl = baseUrl.slice(0, -1);\n }\n\n return baseUrl;\n })();\n let check = (c: string) => {\n if (typeof c === 'string') {\n if (c === '*') {\n return '*';\n }\n else {\n let cu = c.trim();\n if (cu[0] === '/' && baseUrl) {\n if (baseUrl.slice(0, 5) === 'file:') {\n throw new SkapiError(`\"${c}\" is an invalid url. Relative URL does not work on local file system. Use full URL string.`, { code: 'INVALID_PARAMETER' });\n }\n cu = baseUrl + cu;\n }\n else if (cu[0] === '.' && baseUrl) {\n if (baseUrl.slice(0, 5) === 'file:') {\n throw new SkapiError(`\"${c}\" is an invalid url. Relative URL does not work on local file system. Use full URL string.`, { code: 'INVALID_PARAMETER' });\n }\n let curr_loc = hasWindow ? window.location.href.split('?')[0] : '';\n if (curr_loc.slice(-1) !== '/') {\n curr_loc += '/';\n }\n\n cu = curr_loc + cu.slice(1);\n }\n\n let _url;\n\n try {\n _url = new URL(cu);\n }\n catch (err) {\n throw new SkapiError(`\"${c}\" is an invalid url.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (_url.protocol) {\n let url = _url.href;\n return url;\n }\n }\n }\n\n throw new SkapiError(`\"${c}\" is an invalid url.`, { code: 'INVALID_PARAMETER' });\n };\n\n if (Array.isArray(url)) {\n return url.map(u => check(u));\n }\n else {\n return check(url);\n }\n}\n\nfunction Params<T = any>(\n params: T,\n struct: Record<string, any>,\n required: string[] = [],\n options?: {\n ignoreEmpty?: boolean;\n nullIfEmpty?: boolean;\n precall?: (pre: { data: any, files: any }) => void\n }\n): T {\n // struct = {\n // a: 'type or value',\n // b: ['number', 'boolean', 'string', 'array', 'function', 'custom value', () => 'default value when none match, or is missing'],\n // c: (v: any) => { return 'value to assign'; }\n // }\n let ext = extractFormData(params, options);\n let p = ext.data;\n struct.service = 'string';\n struct.owner = 'string';\n\n let toCheck = {};\n\n // Extra user input fields not in schema are ignored.\n // If a field value is already a function, it copies it directly (JSON clone would break functions).\n // For each allowed field, it tries to deep-copy via JSON stringify/parse so later validation/mutation does not mutate the original input object.\n for (let s in struct) {\n if (p && typeof p === 'object' && !Array.isArray(p) && p.hasOwnProperty(s)) {\n if (typeof p[s] === 'function') {\n toCheck[s] = p[s];\n }\n else {\n try {\n toCheck[s] = JSON.parse(JSON.stringify(p[s]));\n }\n catch (err) {\n toCheck[s] = p[s];\n }\n }\n }\n }\n\n if (options?.precall) {\n options.precall({ data: toCheck, files: ext?.files || [] });\n }\n\n try {\n return cocochex(toCheck, struct, required) as T;\n }\n catch (err: any) {\n throw new SkapiError(err.message, { code: 'INVALID_PARAMETER' });\n }\n}\n\nexport default {\n UserId,\n PhoneNumber,\n Birthdate,\n Password,\n Email,\n Url,\n Params\n};","import SkapiError from '../main/error';\nimport {\n CognitoUserAttribute,\n CognitoUser,\n AuthenticationDetails,\n CognitoUserSession,\n CognitoIdToken,\n CognitoAccessToken,\n CognitoRefreshToken\n} from 'amazon-cognito-identity-js';\nimport {\n Form,\n UserProfile,\n FetchOptions,\n DatabaseResponse,\n UserAttributes,\n UserPublic\n} from '../Types';\nimport validator from '../utils/validator';\nimport { request } from '../utils/network';\nimport { MD5, extractFormData, fromBase62, parseUserAttributes } from '../utils/utils';\n\nlet cognitoUser: CognitoUser | null = null;\n\nfunction map_ticket_obj(t): {\n ticket_id?: string;\n consume_id?: string;\n user_id?: string;\n is_test?: boolean;\n timestamp?: number;\n condition?: any;\n action?: any;\n count?: number;\n time_to_live?: number;\n description?: string;\n limit_per_user?: number;\n} {\n let mapper = {\n \"tkid\": 'ticket_id',\n \"cond\": 'condition',\n \"stmp\": 'timestamp',\n \"actn\": 'action',\n \"cnt\": 'count',\n \"ttl\": 'time_to_live',\n 'plch': 'placeholder',\n 'hash': 'hash',\n 'desc': 'description',\n 'pmc': 'limit_per_user'\n }\n let new_obj = {};\n for (let k in t) {\n if (k === 'tkid') {\n let tkid = t[k].split('#');\n if (tkid.length === 1) {\n new_obj['ticket_id'] = tkid[0];\n continue;\n }\n new_obj['ticket_id'] = tkid[1];\n new_obj['consume_id'] = tkid[2];\n new_obj['user_id'] = tkid[3];\n\n // last 4 characters are random chars\n let rand = tkid[2].slice(-4);\n new_obj[\"is_test\"] = rand === \":CHK\";\n\n if (!t.stmp) {\n let timestampStr = tkid[2].slice(0, -4);\n\n // check if timestampStr is a number string\n if (/^[0-9]+$/.test(timestampStr)) {\n new_obj['timestamp'] = parseInt(timestampStr, 10);\n }\n else {\n new_obj['timestamp'] = fromBase62(tkid[2].slice(0, -4));\n }\n }\n }\n else if (mapper[k]) {\n new_obj[mapper[k]] = t[k];\n }\n else {\n new_obj[k] = t[k];\n }\n }\n return new_obj;\n}\n\nexport async function consumeTicket(params: {\n ticket_id: string;\n method: string; // GET | POST\n auth?: boolean;\n data?: {\n [key: string]: any;\n }\n}): Promise<any> {\n if (!params.ticket_id) {\n throw new SkapiError('Ticket ID is required.', { code: 'INVALID_PARAMETER' });\n }\n if (!params.method) {\n throw new SkapiError('Method is required. Should be either \"GET\" or \"POST\"', { code: 'INVALID_PARAMETER' });\n }\n let ticket_id = params.ticket_id;\n\n await this.__connection;\n let resp = await request.bind(this)(`https://${this.service.slice(0, 4)}.${this.customApiDomain}/auth/consume/${this.service}/${this.owner}/${ticket_id}`, params?.data || {}, { method: params.method, auth: !!params?.auth });\n return map_ticket_obj(resp);\n}\n\nexport async function getTickets(params: {\n ticket_id?: string;\n}, fetchOptions?: FetchOptions): Promise<DatabaseResponse<any[]>> {\n await this.__connection;\n let tickets = await request.bind(this)('ticket', Object.assign({ exec: 'list' }, params || {}), { auth: true, fetchOptions });\n tickets.list = tickets.list.map(map_ticket_obj);\n return tickets;\n}\n\nexport async function getConsumedTickets(params: {\n ticket_id?: string;\n}, fetchOptions?: FetchOptions): Promise<DatabaseResponse<any[]>> {\n await this.__connection;\n let tickets = await request.bind(this)('ticket', Object.assign({ exec: 'consumed' }, params || {}), { auth: true, fetchOptions });\n tickets.list = tickets.list.map(map_ticket_obj);\n return tickets;\n}\n\nexport async function registerTicket(\n params: {\n ticket_id: string;\n description: string;\n count?: number;\n time_to_live?: number;\n placeholder?: { [key: string]: string };\n limit_per_user?: number;\n condition?: {\n return200?: boolean; // When true, returns 200 when regardless condition mismatch\n method?: 'GET' | 'POST'; // Defaults to 'GET' method when not given\n headers?: {\n key: string;\n value: string | string[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n }[],\n ip?: {\n value: string | string[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n },\n user_agent?: {\n value: string | string[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n },\n data?: {\n key?: string;\n value: any | any[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n setValueWhenMatch?: any | any[];\n }[],\n params?: {\n key?: string;\n value: string | string[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n setValueWhenMatch?: any | any[];\n }[],\n user?: {\n key: string;\n value: string | string[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n }[],\n record_access?: string; // record id user should have access to\n request?: {\n url: string;\n method: 'GET' | 'POST';\n headers?: {\n [key: string]: string;\n };\n data?: Record<string, any>;\n params?: Record<string, any>;\n match: {\n key: string; // key[to][match]\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n value: any | any[];\n }[];\n }\n };\n action?: {\n access_group: number; // group number to give access to the user\n record_access?: string; // record id to give access to the user\n request?: {\n url: string;\n method: 'GET' | 'POST'; // Defaults to 'GET' method when not given\n headers?: {\n [key: string]: string;\n };\n data?: Record<string, any>;\n params?: Record<string, any>;\n }\n };\n }\n): Promise<string> {\n return request.bind(this)('register-ticket', Object.assign({ exec: 'reg' }, params), { auth: true });\n}\n\nexport async function unregisterTicket(\n params: {\n ticket_id: string;\n }\n): Promise<string> {\n return request.bind(this)('register-ticket', Object.assign({ exec: 'unreg' }, params), { auth: true });\n}\n\n// Refresh a token that is merely ABOUT to expire, not only one that already has.\n//\n// Without a margin, a token with seconds left is handed out as valid — and a token\n// is not always used at the moment it is fetched. A queued request carries it to a\n// server that runs it minutes later, and a background job (indexing a large file)\n// replays that same stored token for the whole run. Those are the calls that die of\n// old age, holding a credential this client could trivially have refreshed first.\n//\n// An hour, because that is the scale of the work a token gets handed to, and it\n// costs at most one extra refresh per token: the replacement is good for a day.\nconst TOKEN_REFRESH_SKEW_SECONDS = 60 * 60;\n\nexport async function getJwtToken() {\n await this.__connection;\n // if (this.bearerToken) {\n // return this.bearerToken;\n // }\n if (this.session) {\n const currentTime = Math.floor(Date.now() / 1000);\n const idToken = this.session.getIdToken();\n const idTokenExp = idToken.getExpiration();\n\n if (idTokenExp < currentTime + TOKEN_REFRESH_SKEW_SECONDS) {\n this.log('request:requesting new token', null);\n try {\n await authentication.bind(this)().getSession({ refreshToken: true });\n this.log('request:received new tokens', {\n exp: this.session?.idToken?.payload?.exp,\n currentTime,\n expiresIn: idTokenExp - currentTime,\n token: this.session?.accessToken?.jwtToken,\n refreshToken: this.session?.refreshToken?.token\n });\n }\n catch (err) {\n this.log('request:new token error', err);\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n }\n else {\n this.log('request:tokens', {\n exp: this.session.idToken.payload.exp,\n currentTime,\n expiresIn: idTokenExp - currentTime,\n token: this.session.accessToken.jwtToken,\n refreshToken: this.session.refreshToken.token\n });\n }\n // this.bearerToken = this.session?.idToken?.jwtToken;\n return this.session?.idToken?.jwtToken;\n }\n else {\n this.log('request:no session', null);\n _out.bind(this)();\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n}\n\nfunction refreshSession(session, cognitoUser) {\n return new Promise((res, rej) => {\n cognitoUser.refreshSession(session.getRefreshToken(), (refreshErr, refreshedSession) => {\n this.log('getSession:refreshSessionCallback', { refreshErr, refreshedSession });\n\n if (refreshErr) {\n _out.bind(this)();\n rej(refreshErr);\n }\n else if (refreshedSession.isValid()) {\n res(refreshedSession);\n }\n else {\n _out.bind(this)();\n rej(new SkapiError('Invalid session.', { code: 'INVALID_REQUEST' }));\n }\n });\n });\n}\n\nexport function authentication() {\n if (!this.userPool) throw new SkapiError('User pool is missing', { code: 'INVALID_REQUEST' });\n\n const getUserProfile = (): UserProfile => {\n // get users updated attribute\n let attr = cognitoUser.getSignInUserSession().getIdToken().payload || null;\n\n // parse attribute structure: [ { Name, Value }, ... ]\n let user = parseUserAttributes(attr);\n this.log('normalized user attribute', user);\n this.__user = user;\n return user;\n };\n\n const getSession = async (option?: { skipUserUpdateEventTrigger?: boolean; refreshToken?: boolean; }): Promise<CognitoUserSession> =>\n new Promise((res, rej) => {\n // fetch session, updates user attributes\n this.log('getSession:option', option);\n let { refreshToken = false, skipUserUpdateEventTrigger = false } = option || {};\n if (refreshToken && skipUserUpdateEventTrigger) {\n skipUserUpdateEventTrigger = false;\n }\n\n // if (!this.bearerToken) {\n cognitoUser = this.userPool.getCurrentUser();\n // }\n if (!cognitoUser) {\n this.log('getSession:cognitoUser', cognitoUser);\n // no user session. wasn't logged in.\n _out.bind(this)();\n rej(null);\n return;\n }\n\n let respond = (s: any) => {\n let sessionAttribute = s.getIdToken().payload;\n this.log('getSession:respond:sessionAttribute', sessionAttribute);\n\n if (sessionAttribute['custom:service'] !== this.service) {\n this.log('getSession:respond', 'invalid service, signing out');\n _out.bind(this)();\n throw new SkapiError('Invalid session.', { code: 'INVALID_REQUEST' });\n }\n\n this.session = s;\n getUserProfile();\n if (!skipUserUpdateEventTrigger) {\n this._runOnUserUpdateListeners(this.user);\n }\n return this.session;\n }\n\n cognitoUser.getSession((err: any, session: CognitoUserSession) => {\n this.log('getSession:getSessionCallback', { err, session });\n if (!session) {\n _out.bind(this)();\n rej(new SkapiError('Current session does not exist.', { code: 'INVALID_REQUEST' }));\n return;\n }\n\n if (err) {\n refreshSession.bind(this)(session, cognitoUser).then(r => res(respond(r))).catch(rej);\n return;\n }\n\n const currentTime = Math.floor(Date.now() / 1000);\n const idToken = session.getIdToken();\n const idTokenExp = idToken.getExpiration();\n const isExpired = idTokenExp < currentTime;\n this.log('getSession:currentTime', currentTime);\n this.log('getSession:idTokenExp', idTokenExp);\n this.log('getSession:isExpired', isExpired);\n // if(this.bearerToken) {\n this.log('getSession:existingBearerToken', this.bearerToken);\n this.bearerToken = idToken.getJwtToken();\n // }\n // try refresh when invalid token\n // when on updateProfile, it will always refreshToken\n if (isExpired || refreshToken || !session.isValid()) {\n refreshSession.bind(this)(session, cognitoUser).then(r => res(respond(r))).catch(rej);\n }\n else {\n try {\n res(respond(session));\n }\n catch (err) {\n rej(err);\n }\n }\n });\n });\n\n const createCognitoUser = (un: string, raw?: boolean) => {\n let username = raw ? un : un.includes(this.service + '-') ? un : this.service + '-' + MD5.hash(un);\n\n return {\n cognitoUser: new CognitoUser({\n Username: username,\n Pool: this.userPool\n }),\n cognitoUsername: username\n };\n };\n\n const authenticateUser = (email: string, password: string, raw: boolean = false, is_openid: boolean = false): Promise<UserProfile> => {\n return new Promise((res, rej) => {\n this.__request_signup_confirmation = null;\n this.__disabledAccount = null;\n\n let initUser = createCognitoUser(email, raw);\n let username = initUser.cognitoUsername;\n let authenticationDetails = new AuthenticationDetails({\n Username: username,\n Password: password\n });\n\n initUser.cognitoUser.authenticateUser(authenticationDetails, {\n newPasswordRequired: (userAttributes, requiredAttributes) => {\n this.__disabledAccount = null;\n this.__request_signup_confirmation = username;\n if (userAttributes['custom:signup_ticket'] === 'PASS' || userAttributes['custom:signup_ticket'] === 'MEMBER' || userAttributes['custom:signup_ticket'] === 'OIDPASS') {\n // auto confirm - (setting password from admin created account)\n initUser.cognitoUser.completeNewPasswordChallenge(password, {}, {\n onSuccess: _ => {\n cognitoUser = initUser.cognitoUser;\n getSession().then(session => res(this.user));\n },\n onFailure: (err: any) => {\n rej(new SkapiError(err.message || 'Failed to authenticate user.', { code: err.code }));\n }\n });\n }\n else {\n // legacy method... will be deprecated\n rej(new SkapiError(\"User's signup confirmation is required.\", { code: 'SIGNUP_CONFIRMATION_NEEDED' }));\n }\n },\n onSuccess: _ => getSession({ skipUserUpdateEventTrigger: true }).then(_ => {\n this.__disabledAccount = null;\n this._runOnLoginListeners(this.user);\n this._runOnUserUpdateListeners(this.user);\n res(this.user);\n }),\n onFailure: (err: any) => {\n let error = [];\n let { parsed, code } = cognitoErrorParser(err);\n let cognitoMessage = typeof err?.message === 'string' ? err.message : '';\n\n if (code === \"NotAuthorizedException\") {\n if (cognitoMessage.includes(\"User is disabled.\")) {\n this.__disabledAccount = username;\n error = ['This account is disabled.', 'USER_IS_DISABLED'];\n }\n\n else {\n if (is_openid) {\n error = ['The account already exists.', 'ACCOUNT_EXISTS'];\n }\n else {\n error = ['Incorrect username or password.', 'INCORRECT_USERNAME_OR_PASSWORD'];\n }\n }\n }\n else if (code === \"UserNotFoundException\") {\n error = ['Incorrect username or password.', 'INCORRECT_USERNAME_OR_PASSWORD'];\n }\n else if (code === \"UserNotConfirmedException\") {\n this.__request_signup_confirmation = username;\n error = [\"User's signup confirmation is required.\", 'SIGNUP_CONFIRMATION_NEEDED'];\n }\n else if (code === \"TooManyRequestsException\" || code === \"LimitExceededException\") {\n error = ['Too many attempts. Please try again later.', 'REQUEST_EXCEED'];\n }\n\n if (parsed.code === 'SIGNUP_CONFIRMATION_NEEDED') {\n this.__request_signup_confirmation = username;\n }\n\n if (error.length) {\n let errCode = error[1];\n let errMsg = error[0];\n\n // \"#INVALID_REQUEST: The account has been blacklisted.\"\n // \"#NOT_EXISTS: The account does not exist.\"\n // \"#SIGNUP_CONFIRMATION_NEEDED\": The account signup needs to be confirmed.\"\n // \"#ACCOUNT_EXISTS\": The account already exists.\"\n\n rej(new SkapiError(errMsg, { code: errCode, cause: err }));\n }\n else {\n rej(parsed);\n }\n\n return;\n }\n });\n });\n };\n\n const signup = (username: string, password: string, attributes: CognitoUserAttribute[]) => {\n return new Promise((res, rej) => {\n this.userPool.signUp(username, password, attributes, null, (err, result) => {\n if (err) {\n let { parsed, code } = cognitoErrorParser(err);\n let error = [];\n if (code === 'UsernameExistsException') {\n error = ['The account already exists.', 'EXISTS'];\n }\n else if (code === 'InvalidPasswordException') {\n error = ['Invalid password. Password must be at least 6 characters.', 'INVALID_PARAMETER'];\n }\n else if (code === 'InvalidParameterException') {\n error = [parsed.message || 'Invalid parameter.', 'INVALID_PARAMETER'];\n }\n else if (code === 'TooManyRequestsException' || code === 'LimitExceededException') {\n error = ['Too many attempts. Please try again later.', 'REQUEST_EXCEED'];\n }\n else if (code === 'CodeDeliveryFailureException') {\n error = ['Failed to deliver verification code.', 'CODE_DELIVERY_FAILURE'];\n }\n else if (code === 'UserLambdaValidationException') {\n error = [parsed.message || 'Signup validation failed.', 'INVALID_REQUEST'];\n }\n\n if (error.length) {\n rej(new SkapiError(error[0], { code: error[1], cause: err }));\n } else {\n rej(parsed);\n }\n\n return;\n }\n res(result);\n return;\n });\n })\n }\n\n return {\n getSession,\n authenticateUser,\n createCognitoUser,\n signup\n };\n}\nfunction cognitoErrorParser(err) {\n let original_code = typeof err?.code === 'string' && err.code.trim() ? err.code.trim() : 'ERROR';\n\n let raw_message =\n typeof err?.message === 'string'\n ? err.message\n : (typeof err === 'string' ? err : 'An error occurred.');\n\n let err_msg = (raw_message || 'An error occurred.').trim();\n if (!err_msg) {\n err_msg = 'An error occurred.';\n }\n\n // format: random text, #ERROR_CODE: Error message.\n let custom = err_msg.match(/#([A-Za-z0-9_]+)\\s*:\\s*([\\s\\S]+)/);\n let err_code = custom?.[1]?.trim() || original_code;\n let err_msg_custom = custom?.[2]?.trim() || err_msg;\n\n return {\n parsed: new SkapiError(err_msg_custom, { code: err_code, cause: err }),\n code: original_code,\n }\n}\nexport async function getProfile(options?: { refreshToken: boolean; }): Promise<UserProfile | null> {\n await this.__authConnection;\n let refreshToken = options?.refreshToken || false;\n if (!refreshToken) {\n return this.user;\n }\n try {\n // Always trigger live session refresh if refreshToken is true\n await authentication.bind(this)().getSession(Object.assign({ skipUserUpdateEventTrigger: !refreshToken, refreshToken }, options));\n return this.user;\n } catch (err) {\n return null;\n }\n}\n\nexport async function openIdLogin(params: {\n token: string;\n id: string;\n merge?: boolean | string[];\n template?: {\n /** message_id of the template to use for the welcome e-mail (sent the first time this OpenID user account is created). */\n welcome?: string;\n };\n}): Promise<{ userProfile: UserProfile; openid: { [attribute: string]: string } }> {\n await this.__connection;\n\n params = validator.Params(params, {\n token: 'string',\n id: 'string',\n merge: v => {\n if (v === undefined) return false;\n if (typeof v === 'string') {\n return [v]\n }\n if (Array.isArray(v)) {\n for (let item of v) {\n if (typeof item !== 'string') {\n throw new SkapiError('\"merge\" array items should be type: <string>.', { code: 'INVALID_PARAMETER' });\n }\n }\n }\n if (typeof v !== 'boolean' && !Array.isArray(v)) {\n throw new SkapiError('\"merge\" should be type: <boolean | string[]>.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n template: (v: { welcome?: string }) => {\n if (typeof v !== 'object' || v === null) {\n throw new SkapiError('\"template\" should be type: <object>.', { code: 'INVALID_PARAMETER' });\n }\n if (v.welcome !== undefined) {\n if (typeof v.welcome !== 'string' || !v.welcome) {\n throw new SkapiError('\"template.welcome\" should be a non-empty <string> (template message_id).', { code: 'INVALID_PARAMETER' });\n }\n }\n return v;\n }\n });\n\n let payload: any = { token: params.token, id: params.id, merge: params.merge };\n if ((params as any).template?.welcome) {\n payload.template_welcome = (params as any).template.welcome;\n }\n\n let oplog = await request.bind(this)(\"openid-logger\", payload);\n let logger = oplog.logger.split('#');\n let username = this.service + '-' + logger[0];\n let password = logger[1];\n\n return { userProfile: await authentication.bind(this)().authenticateUser(username, password, true, true), openid: oplog.openid };\n}\n\n// Get user info from base64 encoded token\nfunction decodeBase64Utf8(base64: string): string {\n const root = typeof globalThis !== 'undefined' ? (globalThis as any) : undefined;\n\n if (root?.Buffer) {\n return root.Buffer.from(base64, 'base64').toString('utf8');\n }\n\n if (typeof atob === 'function') {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder().decode(bytes);\n }\n\n return binary;\n }\n\n throw new Error('No base64 decoder available in this environment');\n}\n\nfunction getUserFromToken(accessToken) {\n // JWT has 3 parts: header.payload.signature\n const parts = accessToken.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format');\n }\n\n // Decode the payload (second part) - use base64url decoding\n const payload = parts[1];\n // Replace base64url chars with standard base64 chars\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const decoded = decodeBase64Utf8(base64);\n const userData = JSON.parse(decoded);\n return userData;\n}\n\nexport async function loginWithToken(params: {\n idToken: string;\n accessToken?: string;\n refreshToken?: string;\n}): Promise<UserProfile> {\n await this.__authConnection;\n this.log('loginWithToken:params', params);\n params = validator.Params(params, {\n idToken: 'string',\n accessToken: 'string',\n refreshToken: 'string'\n }, ['idToken']);\n\n // Store the bearer token for authenticated requests\n const idTokenPayload = getUserFromToken(params.idToken);\n this.log('loginWithToken:idTokenPayload', idTokenPayload);\n // Validate the token belongs to this service\n if (idTokenPayload['custom:service'] !== this.service) {\n throw new SkapiError('Token does not belong to this service.', { code: 'INVALID_REQUEST' });\n }\n\n // Check if token is expired\n const currentTime = Math.floor(Date.now() / 1000);\n if (idTokenPayload.exp && idTokenPayload.exp < currentTime) {\n throw new SkapiError('Token has expired.', { code: 'INVALID_REQUEST' });\n }\n\n // this.bearerToken = params.idToken;\n // Parse user attributes from the token payload\n this.__user = parseUserAttributes(idTokenPayload);\n\n this.session = null;\n\n if (params.accessToken && params.refreshToken) {\n try {\n this.session = new CognitoUserSession({\n IdToken: new CognitoIdToken({ IdToken: params.idToken }),\n AccessToken: new CognitoAccessToken({ AccessToken: params.accessToken }),\n RefreshToken: new CognitoRefreshToken({ RefreshToken: params.refreshToken })\n });\n\n this.log('loginWithToken:session', this.session);\n this.log('loginWithToken:CognitoUser', CognitoUser);\n this.log('loginWithToken:userPool', this.userPool);\n // Restore cognitoUser in memory for Node.js/server context\n if (CognitoUser && this.userPool) {\n this.log('loginWithToken:cognito:username', idTokenPayload['cognito:username']);\n let up = {\n Username: idTokenPayload['cognito:username'],\n Pool: this.userPool\n }\n this.log('loginWithToken:cognitoUserParams', up);\n cognitoUser = new CognitoUser(up);\n cognitoUser.setSignInUserSession(this.session);\n this.log('loginWithToken:cognitoUserRestored', {\n cognitoUserType: typeof cognitoUser,\n cognitoUserKeys: Object.keys(cognitoUser || {}),\n cognitoUser\n });\n }\n }\n catch (err: any) {\n // Enhanced error logging: log all property names, symbols, and descriptors\n this.log('loginWithToken:err', err);\n try {\n this.log('loginWithToken:err:stringified', JSON.stringify(err));\n } catch (e) {\n this.log('loginWithToken:err:stringifyFail', String(err));\n }\n try {\n const keys = Object.keys(err || {});\n const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(err || {}) : [];\n const descriptors = Object.getOwnPropertyDescriptors ? Object.getOwnPropertyDescriptors(err || {}) : {};\n this.log('loginWithToken:createSessionError:allKeys', { keys, symbols, descriptors });\n } catch (e) {\n this.log('loginWithToken:createSessionError:allKeysFail', String(e));\n }\n }\n }\n\n this._runOnLoginListeners(this.user);\n this._runOnUserUpdateListeners(this.user);\n\n return this.user;\n}\n\nexport async function checkAdmin() {\n await this.__connection;\n if (this.__user?.service === this.service) {\n // logged in\n return this.__user?.owner === this.host;\n } else {\n // not logged\n await logout.bind(this)();\n }\n\n return false;\n}\n\nexport async function _out(global: boolean = false) {\n let toReturn = null;\n\n if (cognitoUser) {\n if (global) {\n toReturn = new Promise((res, rej) => {\n cognitoUser.globalSignOut({\n onSuccess: (result: any) => {\n this.log('globalSignOut:success', result);\n res(result);\n },\n onFailure: (err: any) => {\n this.log('globalSignOut:error', err);\n rej(err);\n }\n });\n });\n }\n else {\n cognitoUser.signOut();\n }\n }\n\n let to_be_erased = {\n 'session': null,\n '__startKeyHistory': {},\n '__cached_requests': {},\n '__user': null\n };\n\n if (toReturn) {\n toReturn = await toReturn;\n }\n\n for (let k in to_be_erased) {\n this[k] = to_be_erased[k];\n }\n\n this._runOnUserUpdateListeners(null);\n this._runOnLoginListeners(null);\n\n return toReturn;\n}\n\nexport async function logout(params?: Form<{ global: boolean; }>): Promise<'SUCCESS: The user has been logged out.'> {\n await this.__connection;\n\n let { data } = extractFormData(params);\n\n await _out.bind(this)(data?.global);\n return 'SUCCESS: The user has been logged out.';\n}\n\nexport async function resendSignupConfirmation(): Promise<'SUCCESS: Signup confirmation e-mail has been sent.'> {\n if (!this.__request_signup_confirmation) {\n throw new SkapiError('Least one login attempt is required.', { code: 'INVALID_REQUEST' });\n }\n\n let resend = await request.bind(this)(\"confirm-signup\", {\n username: this.__request_signup_confirmation,\n });\n\n return resend; // 'SUCCESS: Signup confirmation e-mail has been sent.'\n}\n\nexport async function recoverAccount(\n /** Redirect url on confirmation success. */\n redirect: boolean | string = false\n): Promise<\"SUCCESS: Recovery e-mail has been sent.\"> {\n\n if (typeof redirect === 'string') {\n redirect = validator.Url(redirect);\n }\n\n else if (typeof redirect !== 'boolean') {\n throw new SkapiError('Argument should be type: <boolean | string>.', { code: 'INVALID_REQUEST' });\n }\n\n if (!this.__disabledAccount) {\n throw new SkapiError('Least one signin attempt of disabled account is required.', { code: 'INVALID_REQUEST' });\n }\n\n await request.bind(this)(\"recover-account\", { username: this.__disabledAccount, redirect });\n return 'SUCCESS: Recovery e-mail has been sent.';\n}\n\nexport async function login(\n form: Form<{\n /** if given, username will be used instead of email. */\n username?: string;\n /** E-Mail for signin. 64 character max. */\n email: string;\n /** Password for signin. Should be at least 6 characters. */\n password: string;\n }>): Promise<UserProfile> {\n \n let params:any = validator.Params(form, {\n username: 'string',\n email: 'string',\n password: 'string'\n }, ['password']);\n\n await this.__authConnection;\n\n if (params.email) {\n // incase user uses email instead of username\n try {\n validator.Email(params.email);\n } catch (err) {\n params.username = params.email;\n delete params.email;\n }\n }\n\n if (!params.username && !params.email) {\n throw new SkapiError('Least one of \"username\" or \"email\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n const resolved = await authentication.bind(this)().authenticateUser(params.username || params.email, params.password);\n\n return resolved;\n // INVALID_REQUEST: the account has been blacklisted.\n // NOT_EXISTS: the account does not exist.\n}\n\nexport async function signup(\n form: Form<UserAttributes & { password: String; username?: string; }>,\n option?: {\n signup_confirmation?: boolean | string;\n email_subscription?: boolean;\n login?: boolean;\n /**\n * Per-call e-mail template overrides.\n * Each value is the `message_id` of a template that the service owner\n * has previously uploaded via the Mail dashboard.\n */\n template?: {\n /** message_id of the template to use for the signup confirmation e-mail. */\n signup_confirmation?: string;\n /** message_id of the template to use for the welcome e-mail (sent on the user's first confirmed login). */\n welcome?: string;\n };\n }): Promise<UserProfile | \"SUCCESS: The account has been created. User's signup confirmation is required.\" | 'SUCCESS: The account has been created.'> {\n\n await this.__authConnection;\n\n let paramRestrictions = {\n username: 'string',\n password: (v: string) => validator.Password(v),\n\n email: (v: string) => validator.Email(v),\n name: 'string',\n address: (v: any) => {\n if (!v) return '';\n\n if (typeof v === 'string') {\n return v;\n }\n\n if (typeof v === 'object') {\n return JSON.stringify(v);\n }\n\n return undefined;\n },\n gender: 'string',\n birthdate: (v: string) => v ? validator.Birthdate(v) : \"\",\n phone_number: (v: string) => v ? validator.PhoneNumber(v) : \"\",\n\n email_public: ['boolean', () => false],\n address_public: ['boolean', () => false],\n gender_public: ['boolean', () => false],\n birthdate_public: ['boolean', () => false],\n phone_number_public: ['boolean', () => false],\n access_group: 'number', // v=>{if(v > 0 && v < 100) return v else throw SkapiError(...)}\n misc: 'string',\n\n picture: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n profile: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n family_name: 'string',\n given_name: 'string',\n middle_name: 'string',\n nickname: 'string',\n website: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n };\n\n let params = validator.Params(form || {}, paramRestrictions, ['email', 'password']);\n\n // always logout before creating an account (for users)\n await logout.bind(this)();\n\n option = validator.Params(option || {}, {\n email_subscription: (v: boolean) => {\n if (typeof v !== 'boolean') {\n throw new SkapiError('\"option.email_subscription\" should be type: <boolean>.', { code: 'INVALID_PARAMETER' });\n }\n if (!option?.signup_confirmation) {\n // requires to be url or true\n throw new SkapiError('\"option.signup_confirmation\" is required for email subscription.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n signup_confirmation: (v: string | boolean) => {\n let value = v;\n if (typeof v === 'string') {\n value = validator.Url(v);\n }\n else if (typeof v === 'boolean') {\n value = v;\n }\n else {\n throw new SkapiError('\"option.signup_confirmation\" should be type: <string | boolean>.', { code: 'INVALID_PARAMETER' });\n }\n\n if (value && !params.email) {\n throw new SkapiError('\"email\" is required for signup confirmation.', { code: 'INVALID_PARAMETER' });\n }\n\n return value;\n },\n login: (v: boolean) => {\n if (typeof v === 'boolean') {\n if (option.signup_confirmation && v) {\n throw new SkapiError('\"login\" is not allowed when \"option.signup_confirmation\" is true.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n }\n throw new SkapiError('\"option.login\" should be type: boolean.', { code: 'INVALID_PARAMETER' });\n },\n template: (v: { signup_confirmation?: string; welcome?: string }) => {\n if (typeof v !== 'object' || v === null) {\n throw new SkapiError('\"option.template\" should be type: <object>.', { code: 'INVALID_PARAMETER' });\n }\n if (v.signup_confirmation !== undefined) {\n if (typeof v.signup_confirmation !== 'string' || !v.signup_confirmation) {\n throw new SkapiError('\"option.template.signup_confirmation\" should be a non-empty <string> (template message_id).', { code: 'INVALID_PARAMETER' });\n }\n if (!option?.signup_confirmation) {\n throw new SkapiError('\"option.signup_confirmation\" is required when \"option.template.signup_confirmation\" is set.', { code: 'INVALID_PARAMETER' });\n }\n }\n if (v.welcome !== undefined) {\n if (typeof v.welcome !== 'string' || !v.welcome) {\n throw new SkapiError('\"option.template.welcome\" should be a non-empty <string> (template message_id).', { code: 'INVALID_PARAMETER' });\n }\n }\n return v;\n }\n });\n\n let logUser = option?.login || false;\n\n params.signup_confirmation = option?.signup_confirmation || false;;\n params.email_subscription = option?.email_subscription || false;\n\n if (params.email_public && !params.signup_confirmation) {\n throw new SkapiError('\"option.signup_confirmation\" should be true if \"email_public\" is set to true.', { code: 'INVALID_PARAMETER' });\n }\n\n // cognito signup process below\n\n params.service = this.service;\n params.owner = this.owner;\n\n // user creating account\n let newUser = authentication.bind(this)().createCognitoUser(params.username || params.email);\n\n for (let k of ['email_public',\n 'address_public',\n 'gender_public',\n 'birthdate_public',\n 'phone_number_public']) {\n params[k] = params[k] ? '1' : '0';\n }\n\n if (params.access_group) {\n params.access_group = params.access_group.toString();\n }\n\n let signup_key = (await request.bind(this)('signupkey', {\n username: newUser.cognitoUsername,\n signup_confirmation: typeof params.signup_confirmation === 'boolean' ? JSON.stringify(params.signup_confirmation) : params.signup_confirmation,\n email_subscription: params.email_subscription,\n template_confirmation: option?.template?.signup_confirmation || '',\n template_welcome: option?.template?.welcome || '',\n })).split(':');\n\n let signup_ticket = signup_key.slice(1).join(':');\n\n let attributeList = [\n new CognitoUserAttribute({\n Name: 'custom:signup',\n Value: signup_key[0]\n }),\n new CognitoUserAttribute({\n Name: 'locale',\n Value: signup_ticket.split('#')[1]\n }),\n new CognitoUserAttribute({\n Name: 'custom:signup_ticket',\n Value: signup_ticket\n })\n ];\n\n for (let k in paramRestrictions) {\n let customParams = [\n 'email_public',\n 'address_public',\n 'gender_public',\n 'birthdate_public',\n 'phone_number_public',\n 'misc',\n 'service',\n 'owner'\n ];\n if (params[k] === \"\") {\n continue;\n }\n\n if (k === 'username' || k === 'password' || k === 'access_group') {\n continue;\n }\n\n if (customParams.includes(k)) {\n attributeList.push(new CognitoUserAttribute({\n Name: 'custom:' + k,\n Value: params[k]\n }));\n }\n else {\n attributeList.push(new CognitoUserAttribute({\n Name: k,\n Value: params[k]\n }));\n }\n }\n\n await authentication.bind(this)().signup(newUser.cognitoUsername, params.password, attributeList);\n\n if (params.signup_confirmation) {\n cognitoUser = newUser.cognitoUser;\n this.__request_signup_confirmation = newUser.cognitoUsername;\n return \"SUCCESS: The account has been created. User's signup confirmation is required.\";\n }\n else if (logUser) {\n // log user in\n return login.bind(this)({ email: params.username || params.email, password: params.password });\n }\n\n return 'SUCCESS: The account has been created.';\n}\n\nexport async function disableAccount(): Promise<'SUCCESS: account has been disabled.'> {\n await this.__connection;\n let result = await request.bind(this)('remove-account', { disable: this.__user.user_id }, { auth: true });\n await logout.bind(this)();\n return result;\n}\n\nexport async function resetPassword(form: Form<{\n email: string;\n code: string | number;\n new_password: string;\n}>): Promise<\"SUCCESS: New password has been set.\"> {\n\n await this.__connection;\n\n let params = validator.Params(form, {\n email: (v: string) => validator.Email(v),\n code: ['number', 'string'],\n new_password: (v: string) => validator.Password(v)\n }, ['email', 'code', 'new_password']);\n\n let code = params.code, new_password = params.new_password;\n\n if (typeof code === 'number') {\n code = code.toString();\n }\n\n return new Promise(async (res, rej) => {\n let cognitoUser = authentication.bind(this)().createCognitoUser(params.email).cognitoUser;\n\n cognitoUser.confirmPassword(code, new_password, {\n onSuccess: result => {\n res(\"SUCCESS: New password has been set.\");\n },\n onFailure: (err: any) => {\n rej(new SkapiError(err?.message || 'Failed to reset password.', { code: err?.code || 'ERROR', cause: err }));\n }\n });\n });\n}\n\nasync function verifyAttribute(attribute: string, form: Form<{ code: string; }>, options?: { template?: { verification?: string } }): Promise<string> {\n await this.__connection;\n let code: string;\n\n if (!cognitoUser) {\n throw new SkapiError('The user has to be logged in.', { code: 'INVALID_REQUEST' });\n }\n\n if (attribute === 'email' || attribute === 'phone_number') {\n if (!this.__user.hasOwnProperty(attribute)) {\n throw new SkapiError(`No ${attribute === 'email' ? 'e-mail' : 'phone number'} to verify`, { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user?.[`${attribute}_verified`]) {\n return `SUCCESS: \"${attribute}\" is verified.`;\n }\n\n code = (form ? validator.Params(form, {\n code: 'string'\n }) : {}).code || '';\n }\n else {\n return;\n }\n\n // Optional per-call template override for the verification e-mail.\n let clientMetadata: { [k: string]: string } | undefined;\n const verificationMid = options?.template?.verification;\n if (verificationMid !== undefined) {\n if (typeof verificationMid !== 'string' || !verificationMid) {\n throw new SkapiError('\"template.verification\" should be a non-empty <string> (template message_id).', { code: 'INVALID_PARAMETER' });\n }\n clientMetadata = { template_verification: verificationMid };\n }\n\n return new Promise((res, rej) => {\n let callback: any = {\n onSuccess: (result: any) => {\n if (code) {\n authentication.bind(this)().getSession({ refreshToken: true }).then(\n () => {\n if (this.__user) {\n this.__user[attribute + '_verified'] = true;\n }\n res(`SUCCESS: \"${attribute}\" is verified.`);\n }\n ).catch(err => {\n rej(err);\n });\n }\n\n else {\n res('SUCCESS: Verification code has been sent.');\n }\n },\n onFailure: (err: Record<string, any>) => {\n rej(\n new SkapiError(\n err.message || 'Failed to request verification code.',\n {\n code: err?.code\n }\n )\n );\n }\n };\n\n if (code) {\n cognitoUser?.verifyAttribute(attribute, code, callback);\n }\n else {\n callback.inputVerificationCode = null;\n cognitoUser?.getAttributeVerificationCode(attribute, callback, clientMetadata);\n }\n });\n}\n\nexport function verifyPhoneNumber(form?: Form<{ code: string; }>, options?: { template?: { verification?: string } }): Promise<string> {\n // 'SUCCESS: Verification code has been sent.' | 'SUCCESS: \"phone_number\" is verified.'\n return verifyAttribute.bind(this)('phone_number', form, options);\n}\n\nexport function verifyEmail(form?: Form<{ code: string; }>, options?: { template?: { verification?: string } }): Promise<string> {\n // 'SUCCESS: Verification code has been sent.' | 'SUCCESS: \"email\" is verified.'\n return verifyAttribute.bind(this)('email', form, options);\n}\n\nexport async function forgotPassword(\n form: Form<{\n /** Signin E-Mail. */\n email: string;\n }>,\n options?: {\n template?: {\n /** message_id of the template to use for the password-reset verification e-mail. */\n verification?: string;\n };\n }): Promise<\"SUCCESS: Verification code has been sent.\"> {\n\n await this.__connection;\n\n let params = validator.Params(form, {\n email: (v: string) => validator.Email(v)\n }, ['email']);\n\n let clientMetadata: { [k: string]: string } | undefined;\n const verificationMid = options?.template?.verification;\n if (verificationMid !== undefined) {\n if (typeof verificationMid !== 'string' || !verificationMid) {\n throw new SkapiError('\"template.verification\" should be a non-empty <string> (template message_id).', { code: 'INVALID_PARAMETER' });\n }\n clientMetadata = { template_verification: verificationMid };\n }\n\n return new Promise(async (res, rej) => {\n let cognitoUser = authentication.bind(this)().createCognitoUser(params.email).cognitoUser;\n cognitoUser.forgotPassword({\n onSuccess: result => {\n res(\"SUCCESS: Verification code has been sent.\");\n },\n onFailure: (err: any) => {\n // create SkapiError from err\n /*\n UserNotFoundException\tUser does not exist in the user pool\n InvalidParameterException\tInvalid parameter (e.g., missing required attribute)\n NotAuthorizedException\tUser is not authorized (e.g., user is disabled)\n LimitExceededException\tAttempt limit exceeded, try again later\n TooManyRequestsException\tToo many requests made to the API\n CodeDeliveryFailureException\tFailed to deliver the verification code (email/SMS issue)\n UnexpectedLambdaException\tUnexpected exception with Lambda trigger\n UserLambdaValidationException\tUser validation exception from Lambda trigger\n InvalidLambdaResponseException\tInvalid response from Lambda trigger\n InvalidSmsRoleAccessPolicyException\tInvalid SMS role access policy\n InvalidSmsRoleTrustRelationshipException\tInvalid SMS role trust relationship\n InvalidEmailRoleAccessPolicyException\tInvalid email role access policy\n ResourceNotFoundException\tResource not found (user pool doesn't exist)\n InternalErrorException\tInternal server error\n ForbiddenException\tWAF blocked the request\n */\n\n let { parsed, code } = cognitoErrorParser(err);\n\n let mappedCode = {\n UserNotFoundException: 'NOT_EXISTS',\n InvalidParameterException: 'INVALID_PARAMETER',\n NotAuthorizedException: 'INVALID_REQUEST',\n LimitExceededException: 'REQUEST_EXCEED',\n TooManyRequestsException: 'REQUEST_EXCEED',\n CodeDeliveryFailureException: 'CODE_DELIVERY_FAILURE'\n }[code] || parsed.code || code || 'ERROR';\n\n rej(new SkapiError(parsed.message, { code: mappedCode, cause: err }));\n }\n }, clientMetadata);\n });\n}\n\nexport async function changePassword(params: {\n new_password: string;\n current_password: string;\n}): Promise<'SUCCESS: Password has been changed.'> {\n await this.__connection;\n if (!this.session) {\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n\n let p = validator.Params(params, {\n 'current_password': 'string',\n 'new_password': 'string'\n });\n\n if (!p?.current_password) {\n throw new SkapiError('\"current_password\" is required to change password.', { code: 'INVALID_PARAMETER' });\n }\n\n if (!p?.new_password) {\n throw new SkapiError('\"new_password\" is required to change password.', { code: 'INVALID_PARAMETER' });\n }\n\n validator.Password(p.current_password);\n validator.Password(p.new_password);\n\n return new Promise((res, rej) => {\n cognitoUser.changePassword(\n p.current_password,\n p.new_password,\n (err: any, result: any) => {\n if (err) {\n if (err?.code === \"InvalidParameterException\") {\n rej(new SkapiError('Invalid password parameter.', { code: 'INVALID_PARAMETER' }));\n }\n else if (err?.code === \"NotAuthorizedException\") {\n rej(new SkapiError('Incorrect password.', { code: 'INVALID_REQUEST' }));\n }\n else if (err?.code === \"TooManyRequestsException\" || err?.code === \"LimitExceededException\") {\n rej(new SkapiError('Too many attempts. Please try again later.', { code: 'REQUEST_EXCEED' }));\n }\n else {\n let { parsed, code } = cognitoErrorParser(err);\n rej(parsed);\n }\n return;\n }\n\n res('SUCCESS: Password has been changed.');\n });\n });\n}\n\nexport async function updateProfile(form: Form<UserAttributes>): Promise<UserProfile> {\n await this.__connection;\n if (!this.session) {\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n\n let params = validator.Params(form || {}, {\n user_id: (v: string) => validator.UserId(v),\n email: (v: string) => validator.Email(v),\n address: (v: any) => {\n if (!v) return '';\n\n if (typeof v === 'string') {\n return v;\n }\n\n if (typeof v === 'object') {\n return JSON.stringify(v);\n }\n\n return undefined;\n },\n name: 'string',\n gender: 'string',\n birthdate: (v: string) => v ? validator.Birthdate(v) : \"\",\n phone_number: (v: string) => v ? validator.PhoneNumber(v) : \"\",\n email_public: 'boolean',\n phone_number_public: 'boolean',\n address_public: 'boolean',\n gender_public: 'boolean',\n birthdate_public: 'boolean',\n misc: 'string',\n\n picture: (v: string) => v ? validator.Url(v) : \"\",\n profile: (v: string) => v ? validator.Url(v) : \"\",\n family_name: 'string',\n given_name: 'string',\n middle_name: 'string',\n nickname: 'string',\n website: (v: string) => v ? validator.Url(v) : \"\",\n });\n\n if (params && typeof params === 'object' && !Object.keys(params).length) {\n return this.user;\n }\n\n // set alternative signin email\n if (params.email) {\n params['preferred_username'] = this.service + '-' + MD5.hash(params.email);\n }\n\n let collision = [\n ['email_public', 'email_verified', \"User's e-mail should be verified to set\"],\n ['phone_number_public', 'phone_number_verified', \"User's phone number should be verified to set\"]\n ];\n\n if (this.__user) {\n for (let c of collision) {\n if (params[c[0]] && !this.__user[c[1]]) {\n throw new SkapiError(`${c[2]} \"${c[0]}\" to true.`, { code: 'INVALID_REQUEST' });\n }\n }\n }\n\n // delete unchanged values, convert key names to cognito attributes\n let toRemove = [];\n for (let k in params) {\n if (params[k] === this.user[k]) {\n toRemove.push(k);\n continue;\n }\n\n let customAttr = [\n 'email_public',\n 'phone_number_public',\n 'address_public',\n 'gender_public',\n 'birthdate_public',\n 'misc'\n ];\n\n if (customAttr.includes(k)) {\n let parseValue = params[k];\n\n if (typeof parseValue === 'boolean') {\n parseValue = parseValue ? '1' : '0';\n }\n\n params['custom:' + k] = parseValue;\n toRemove.push(k);\n }\n }\n\n for (let k of toRemove) {\n delete params[k];\n }\n\n if (params.user_id) {\n let user_id = params.user_id;\n if (user_id === this.user.user_id) {\n delete params.user_id;\n }\n else {\n return request.bind(this)('admin-edit-profile', { attributes: params }, { auth: true });\n }\n }\n\n if (params && typeof params === 'object' && Object.keys(params).length) {\n // format params to cognito attribute\n let toSet: Array<CognitoUserAttribute> = [];\n for (let key in params) {\n toSet.push(new CognitoUserAttribute({\n Name: key,\n Value: params[key]\n }));\n }\n\n await new Promise((res, rej) => {\n cognitoUser?.updateAttributes(\n toSet,\n (err: any, result: any) => {\n if (err) {\n rej(\n [\n err?.code || err?.name,\n err?.message || `Failed to update user settings.`\n ]\n );\n }\n res(result);\n });\n });\n\n await authentication.bind(this)().getSession({ refreshToken: true });\n return this.user;\n }\n\n return this.user;\n}\n\nexport async function getUsers(\n params?: {\n searchFor: string;\n value: string | number | boolean | string[];\n condition?: '>' | '>=' | '=' | '<' | '<=' | 'gt' | 'gte' | 'eq' | 'lt' | 'lte';\n range?: string | number | boolean;\n },\n fetchOptions?: FetchOptions): Promise<DatabaseResponse<UserPublic>> {\n\n params = extractFormData(params).data as any;\n\n if (!params) {\n // set default value\n params = {\n searchFor: 'timestamp',\n condition: '>',\n value: 0\n };\n\n if (!fetchOptions) {\n fetchOptions = {};\n }\n\n fetchOptions.ascending = false;\n }\n\n await this.__connection;\n\n const searchForTypes = {\n 'user_id': (v: string) => {\n if (Array.isArray(v)) {\n return v.map(id => validator.UserId(id));\n }\n return validator.UserId(v)\n },\n 'email': 'string',\n 'phone_number': 'string',\n 'locale': (v: string) => {\n if (typeof v !== 'string' || typeof v === 'string' && v.length > 5) {\n throw new SkapiError('Value of \"locale\" should be a country code.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n 'name': 'string',\n 'address': 'string',\n 'gender': 'string',\n 'birthdate': (v: string) => validator.Birthdate(v),\n 'subscribers': 'number',\n 'timestamp': 'number',\n 'access_group': 'number',\n 'approved': 'string'\n };\n\n let required = ['searchFor', 'value'];\n\n params = validator.Params(params, {\n searchFor: [\n 'user_id',\n 'name',\n 'email',\n 'phone_number',\n 'address',\n 'gender',\n 'birthdate',\n 'locale',\n 'subscribers',\n 'timestamp',\n 'access_group',\n 'approved'\n ],\n condition: ['>', '>=', '=', '<', '<=', 'gt', 'gte', 'eq', 'lt', 'lte', () => '='],\n value: (v: any) => {\n let checker = searchForTypes[params.searchFor];\n if (typeof checker === 'function') {\n return checker(v);\n }\n\n else if (typeof v !== checker) {\n throw new SkapiError(`Value does not match the type of \"${params.searchFor}\" index.`, { code: 'INVALID_PARAMETER' });\n }\n\n return v;\n },\n range: (v: any) => {\n let checker = searchForTypes[params.searchFor];\n if (typeof checker === 'function') {\n return checker(v);\n }\n\n else if (typeof v !== checker) {\n throw new SkapiError(`Range does not match the type of \"${params.searchFor}\" index.`, { code: 'INVALID_PARAMETER' });\n }\n\n return v;\n }\n }, required);\n\n if (params?.condition && params?.condition !== '=' && params.hasOwnProperty('range')) {\n throw new SkapiError('Conditions does not apply on range search.', { code: 'INVALID_PARAMETER' });\n }\n\n if (params.searchFor === 'user_id' && (params.condition !== '=' || params.range)) {\n throw new SkapiError(`Conditions are not allowed on \"${params.searchFor}\"`, { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof params?.value === 'string' && !params?.value) {\n throw new SkapiError('Value should not be an empty string.', { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof params?.searchFor === 'string' && !params?.searchFor) {\n throw new SkapiError('\"searchFor\" should not be an empty string.', { code: 'INVALID_PARAMETER' });\n }\n\n return request.bind(this)('get-users', params, { auth: true, fetchOptions });\n}\n\n/**\n * Not official. Bleeding edge.<br>\n * Retrieves, reverts e-mail to last verified email.<br>\n * @returns Last verified e-mail address, or updated userProfile when params.revert is true.\n */\nexport async function lastVerifiedEmail(params?: {\n /** Reverts to last verified e-mail when true. */\n revert: boolean;\n}): Promise<string | UserProfile> {\n await this.__connection;\n let res = await request.bind(this)('last-verified-email', params, { auth: true });\n if (res.includes('SUCCESS')) {\n await authentication.bind(this)().getSession({ refreshToken: true });\n return this.user;\n }\n return res;\n}\n\n/**\n * Not official. Bleeding edge.<br>\n * Requests username(e-mail) change.<br>\n * skapi server will send username change confirmation e-mail to user.<br>\n * Username will not be changed when the user did not confirm.<br>\n * Confirmation e-mail is valid within 24 hours.\n */\nexport async function requestUsernameChange(params: {\n /** Redirect URL when user clicks on the link. */\n redirect?: string;\n /** username(e-mail) user wish to change to. */\n username: string;\n}): Promise<'SUCCESS: confirmation e-mail has been sent.'> {\n await this.__connection;\n\n params = validator.Params(params, {\n username: validator.Email,\n redirect: validator.Url\n }, ['username']);\n\n return await request.bind(this)('request-username-change', params, { auth: true });\n}","\nimport SkapiError from '../main/error';\nimport { Form, FetchOptions, DatabaseResponse, ProgressCallback } from '../Types';\nimport validator from './validator';\nimport { MD5, generateRandom, extractFormData, isBrowserRuntime } from './utils';\n// import { authentication, getJwtToken } from '../methods/user';\nimport { getJwtToken } from '../methods/user';\nimport Qpass from \"qpass\";\n\nlet requestQueue = null;\nconst hasSubmitEvent = typeof SubmitEvent !== 'undefined';\nconst hasHTMLFormElement = typeof HTMLFormElement !== 'undefined';\nconst isBrowser = isBrowserRuntime();\n// Global counters for round-robin\nlet request_counter = 0;\n\nfunction getRetryDelayMs(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n if (Number.isFinite(seconds)) {\n return Math.max(0, seconds * 1000);\n }\n\n const dateMs = Date.parse(retryAfter);\n if (!Number.isNaN(dateMs)) {\n return Math.max(0, dateMs - Date.now());\n }\n\n return null;\n}\n\nfunction toPercent(loaded: number, total: number): number {\n return total > 0 ? (loaded / total) * 100 : 0;\n}\n\nlet selectGateway = (params: { auth: boolean, type: string, endpoints: {[key:string]: string}[], stable?: boolean }) => {\n const { auth, type, endpoints, stable } = params;\n\n const admin = endpoints[0];\n // {\n // \"admin_public\": \"https://nty2bxrol1.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"admin_private\": \"https://4250a1g3bd.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"admin_public_2\": \"https://of8ur90ix1.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"admin_private_2\": \"https://gge4qiyqv2.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"get_users_private\": \"https://eztrfvyq49.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"service_public\": \"https://pg695jr002.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"extra_public\": \"https://8zpb401kr3.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"extra_private\": \"https://o5vqmktoa4.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"extra_public_2\": \"https://u3c0pt5v7a.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"extra_private_2\": \"https://dr6glk4kz8.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"userpool_id\": \"eu-west-1_vq4rt05un\",\n // \"userpool_client\": \"76uku0vqmkko2os1s8sh8dmpar\"\n // }\n const record = endpoints[1];\n // {\n // \"record_public\": \"https://9zxjxkrczi.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"record_private\": \"https://luvgxcgpwd.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"record_public_2\": \"https://ekhpyuchg6.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"record_private_2\": \"https://nprhgj1xkj.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"post_public\": \"https://cbzajunw33.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"post_private\": \"https://j51bbrnqb7.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"get_public\": \"https://nmnczc41wg.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"get_private\": \"https://0zpwltd5yh.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"del_private\": \"https://w7grra2h6k.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"websocket_private\": \"wss://t47k8wdn19.execute-api.ap-northeast-1.amazonaws.com/api\"\n // }\n\n request_counter++;\n\n if (type === 'admin') {\n const gateways_admin_round_robin = Object.entries(admin)\n .filter(([k, v]) => k.includes(auth ? '_private' : '_public') && k !== 'get_users_private' && k !== 'service_public' && typeof v === 'string')\n .map(([, v]) => v);\n\n if (!gateways_admin_round_robin.length) {\n throw new SkapiError('No available admin gateways.', { code: 'INVALID_REQUEST' });\n }\n\n return gateways_admin_round_robin[request_counter % gateways_admin_round_robin.length];\n }\n if (type === 'record') {\n const gateways_record_round_robin = Object.entries(record)\n .filter(([k, v]) => k.includes(auth ? 'record_private' : 'record_public') && typeof v === 'string')\n .map(([, v]) => v);\n\n if (!gateways_record_round_robin.length) {\n throw new SkapiError('No available record gateways.', { code: 'INVALID_REQUEST' });\n }\n\n // A response the BROWSER is meant to cache has to come back from the same\n // host every time: the http cache is keyed by the whole url, so letting\n // the round robin alternate between record_private and record_private_2\n // gives the same file two cache entries holding two different signed\n // urls, and the file is downloaded once for each. Pinning costs this one\n // request its turn in the rotation and nothing else.\n if (stable) {\n return gateways_record_round_robin[0];\n }\n\n return gateways_record_round_robin[request_counter % gateways_record_round_robin.length];\n }\n\n throw new SkapiError('Invalid gateway type.', { code: 'INVALID_REQUEST' });\n}\n\nasync function getEndpoint(dest: string, auth: boolean, stableGateway?: boolean) {\n const endpoints = await Promise.all([\n this.admin_endpoint,\n this.record_endpoint\n ]);\n\n const admin = endpoints[0];\n const record = endpoints[1];\n\n let params = dest.split('?');\n let query = params.length > 1 ? '?' + params[1] : '';\n dest = params[0];\n\n switch (dest) {\n case 'get-users': ////\n return admin.get_users_private + dest + query;\n case 'service': ////\n return admin.service_public + dest + query;\n case 'get-newsletters':\n case 'get-public-newsletters':\n case 'subscribe-newsletter':\n case 'subscribe-public-newsletter':\n case 'signupkey':\n case 'admin-newsletter-request':\n case 'admin-signup':\n case 'confirm-signup':\n case 'openid-logger':\n case 'block-account':\n case 'admin-edit-profile':\n case 'remove-account':\n case 'post-secure':\n case 'recover-account':\n case 'mock':\n case 'grant-access':\n case 'last-verified-email':\n case 'ticket':\n case 'register-ticket':\n case 'get-newsletter-subscription':\n case 'request-username-change':\n case 'send-inquiry':\n case 'register-newsletter-group':\n case 'newsletter-group-endpoint':\n case 'invitation-list':\n case 'csr':\n case 'csr-poll':\n case 'csr-cancel':\n return selectGateway.bind(this)({ auth, type: 'admin', endpoints }) + dest + query;\n\n // Records\n case 'post-record': ////\n // Dedicated gateway api for post-record\n return (auth ? record.post_private : record.post_public) + dest + query;\n\n case 'get-records': ////\n // Dedicated gateway api for get-record\n return (auth ? record.get_private : record.get_public) + dest + query;\n\n case 'del-files': //\n case 'del-records': //\n // Dedicated gateway api for del-records and del-files\n return record.del_private + dest + query;\n case 'store-subscription':\n case 'get-vapid-public-key':\n case 'push-notification':\n case 'delete-subscription':\n case 'subscription':\n case 'get-subscription':\n case 'get-table':\n case 'get-tag':\n case 'get-uniqueid':\n case 'get-index':\n case 'get-signed-url':\n case 'extract-file-text':\n case 'grant-private-access':\n case 'request-private-access-key':\n case 'get-ws-group':\n case 'check-schema':\n case 'get-feed':\n // From viviplayground\n case 'castspell':\n case 'dopamine':\n case 'getspell':\n return selectGateway.bind(this)({ auth, type: 'record', endpoints, stable: stableGateway }) + dest + query;\n\n default:\n return validator.Url(dest) + query;\n }\n}\n\nconst __pendingRequest: Record<string, Promise<any>> = {};\n\nexport function terminatePendingRequests() {\n if (requestQueue) {\n requestQueue.terminate();\n requestQueue = null;\n }\n}\n\nexport async function request(\n url: string,\n data: Form<any> = null,\n options?: {\n fetchOptions?: FetchOptions;\n auth?: boolean;\n method?: string;\n bypassAwaitConnection?: boolean;\n responseType?: 'json' | 'blob' | 'text' | 'arrayBuffer' | 'formData' | 'document';\n contentType?: string;\n tokenHeaders?: {\n accessToken?: boolean | string;\n idToken?: boolean | string;\n };\n // Always resolve to the SAME gateway host instead of taking the next one\n // in the round robin. Only for a response the browser is meant to cache:\n // the http cache is keyed by the full url, so an alternating host would\n // silently halve the hit rate and duplicate whatever the response points\n // at. See selectGateway.\n stableGateway?: boolean;\n // Send `Cache-Control: no-cache`, so the browser revalidates this exact\n // url and OVERWRITES its stored response instead of adding a second entry\n // beside it. Pair with stableGateway when replacing a cached response.\n revalidate?: boolean;\n },\n _etc?: {\n ignoreService: boolean;\n }\n): Promise<any> {\n this.log('request', { url, data, options, _etc: _etc || {} });\n\n options = options || {};\n\n let {\n auth = false,\n method = 'post',\n bypassAwaitConnection = false,\n } = options;\n\n method = method.toUpperCase();\n\n let __connection = null;\n let service = data?.service || this.service;\n let owner = data?.owner || this.owner;\n let token = null; // idToken\n let endpoint = await getEndpoint.bind(this)(url, !!auth, !!options.stableGateway);\n\n if (!bypassAwaitConnection) {\n __connection = await this.__connection;\n if (!__connection) {\n throw new SkapiError('Invalid connection. The service could have been disabled, or has a restricted CORS.', { code: 'INVALID_REQUEST' });\n }\n }\n\n const wantsIdTokenHeader = options?.tokenHeaders?.idToken === true;\n\n if (auth || wantsIdTokenHeader) {\n token = await getJwtToken.bind(this)();\n }\n\n let fetchOptions = {}; // record fetch options\n let { fetchMore = false, progress } = options?.fetchOptions || {};\n\n if (options?.fetchOptions && Object.keys(options.fetchOptions).length) {\n for (let k of ['limit', 'startKey', 'ascending']) {\n if (options.fetchOptions.hasOwnProperty(k)) {\n if (k === 'startKey' && options.fetchOptions[k] === null) {\n continue;\n }\n fetchOptions[k] = options.fetchOptions[k];\n }\n }\n\n fetchOptions = validator.Params(\n fetchOptions,\n {\n limit: v => {\n if (typeof v !== 'number') {\n throw new SkapiError('Fetch limit should be a number.', { code: 'INVALID_REQUEST' });\n }\n if (v > 1000) {\n throw new SkapiError('Fetch limit should be below 1000.', { code: 'INVALID_REQUEST' });\n }\n return v;\n },\n startKey: v => v,\n ascending: 'boolean'\n }\n );\n }\n\n let required = _etc?.ignoreService ? {} : { service, owner };\n Object.assign(required, fetchOptions);\n\n data = extractFormData(data).data;\n\n if (!data) {\n // set data to required parameter\n data = required;\n }\n else if (data && typeof data === 'object') {\n // add required to data\n data = Object.assign(required, data);\n }\n\n let requestFingerprint = `${method}:${auth ? 'auth' : 'public'}:${url}`;\n\n let hashedParams = (() => {\n if (data && typeof data === 'object' && Object.keys(data).length && !(isBrowser && data instanceof FormData)) {\n // hash request parameters\n function sortObject(obj: Record<string, any>): Record<string, any> {\n if (typeof obj === 'object' && obj !== null) {\n return Object.keys(obj)\n .sort()\n .reduce((res, key) => {\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n // If the value is an object, sort it recursively\n res[key] = sortObject(obj[key]);\n } else {\n res[key] = obj[key];\n }\n return res;\n }, {});\n }\n return obj;\n };\n\n return MD5.hash(requestFingerprint + '/' + JSON.stringify(sortObject(data)));\n }\n\n return MD5.hash(requestFingerprint + '/' + service);\n })();\n\n let { requestKey, requestKeyWithStartKey } = load_startKey_keys.bind(this)({\n params: data,\n url,\n fetchMore,\n hashedParams\n }); // returns requrestKey | cached data\n\n if (!requestKey || requestKey && typeof requestKey === 'object') {\n // cached data can be falsy data or object\n return requestKey;\n }\n\n this.log('requestKey', requestKeyWithStartKey);\n\n // prevent duplicate request\n if (typeof requestKeyWithStartKey === 'string' && __pendingRequest[requestKeyWithStartKey] instanceof Promise) {\n this.log('request:returning pending', requestKeyWithStartKey);\n return __pendingRequest[requestKeyWithStartKey as string];\n }\n\n // new request\n let headers: Record<string, any> = {\n 'Accept': '*/*'\n };\n\n const hasCustomContentType = Object.prototype.hasOwnProperty.call(options, 'contentType') && options.contentType !== undefined;\n if (hasCustomContentType) {\n const configuredContentType = options.contentType === null ? 'application/x-www-form-urlencoded' : options.contentType;\n if (configuredContentType) {\n headers['Content-Type'] = configuredContentType;\n }\n }\n else if (isBrowser && !(data instanceof FormData)) {\n headers['Content-Type'] = 'application/json';\n }\n else {\n headers['Content-Type'] = 'application/json';\n }\n\n if (token) {\n headers.Authorization = token;\n }\n\n if (options?.tokenHeaders) {\n const resolveTokenValue = (configuredValue: boolean | string | undefined, fallbackValue: string | null) => {\n if (typeof configuredValue === 'string') {\n return configuredValue;\n }\n\n if (configuredValue === true) {\n return fallbackValue;\n }\n\n return null;\n };\n\n const accessToken = resolveTokenValue(options.tokenHeaders.accessToken, this.session?.accessToken?.jwtToken || null);\n const idToken = resolveTokenValue(options.tokenHeaders.idToken, this.bearerToken || this.session?.idToken?.jwtToken || token || null);\n\n if (accessToken) {\n headers['X-Access-Token'] = accessToken;\n }\n\n if (idToken) {\n headers['X-Id-Token'] = idToken;\n }\n }\n\n let meta = {\n public_identifier: this.__public_identifier,\n service,\n owner\n };\n\n headers['Content-Meta'] = JSON.stringify(meta);\n\n if (options.revalidate) {\n // Forces the browser to go to the origin for THIS url and to REPLACE what\n // it has stored under it. A cache-busting query parameter cannot do that:\n // it is a different url, so it creates a second entry and leaves the stale\n // one answering every later call until it expires on its own.\n headers['Cache-Control'] = 'no-cache';\n headers['Pragma'] = 'no-cache';\n }\n\n // if (headers['Content-Type'] !== 'application/json') {\n // // add service and owner to headers if content type is not json\n // headers['Content-Meta'] = JSON.stringify(meta);\n // }\n\n let opt: RequestInit & { responseType?: string | null, headers: Record<string, any>; } = { headers }; // request options\n if (options?.responseType) {\n opt.responseType = options.responseType;\n }\n\n if (method === 'GET') {\n if (data) {\n let query = [];\n if (isBrowser && data instanceof FormData) {\n query = Array.from(data.entries()).map(([k, value]) => {\n const stringValue = typeof value === 'string' ? value : value.name;\n return encodeURIComponent(k) + '=' + encodeURIComponent(stringValue);\n });\n }\n else {\n query = Object.keys(data)\n .map(k => {\n let value = data[k];\n if (typeof value !== 'string') {\n value = JSON.stringify(value);\n }\n return encodeURIComponent(k) + '=' + encodeURIComponent(value);\n });\n }\n\n if (query.length) {\n const separator = endpoint.includes('?')\n ? (endpoint.endsWith('?') || endpoint.endsWith('&') ? '' : '&')\n : '?';\n endpoint += separator + query.join('&');\n }\n }\n opt.body = null;\n }\n else {\n if (isBrowser && data instanceof FormData) {\n opt.body = data;\n }\n else if (headers['Content-Type'] === 'application/x-www-form-urlencoded' && data && typeof data === 'object') {\n const encoded = new URLSearchParams();\n for (let key of Object.keys(data)) {\n const value = data[key];\n encoded.append(key, typeof value === 'string' ? value : JSON.stringify(value));\n }\n opt.body = encoded.toString();\n }\n else if (typeof data === 'string') {\n opt.body = data;\n }\n else {\n opt.body = data ? JSON.stringify(data) : null;\n }\n }\n\n opt.method = method;\n\n if (requestQueue === null) {\n let config = {\n batchSize: this.requestBatchSize,\n breakWhenError: false,\n onProgress: (progress) => {\n // for(let key in __pendingRequest) {\n // delete __pendingRequest[key];\n // }\n this.onBatchProcess.forEach((cb) => cb(progress));\n }\n };\n\n requestQueue = new Qpass(config);\n }\n\n this.log('request-opt', opt);\n\n return new Promise((res, rej) => {\n requestQueue.add([async () => {\n let promise = _fetch.bind(this)(endpoint, opt, progress);\n __pendingRequest[requestKeyWithStartKey as string] = promise;\n\n try {\n let result = update_startKey_keys.bind(this)({\n hashedParam: requestKey,\n requestKeyWithStartKey,\n url,\n fetched: await promise\n });\n delete __pendingRequest[requestKeyWithStartKey];\n this.log('request:end', result);\n res(result);\n return result;\n }\n catch (err) {\n delete __pendingRequest[requestKeyWithStartKey];\n this.log('request:err', err);\n rej(err);\n throw err;\n }\n }]);\n });\n}\n\nfunction load_startKey_keys(option: {\n params: Record<string, any>;\n url: string;\n fetchMore: boolean;\n hashedParams: string;\n}): { requestKeyWithStartKey: string, requestKey: string | DatabaseResponse<any> } {\n let { params = {}, url, fetchMore = false, hashedParams } = option || {};\n\n if (params.startKey) {\n if (\n !(typeof params.startKey === 'object' && Object.keys(params.startKey).length) &&\n params.startKey !== 'start' && params.startKey !== 'end'\n ) {\n throw new SkapiError(`\"${params.startKey}\" is invalid startKey key.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (params.startKey === 'start') {\n // deletes referenced object key\n fetchMore = false;\n delete params.startKey;\n }\n }\n\n if (!fetchMore) {\n // init cache, init startKey\n\n if (this.__cached_requests?.[url]?.[hashedParams]) {\n // delete cached data start\n delete this.__cached_requests[url][hashedParams];\n }\n\n if (this.__startKeyHistory?.[url]?.[hashedParams]) {\n if (Array.isArray(this.__startKeyHistory[url][hashedParams]) && this.__startKeyHistory[url][hashedParams].length) {\n // delete cache of all startkeys\n for (let p of this.__startKeyHistory[url][hashedParams]) {\n let hashedParams_cached = hashedParams + MD5.hash(p);\n if (this.__cached_requests?.[url] && this.__cached_requests?.[url]?.[hashedParams_cached]) {\n delete this.__cached_requests[url][hashedParams_cached];\n }\n }\n }\n\n // delete start key lists\n delete this.__startKeyHistory[url][hashedParams];\n }\n\n return { requestKeyWithStartKey: hashedParams, requestKey: hashedParams };\n }\n\n if (!Array.isArray(this.__startKeyHistory?.[url]?.[hashedParams])) {\n // startkey does not exists\n return { requestKeyWithStartKey: hashedParams, requestKey: hashedParams };\n }\n\n // hashed params exists\n let list_of_startKeys = this.__startKeyHistory[url][hashedParams]; // [\"{<startKey key>}\", ...'end']\n let last_startKey_key = list_of_startKeys[list_of_startKeys.length - 1];\n let requestKeyWithStartKey = hashedParams;\n\n if (last_startKey_key) {\n // use last start key\n // requestKeyWithStartKey += MD5.hash(last_startKey_key);\n\n if (last_startKey_key === 'end') { // cached startKeys are stringified\n return {\n requestKey: {\n list: [],\n startKey: 'end',\n endOfList: true,\n startKeyHistory: list_of_startKeys\n },\n requestKeyWithStartKey\n }\n }\n\n // else {\n requestKeyWithStartKey += MD5.hash(last_startKey_key);\n params.startKey = JSON.parse(last_startKey_key);\n // }\n }\n\n if (this.__cached_requests?.[url]?.[requestKeyWithStartKey]) {\n // return data if there is cache\n return { requestKey: this.__cached_requests[url][requestKeyWithStartKey], requestKeyWithStartKey };\n }\n\n // return hashedParams;\n return { requestKeyWithStartKey, requestKey: hashedParams };\n}\n\nfunction _fetch(url: string, opt: any, progress?: ProgressCallback) {\n return new Promise(\n (res, rej) => {\n let xhr = new XMLHttpRequest();\n\n // 0: UNSENT - The request is not initialized.\n // 1: OPENED - The request has been set up.\n // 2: HEADERS_RECEIVED - The request has sent, and the headers and status are available.\n // 3: LOADING - The response's body is being received.\n // 4: DONE - The data transfer has been completed or an error has occurred during the \n\n // xhr.onreadystatechange = function () {\n // if (xhr.readyState === 4) { //if complete\n // if (xhr.status >= 200 || xhr.status <= 299) { //check if \"OK\" (200)\n // //success\n // } else {\n // rej(xhr.status); //otherwise, some other code was returned\n // }\n // }\n // };\n\n xhr.open(opt.method || 'GET', url);\n\n for (var k in opt.headers || {}) {\n xhr.setRequestHeader(k, opt.headers[k]);\n }\n\n if (opt.responseType) {\n xhr.responseType = opt.responseType;\n }\n\n xhr.onload = () => {\n if (xhr.status < 400) {\n // Status codes in the 2xx range mean success\n if (opt.responseType == 'json' || opt.responseType == 'blob') {\n res(xhr.response);\n }\n else {\n let result = xhr.responseText;\n try {\n result = JSON.parse(result);\n }\n catch (err) { }\n res(result);\n }\n }\n\n else if (xhr.status === 429) {\n // too many requests\n let retryAfter = xhr.getResponseHeader('Retry-After');\n let retryDelayMs = getRetryDelayMs(retryAfter);\n if (retryDelayMs !== null) {\n setTimeout(() => {\n _fetch(url, opt, progress).then(res, rej);\n }, retryDelayMs);\n }\n else {\n rej('Too many requests');\n }\n }\n\n else {\n // Status codes outside the 2xx range indicate errors\n let status = xhr.status;\n let errCode = [\n 'INVALID_CORS',\n 'INVALID_REQUEST',\n 'SERVICE_DISABLED',\n 'INVALID_PARAMETER',\n 'ERROR',\n 'EXISTS',\n 'NOT_EXISTS'\n ];\n\n let result: any = opt.responseType == 'blob' ? xhr.response : xhr.responseText;\n try {\n result = JSON.parse(result);\n }\n catch (err) { }\n \n if (typeof result === 'string') {\n let errMsg = result.split(':');\n let code = errMsg.splice(0, 1)[0].trim();\n let msg = errMsg.join(':').trim();\n rej(new SkapiError(msg || result, { code: (errCode.includes(code) ? code : 'ERROR') }));\n }\n\n else if (typeof result === 'object' && result?.message) {\n let code = (result?.code || (status ? status.toString() : null) || 'ERROR');\n let message = result.message;\n let cause = result?.cause;\n if (typeof message === 'string') {\n message = message.trim();\n }\n rej(new SkapiError(message, { cause, code }));\n }\n\n else {\n rej(result);\n }\n }\n };\n\n xhr.onerror = () => rej('Network error');\n xhr.onabort = () => rej('Aborted');\n xhr.ontimeout = () => rej('Timeout');\n\n if (typeof progress === 'function') {\n xhr.onprogress = (p: ProgressEvent) => {\n progress(\n {\n status: 'download',\n progress: toPercent(p.loaded, p.total),\n loaded: p.loaded,\n total: p.total,\n abort: () => xhr.abort()\n }\n );\n };\n if (xhr.upload) {\n xhr.upload.onprogress = (p: ProgressEvent) => {\n progress(\n {\n status: 'upload',\n progress: toPercent(p.loaded, p.total),\n loaded: p.loaded,\n total: p.total,\n abort: () => xhr.abort()\n }\n );\n };\n }\n }\n\n xhr.send(opt.body);\n }\n );\n}\n\nfunction update_startKey_keys(option: Record<string, any>) {\n let { hashedParam, requestKeyWithStartKey, url, fetched } = option;\n\n if (!fetched?.startKey) {\n // no startkey no caching\n return fetched;\n }\n\n // has start key\n // startkey is key for next fetch\n\n // this.__startKeyHistory[url] = {\n // [hashedParam]: ['{<startKey key>}', ...'end'],\n // ...\n // }\n\n // this.__cached_requests[url][hashsedParams + md5(JSON.stringify(startKey))] = {\n // data\n // ...\n // }\n\n if (!this.__startKeyHistory.hasOwnProperty(url)) {\n // create url key to store startKey key list if it doesnt exists\n this.__startKeyHistory[url] = {};\n }\n\n if (!this.__startKeyHistory[url].hasOwnProperty(hashedParam)) {\n this.__startKeyHistory[url][hashedParam] = [];\n }\n\n let startKey_string = fetched.startKey === 'end' ? 'end' : JSON.stringify(fetched.startKey);\n if (!this.__startKeyHistory[url][hashedParam].includes(startKey_string)) {\n this.__startKeyHistory[url][hashedParam].push(startKey_string);\n }\n\n // let hashedParamWithStartKey = hashedParam + MD5.hash(startKey_string);\n\n if (!this.__cached_requests?.[url]) {\n this.__cached_requests[url] = {};\n }\n // this.__cached_requests[url][hashedParamWithStartKey] = fetched;\n this.__cached_requests[url][requestKeyWithStartKey] = fetched;\n\n return Object.assign({ startKeyHistory: this.__startKeyHistory[url][hashedParam] }, fetched);\n}\n\nexport async function uploadFiles(\n fileList: FormData | HTMLFormElement | SubmitEvent,\n params: {\n record_id: string; // Record ID of a record to upload files to.\n progress?: ProgressCallback;\n }\n): Promise<{ completed: File[]; failed: File[]; bin_endpoints: string[] }> {\n await this.__connection;\n let { record_id, service = this.service, progress } = (params as { [key: string]: any })\n\n if (!record_id) {\n throw new SkapiError('\"record_id\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n if (hasSubmitEvent && fileList instanceof SubmitEvent) {\n fileList = (fileList.target as HTMLFormElement);\n }\n\n if (hasHTMLFormElement && fileList instanceof HTMLFormElement) {\n fileList = new FormData(fileList);\n }\n\n if (!isBrowser || !(fileList instanceof FormData)) {\n throw new SkapiError('\"fileList\" should be a FormData or HTMLFormElement.', { code: 'INVALID_PARAMETER' });\n }\n\n let reserved_key = generateRandom();\n\n let getSignedParams: Record<string, any> = {\n reserved_key,\n service,\n request: 'post'\n };\n\n if (params?.record_id) {\n getSignedParams.id = params.record_id;\n }\n\n let xhr;\n\n let fetchProgress = (\n url: string,\n body: FormData,\n progressCallback: (p: ProgressEvent) => void\n ) => {\n return new Promise((res, rej) => {\n xhr = new XMLHttpRequest();\n xhr.open('POST', url);\n xhr.onload = () => {\n let result = xhr.responseText;\n try {\n result = JSON.parse(result);\n }\n catch (err) { }\n if (xhr.status >= 200 && xhr.status < 300) {\n res(result);\n }\n else if (xhr.status === 429) {\n // too many requests\n let retryAfter = xhr.getResponseHeader('Retry-After');\n let retryDelayMs = getRetryDelayMs(retryAfter);\n if (retryDelayMs !== null) {\n setTimeout(() => {\n fetchProgress(url, body, progressCallback).then(res, rej);\n }, retryDelayMs);\n }\n else {\n rej('Too many requests');\n }\n }\n else {\n rej(result);\n }\n };\n xhr.onerror = () => rej('Network error');\n xhr.onabort = () => rej('Aborted');\n xhr.ontimeout = () => rej('Timeout');\n\n // xhr.addEventListener('error', rej);\n if (xhr.upload && typeof progressCallback === 'function') {\n xhr.upload.onprogress = progressCallback;\n }\n\n xhr.send(body);\n });\n };\n\n function toBase62(num: number) {\n const base62Chars = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n if (num === 0) return base62Chars[0];\n let result = '';\n while (num > 0) {\n result = base62Chars[num % 62] + result;\n num = Math.floor(num / 62);\n }\n return result;\n }\n\n let completed = [];\n let failed = [];\n let bin_endpoints = [];\n\n for (let [key, f] of (fileList as any).entries()) {\n if (!(f instanceof File)) {\n continue;\n }\n\n let signedParams = Object.assign({\n key: key + '/' + f.name,\n sizeKey: toBase62(f.size),\n contentType: f.type || null\n }, getSignedParams);\n\n let { fields = null, url, cdn } = await request.bind(this)('get-signed-url', signedParams, { auth: !!this.__user });\n bin_endpoints.push(cdn);\n \n let form = new FormData();\n for (let name in fields) {\n form.append(name, fields[name]);\n }\n\n form.append('file', f);\n\n try {\n await fetchProgress(\n url,\n form,\n typeof progress === 'function' ? (p: ProgressEvent) => progress(\n {\n status: 'upload',\n progress: toPercent(p.loaded, p.total),\n currentFile: f,\n completed,\n failed,\n loaded: p.loaded,\n total: p.total,\n abort: () => xhr.abort()\n }\n ) : null\n );\n completed.push(f);\n } catch (err) {\n failed.push(f);\n }\n }\n\n return { completed, failed, bin_endpoints };\n}\n\nconst pendPromise: Record<string, Promise<any> | null> = {};\n\nexport function formHandler(options?: { preventMultipleCalls: boolean; }) {\n let { preventMultipleCalls = false } = options || {};\n\n // wraps methods that requires form handling\n return function (target: object, propertyKey: string, descriptor: any) {\n const fn = descriptor.value;\n\n descriptor.value = function (...arg: any[]) {\n let form: Form<any> = arg[0];\n let storeResponseKey = true;\n let formEl = null;\n let actionDestination = '';\n let fileBase64String = {};\n let refreshPage = false;\n if (hasSubmitEvent && form instanceof SubmitEvent) {\n form.preventDefault();\n\n let currentUrl = window.location.href;\n formEl = form.target as HTMLFormElement;\n let href = new URL(formEl.action);\n actionDestination = href.href;\n\n // find {placeholder} in actionDestination url string and replace it with form data value\n // can be also used as image previewer\n let placeholders = actionDestination ? actionDestination.match(/(?<=\\{).*?(?=\\})/g) : '';\n if (placeholders) {\n for (let p of placeholders) {\n if (!p) {\n continue;\n }\n\n let inputElement = formEl.querySelector(`[name=\"${p}\"]`);\n\n // check if input element exists\n if (!inputElement) {\n continue;\n }\n\n // check if input element is a file input\n if (inputElement.type === 'file') {\n for (let i = 0; i <= inputElement.files.length - 1; i++) {\n if (!inputElement.files[i])\n continue;\n\n if (!fileBase64String[p]) {\n fileBase64String[p] = [];\n }\n\n fileBase64String[p].push(new Promise((res, rej) => {\n let reader = new FileReader();\n reader.onload = function () {\n res(reader.result);\n };\n reader.readAsDataURL(inputElement.files[i]);\n reader.onerror = rej;\n }));\n }\n }\n else {\n actionDestination = actionDestination.replace(`{${p}}`, inputElement.value);\n }\n }\n }\n\n if (formEl.getAttribute('action') === null) {\n storeResponseKey = false;\n }\n else {\n refreshPage = href.href === currentUrl;\n }\n }\n\n const handleResponse = async (response: any) => {\n if (actionDestination) {\n for (let k in fileBase64String) {\n if (fileBase64String[k].length) {\n actionDestination = actionDestination.replace(`{${k}}`, (await Promise.all(fileBase64String[k])).join(','));\n }\n }\n }\n\n if (formEl) {\n if (storeResponseKey) {\n window.sessionStorage.setItem(`${this.service}:${MD5.hash(actionDestination)}`, JSON.stringify(response));\n if (refreshPage) {\n window.location.replace(actionDestination);\n }\n else {\n window.location.href = actionDestination;\n }\n }\n }\n\n return response;\n };\n\n let response: any;\n let handleError = (err: any) => {\n if (err instanceof SkapiError) {\n err.name = propertyKey + '()';\n }\n\n else {\n err = err instanceof Error ? err : new SkapiError(err, { name: propertyKey + '()' });\n }\n\n throw err;\n };\n\n const executeMethod = async () => {\n try {\n // execute\n response = fn.bind(this)(...arg);\n\n if (response instanceof Promise) {\n // handle promise\n let resolved = await response;\n return handleResponse(resolved);\n }\n\n return handleResponse(response);\n }\n catch (err) {\n throw handleError(err);\n }\n };\n\n if (preventMultipleCalls) {\n let pendingKey = `${propertyKey}:${this?.__public_identifier || ''}:${this?.service || ''}:${this?.owner || ''}`;\n\n if (!pendPromise?.[pendingKey]) {\n pendPromise[pendingKey] = executeMethod().finally(() => {\n delete pendPromise[pendingKey];\n });\n }\n\n return pendPromise[pendingKey];\n }\n\n return executeMethod();\n }\n }\n}\n\nexport async function getFormResponse(): Promise<any> {\n await this.__connection;\n let responseKey = `${this.service}:${MD5.hash(window.location.href.split('?')[0])}`;\n let stored = window.sessionStorage.getItem(responseKey);\n window.sessionStorage.removeItem(responseKey);\n\n if (stored !== null) {\n try {\n stored = JSON.parse(stored);\n } catch (err) { }\n\n return stored;\n }\n\n return null;\n};","import validator from '../utils/validator';\nimport { SkapiError } from '../Main';\n\n// 256 to match the platform (validate_table_name -> validate_key_segment, max_len=256). This was\n// 128, an SDK-only cap half the platform's, so a legal table name was refused before it left the\n// client. Like a tag, the name is escaped on the wire and the server measures the escaped form, so\n// validateStringByPolicy re-checks the length after escaping.\nconst MAX_TABLE_NAME_LENGTH = 256;\n// The backend allows 256 (validate_tag_value -> validate_key_segment, max_len=256). This was 64,\n// an SDK-only cap four times stricter than the platform, so a perfectly legal 100-character tag was\n// refused before it ever left the client. The backend measures the ENCODED form, and so do we: the\n// length is re-checked after / ! * # are escaped (each grows to 3 characters), which is the only way\n// a raw length can be compared against a limit the server applies to the escaped string.\nconst MAX_TAG_LENGTH = 256;\n// 256 to match the platform (validate_index_name -> validate_key_segment, max_len=256). Same\n// SDK-only under-cap as the table name, and same escaped-length re-check.\nconst MAX_INDEX_NAME_LENGTH = 256;\n// Already correct at 256 (validate_index_string_value, max_len=256). Note this one is NOT escaped:\n// the platform allows / ! * # in an index VALUE, unlike a name or a tag.\nconst MAX_INDEX_STRING_VALUE_LENGTH = 256;\nconst SENTINEL_CHAR = '\\u{10FFFF}';\nconst CONTROL_OR_SENTINEL_REGEX = /[\\u0000-\\u001F\\u007F]|\\u{10FFFF}/u;\n\nconst DELIMITER_ENCODING_MAP: Record<string, string> = {\n '/': '%2F',\n '!': '%21',\n '*': '%2A',\n '#': '%23',\n};\n\nconst DELIMITER_DECODING_MAP: Record<string, string> = {\n '%2F': '/',\n '%21': '!',\n '%2A': '*',\n '%23': '#',\n};\n\nfunction encodeReservedDelimiters(value: string) {\n // Escape '%' first so literal sequences like \"%2F\" remain distinguishable\n // from a real '/' after normalization.\n const escapedPercent = value.replace(/%/g, '%25');\n return escapedPercent.replace(/[\\/!*#]/g, (char) => DELIMITER_ENCODING_MAP[char] || char);\n}\n\nexport function decodeReservedDelimiters(value: string) {\n if (typeof value !== 'string') {\n return value as any;\n }\n\n // Reverse delimiter encoding first, then unescape '%25' so '%252F'\n // round-trips back to literal '%2F' instead of '/'.\n const delimitersDecoded = value.replace(/%(2F|21|2A|23)/gi, (match) => {\n const key = match.toUpperCase();\n return DELIMITER_DECODING_MAP[key] || match;\n });\n\n return delimitersDecoded.replace(/%25/gi, '%');\n}\n\nexport function validateStringByPolicy(\n value: any,\n fieldName: string,\n options: {\n onlyAlphanumeric?: boolean;\n allowEmpty?: boolean;\n maxLength?: number;\n blockKeyDelimiters?: boolean;\n disallowLeadingDollar?: boolean;\n } = {}\n) {\n const {\n allowEmpty = false,\n maxLength,\n blockKeyDelimiters = false,\n disallowLeadingDollar = false,\n onlyAlphanumeric = false\n } = options;\n\n if (typeof value !== 'string') {\n throw new SkapiError(`\"${fieldName}\" should be type: <string>.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (onlyAlphanumeric && /[^a-zA-Z0-9]/.test(value)) {\n throw new SkapiError(`\"${fieldName}\" should only contain alphanumeric characters.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (!allowEmpty && value.length === 0) {\n throw new SkapiError(`\"${fieldName}\" is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (maxLength && value.length > maxLength) {\n throw new SkapiError(`\"${fieldName}\" should be <= ${maxLength} characters.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (CONTROL_OR_SENTINEL_REGEX.test(value) || value.includes(SENTINEL_CHAR)) {\n throw new SkapiError(`\"${fieldName}\" cannot include control characters or unsupported sentinel characters.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (blockKeyDelimiters) {\n // Escape UNCONDITIONALLY. This used to run only when the value already contained a raw\n // delimiter, which made the round trip lossy: decodeReservedDelimiters has no such gate, so a\n // value carrying a percent-sequence but no raw delimiter went out untouched and came back\n // decoded. A tag written as \"a%2Fb\" read back as \"a/b\", and \"100%25off\" read back as\n // \"100%off\". A decoder cannot tell an escape it produced from one the caller typed, so the\n // only way to keep the two distinguishable is for the encoder to always run and always\n // escape '%' first. That is what the '%' -> '%25' pass in encodeReservedDelimiters is for;\n // under the old gate it was unreachable unless a delimiter happened to share the string.\n value = encodeReservedDelimiters(value);\n\n // Escaping expands the string (each of / ! * # becomes 3 characters, and a literal % becomes\n // %25), and the server measures what it receives. Re-check, so a value that only overflows\n // once escaped is refused here with a clear message instead of as an opaque server error.\n if (maxLength && value.length > maxLength) {\n throw new SkapiError(\n `\"${fieldName}\" should be <= ${maxLength} characters. \"/\", \"!\", \"*\", \"#\" and \"%\" count as 3 characters each.`,\n { code: 'INVALID_PARAMETER' }\n );\n }\n }\n\n if (disallowLeadingDollar && value.startsWith('$')) {\n throw new SkapiError(`\"${fieldName}\" cannot start with \"$\".`, { code: 'INVALID_PARAMETER' });\n }\n\n return value;\n}\n\n// \"allowEmpty\" exists for the QUERY side. A write must name a real table/tag/index, but a query uses\n// these same fields as filters, where an empty string paired with a condition is the established\n// \"scan everything\" idiom (skapi-mcp builds exactly that: table ' ' with condition '>').\ntype KeySegmentOptions = { allowEmpty?: boolean };\n\nexport function validateTableName(value: any, fieldName = 'table.name', options: KeySegmentOptions = {}) {\n return validateStringByPolicy(value, fieldName, {\n allowEmpty: options.allowEmpty === true,\n maxLength: MAX_TABLE_NAME_LENGTH,\n blockKeyDelimiters: true,\n });\n}\n\nexport function validateTag(value: any, fieldName = 'tag', options: KeySegmentOptions = {}) {\n return validateStringByPolicy(value, fieldName, {\n allowEmpty: options.allowEmpty === true,\n maxLength: MAX_TAG_LENGTH,\n blockKeyDelimiters: true,\n });\n}\n\nexport function validateCustomIndexName(value: any, fieldName = 'index.name', options: KeySegmentOptions = {}) {\n return validateStringByPolicy(value, fieldName, {\n allowEmpty: options.allowEmpty === true,\n maxLength: MAX_INDEX_NAME_LENGTH,\n blockKeyDelimiters: true,\n disallowLeadingDollar: true,\n });\n}\n\nexport function validateIndexStringValue(value: any, fieldName = 'index.value') {\n return validateStringByPolicy(value, fieldName, {\n allowEmpty: true,\n maxLength: MAX_INDEX_STRING_VALUE_LENGTH,\n });\n}\n\n// A \"nest\" query is one whose index.name ends in '.', addressing the children of a compound index.\n// There, index.value is NOT a value: the backend concatenates it onto the parent name to rebuild a\n// child index NAME segment. Names are escaped on write, so this has to be escaped too. Left raw, a\n// compound index like \"Band.Rock/Pop.year\" (stored as \"Band.Rock%2FPop.year\") could never be found\n// by the nest query meant to find it, because '%' sorts below '/' so the key falls outside the\n// range, and the reverse index used by the '<=' ends-with form mirrors the ESCAPED name.\nexport function isNestIndexName(name: any) {\n return typeof name === 'string' && name.slice(-1) === '.';\n}\n\nexport function validateNestIndexSegment(value: any, fieldName: string) {\n return validateStringByPolicy(value, fieldName, {\n allowEmpty: true,\n maxLength: MAX_INDEX_STRING_VALUE_LENGTH,\n blockKeyDelimiters: true,\n });\n}\n\nexport function recordIdOrUniqueId(query) {\n if (!query.record_id && !query.unique_id) {\n return null;\n }\n\n let outputObj: any = {};\n if (query?.service) {\n outputObj.service = query.service;\n }\n if (query?.owner) {\n outputObj.owner = query.owner;\n }\n if (query?.record_id) {\n outputObj.record_id = validateStringByPolicy(query.record_id, 'record_id', {\n allowEmpty: false,\n onlyAlphanumeric: true,\n });\n }\n else if (query?.unique_id) {\n outputObj.unique_id = query.unique_id;\n }\n\n return outputObj;\n}\n\nexport function accessGroup(v) {\n if (v === undefined) {\n return 0;\n }\n\n if (typeof v === 'number') {\n if (v > 99 || v < 0) {\n throw new SkapiError('\"table.access_group\" value should be within a range of 0 ~ 99.', { code: 'INVALID_REQUEST' });\n }\n }\n\n else if (typeof v === 'string') {\n v = {\n private: 'private',\n public: 0,\n authorized: 1,\n admin: 99\n }[v]\n\n if (v === undefined) {\n throw new SkapiError('\"table.access_group\" is invalid.', { code: 'INVALID_PARAMETER' });\n }\n }\n\n else {\n throw new SkapiError('\"table.access_group\" should be type: <number | string>.', { code: 'INVALID_PARAMETER' });\n }\n\n if (!this.__user && v) {\n throw new SkapiError('Unsigned users have no access to records with access group.', { code: 'INVALID_REQUEST' });\n }\n\n return v;\n}\n\nconst __index_number_range = 4503599627370496; // +/-\nexport function indexValue(v) {\n if (typeof v === 'number') {\n if (v > __index_number_range || v < -__index_number_range) {\n throw new SkapiError(`Number value should be within range -${__index_number_range} ~ +${__index_number_range}`, { code: 'INVALID_PARAMETER' });\n }\n return v;\n }\n\n if (typeof v === 'boolean') {\n return v;\n }\n\n if (typeof v === 'string') {\n return validateIndexStringValue(v, 'index.value');\n }\n\n throw new SkapiError(`\"index.value\" should be type: <number | boolean | string>.`, { code: 'INVALID_PARAMETER' });\n}\n\nexport function indexRange(v, query) {\n if (!query.index || !('value' in query.index)) {\n throw new SkapiError('\"index.value\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n if (query.index.name === '$record_id') {\n throw new SkapiError(`Cannot do \"index.range\" on ${query.index.name}`, { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof query.index.value !== typeof v) {\n throw new SkapiError('\"index.range\" type should match the type of \"index.value\".', { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof v === 'string') {\n // Same treatment as index.value: on a nest query the range bound is a child NAME segment.\n if (isNestIndexName(query.index.name)) {\n return validateNestIndexSegment(v, 'index.range');\n }\n return validateIndexStringValue(v, 'index.range');\n }\n\n return v;\n}\n","import {\n RecordData,\n Form,\n FetchOptions,\n DatabaseResponse,\n GetRecordQuery,\n Condition,\n PostRecordConfig,\n ProgressCallback,\n BinaryFile,\n FileInfo,\n DelRecordQuery,\n Table,\n Index,\n Tag,\n UniqueId\n} from '../Types';\nimport SkapiError from '../main/error';\nimport { extractFormData, fromBase62, isBrowserRuntime } from '../utils/utils';\nimport validator from '../utils/validator';\nimport { request, uploadFiles } from '../utils/network';\nimport { checkAdmin } from './user';\nimport { authentication } from './user';\nimport { accessGroup, decodeReservedDelimiters, indexValue, recordIdOrUniqueId, validateCustomIndexName, validateTableName, validateTag, validateStringByPolicy, indexRange, isNestIndexName, validateNestIndexSegment } from './param_restrictions';\n\nconst pendingPrivateAccessKeyRequest: Record<string, Promise<string>> = {};\n\n/**\n * How long a private record file stays available locally: ONE WEEK.\n *\n * A private file cannot be served from the plain CDN url, so every read went out\n * over the network. The `?t=<idToken>` form it used could not help either: that\n * token rotates, so the url changed and the browser cache never matched. Reading\n * the same private image twice therefore downloaded it twice.\n *\n * These two numbers do different jobs:\n * - EXPIRES is how long the signed URL works. Short, so a leaked url dies fast.\n * - BROWSER_CACHE is how long the FILE stays usable locally.\n *\n * They used to be a week and twenty minutes, which reads as \"short url, long\n * local copy\" and is in fact a scheduled outage: get_signed_url stamped the mint\n * response with the week, so from minute 21 the browser answered every later mint\n * from its own store with a credential that was already dead, for the remaining\n * six days. That is what killed chat image previews on phones (which drop image\n * bodies and refetch) while desktops, still holding the bytes, never noticed.\n *\n * The server now refuses to grant a cache a url cannot back\n * (get_signed_url resolve_browser_cache caps at `expires` minus headroom), so the\n * real lever on local availability is EXPIRES, not BROWSER_CACHE. An hour buys\n * 55 minutes of reuse and is still short enough that a leaked url is not a\n * standing grant. Asking for the week is kept deliberately: it says what this\n * client would reuse if the url were stable by construction, and lets the server\n * be the one that decides.\n */\nconst PRIVATE_FILE_BROWSER_CACHE_SECONDS = 7 * 24 * 60 * 60;\nconst PRIVATE_FILE_URL_EXPIRES_SECONDS = 60 * 60;\n\n/**\n * Cache generation for the mint url, and the repair's window stamp.\n *\n * Mirrors bunnyquery/engine's previewMintCacheToken, which cannot be imported\n * here (the chat engine depends on this package, not the other way round). BUMP\n * THE GENERATION to abandon every mint response browsers are holding: generation\n * 2 retires the week-long entries written before 2026-08-11, which the server cap\n * cannot reach because they are already on the user's device.\n *\n * A query parameter, not a request header. `Cache-Control: no-cache` is not\n * CORS-safelisted and the record gateway's preflight does not allow it, so a mint\n * carrying it is refused by the browser before it is sent: the repair below never\n * ran at all, in any browser.\n */\nconst MINT_CACHE_GENERATION = 2;\n\nfunction mintCacheToken(expiresSeconds: number, refresh?: boolean): string {\n if (!refresh) return String(MINT_CACHE_GENERATION);\n // Same derivation as the chat client: one stamp per window, so a repair is one\n // extra cache entry per window rather than one per file per attempt, and the\n // window always closes before the url it carries can expire.\n let windowMs = Math.max(60, expiresSeconds - 5 * 60) * 1000;\n return MINT_CACHE_GENERATION + '.' + Math.floor(Date.now() / windowMs);\n}\n\n/**\n * Whether a signed url for this record file may be browser-cached.\n *\n * Reaching ANOTHER user's restricted file relies on a granted private access key,\n * which getFile appends as `&p=` to the token url. The mint request has no way to\n * carry that key, so those files must keep taking the token path: they stay\n * uncached rather than being handed a presign the caller is not entitled to.\n *\n * `splitPath` is the record file path:\n * auth|publ/service/owner/uploader/records/record/access_group/bin/ts/size/key/name\n */\nfunction canBrowserCacheRecordFile(splitPath: string[]): boolean {\n if (!this.user?.user_id) return false;\n let access_group = splitPath[6] === '**' ? '**' : parseInt(splitPath[6]);\n let user_access_group = this.user?.access_group ?? -1;\n if (this.user.user_id !== splitPath[3] && (access_group === '**' || user_access_group < access_group)) {\n return false;\n }\n return true;\n}\n\n// Read a getFile('blob') result to text across browser + node runtimes. Blob.text()\n// is used when present; otherwise FileReader (the same polyfilled reader getFile\n// uses for its base64 path) reads it.\nasync function blobToText(blob: any): Promise<string> {\n if (typeof blob === 'string') {\n return blob;\n }\n if (blob && typeof blob.text === 'function') {\n return await blob.text();\n }\n return await new Promise<string>((resolve, reject) => {\n try {\n let fr = new FileReader();\n fr.onload = () => resolve(fr.result as string);\n fr.onerror = () => reject(fr.error || new Error('Failed to read blob'));\n fr.readAsText(blob);\n }\n catch (err) {\n reject(err);\n }\n });\n}\n\nexport async function normalizeRecord(record: Record<string, any>, _called_from?, _skipDataFetch = false): Promise<RecordData> {\n // if (record?.rec) {\n // if (_called_from !== 'called from postRecord') {\n // let recPost = window.sessionStorage.getItem(`${this.service}:post:${record.rec}`);\n // if (recPost) {\n // try {\n // record = JSON.parse(recPost);\n // }\n // catch (err) { }\n // window.sessionStorage.removeItem(`${this.service}:post:${record.rec}`);\n // }\n // }\n // }\n const output: Record<string, any> = {\n user_id: '',\n record_id: '',\n updated: 0,\n uploaded: 0,\n readonly: false,\n table: {\n name: '',\n access_group: 0,\n subscription: {\n is_subscription_record: false,\n upload_to_feed: false,\n notify_subscribers: false,\n feed_referencing_records: false,\n notify_referencing_records: false\n }\n },\n referenced_count: 0,\n source: {\n referencing_limit: null,\n prevent_multiple_referencing: false,\n can_remove_referencing_records: false,\n only_granted_can_reference: false,\n },\n ip: '',\n bin: {}\n };\n let is_anonymous = false;\n // Raw CDN urls of any offloaded-\"data\" file (a __data__/__json__.json entry\n // in the record's bin). Collected while processing \"bin\" (which runs before\n // \"data\") and used by the \"data\" handler to fetch the payload back.\n let dataFileUrls: string[] = [];\n function access_group_set(v) {\n let access_group = v == '**' ? 'private' : parseInt(v);\n access_group = access_group == 0 ? 'public' : access_group == 1 ? 'authorized' : access_group == 99 ? 'admin' : access_group;\n return access_group;\n }\n const keys = {\n 'ip': (r: string) => {\n // Stored as \"<ip>[R]#<unique_id>\". Only the FIRST '#' is the delimiter —\n // the unique_id itself may contain '#' (e.g. a \"src::<path>\" id built\n // from a file path), so rejoin everything after it instead of taking\n // split[1], which silently truncated at the first '#' in the id.\n let split_ip = r.split('#');\n let ip = split_ip[0];\n if (split_ip.length > 1) {\n output.unique_id = split_ip.slice(1).join('#');\n }\n if (ip.slice(-1) === 'R') {\n output.readonly = true;\n ip = ip.slice(0, -1);\n }\n else {\n output.readonly = false;\n }\n // check if the format of the ip is 0-0-0-0, if it is, convert it to 0.0.0.0\n\n if (/^\\d{1,3}-\\d{1,3}-\\d{1,3}-\\d{1,3}$/.test(ip)) {\n ip = ip.split('-').join('.');\n is_anonymous = true;\n }\n\n output.ip = ip;\n },\n 'rec': (r: string) => {\n if (!r) return;\n output.record_id = r;\n let base62timestamp = r.substring(0, r.length - 9); // id: [base62 timestamp][random 5 char][suid 4 char]\n let uploaded = fromBase62(base62timestamp);\n output.uploaded = uploaded;\n },\n 'usr': (r: string) => {\n output.user_id = r;\n },\n 'tbl': (r: string) => {\n if (!r) return;\n // table/service/group(** | group)/[subscription(user id)/group(00 - 99)]/[tag]\n if (!output.table.name) {\n let rSplit = r.split('/');\n output.table.name = decodeReservedDelimiters(rSplit[0]);\n output.table.access_group = access_group_set(rSplit[2]);\n if (rSplit?.[3]) {\n output.table.subscription.is_subscription_record = true;\n }\n }\n },\n 'usr_tbl': (r: string) => {\n // user-id/table/service/group(** | group)[/subscription(user id)/group(00 - 99)][/tag]\n let rSplit = r.split('/');\n if (!output.user_id) {\n output.user_id = rSplit[0];\n }\n if (!output.table.name) {\n output.table.name = decodeReservedDelimiters(rSplit[1]);\n output.table.access_group = access_group_set(rSplit[3]);\n if (rSplit?.[4]) {\n output.table.subscription.is_subscription_record = true;\n }\n }\n },\n 'idx': (r: string) => {\n if (!r) return;\n let rSplit = r.split('!');\n let name = decodeReservedDelimiters(rSplit.splice(0, 1)[0]);\n // The VALUE is raw both directions and must NOT be decoded. The platform allows / ! * #\n // in an index value (validate_index_string_value passes no forbidden_chars), so the write\n // path sends it untouched; decoding on the way back turned a value written as \"a%2Fb\"\n // into \"a/b\". Escaping it instead is not an option: index values are compared\n // lexicographically for gt/lt/range queries, and \"%2F\" sorts nowhere near \"/\", so\n // escaping would silently change the result of every range query. Raw end to end is the\n // only lossless choice. A raw '!' inside the value is already safe, because the split\n // above takes only the first segment as the name and rejoins the remainder.\n let value = normalizeTypedString('!' + rSplit.join('!'));\n output.index = {\n name,\n value\n };\n },\n 'ref': (r: string) => {\n if (!r) return;\n output.reference = r.split('/')[0];\n },\n 'tags': (r: string[]) => {\n output.tags = Array.isArray(r) ? r.map((tag) => decodeReservedDelimiters(tag)) : r;\n },\n 'upd': (r: number) => {\n output.updated = r;\n },\n 'acpt_mrf': (r: boolean) => {\n output.source.prevent_multiple_referencing = !r;\n },\n 'ref_limt': (r: number) => {\n output.source.referencing_limit = r;\n },\n 'rfd': (r: number) => {\n output.referenced_count = r;\n },\n 'bin': async (r: string[]) => {\n let binObj: Record<string, any[]> = {};\n let _ref = output?.reference || null;\n if (Array.isArray(r)) {\n const parsedBin = await Promise.all(r.map(async (url) => {\n try {\n let path = url.split('/').slice(3).join('/');\n let splitPath = path.split('/');\n\n // Expected path format:\n // auth|publ/serviceid/ownerid/uploaderid/records/recordid/access_group/bin/timestamp/size/form_key/filename\n if (splitPath.length < 12) {\n return null;\n }\n\n // NOT decoded. Nothing ever percent-encodes these segments on the way out:\n // uploadFiles sends the key as `key + '/' + f.name` verbatim\n // (utils/network.ts), get_signed_url returns that raw string as the cdn url,\n // and the S3 notification stores unquote_plus of the event key, which is the\n // raw name again. So decodeURIComponent here had no matching encode and could\n // only corrupt: a file named \"100%off.pdf\" threw URIError, which the catch\n // below swallowed as null, silently dropping the file from record.bin\n // entirely; \"50%20off.pdf\" came back renamed to \"50 off.pdf\" while its own\n // .path still held the real name. getFile(url, { dataType: 'info' }) already\n // reads this segment raw, so this also makes the two agree.\n let filename = splitPath[splitPath.length - 1];\n let pathKey = splitPath[10];\n\n // Offloaded record \"data\" lives at .../bin/<ts>/<size>/__data__/__json__.json.\n // It is not a user binary: keep it out of the bin output and\n // hand its raw url to the \"data\" handler to fetch back.\n if (pathKey === '__data__' && filename === '__json__.json') {\n return { isDataFile: true, rawUrl: url };\n }\n\n let size = splitPath[9];\n let uploaded = splitPath[8];\n let access_group = access_group_set(splitPath[6]);\n let url_endpoint = url;\n\n // A private file is read through a SIGNED url whose mint is\n // browser-cached for a week, so the same url keeps coming\n // back and the file downloads once instead of on every read.\n // Null when the file needs a granted private access key,\n // which the mint cannot carry: those keep the token url.\n let privateCache = access_group !== 'public' && canBrowserCacheRecordFile.call(this, splitPath)\n ? {\n expires: PRIVATE_FILE_URL_EXPIRES_SECONDS,\n browserCache: PRIVATE_FILE_BROWSER_CACHE_SECONDS,\n }\n : null;\n\n if (access_group !== 'public') {\n try {\n // Deliberately NOT the cached presign, even for a\n // file that could use one. `url` is the record's\n // public face: it is fed back into remove_bin and\n // deleteFiles, which rebuild the endpoint from this\n // string's host and require a cloudfront one\n // (post_record raises \"Invalid binary endpoint.\" on\n // an s3 host, and del_files accepts it and then\n // deletes nothing). It is also what the MCP server\n // hands to a model and what a dashboard renders, so\n // a presign here would leak the bucket and key and\n // rot wherever it was stored. Caching happens in\n // getFile below, where the url never escapes.\n url_endpoint = (await getFile.bind(this)(url, { dataType: 'endpoint', _ref }) as string);\n }\n catch (err) {\n console.error('Error getting signed url for private file:', err);\n // Keep the original CDN URL when signed endpoint resolution is unavailable.\n url_endpoint = url;\n }\n }\n\n let obj = {\n access_group,\n filename,\n url: url_endpoint,\n path,\n size: fromBase62(size),\n uploaded: fromBase62(uploaded),\n getFile: (dataType: 'base64' | 'download' | 'endpoint' | 'blob' | 'text' | 'info', progress?: ProgressCallback) => {\n let base = {\n dataType: dataType || 'download',\n progress,\n _ref,\n };\n let tokenPath = () => getFile.bind(this)(\n url_endpoint,\n Object.assign({}, base, { _update: obj }),\n );\n\n if (!privateCache) return tokenPath();\n\n // Mint from the RAW cdn url, not url_endpoint: the\n // latter already carries '?t=<token>', which getFile\n // would re-append to, and which is not the string\n // the record stores in its bin list.\n //\n // No `_update` here on purpose. _update writes the\n // resolved url back onto obj.url, and a presign\n // there is exactly what breaks remove_bin and\n // deleteFiles (see the resolution above).\n return getFile.bind(this)(url, Object.assign({}, base, privateCache))\n .catch(() => {\n // A file that reads fine today must not\n // become unreadable because the mint\n // refuses it. The mint enforces checks the\n // cdn edge does not (record existence, bin\n // membership, subscription access), and a\n // backend without browser_cache support\n // answers differently again. Any of those\n // falls back to the url that already works.\n return tokenPath();\n });\n }\n };\n\n return { pathKey, obj };\n }\n catch {\n return null;\n }\n }));\n\n for (let parsed of parsedBin) {\n if (!parsed) {\n continue;\n }\n\n if ((parsed as any).isDataFile) {\n // Kept out of the user-facing bin; the url was already\n // collected by the synchronous pre-scan above.\n continue;\n }\n\n if (binObj[parsed.pathKey]) {\n binObj[parsed.pathKey].push(parsed.obj);\n continue;\n }\n\n binObj[parsed.pathKey] = [parsed.obj];\n }\n }\n output.bin = binObj;\n },\n 'prv_acs': (r: { [key: string]: string }) => {\n for (let k in r) {\n let subscription_config = ['notify_subscribers', 'upload_to_feed', 'feed_referencing_records', 'notify_referencing_records'];\n if (subscription_config.includes(k)) {\n output.table.subscription[k] = r[k];\n }\n else if (k === 'referencing_index_restrictions' && Array.isArray(r[k])) {\n // The index NAME inside a restriction is escaped on write by\n // validateCustomIndexName, because the backend rejects a raw / ! * # in an index\n // name. It was the one escaped-on-write field with no decode on read, so a\n // restriction written for \"category/sub\" came back as \"category%2Fsub\" while\n // record.index.name for that same string came back decoded. Re-saving the record\n // then escaped it a second time (\"category%252Fsub\"), and the backend compares\n // the restriction name against the incoming index name, so referencing that\n // record started failing with \"Index value does not match the reference index\n // restriction\". The sibling value/range stay raw, matching the idx handler:\n // index VALUES are never escaped.\n output.source[k] = (r[k] as any[]).map((restriction: any) => {\n if (restriction && typeof restriction === 'object' && typeof restriction.name === 'string') {\n return Object.assign({}, restriction, { name: decodeReservedDelimiters(restriction.name) });\n }\n return restriction;\n });\n }\n else {\n output.source[k] = r[k];\n }\n }\n },\n 'data': async (r: any) => {\n if (r === '!D%{}') {\n output.data = {};\n return;\n }\n if (r === '!L%[]') {\n output.data = [];\n return;\n }\n\n // Data DynamoDB could not hold natively is stored as { __json__: \"<text>\" }:\n // valid JSON whose shape the item itself cannot express (an empty or oversized\n // key at any depth, nesting past 32 levels). Parse it back. The check mirrors\n // exactly what the server writes (one key, holding a string), and a value that\n // merely looks like the marker but does not parse is an ordinary user value, so\n // it falls through and is returned verbatim.\n if (\n r && typeof r === 'object' && !Array.isArray(r) &&\n typeof r.__json__ === 'string' && Object.keys(r).length === 1\n ) {\n try {\n output.data = JSON.parse(r.__json__);\n return;\n }\n catch (err) { }\n }\n\n // Offloaded data: stored as { __data__: \"<ts>/<size>/__data__/__json__.json\" },\n // the JSON itself living in the record's bin as that same file. Fetch\n // it back (all records in a getRecords batch resolve concurrently via\n // the Promise.all over normalizeRecord) and replace it in the data key.\n // The value must be exactly one key whose string ends with the\n // reserved suffix AND a matching bin file must exist; otherwise it is\n // an ordinary user value that merely looks like a marker, so fall\n // through and return it verbatim.\n if (\n r && typeof r === 'object' && !Array.isArray(r) &&\n typeof r.__data__ === 'string' && Object.keys(r).length === 1 &&\n r.__data__.endsWith('/__data__/__json__.json')\n ) {\n let markerPath = r.__data__;\n let rawUrl = dataFileUrls.find(u => u.endsWith(markerPath)) || null;\n if (rawUrl) {\n if (_skipDataFetch) {\n // postRecord/bulkPostRecords already hold the posted value\n // and restore it, so skip re-downloading what was just sent.\n output.data = r;\n return;\n }\n\n try {\n // Fetch as a blob, not 'text': getFile('text') routes the\n // body through request()'s response post-processing, which\n // both JSON.parses it (a second parse here would corrupt a\n // JSON-shaped string) and, if the decoded object has a\n // truthy top-level `startKey`, mangles it as a paginated\n // response. A blob passes through untouched, so we decode\n // and JSON.parse the raw body exactly once — the exact\n // inverse of the server's json.dumps for every value type.\n let blob = await getFile.bind(this)(rawUrl, { dataType: 'blob', _ref: output.reference || null });\n let text = await blobToText(blob);\n // Parsed ONCE, and never run through the __json__ decode above. The\n // offloaded file always holds the original payload (post_record\n // offloads decode_record_data(...) precisely so it does), which means\n // a file whose contents ARE { __json__: \"...\" } is a caller who really\n // stored that shape. Decoding again here would unwrap their data.\n output.data = JSON.parse(text);\n }\n catch (err) {\n console.error('Failed to fetch offloaded record data:', err);\n output.data = null;\n }\n return;\n }\n }\n\n output.data = r;\n }\n };\n\n if (record.record_id) {\n // bypass already normalized records\n return record as RecordData;\n }\n\n // Pre-scan the raw bin synchronously so the async \"data\" handler can resolve\n // the offloaded-data file url immediately. The handler loop below starts every\n // handler before awaiting any of them (collect-then-Promise.all), so the \"data\"\n // handler's synchronous lookup cannot rely on the \"bin\" handler having run yet.\n if (Array.isArray(record.bin)) {\n for (let url of record.bin) {\n try {\n if (typeof url !== 'string') continue;\n let sp = url.split('/').slice(3);\n // Raw, matching the \"bin\" handler: these segments are never percent-encoded, and\n // decoding threw URIError on any filename holding a bare '%'.\n if (sp.length >= 12 && sp[10] === '__data__' && sp[sp.length - 1] === '__json__.json') {\n dataFileUrls.push(url);\n }\n }\n catch { }\n }\n }\n\n let toWait = []\n for (let k in keys) {\n if (record.hasOwnProperty(k)) {\n let exec = keys[k](record[k]);\n if (exec instanceof Promise) {\n toWait.push(exec);\n }\n }\n }\n\n if (is_anonymous) {\n output.user_id = 'anonymous:' + output.user_id;\n }\n await Promise.all(toWait);\n return output as RecordData;\n}\n\nfunction normalizeTypedString(v: string) {\n let value = v.substring(3);\n let type = v.substring(0, 3);\n\n switch (type) {\n case \"!S%\":\n // !S%string\n return value;\n case \"!N%\":\n // !N%0\n let splitDec = value.split('.');\n let calcNumb = Number(splitDec[0]) - 4503599627370496;\n if (splitDec.length === 1) {\n return calcNumb;\n }\n return parseFloat(calcNumb.toString() + '.' + splitDec[1]);\n case \"!B%\":\n // !B%1\n return value === '1';\n case \"!L%\":\n case \"!D%\":\n // !L%[0, \"hello\"] / !D%{}\n try {\n return JSON.parse(value);\n } catch (err) {\n throw new SkapiError('Value parse error.', { code: 'PARSE_ERROR' });\n }\n default:\n return v;\n }\n}\n\nexport async function deleteFiles(params: {\n endpoints: string | string[], // file endpoints\n}): Promise<RecordData[]> {\n let { endpoints } = params;\n\n if (typeof endpoints === 'string') {\n endpoints = [endpoints];\n }\n\n if (!Array.isArray(endpoints)) {\n throw new SkapiError('\"endpoints\" should be type: array | string.', { code: 'INVALID_PARAMETER' });\n }\n\n let updatedRec = await request.bind(this)('del-files', {\n endpoints,\n storage: 'records'\n }, { auth: true, method: 'post' });\n\n let to_process = [];\n for (let i in updatedRec) {\n to_process.push(normalizeRecord.bind(this)(updatedRec[i]));\n }\n\n return Promise.all(to_process);\n}\n\nexport async function getFile(\n url: string, // cdn endpoint url https://xxxx.cloudfront.net/path/file\n config?: {\n dataType?: 'base64' | 'download' | 'endpoint' | 'blob' | 'text' | 'info'; // default 'download'\n expires?: number; // uses url that expires in given seconds. this option does not use the cdn (slow). can be used for private files. (does not work on public files).\n // Seconds the browser may reuse the signed url minted for `expires`.\n //\n // Without it, every call mints a brand new SigV4 url, so the browser\n // cache can never be hit and the file downloads again every time even\n // though nothing changed. With it, the MINT REQUEST is answered from the\n // browser cache and the same url comes back, so the already-downloaded\n // body stays addressable. The url's own lifetime is still `expires`: what\n // keeps the file available past that is the cached body, not the url.\n //\n // Only meaningful together with `expires`, and capped at 1 week\n // server-side. Private record files in `record.bin` set it to a week for\n // you; this is for files you fetch by url yourself.\n browserCache?: number;\n // Bypass the cached mint above and force a fresh signed url. Use it when\n // the file may have changed, or after a load failed because the cached\n // url had expired and the body was no longer in the cache.\n refresh?: boolean;\n progress?: ProgressCallback;\n _ref?: string;\n _update?: any;\n }\n): Promise<Blob | string | void | FileInfo> {\n if (typeof url !== 'string') {\n throw new SkapiError('\"url\" should be type: string.', { code: 'INVALID_PARAMETER' });\n }\n\n // `url` is reassigned below (query string, then the minted signed url). The\n // retry at the end has to start over from what the caller actually passed.\n const requestedUrl = url;\n\n let splitQuery = url.split('?');\n let baseUrl = splitQuery.shift() || '';\n let queryString = splitQuery.length ? '?' + splitQuery.join('?') : '';\n\n let validatedBaseUrl = validator.Url(baseUrl);\n url = validatedBaseUrl + queryString;\n\n let isValidEndpoint = false;\n let splitUrl = validatedBaseUrl.split('/');\n let host = splitUrl[2];\n let splitHost = host.split('.');\n let subdomain = null;\n\n if (splitHost.length === 3 && splitHost[1] === 'skapi') {\n subdomain = splitHost[0];\n isValidEndpoint = true;\n }\n\n let target_key = splitUrl.slice(3);\n let needAuth = false;\n if (!isValidEndpoint) {\n if (target_key[0] === 'auth' || target_key[0] === 'publ') {\n try {\n validator.UserId(target_key[2]);\n validator.UserId(target_key[3]);\n needAuth = target_key[0] == 'auth';\n isValidEndpoint = true;\n }\n catch {\n throw new SkapiError('Invalid file url.', { code: 'INVALID_PARAMETER' });\n }\n }\n }\n\n let service = subdomain ? null : target_key[1];\n\n config = validator.Params<NonNullable<typeof config>>(config, {\n expires: ['number', () => 0],\n browserCache: ['number', () => 0],\n refresh: ['boolean', () => false],\n dataType: ['base64', 'blob', 'endpoint', 'text', 'info', () => 'download'],\n progress: ['function', 'undefined', null],\n _ref: [null, 'string'],\n _update: v => v\n });\n\n\n if (config?.dataType === 'info') {\n // auth(publ)/service-id/owner-id/user-id/records/rec-id/**/file(bin)/sizetag/filename\n return {\n url,\n filename: target_key[target_key.length - 1],\n fileKey: target_key[target_key.length - 2],\n access_group: target_key[6] === '**' ? 'private' : target_key[6] === '01' ? 'authorized' : target_key[6] === '00' ? 'public' : parseInt(target_key[6]),\n uploader: target_key[3],\n record_id: target_key[4] === 'records' ? target_key[5] : 'N/A',\n filesize: fromBase62(target_key[9]),\n uploaded: fromBase62(target_key[8]),\n }\n }\n\n let filename = url.split('/').slice(-1)[0];\n\n // if ((config?.dataType === 'blob' || config?.dataType === 'base64') && needAuth) {\n // // when downloading blob, use signed url\n // config.expires = 60;\n // }\n\n let expires = config.expires;\n if (expires) {\n if (!isValidEndpoint) {\n throw new SkapiError('Expires option can only be used on skapi cdn endpoints.', { code: 'INVALID_PARAMETER' });\n }\n\n if (expires < 0) {\n throw new SkapiError('\"config.expires\" should be > 0. (seconds)', { code: 'INVALID_PARAMETER' });\n }\n\n let params: Record<string, any> = {\n request: subdomain ? 'get-host' : 'get',\n id: subdomain || target_key[5],\n // The RAW url the caller passed, minus any query string, NOT the\n // validator-normalized one. The server authorizes this by testing\n // `key in record.bin`, an exact string compare against urls stored\n // fully decoded (s3_notification unquote_plus). validator.Url runs\n // `new URL().href`, which percent-encodes: a private file called\n // \"my photo.jpg\" or \"한글.jpg\" arrived as \"my%20photo.jpg\" /\n // \"%ED%95%9C%EA%B8%80.jpg\", matched nothing, and the mint failed with\n // \"File does not exists.\" The query is dropped because a stored bin\n // url never has one, and a '?t=' token would never match either.\n key: requestedUrl.split('?')[0],\n expires\n }\n\n if (service) {\n params.service = service\n }\n\n // A cacheable mint has to be a GET: a POST response is not stored by any\n // browser cache, so the same signed url could never come back without a\n // round trip and the file would re-download every time.\n let browserCache = config.browserCache;\n let mintOptions: Record<string, any> = { auth: true };\n\n if (browserCache) {\n if (browserCache < 0) {\n throw new SkapiError('\"config.browserCache\" should be > 0. (seconds)', { code: 'INVALID_PARAMETER' });\n }\n\n mintOptions.method = 'get';\n // One host for every mint of this file. The gateway is otherwise\n // picked round robin, and the browser caches by full url, so\n // alternating hosts would hold two entries with two different signed\n // urls and download the file once for each.\n mintOptions.stableGateway = true;\n params.browser_cache = browserCache;\n\n // Partitions the browser cache per user. A cache is keyed by url\n // alone and shared by everyone using that browser profile, so\n // without this a second user signing in would be served the first\n // user's signed urls. The backend rejects a uid that is not the\n // caller, so a stale value fails loudly instead of silently.\n let uid = this.session?.idToken?.payload?.sub || this.user?.user_id;\n if (uid) {\n params.uid = uid;\n }\n\n // Cache generation, plus a window stamp when this is a repair. NOT\n // `revalidate`: that sends Cache-Control: no-cache as a REQUEST\n // header, which the gateway's CORS preflight does not allow, so the\n // browser refused to send the repair at all and the read fell back to\n // the token path every time. The objection to the old `nocache=<ts>`\n // form was that a per-call timestamp made a new cache key on every\n // attempt and left the poisoned entry answering ordinary reads; a\n // generation plus a window fixes both halves of that.\n params.nocache = mintCacheToken(expires, config.refresh);\n }\n\n url = (await request.bind(this)('get-signed-url', params,\n mintOptions\n )).url;\n }\n\n else if (needAuth) {\n let currTime = Math.floor(Date.now() / 1000);\n\n if (!this.bearerToken && (!this.session?.idToken?.payload?.exp || this.session.idToken.payload.exp < currTime)) {\n this.log('getFile:requesting new token', null);\n try {\n await authentication.bind(this)().getSession({ refreshToken: true });\n this.log('getFile:received new tokens', {\n exp: this.session?.idToken?.payload?.exp,\n currTime,\n expiresIn: this.session?.idToken?.payload?.exp - currTime,\n token: this.session?.accessToken?.jwtToken,\n refreshToken: this.session?.refreshToken?.token\n });\n }\n catch (err) {\n this.log('getFile:new token error', err);\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n }\n\n let token = this.bearerToken || this.session?.idToken?.jwtToken; // idToken\n\n if (!token || !this.user?.user_id) {\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n\n url += `${url.includes('?') ? '&' : '?'}t=${encodeURIComponent(token)}`;\n\n let access_group = target_key[6] === '**' ? '**' : parseInt(target_key[6]);\n let user_access_group = this.user?.access_group ?? -1;\n\n if (this.user.user_id !== target_key[3] && (access_group === '**' || user_access_group < access_group)) {\n let record_id = target_key[5];\n if (this.__private_access_key[record_id] && typeof this.__private_access_key[record_id] === 'string') {\n url += `&p=${encodeURIComponent(this.__private_access_key[record_id])}`;\n }\n else if (this.owner !== this.host) {\n try {\n let p = await this.requestPrivateRecordAccessKey({ record_id, reference_id: config?._ref });\n url += `&p=${encodeURIComponent(p)}`;\n } catch (err) { }\n }\n }\n }\n\n if (config?.dataType === 'endpoint') {\n if (config._update) {\n // updates the url in the record (when called from the record bin object)\n config._update.url = url;\n }\n return url;\n }\n\n if (config?.dataType === 'download') {\n let a = document.createElement('a');\n // Set the href attribute to the file URL\n a.href = url;\n document.body.appendChild(a);\n a.setAttribute('download', filename);\n a.target = '_blank';\n a.click();\n document.body.removeChild(a);\n return null;\n }\n\n let blob: Promise<Blob | string> = new Promise(async (res, rej) => {\n try {\n let b = await request.bind(this)(\n url,\n null,\n { method: 'get', contentType: null, responseType: config?.dataType === 'text' ? 'text' : 'blob', fetchOptions: { progress: config?.progress } },\n { ignoreService: true }\n );\n if (config?.dataType === 'base64') {\n const reader = new FileReader();\n reader.onloadend = () => res((reader.result as string));\n reader.readAsDataURL(b);\n }\n else {\n res(b);\n }\n } catch (err) {\n // The expected failure of a cached mint: the browser answered from\n // its cache with a url whose signature has since expired, and the\n // file it points at is no longer in the cache either, so the fetch\n // 403s on a url the caller never chose. Re-mint once, bypassing the\n // cache. Only when we actually used the cache, and never twice.\n if (config?.browserCache && !config?.refresh) {\n try {\n res(await getFile.bind(this)(\n requestedUrl,\n Object.assign({}, config, { refresh: true }),\n ) as Blob | string);\n return;\n }\n catch (retryErr) {\n rej(retryErr);\n return;\n }\n }\n rej(err);\n }\n });\n\n return blob;\n}\n\n/**\n * Scope key for the unique_id -> record_id cache.\n *\n * Every database call may target a service OTHER than the instance's own: callers pass\n * `service`/`owner` per call (the MCP server keeps one Skapi instance per user and names\n * a different project on each call), falling back to the instance's own pair. So the\n * cache must be keyed by the service the call is actually for. Keying it by `this.service`\n * is just as wrong as not keying it at all, because `this.service` is frequently not the\n * service being written to.\n */\nfunction cacheScope(service?: string, owner?: string): string {\n return `${service || this.service}/${owner || this.owner}`;\n}\n\nfunction getScopedUniqueId(scope: string, unique_id: string): string | undefined {\n let bucket = this.__my_unique_ids[scope];\n return bucket ? bucket[unique_id] : undefined;\n}\n\nfunction setScopedUniqueId(scope: string, unique_id: string, record_id: string): void {\n if (!this.__my_unique_ids[scope]) {\n this.__my_unique_ids[scope] = {};\n }\n this.__my_unique_ids[scope][unique_id] = record_id;\n}\n\nfunction deleteScopedUniqueId(scope: string, unique_id: string): void {\n if (this.__my_unique_ids[scope]) {\n delete this.__my_unique_ids[scope][unique_id];\n }\n}\n\nasync function getQuery(query, isDel = false) {\n query = extractFormData(query, { ignoreEmpty: true }).data || {};\n\n // Captured before any mutation of `query`: the caller may name the target project,\n // and the cache lookup below must be confined to it.\n let scope = cacheScope.bind(this)(query?.service, query?.owner);\n\n let is_reference_fetch = '';\n let rec_or_uniq = recordIdOrUniqueId(query);\n\n if (rec_or_uniq) {\n query = rec_or_uniq;\n is_reference_fetch = query.record_id || query.unique_id;\n\n if (typeof is_reference_fetch === 'string') {\n if (typeof this.__private_access_key?.[is_reference_fetch] === 'string') {\n query.private_key = this.__private_access_key?.[is_reference_fetch] || undefined;\n }\n let cached = getScopedUniqueId.bind(this)(scope, is_reference_fetch);\n if (cached) {\n if (isDel) {\n deleteScopedUniqueId.bind(this)(scope, is_reference_fetch);\n }\n else {\n query.record_id = cached;\n // delete query.unique_id;\n }\n }\n }\n }\n else {\n let isAdmin = await checkAdmin.bind(this)();\n let ref: any = query?.reference;\n let ref_user_is_me = false;\n\n if (typeof ref === 'object' && Object.keys(ref).length) {\n if (ref?.record_id || ref?.unique_id) {\n // if (ref.unique_id && this.__my_unique_ids[ref.unique_id]) {\n // ref.record_id = this.__my_unique_ids[ref.unique_id];\n // delete ref.unique_id;\n // }\n\n is_reference_fetch = ref.record_id || ref.unique_id;\n\n if (is_reference_fetch && typeof this.__private_access_key?.[is_reference_fetch] === 'string') {\n query.private_key = this.__private_access_key?.[is_reference_fetch] || undefined;\n }\n\n query.reference = is_reference_fetch;\n }\n else if (ref?.user_id) {\n ref_user_is_me = ref.user_id === this.user?.user_id;\n query.reference = ref.user_id;\n }\n }\n\n if (typeof query?.table === 'string') {\n query.table = {\n name: query.table,\n access_group: 0\n };\n }\n\n if (query.index) {\n if (query.index.hasOwnProperty('range') && query.index.hasOwnProperty('condition')) {\n delete query.index.range;\n }\n }\n\n const buildStruct = (query) => {\n return {\n table: {\n name: v => validateTableName(v, 'table.name'),\n access_group: accessGroup.bind(this),\n subscription: (v: any) => validator.UserId(v, 'User ID in \"subscription\"')\n },\n reference: 'string',\n index: {\n name: ['$updated', '$uploaded', '$referenced_count', '$user_id', (v: string) => {\n return validateCustomIndexName(v, 'index.name');\n }],\n value: (v: number | boolean | string) => {\n const indexTypes = {\n '$updated': 'number',\n '$uploaded': 'number',\n '$referenced_count': 'number',\n '$user_id': validator.UserId\n };\n\n if (indexTypes.hasOwnProperty(query.index.name)) {\n let tp = indexTypes[query.index.name];\n\n if (typeof tp === 'function') {\n return tp(v);\n }\n\n if (tp !== typeof v) {\n throw new SkapiError(`\"index.value\" should be type: ${tp}.`, { code: 'INVALID_PARAMETER' });\n }\n\n return v;\n }\n\n if (typeof v === 'string' && !v) {\n return \"\";\n }\n\n // On a nest query (name ending in '.') this is a child index NAME segment,\n // not a value, and the backend concatenates it onto the parent name. Names\n // are escaped on write, so a raw \"Rock/Pop\" here searched a range that the\n // stored \"Rock%2FPop\" falls outside of, and the caller could only find their\n // own record by typing the internal escaped form.\n if (typeof v === 'string' && isNestIndexName(query.index.name)) {\n return validateNestIndexSegment(v, 'index.value');\n }\n\n return indexValue(v);\n },\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq'],\n range: (v: number | boolean | string) => indexRange(v, query)\n },\n tag: (v: string) => {\n if (v === null || v === undefined) {\n return v;\n }\n if (typeof v === 'string') {\n return validateTag(v, 'tag');\n }\n else {\n throw new SkapiError('\"tag\" should be type: string.', { code: 'INVALID_PARAMETER' });\n }\n },\n private_key: 'string'\n }\n }\n\n query = validator.Params(query || {}, buildStruct(query), ref_user_is_me || isAdmin ? [] : ['table'], { ignoreEmpty: true });\n }\n return {\n query,\n is_reference_fetch\n }\n}\n\nexport async function getRecords(query: GetRecordQuery & { private_key?: string; }, fetchOptions?: FetchOptions): Promise<DatabaseResponse<RecordData>> {\n await this.__connection;\n\n let q = await getQuery.bind(this)(query);\n let is_reference_fetch = q.is_reference_fetch;\n\n // TODO: THINK ABOUT HOW TO HANDLE PRIVATE KEY FOR REFERENCE FETCH.\n // if (is_reference_fetch && typeof this.__private_access_key[is_reference_fetch] === 'string') {\n // q.query.private_key = this.__private_access_key[is_reference_fetch] || undefined;\n // }\n\n let result = await request.bind(this)(\n 'get-records',\n q.query,\n {\n fetchOptions,\n auth: !!this.__user,\n method: !!this.__user ? 'post' : 'get'\n }\n );\n\n if (is_reference_fetch && result?.reference_private_key && typeof result.reference_private_key === 'string') {\n this.__private_access_key[is_reference_fetch] = result.reference_private_key;\n }\n\n let to_process = [];\n for (let i in result.list) {\n to_process.push(normalizeRecord.bind(this)(result.list[i]));\n }\n\n result.list = await Promise.all(to_process);\n return result;\n}\n\nfunction setupPostRecordConfig(config: PostRecordConfig & { data?: any; }) {\n let is_reference_post = \"\";\n let files = [];\n // The config names the project this record is posted to (`service`/`owner` are\n // stripped further down, after the caller has read them). Both cache lookups below\n // are confined to it, so a unique_id known in one project can never resolve to that\n // project's record_id while posting into another.\n let scope = cacheScope.bind(this)((config as any)?.service, (config as any)?.owner);\n let _config = validator.Params(config || {}, {\n record_id: (v) => {\n // \"record_id\" may actually be a unique_id. If we already know the\n // unique_id -> record_id mapping locally, resolve it here; otherwise\n // pass the value through and let the backend resolve it. Do NOT force\n // alphanumeric, since unique_ids (e.g. \"src::folder/file.pdf\") contain\n // characters a real record_id never would.\n let cached = typeof v === 'string' ? getScopedUniqueId.bind(this)(scope, v) : undefined;\n if (cached) {\n return cached;\n }\n return validateStringByPolicy(v, 'record_id', {\n allowEmpty: false,\n });\n },\n unique_id: ['string', null],\n readonly: 'boolean',\n table: {\n name: v => validateTableName(v, 'table.name'),\n subscription: [null, {\n is_subscription_record: 'boolean',\n upload_to_feed: 'boolean',\n notify_subscribers: 'boolean',\n feed_referencing_records: 'boolean',\n notify_referencing_records: 'boolean',\n }],\n access_group: accessGroup.bind(this),\n },\n source: {\n referencing_limit: (v: number) => {\n if (v === null) {\n return null;\n }\n\n else if (typeof v === 'number') {\n if (0 > v) {\n throw new SkapiError(`\"reference_limit\" should be >= 0`, { code: 'INVALID_PARAMETER' });\n }\n\n if (v > 4503599627370546) {\n throw new SkapiError(`\"reference_limit\" should be <= 4503599627370546`, { code: 'INVALID_PARAMETER' });\n }\n\n return v;\n }\n\n throw new SkapiError(`\"reference_limit\" should be type: <number | null>`, { code: 'INVALID_PARAMETER' });\n },\n prevent_multiple_referencing: 'boolean',\n can_remove_referencing_records: 'boolean',\n only_granted_can_reference: 'boolean',\n allow_granted_to_grant_others: 'boolean',\n referencing_index_restrictions: v => {\n if (v === undefined) {\n return undefined;\n }\n\n if (!v) {\n return null;\n }\n\n if (Array.isArray(v) && !v.length) {\n return null;\n }\n\n let p = {\n name: v => validateCustomIndexName(v, '\"name\" in \"index_restrictions\"'),\n value: v => indexValue(v),\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq', '!=', 'ne', () => null],\n range: val => {\n if (val !== null && typeof v.value !== typeof val) {\n throw new SkapiError('Index restriction \"range\" type should match the type of \"value\".', { code: 'INVALID_PARAMETER' });\n }\n if (!v.hasOwnProperty('value')) {\n throw new SkapiError('Index restriction \"value\" is required.', { code: 'INVALID_PARAMETER' });\n }\n return val;\n }\n }\n\n if (!Array.isArray(v)) {\n v = [v];\n }\n\n let qq = v.map(vv => validator.Params(vv, p, ['name']));\n if (qq.length) {\n for (let q of qq) {\n if (q.condition && q.hasOwnProperty('range')) {\n delete q.range;\n }\n }\n }\n return qq;\n },\n },\n reference: v => {\n if (v === null) {\n return { record_id: null };\n }\n if (!v) {\n return undefined;\n }\n if (typeof v === 'string') {\n is_reference_post = v;\n // Scoped: an unscoped hit here is what silently redirected a\n // \"src::<file>\" reference to a same-named file's record in a\n // different project, which the backend then rejected as missing.\n let cached = getScopedUniqueId.bind(this)(scope, v);\n if (cached) {\n return cached;\n }\n return v;\n }\n\n if (typeof v !== 'object') {\n throw new SkapiError('\"reference\" should be type: <string | object>.', { code: 'INVALID_PARAMETER' });\n }\n\n return validator.Params(v, {\n unique_id: 'string',\n record_id: v => {\n if (v === null || v === undefined) {\n return v;\n }\n is_reference_post = v;\n if (typeof this.__private_access_key?.[v] === 'string') {\n config.reference_private_key = this.__private_access_key[v] || undefined;\n }\n return validateStringByPolicy(v, 'reference.record_id', {\n allowEmpty: false,\n onlyAlphanumeric: true,\n });\n }\n });\n },\n index: [null, {\n name: v => validateCustomIndexName(v, 'index.name'),\n value: v => indexValue(v)\n }],\n tags: (v: string | string[]) => {\n if (v === null || v === undefined) {\n return v;\n }\n if (typeof v === 'string') {\n v = v.split(',').map(t => t.trim());\n }\n if (!Array.isArray(v)) {\n throw new SkapiError('\"tag\" should be type: <string | string[]>.', { code: 'INVALID_PARAMETER' });\n }\n return v.map(t => validateTag(t, 'tag'));\n },\n remove_bin: (v: string[] | BinaryFile[] | null) => {\n if (!v) {\n return null;\n }\n\n let arr = []\n if (Array.isArray(v)) {\n for (let i of v) {\n if (typeof i === 'string') {\n // Strip the \"?t=<token>\" getFile appends, but do NOT decode: the stored bin\n // url holds the filename raw, so decoding produced a url that matches\n // nothing. The backend's DELETE on a string set ignores a non-matching\n // element, so removing a file named \"a%2Fb.pdf\" silently did nothing.\n arr.push(i.split('?')[0]);\n }\n else if (i.url && i.size && i.filename) {\n let hostUrl = i.url.split('/').slice(0, 3).join('/');\n let url = hostUrl + '/' + i.path;\n arr.push(url);\n }\n else {\n throw new SkapiError(`\"remove_bin\" should be type: <string[] | BinaryFile[] | null>`, { code: 'INVALID_PARAMETER' });\n }\n }\n }\n else {\n throw new SkapiError(`\"remove_bin\" should be type: <string[] | BinaryFile[] | null>`, { code: 'INVALID_PARAMETER' });\n }\n\n return arr;\n },\n progress: 'function',\n data: v => v\n }, [], {\n precall: (pc) => {\n const data = pc?.data || {};\n\n if (!data?.record_id && !data.table) {\n throw new SkapiError('\"table.name\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof data.table === 'string') {\n data.table = {\n name: data.table,\n access_group: 0\n };\n }\n\n if (pc.files) {\n files = pc.files;\n }\n }\n });\n\n let progress = config.progress || null;\n\n // callbacks should be removed after cocochex\n delete _config.progress;\n\n if (!this.__user) {\n const hasEnabledSubscriptionOptions = !!(\n _config.table?.subscription?.is_subscription_record\n || _config.table?.subscription?.upload_to_feed\n || _config.table?.subscription?.notify_subscribers\n || _config.table?.subscription?.feed_referencing_records\n || _config.table?.subscription?.notify_referencing_records\n );\n\n if (_config.record_id) {\n throw new SkapiError('Public users cannot update existing records.', { code: 'INVALID_REQUEST' });\n }\n if (_config.table.access_group !== 'public' && _config.table.access_group !== 0) {\n throw new SkapiError('Public users can only post records to public tables.', { code: 'INVALID_REQUEST' });\n }\n if (hasEnabledSubscriptionOptions) {\n throw new SkapiError('Public users cannot post subscription records.', { code: 'INVALID_REQUEST' });\n }\n if (_config.remove_bin) {\n throw new SkapiError('Public users cannot remove files from records.', { code: 'INVALID_REQUEST' });\n }\n if (_config.unique_id) {\n throw new SkapiError('Public users cannot set unique_id for records.', { code: 'INVALID_REQUEST' });\n }\n }\n return { config: _config, progress, is_reference_post, files };\n}\n\nexport async function bulkPostRecords(params) {\n await this.__connection;\n\n if (!Array.isArray(params) || !params.length) {\n throw new SkapiError('\"params\" should be a non-empty array.', { code: 'INVALID_PARAMETER' });\n }\n\n let reference_posts = [];\n let service = undefined;\n let owner = undefined;\n let progress = null;\n\n let validatedBulk = params.map((config, idx) => {\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n throw new SkapiError(`\"params[${idx}]\" should be type: <object>.`, { code: 'INVALID_PARAMETER' });\n }\n\n let mangled = setupPostRecordConfig.bind(this)(config) as {config: PostRecordConfig & { service?: string; owner?: string; }; is_reference_post?: string;};\n let _config = mangled.config;\n if (mangled.is_reference_post) {\n reference_posts.push(mangled.is_reference_post);\n }\n if (typeof _config.progress === 'function' && progress === null) {\n progress = _config.progress;\n }\n\n if (_config.service !== undefined) {\n if (service === undefined) {\n service = _config.service;\n }\n else if (service !== _config.service) {\n throw new SkapiError('All bulk params should share the same \"service\" value.', { code: 'INVALID_PARAMETER' });\n }\n }\n\n if (_config.owner !== undefined) {\n if (owner === undefined) {\n owner = _config.owner;\n }\n else if (owner !== _config.owner) {\n throw new SkapiError('All bulk params should share the same \"owner\" value.', { code: 'INVALID_PARAMETER' });\n }\n }\n\n delete _config.progress;\n delete _config.service;\n delete _config.owner;\n\n return _config;\n });\n\n let postData = {\n _is_bulk_: validatedBulk,\n service: \"\",\n owner: \"\"\n };\n\n if (service !== undefined) {\n postData.service = service;\n }\n\n if (owner !== undefined) {\n postData.owner = owner;\n }\n\n let options = { auth: !!this.__user, method: 'post' };\n let fetchOptions = {};\n\n // if (typeof progress === 'function') {\n // fetchOptions.progress = progress;\n // }\n\n if (Object.keys(fetchOptions).length) {\n Object.assign(options, { fetchOptions });\n }\n\n let recList = await request.bind(this)('post-record', postData, options);\n let records = await Promise.all(recList.map((rec) => normalizeRecord.bind(this)(rec, 'called from postRecord')));\n\n // Bulk posts all share one service/owner (enforced above), so one scope covers the\n // whole batch. Falls back to the instance's own pair when the caller named neither.\n let scope = cacheScope.bind(this)(service, owner);\n\n for (let i = 0; i < recList.length; i++) {\n let rec = recList[i];\n let record = records[i];\n\n // if (rec?.rec) {\n // window.sessionStorage.setItem(`${this.service}:post:${rec.rec}`, JSON.stringify(rec));\n // }\n\n // The backend reports a per-element rejection as an error OBJECT INSIDE the\n // returned array rather than by throwing, e.g. {error:{code:\"NOT_EXISTS\",\n // message:'Reference \"VQs5...\" does not exists.'}}. normalizeRecord does not\n // know the `error` key, so it dropped it and handed back a fully-shaped EMPTY\n // record: callers saw an ordinary array of records, counted the rejections as\n // saves, and the one thing that explained the failure was gone. Carry it across\n // so a caller can report WHY a record did not save. An empty record_id remains\n // the reliable \"not saved\" signal; this only adds the reason.\n if (rec && typeof rec === 'object' && rec.error && record && !record.record_id) {\n record.error = rec.error;\n }\n\n if (typeof rec?.reference_private_key === 'string') {\n for (let ref of reference_posts) {\n this.__private_access_key[ref] = rec.reference_private_key;\n }\n }\n\n if (record?.unique_id) {\n setScopedUniqueId.bind(this)(scope, record.unique_id, record.record_id);\n }\n }\n\n // if (Object.keys(this.__my_unique_ids).length) {\n // window.sessionStorage.setItem(`${this.service}:uniqueids`, JSON.stringify(this.__my_unique_ids));\n // }\n\n return records;\n}\n\nexport async function postRecord(\n form: Form<Record<string, any>> | null | undefined,\n config: PostRecordConfig,\n files?: { name: string, file: File }[],\n): Promise<RecordData> {\n await this.__connection;\n\n if (!config) {\n throw new SkapiError('\"config\" argument is required.', { code: 'INVALID_PARAMETER' });\n }\n\n let postConf = setupPostRecordConfig.bind(this)(config);\n let _config = postConf.config;\n let progress = postConf.progress;\n let is_reference_post = postConf.is_reference_post;\n\n let options: { [key: string]: any } = { auth: !!this.__user, method: 'post' };\n\n let to_bin: { name: string, file: File }[] = [];\n let extractedForm = extractFormData(form);\n if (files && Array.isArray(files) && files.length) {\n // { name: string, file: File }[]\n to_bin = to_bin.concat(files);\n }\n if (extractedForm.files && Array.isArray(extractedForm.files) && extractedForm.files.length) {\n // { name: string, file: File }[]\n to_bin = to_bin.concat(extractedForm.files);\n }\n\n let postData = null;\n postData = Object.assign({ data: extractedForm.data }, _config);\n\n let fetchOptions: { [key: string]: any } = {};\n\n if (typeof progress === 'function') {\n fetchOptions.progress = progress;\n }\n\n if (Object.keys(fetchOptions).length) {\n Object.assign(options, { fetchOptions });\n }\n let rec = await request.bind(this)('post-record', postData, options);\n if (isBrowserRuntime() && to_bin.length) {\n let bin_formData = new FormData();\n for (let f of to_bin) {\n bin_formData.append(f.name, f.file, f.file.name);\n }\n let uploadFileParams = {\n record_id: rec.rec,\n progress\n }\n if (_config.hasOwnProperty('service')) {\n uploadFileParams['service'] = _config.service;\n }\n let { bin_endpoints } = await uploadFiles.bind(this)(bin_formData, uploadFileParams);\n if (!rec.bin) {\n rec.bin = bin_endpoints;\n }\n else {\n rec.bin.push(...bin_endpoints);\n }\n }\n\n if (is_reference_post && typeof rec?.reference_private_key === 'string') {\n this.__private_access_key[is_reference_post] = rec.reference_private_key;\n }\n\n // window.sessionStorage.setItem(`${this.service}:post:${rec.rec}`, JSON.stringify(rec));\n\n // If the server offloaded the \"data\" payload to storage (too large for the\n // record item), the response carries a { __data__: <path> } marker. Skip the\n // re-download and return exactly what was posted.\n let dataOffloaded = !!rec && rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data) && typeof rec.data.__data__ === 'string' && rec.data.__data__.endsWith('/__data__/__json__.json');\n let record = await normalizeRecord.bind(this)(rec, 'called from postRecord', true);\n if (dataOffloaded) {\n record.data = extractedForm.data;\n }\n if (record.unique_id) {\n let scope = cacheScope.bind(this)((_config as any)?.service, (_config as any)?.owner);\n setScopedUniqueId.bind(this)(scope, record.unique_id, record.record_id);\n if (isBrowserRuntime()) {\n // Debounce + guard the persistence. Previously every postRecord\n // re-stringified the entire, ever-growing map synchronously, so a\n // bulk upload (e.g. 10k files, each writing a src:: unique_id) did\n // O(n^2) JSON work and could throw QuotaExceededError mid-batch,\n // failing the upload. Coalesce writes to at most one per idle tick\n // and swallow storage errors so persistence never breaks an upload.\n if (this.__uniqueIdsPersistTimer !== null) {\n clearTimeout(this.__uniqueIdsPersistTimer);\n }\n this.__uniqueIdsPersistTimer = setTimeout(() => {\n this.__uniqueIdsPersistTimer = null;\n try {\n // Persist ONLY the scope just written, under a key that names both\n // service and owner. Writing the whole map under a service-only key\n // is what let one project's entries be restored into another.\n window.sessionStorage.setItem(`${scope}:uniqueids`, JSON.stringify(this.__my_unique_ids[scope] || {}));\n } catch (e) {\n // sessionStorage full/unavailable: keep the in-memory map,\n // just skip persistence for this session.\n }\n }, 500);\n }\n }\n\n return record;\n}\n\nexport async function getTables(\n /** If null fetch all list of tables. */\n query: {\n table: string;\n /** Condition operator of table name. */\n condition?: Condition;\n },\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<Table>> {\n let res = await request.bind(this)('get-table', validator.Params(query || {}, {\n // Escaped, because storage holds the escaped form: a lookup for a table literally named\n // \"a/b\" has to go out as \"a%2Fb\" or it matches nothing. The response is decoded below, so\n // leaving the query raw made this one call the only place where the caller had to know\n // about the wire format. Empty is allowed: table '' or ' ' with a condition is the\n // \"list everything\" idiom.\n table: (v: string) => validateTableName(v, 'table', { allowEmpty: true }),\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq', '!=', 'ne']\n }), Object.assign({ auth: !!this.__user }, { fetchOptions }));\n\n let convert = {\n 'cnt_rec': 'number_of_records',\n 'tbl': 'table',\n 'srvc': 'service',\n 'grp_': 'number_of_records_in_access_group_'\n };\n\n if (Array.isArray(res?.list)) {\n for (let t of res.list) {\n for (let k in convert) {\n if(k === 'grp_') {\n for (let gk in t) {\n if (gk.startsWith('grp_')) {\n let access_group = gk.substring(4);\n if(access_group === 'pv') {\n access_group = 'private';\n }\n else if(access_group === '00') {\n access_group = 'public';\n }\n else if(access_group === '01') {\n access_group = 'authorized';\n }\n else if(access_group === '99') {\n access_group = 'admin';\n }\n t[`number_of_records_in_access_group_${access_group}`] = t[gk];\n delete t[gk];\n }\n }\n }\n if (t.hasOwnProperty(k)) {\n t[convert[k]] = t[k];\n delete t[k];\n }\n }\n\n if (typeof t.table === 'string') {\n t.table = decodeReservedDelimiters(t.table);\n }\n }\n }\n\n return res;\n}\n\nexport async function getIndexes(\n query: {\n /** Table name */\n table: string;\n /** Index name. When period is at the end of name, querys nested index keys. */\n index?: string;\n /** Queries order by */\n order?: {\n /** Key name to order by. */\n by: 'average_number' | 'total_number' | 'number_count' | 'average_bool' | 'total_bool' | 'bool_count' | 'string_count' | 'index_name';\n /** Value to query. */\n value?: number | boolean | string;\n condition?: Condition;\n };\n },\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<Index>> {\n if (!query?.table) {\n throw new SkapiError('\"table\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n let p:any = validator.Params(\n query || {},\n {\n // Escaped for the same reason as getTables: storage holds the escaped form.\n table: (v: string) => validateTableName(v, 'table', { allowEmpty: true }),\n index: (v: string) => validateCustomIndexName(v, 'index.name'),\n order: {\n by: [\n 'average_number',\n 'total_number',\n 'number_count',\n 'average_bool',\n 'total_bool',\n 'bool_count',\n 'string_count',\n 'index_name',\n 'number_of_records'\n ],\n value: (v: any) => {\n // When ordering by 'index_name', order.value is NOT a value: the backend\n // concatenates it onto the index name to build the composite key\n // (get_index: idx = index + order.value), so it is a name fragment and needs the\n // same escaping the name itself got. Sent raw, it searched for \"svc/t/Band.Mem/bers\"\n // while storage held \"svc/t/Band.Mem%2Fbers\", returning an empty list with no\n // error, and the getIndexes response hands back the decoded spelling that fails.\n // For every other \"by\" the value is a numeric threshold and must be left alone.\n if (query?.order?.by === 'index_name' && typeof v === 'string') {\n return validateStringByPolicy(v, 'order.value', {\n allowEmpty: true,\n maxLength: 256,\n blockKeyDelimiters: true\n });\n }\n if (typeof v !== 'string' && typeof v !== 'number' && typeof v !== 'boolean') {\n throw new SkapiError('\"order.value\" should be type: <string | number | boolean>.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq', '!=', 'ne']\n }\n },\n ['table']\n );\n\n if (p.hasOwnProperty('order')) {\n if (!p.order?.by) {\n throw new SkapiError('\"order.by\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n if (p.order.hasOwnProperty('condition') && !p.order.hasOwnProperty('value')) {\n throw new SkapiError('\"value\" is required for \"condition\".', { code: 'INVALID_PARAMETER' });\n }\n\n if (p.hasOwnProperty('index')) {\n if (p.index.substring(p.index.length - 1) !== '.') {\n throw new SkapiError('\"index\" should be a parent index name of the compound index when using \"order.by\"', { code: 'INVALID_PARAMETER' });\n }\n }\n }\n\n let res = await request.bind(this)(\n 'get-index',\n p,\n Object.assign(\n { auth: !!this.__user },\n { fetchOptions }\n )\n );\n\n let convert = {\n 'cnt_bool': 'boolean_count',\n 'cnt_numb': 'number_count',\n 'totl_numb': 'total_number',\n 'totl_bool': 'total_bool',\n 'avrg_numb': 'average_number',\n 'avrg_bool': 'average_bool',\n 'cnt_str': 'string_count'\n };\n\n if (Array.isArray(res?.list)) {\n res.list = res.list.map((i: Record<string, any>) => {\n let iSplit = i.idx.split('/');\n let resolved: Record<string, any> = {\n table: decodeReservedDelimiters(iSplit[1]),\n index: decodeReservedDelimiters(iSplit[2]),\n number_of_records: i.cnt_rec\n };\n\n for (let k in convert) {\n if (Object.prototype.hasOwnProperty.call(i, k)) {\n resolved[convert[k]] = i[k];\n }\n }\n\n return resolved;\n });\n }\n\n return res;\n}\n\nexport async function getTags(\n query?: {\n /** Table name */\n table: string;\n /** Tag name */\n tag?: string;\n /** String query condition for tag name. */\n condition?: Condition;\n },\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<Tag>> {\n\n let res = await request.bind(this)(\n 'get-tag',\n validator.Params(query || {},\n {\n // Both escaped: the stored tag key is \"<tag>/<table>\", both segments in escaped\n // form, and the response is decoded below.\n table: (v: string) => validateTableName(v, 'table', { allowEmpty: true }),\n tag: (v: string) => validateTag(v, 'tag', { allowEmpty: true }),\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq', '!=', 'ne']\n }\n ),\n Object.assign({ auth: !!this.__user }, { fetchOptions })\n );\n\n if (Array.isArray(res?.list)) {\n res.list = res.list.map(item => {\n let tSplit = item.tag.split('/');\n return {\n table: decodeReservedDelimiters(tSplit[1]),\n tag: decodeReservedDelimiters(tSplit[0]),\n number_of_records: item.cnt_rec\n };\n });\n }\n\n return res;\n}\n\nexport async function getUniqueId(\n query?: Form<{\n /** Unique ID */\n unique_id?: string;\n /** String query condition for tag name. */\n condition?: Condition;\n }>,\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<UniqueId>> {\n\n let res = await request.bind(this)(\n 'get-uniqueid',\n validator.Params(query || {},\n {\n unique_id: 'string',\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq', '!=', 'ne']\n }\n ),\n Object.assign({ auth: !!this.__user }, { fetchOptions })\n );\n\n if (Array.isArray(res?.list)) {\n for (let i in res.list) {\n let item = res.list[i];\n res.list[i] = {\n unique_id: item.unq,\n record_id: item.rec\n };\n }\n }\n\n return res;\n}\n\nexport async function deleteRecords(query: DelRecordQuery & { private_key?: string; }, fetchOptions?: FetchOptions): Promise<string | DatabaseResponse<RecordData>> {\n await this.__connection;\n\n let q = await getQuery.bind(this)(query, true);\n let is_reference_fetch = q.is_reference_fetch;\n let result = await request.bind(this)('del-records', q.query, { auth: true, fetchOptions });\n if (is_reference_fetch && typeof result?.reference_private_key === 'string') {\n this.__private_access_key[is_reference_fetch] = result.reference_private_key;\n }\n\n return result?.message || result;\n}\n\nexport function grantPrivateRecordAccess(params: {\n record_id: string;\n user_id: string | string[];\n}) {\n return recordAccess.bind(this)({\n record_id: params.record_id,\n user_id: params.user_id,\n execute: 'add'\n });\n}\n\nexport function removePrivateRecordAccess(params: {\n record_id: string;\n user_id: string | string[];\n}) {\n return recordAccess.bind(this)({\n record_id: params.record_id,\n user_id: params.user_id || null,\n execute: 'remove'\n });\n}\n\nexport async function listPrivateRecordAccess(p: {\n record_id?: string;\n user_id?: string | string[];\n}, fetchOptions?: FetchOptions): Promise<DatabaseResponse<{ record_id: string; user_id: string; }>> {\n let params = {\n record_id: p.record_id || undefined,\n user_id: p.user_id || undefined,\n execute: 'list'\n };\n\n if (!params.record_id && !params.user_id) {\n throw new SkapiError(`Either record_id or user_id must be provided.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (params.user_id) {\n if (typeof params.user_id === 'string') {\n validator.UserId(params.user_id);\n params.user_id = [params.user_id];\n }\n else if (Array.isArray(params.user_id)) {\n for (let u of params.user_id) {\n validator.UserId(u);\n }\n }\n else {\n throw new SkapiError(`user_id should be type: <string | string[]>`, { code: 'INVALID_PARAMETER' });\n }\n }\n\n let mapper = (i: Record<string, any>) => {\n if (i.rec_usr) {\n i.record_id = i.rec_usr.split('/')[0];\n i.user_id = i.rec_usr.split('/')[1];\n }\n else if (i.usr_rec) {\n i.user_id = i.usr_rec.split('/')[0];\n i.record_id = i.usr_rec.split('/')[1];\n }\n return i;\n };\n\n let list = await request.bind(this)(\n 'grant-private-access',\n params,\n { auth: true, fetchOptions }\n );\n\n list.list = list.list.map(mapper);\n\n return list;\n}\n\nexport function requestPrivateRecordAccessKey(params: { record_id: string, reference_id?: string }): Promise<string> {\n let record_id: string | string[] = params.record_id;\n let reference_id = params.reference_id || undefined;\n if (!record_id) {\n throw new SkapiError(`Record ID is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof record_id !== 'string') {\n throw new SkapiError(`Record ID should be type: <string | string[]>`, { code: 'INVALID_PARAMETER' });\n }\n\n if (reference_id && typeof reference_id !== 'string') {\n throw new SkapiError(`Reference ID should be type: <string>`, { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof this.__private_access_key[record_id] === 'string') {\n return Promise.resolve(this.__private_access_key[record_id]);\n }\n\n if (pendingPrivateAccessKeyRequest[record_id]) {\n return pendingPrivateAccessKeyRequest[record_id];\n }\n\n let res = request\n .bind(this)(\n 'request-private-access-key',\n { record_id, reference_id },\n { auth: true }\n )\n .then((r: any) => {\n let privateKey = typeof r === 'string' ? r : r?.private_key;\n if (typeof privateKey !== 'string') {\n throw new SkapiError('Invalid private access key response.', { code: 'ERROR' });\n }\n\n this.__private_access_key[record_id] = privateKey;\n return privateKey;\n })\n .finally(() => {\n delete pendingPrivateAccessKeyRequest[record_id];\n });\n\n pendingPrivateAccessKeyRequest[record_id] = res;\n\n return res;\n}\n\nfunction recordAccess(params: {\n record_id: string;\n user_id: string | string[];\n execute: 'add' | 'remove';\n}): Promise<any> {\n let execute = params.execute;\n let req = validator.Params(params,\n {\n record_id: 'string',\n user_id: (v: string | string[]) => {\n if (!v) {\n throw new SkapiError(`User ID is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n let id = v;\n if (typeof id === 'string') {\n id = [id];\n }\n\n if (id.length > 100) {\n throw new SkapiError(`Cannot process more than 100 users at once.`, { code: 'INVALID_REQUEST' });\n }\n\n for (let i of id) {\n validator.UserId(i, 'User ID in \"user_id\"');\n }\n\n return id;\n },\n execute: ['add', 'remove']\n },\n [\n 'execute',\n 'record_id',\n 'user_id'\n ]\n );\n\n if (!req.user_id) {\n req.user_id = null;\n }\n\n return request.bind(this)(\n 'grant-private-access',\n req,\n { auth: true }\n );\n}\n\n","import { SkapiError } from \"../Main\";\nimport { RTCResolved, RTCEvent, RTCConnectorParams, RTCReceiverParams, WebSocketMessage, RTCConnector } from \"../Types\";\nimport { extractFormData } from \"../utils/utils\";\nimport validator from \"../utils/validator\";\n\nexport const __peerConnection: { [sender: string]: RTCPeerConnection } = {};\nexport const __dataChannel: { [sender: string]: { [label: string]: RTCDataChannel } } = {};\nexport const __caller_ringing: { [recipient: string]: (v: any) => void } = {};\nexport const __receiver_ringing: { [caller: string]: string } = {};\nexport const __rtcEvents: { [sender: string]: (v: any) => void } = {};\n\nlet __rtcCandidatesBuffer: { [sender: string]: any[] } = {};\nlet __rtcSdpOfferBuffer: { [sender: string]: any[] } = {};\n\nfunction setBuffer(buffer: { [recipient: string]: any[] }, recipient: string, item: any) {\n if (!buffer[recipient]) {\n buffer[recipient] = [];\n }\n buffer[recipient].push(item);\n}\n\nasync function processBuffer(buffer: { [recipient: string]: any[] }, recipient: string, fn: (item: any) => any): Promise<any[]> {\n let proceed = [];\n if (buffer[recipient]) {\n for (let v of buffer[recipient]) {\n if (v) {\n let process = fn(v);\n if (process instanceof Promise) {\n process = await process;\n }\n proceed.push(process);\n }\n };\n delete buffer[recipient];\n }\n return proceed;\n}\n\nexport async function answerSdpOffer(offer: any, recipient: string) {\n if (!this?.session?.accessToken?.jwtToken) {\n throw new SkapiError('Access token is required.', { code: 'INVALID_PARAMETER' });\n }\n\n let socket: WebSocket = await this.__socket;\n async function sendAnswer(offer, recipient, socket) {\n this.log('answerSdpOffer from', recipient);\n await __peerConnection[recipient].setRemoteDescription(new RTCSessionDescription(offer));\n const answer = await __peerConnection[recipient].createAnswer();\n await __peerConnection[recipient].setLocalDescription(answer);\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: recipient,\n content: { sdpanswer: answer },\n token: this.session.accessToken.jwtToken\n }));\n }\n\n if (__peerConnection?.[recipient]) {\n if (!offer) {\n await processBuffer(__rtcSdpOfferBuffer, recipient, (offer) => sendAnswer.bind(this)(offer, recipient, socket)); // process all buffered sdp offers\n }\n else {\n await processBuffer(__rtcSdpOfferBuffer, recipient, (offer) => sendAnswer.bind(this)(offer, recipient, socket)); // process all buffered sdp offers first\n await sendAnswer.bind(this)(offer, recipient, socket);\n }\n }\n else {\n if (offer) {\n setBuffer(__rtcSdpOfferBuffer, recipient, offer);\n }\n }\n}\n\nexport async function receiveIceCandidate(candidate: any, recipient: string) {\n this.log('receiveIceCandidate', candidate);\n if (__peerConnection?.[recipient] && __peerConnection[recipient]?.remoteDescription && __peerConnection[recipient]?.remoteDescription?.type) {\n if (!candidate) {\n return processBuffer(__rtcCandidatesBuffer, recipient, (candidate) => __peerConnection[recipient].addIceCandidate(candidate)); // process all buffered candidates\n }\n await processBuffer(__rtcCandidatesBuffer, recipient, (candidate) => __peerConnection[recipient].addIceCandidate(candidate)); // process all buffered candidates\n await __peerConnection[recipient].addIceCandidate(candidate);\n }\n else {\n setBuffer(__rtcCandidatesBuffer, recipient, candidate);\n }\n}\n\nexport async function closeRTC(params: { cid?: string; close_all?: boolean }): Promise<void> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebRTC is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n validator.Params(params, {\n cid: v => {\n if (typeof v !== 'string') {\n throw new SkapiError(`\"cid\" should be type: <string>.`, { code: 'INVALID_PARAMETER' });\n }\n if (v && v.slice(0, 4) !== 'cid:') {\n throw new SkapiError(`\"cid\" should be a valid connection id.`, { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n close: 'boolean'\n });\n let socket: WebSocket = await this.__socket;\n let { cid, close_all = false } = params || {};\n\n if (!close_all && !cid) {\n throw new SkapiError(`\"cid\" is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n let close = (cid: string) => {\n if (!cid) {\n throw new SkapiError(`\"cid\" is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n delete __rtcSdpOfferBuffer[cid];\n delete __rtcCandidatesBuffer[cid];\n\n // Close all associated data channels\n if (__dataChannel[cid]) {\n Object.values(__dataChannel[cid]).forEach(channel => {\n if (channel.readyState !== 'closed') {\n channel.close();\n }\n });\n }\n\n delete __dataChannel[cid];\n\n if (__peerConnection?.[cid]) {\n if (__peerConnection[cid].connectionState !== 'closed') {\n __peerConnection[cid].close();\n\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: cid,\n content: { hungup: this.user.user_id },\n token: this.session.accessToken.jwtToken\n }));\n }\n\n let msg = {\n type: 'connectionstatechange',\n target: __peerConnection[cid],\n timestamp: new Date().toISOString(),\n state: __peerConnection[cid].connectionState,\n iceState: __peerConnection[cid].iceConnectionState,\n signalingState: __peerConnection[cid].signalingState\n }\n\n if (__rtcEvents[cid]) {\n __rtcEvents[cid](msg);\n }\n\n this.log('closeRTC', msg);\n }\n\n delete __rtcEvents[cid];\n delete __receiver_ringing[cid];\n delete __caller_ringing[cid];\n delete __peerConnection[cid];\n }\n\n if (close_all) {\n for (let key in __peerConnection) {\n close(key);\n }\n }\n else {\n close(cid);\n }\n\n this.log('Cleaning up media stream...');\n if (this.__mediaStream) {\n this.__mediaStream.getTracks().forEach((track) => {\n track.stop(); // Stops the track (audio or video)\n });\n this.__mediaStream = null; // Clear the reference to the MediaStream\n }\n}\n\nasync function createMediaStream(media: MediaStream | MediaStreamConstraints): Promise<MediaStream> {\n if (media instanceof MediaStream) {\n return media;\n }\n\n if (!media.video && !media.audio) {\n // make dummy media stream\n // Create a dummy MediaStream\n const dummyStream = new MediaStream();\n\n // Create a dummy video track (using a canvas)\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const dummyVideoStream = canvas.captureStream();\n const dummyVideoTrack = dummyVideoStream.getVideoTracks()[0];\n\n // Add the dummy video track to the MediaStream\n dummyStream.addTrack(dummyVideoTrack);\n\n // Assign the dummy MediaStream to this.__mediaStream\n return dummyStream;\n }\n\n return window.navigator.mediaDevices.getUserMedia(media);\n}\n\nexport async function connectRTC(\n params: RTCConnectorParams,\n callback: (e: RTCEvent) => void\n): Promise<RTCConnector> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebRTC is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n if (typeof callback !== 'function') {\n throw new SkapiError(`Callback is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (!this?.session?.accessToken?.jwtToken) {\n throw new SkapiError('Access token is required.', { code: 'INVALID_PARAMETER' });\n }\n\n params = validator.Params(params, {\n cid: v => {\n if (typeof v !== 'string') {\n throw new SkapiError(`\"cid\" should be type: <string>.`, { code: 'INVALID_PARAMETER' });\n }\n if (v && v.slice(0, 4) !== 'cid:') {\n throw new SkapiError(`\"cid\" should be a valid connection id.`, { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n ice: ['string', () => 'stun:stun.skapi.com:3468'],\n media: v => v,\n channels: ['text-chat', 'file-transfer', 'video-chat', 'voice-chat', 'gaming', {\n // negotiated: 'boolean',\n // id: 'number',\n ordered: 'boolean',\n maxPacketLifeTime: 'number',\n maxRetransmits: 'number',\n protocol: 'string'\n }, () => {\n return [{ ordered: true, maxPacketLifeTime: 10, protocol: 'default' }]\n }]\n }, ['cid']);\n\n let { cid, ice } = params;\n\n if (!(params?.media instanceof MediaStream)) {\n if (params?.media?.video || params?.media?.audio) {\n // check if it is localhost or https\n if (window.location.hostname !== 'localhost' && window.location.protocol !== 'https:') {\n throw new SkapiError(`Media stream is only supported on either localhost or https.`, { code: 'INVALID_REQUEST' });\n }\n }\n }\n\n let socket: WebSocket = this.__socket ? await this.__socket : this.__socket;\n\n if (!socket) {\n throw new SkapiError(`No realtime connection. Execute connectRealtime() before this method.`, { code: 'INVALID_REQUEST' });\n }\n\n if (socket.readyState !== 1) {\n throw new SkapiError('Realtime connection is not ready.', { code: 'INVALID_REQUEST' });\n }\n\n // Call STUN server to get IP address\n const configuration = {\n iceServers: [\n { urls: ice }\n ]\n };\n\n if (!__peerConnection?.[cid]) {\n __peerConnection[cid] = new RTCPeerConnection(configuration);\n }\n\n // add media stream\n if (params?.media) {\n this.__mediaStream = await createMediaStream(params.media);\n this.__mediaStream.getTracks().forEach(track => {\n __peerConnection[cid].addTrack(track, this.__mediaStream);\n });\n }\n\n __rtcEvents[cid] = callback;\n\n if (!__dataChannel[cid]) {\n __dataChannel[cid] = {};\n }\n\n for (let i = 0; i < params.channels.length; i++) {\n let options = params.channels[i];\n\n if (typeof options === 'string') {\n switch (options) {\n case 'text-chat':\n options = { ordered: true, maxRetransmits: 10, protocol: 'text-chat' };\n break;\n case 'file-transfer':\n options = { ordered: false, maxPacketLifeTime: 3000, protocol: 'file-transfer' };\n break;\n case 'video-chat':\n options = { ordered: true, maxRetransmits: 10, protocol: 'video-chat' };\n break;\n case 'voice-chat':\n options = { ordered: true, maxRetransmits: 10, protocol: 'voice-chat' };\n break;\n case 'gaming':\n options = { ordered: false, maxPacketLifeTime: 100, protocol: 'gaming' };\n break;\n default:\n options = { ordered: true, maxRetransmits: 10, protocol: 'default' };\n break;\n }\n }\n\n let protocol = options.protocol || 'default';\n if (Object.keys(__dataChannel[cid]).includes(protocol)) {\n throw new SkapiError(`Data channel with the protocol \"${protocol}\" already exists.`, { code: 'INVALID_REQUEST' });\n }\n\n let dataChannel = __peerConnection[cid].createDataChannel(protocol, options);\n __dataChannel[cid][protocol] = dataChannel;\n }\n\n for (let key in __dataChannel[cid]) {\n let dataChannel = __dataChannel[cid][key];\n handleDataChannel.bind(this)(cid, dataChannel);\n }\n\n peerConnectionHandler.bind(this)(cid, ['onnegotiationneeded']);\n await sendOffer.bind(this)(cid);\n\n return {\n hangup: () => __caller_ringing[cid] && __caller_ringing[cid](false),\n connection: new Promise(resolve => {\n __caller_ringing[cid] = ((proceed: boolean) => {\n this.log('receiver picked up the call', cid);\n // proceed\n if (!proceed) {\n closeRTC.bind(this)({ cid: cid });\n return null;\n }\n\n __peerConnection[cid].onnegotiationneeded = () => {\n this.log('onnegotiationneeded', `sending offer to \"${cid}\".`);\n sendOffer.bind(this)(cid);\n if (__rtcEvents[cid])\n __rtcEvents[cid]({\n type: 'negotiationneeded',\n target: __peerConnection[cid],\n timestamp: new Date().toISOString(),\n signalingState: __peerConnection[cid].signalingState,\n connectionState: __peerConnection[cid].iceConnectionState,\n gatheringState: __peerConnection[cid].iceGatheringState\n });\n };\n\n resolve({\n target: __peerConnection[cid],\n channels: __dataChannel[cid],\n hangup: () => closeRTC.bind(this)({ cid: cid }),\n media: this.__mediaStream\n });\n }).bind(this);\n })\n }\n}\n\nexport function respondRTC(msg: WebSocketMessage): (params: RTCReceiverParams, callback: (e: RTCEvent) => void) => Promise<RTCResolved> {\n return async (params: RTCReceiverParams, callback: (e: RTCEvent) => void): Promise<RTCResolved> => {\n params = params || {};\n params = extractFormData(params).data;\n\n let sender = msg.sender_cid;\n let socket: WebSocket = await this.__socket;\n\n if (!__receiver_ringing[sender]) {\n return null;\n }\n\n if (typeof callback !== 'function') {\n throw new SkapiError(`Callback is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (!(params?.media instanceof MediaStream)) {\n if (params?.media?.video || params?.media?.audio) {\n // check if it is localhost or https\n if (window.location.hostname !== 'localhost' && window.location.protocol !== 'https:') {\n throw new SkapiError(`Media stream is only supported on either localhost or https.`, { code: 'INVALID_REQUEST' });\n }\n }\n }\n\n let { ice = 'stun:stun.skapi.com:3468' } = params;\n\n if (!__peerConnection?.[sender]) {\n __peerConnection[sender] = new RTCPeerConnection({\n iceServers: [\n { urls: ice }\n ]\n });\n }\n\n if (params?.media) {\n this.__mediaStream = await createMediaStream(params.media);\n this.__mediaStream.getTracks().forEach(track => {\n __peerConnection[sender].addTrack(track, this.__mediaStream);\n });\n }\n\n delete __receiver_ringing[sender];\n\n __rtcEvents[sender] = callback;\n\n if (!__dataChannel[sender]) {\n __dataChannel[sender] = {};\n }\n\n __peerConnection[sender].ondatachannel = (event) => {\n this.log('ondatachannel', `received data channel \"${event.channel.label}\".`);\n const dataChannel = event.channel;\n __dataChannel[sender][dataChannel.label] = dataChannel;\n handleDataChannel.bind(this)(sender, dataChannel);\n }\n\n peerConnectionHandler.bind(this)(sender, ['onnegotiationneeded']);\n await answerSdpOffer.bind(this)(null, sender);\n await receiveIceCandidate.bind(this)(null, sender);\n\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: sender,\n content: { pickup: this.user.user_id },\n token: this.session.accessToken.jwtToken\n }));\n\n return {\n target: __peerConnection[sender],\n channels: __dataChannel[sender],\n hangup: () => closeRTC.bind(this)({ cid: sender }),\n media: this.__mediaStream\n }\n }\n}\n\nasync function sendOffer(recipient) {\n if (!this?.session?.accessToken?.jwtToken) {\n throw new SkapiError('Access token is required.', { code: 'INVALID_PARAMETER' });\n }\n this.log('sendOffer', recipient);\n let socket: WebSocket = await this.__socket;\n\n const offer = await __peerConnection[recipient].createOffer();\n await __peerConnection[recipient].setLocalDescription(offer);\n\n let sdpoffer = __peerConnection[recipient].localDescription;\n this.log('rtcSdpOffer to', sdpoffer);\n\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: recipient,\n content: { sdpoffer },\n token: this.session.accessToken.jwtToken\n }));\n}\n\nasync function sendIceCandidate(event, recipient) {\n if (!this?.session?.accessToken?.jwtToken) {\n throw new SkapiError('Access token is required.', { code: 'INVALID_PARAMETER' });\n }\n this.log('sendIceCandidate to', recipient);\n\n let socket: WebSocket = await this.__socket;\n\n if (!event.candidate) {\n this.log('candidate-end', 'all ice candidates have been sent');\n return;\n }\n\n let callback = __rtcEvents[recipient] || (() => { });\n\n // Collect ICE candidates and send them to the remote peer\n let candidate = event.candidate;\n this.log('ice gathering state set to', __peerConnection[recipient].iceGatheringState);\n\n callback({\n type: 'icecandidate',\n target: __peerConnection[recipient],\n timestamp: new Date().toISOString(),\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment,\n protocol: event.candidate.protocol,\n gatheringState: __peerConnection[recipient].iceGatheringState,\n connectionState: __peerConnection[recipient].iceConnectionState\n });\n\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: recipient,\n content: { candidate },\n token: this.session.accessToken.jwtToken\n }));\n}\n\nfunction peerConnectionHandler(key: string, skipKey: string[]) {\n let skip = new Set(skipKey);\n let cb = __rtcEvents[key] || ((v: any) => { });\n let peer = __peerConnection[key];\n\n const handlers = {\n ontrack: (event: any) => {\n cb({\n type: 'track',\n target: peer,\n timeStamp: event.timeStamp,\n streams: event.streams,\n track: event.track,\n });\n },\n onicecandidate: (event: RTCPeerConnectionIceEvent) => {\n sendIceCandidate.bind(this)(event, key);\n if (event.candidate) {\n cb({\n type: 'icecandidate',\n target: peer,\n timestamp: new Date().toISOString(),\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment,\n protocol: event.candidate.protocol,\n gatheringState: peer.iceGatheringState,\n connectionState: peer.iceConnectionState\n });\n } else {\n cb({ type: 'icecandidateend', target: peer, timestamp: new Date().toISOString() });\n }\n },\n onicecandidateerror: (event: any) => {\n cb({\n type: 'icecandidateerror',\n target: peer,\n timestamp: new Date().toISOString(),\n errorCode: event.errorCode,\n errorText: event.errorText,\n url: event.url,\n hostCandidate: event.hostCandidate,\n gatheringState: peer.iceGatheringState,\n connectionState: peer.iceConnectionState\n });\n },\n oniceconnectionstatechange: () => {\n cb({\n type: 'iceconnectionstatechange',\n target: peer,\n timestamp: new Date().toISOString(),\n state: peer.iceConnectionState,\n gatheringState: peer.iceGatheringState,\n signalingState: peer.signalingState\n });\n },\n onicegatheringstatechange: () => {\n cb({\n type: 'icegatheringstatechange',\n target: peer,\n timestamp: new Date().toISOString(),\n state: peer.iceGatheringState,\n connectionState: peer.iceConnectionState,\n signalingState: peer.signalingState\n });\n },\n onsignalingstatechange: () => {\n cb({\n type: 'signalingstatechange',\n target: peer,\n timestamp: new Date().toISOString(),\n state: peer.signalingState,\n connectionState: peer.iceConnectionState,\n gatheringState: peer.iceGatheringState\n });\n },\n onnegotiationneeded: () => {\n sendOffer.bind(this)(key);\n cb({\n type: 'negotiationneeded',\n target: peer,\n timestamp: new Date().toISOString(),\n signalingState: peer.signalingState,\n connectionState: peer.iceConnectionState,\n gatheringState: peer.iceGatheringState\n });\n },\n onconnectionstatechange: () => {\n cb({\n type: 'connectionstatechange',\n target: peer,\n timestamp: new Date().toISOString(),\n state: peer.connectionState,\n iceState: peer.iceConnectionState,\n signalingState: peer.signalingState\n });\n\n let state = peer.connectionState;\n // Clean up on disconnection\n if (state === 'disconnected' || state === 'failed' || state === 'closed') {\n // Close all associated data channels\n closeRTC.bind(this)({ cid: key });\n }\n }\n };\n\n for (const [event, handler] of Object.entries(handlers)) {\n if (!skip.has(event)) {\n peer[event] = handler;\n }\n }\n}\n\nfunction handleDataChannel(key: string, dataChannel: RTCDataChannel, skipKey?: string[]) {\n let skip = new Set(skipKey);\n let cb = __rtcEvents[key] || ((v: any) => { });\n\n const events = {\n onmessage: (event) => {\n let msg = {\n type: event.type,\n target: dataChannel,\n timeStamp: event.timeStamp,\n data: event.data,\n lastEventId: event.lastEventId,\n origin: event.origin,\n readyState: dataChannel.readyState,\n bufferedAmount: dataChannel.bufferedAmount\n };\n this.log(`${dataChannel.label}: message`, event.data);\n cb(msg);\n },\n onerror: (event) => {\n let err = {\n type: event.type,\n target: dataChannel,\n timeStamp: event.timeStamp,\n error: event.error.message,\n errorCode: event.error.errorDetail,\n readyState: dataChannel.readyState,\n label: dataChannel.label\n };\n this.log(`${dataChannel.label}: error`, event.error.message);\n cb(err);\n },\n onclose: (event) => {\n let closed = {\n type: event.type,\n target: dataChannel,\n timeStamp: event.timeStamp,\n readyState: dataChannel.readyState,\n label: dataChannel.label,\n id: dataChannel.id\n };\n this.log(`${dataChannel.label}: closed`, null);\n cb(closed);\n\n if (__dataChannel[key]) {\n delete __dataChannel[key][dataChannel.label];\n if (Object.keys(__dataChannel[key]).length === 0) {\n closeRTC.bind(this)({ cid: key });\n }\n }\n },\n onbufferedamountlow: (event) => {\n let buffer = {\n target: dataChannel,\n bufferedAmount: dataChannel.bufferedAmount,\n bufferedAmountLowThreshold: dataChannel.bufferedAmountLowThreshold,\n type: event.type,\n timeStamp: event.timeStamp\n };\n this.log(`${dataChannel.label}: bufferedamountlow`, dataChannel.bufferedAmount);\n cb(buffer);\n },\n onopen: (event) => {\n this.log('dataChannel', `data channel: \"${dataChannel.label}\" is open and ready to send messages.`);\n let msg = {\n type: event.type,\n target: dataChannel,\n timeStamp: event.timeStamp,\n readyState: dataChannel.readyState,\n label: dataChannel.label,\n id: dataChannel.id,\n ordered: dataChannel.ordered,\n maxRetransmits: dataChannel.maxRetransmits,\n protocol: dataChannel.protocol\n };\n cb(msg);\n }\n };\n\n for (const [event, handler] of Object.entries(events)) {\n if (!skip.has(event)) {\n dataChannel[event] = handler;\n }\n }\n}\n\n\n","\nimport SkapiError from '../main/error';\nimport validator from '../utils/validator';\nimport { extractFormData } from '../utils/utils';\nimport { request } from '../utils/network';\nimport { DatabaseResponse, FetchOptions, RealtimeCallback, WebSocketMessage } from '../Types';\nimport { answerSdpOffer, receiveIceCandidate, __peerConnection, __receiver_ringing, closeRTC, respondRTC, __caller_ringing, __rtcEvents } from './webrtc';\nimport { getJwtToken } from './user';\n\n// let __roomList: {\n// [realTimeGroup: string]: {\n// [sender_id: string]: string[]; // connection id, (single person can have multiple connection id)\n// }\n// } = {};\n\nlet __current_socket_room: string;\nlet __keepAliveInterval = null;\nlet closedByIntention = true;\nlet reconnectAttempts = 0;\n\nasync function prepareWebsocket() {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebSocket is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n\n // Connect to the WebSocket server\n await this.getProfile();\n\n if (!this.session) {\n throw new SkapiError(`No access.`, { code: 'INVALID_REQUEST' });\n }\n\n let r = await this.record_endpoint;\n\n return new WebSocket(\n r.websocket_private + '?token=' + this.session.accessToken.jwtToken\n );\n}\n\n\nlet visibilitychange = null;\n\nexport async function closeRealtime(): Promise<void> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebSocket is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n closedByIntention = true;\n let socket: WebSocket = this.__socket ? await this.__socket : this.__socket;\n closeRTC.bind(this)({ close_all: true });\n\n if (__current_socket_room) {\n joinRealtime.bind(this)({ group: null });\n }\n\n // __roomList = {};\n reconnectAttempts = 0;\n\n if (__keepAliveInterval) {\n __keepAliveInterval.terminate();\n __keepAliveInterval = null;\n }\n\n try {\n if (socket) {\n socket.close();\n }\n }\n catch (e) { }\n\n window.removeEventListener('visibilitychange', visibilitychange);\n this.__socket = null;\n return null;\n}\n\nexport async function connectRealtime(cb: RealtimeCallback, delay = 50, reconnect?: string): Promise<WebSocket> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebSocket is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n if (typeof cb !== 'function') {\n throw new SkapiError(`Callback must be a function.`, { code: 'INVALID_REQUEST' });\n }\n\n if (reconnect === 'reconnect') {\n if (this.__socket instanceof Promise) {\n let socket = await this.__socket;\n if (socket.readyState !== WebSocket.CLOSED && socket.readyState !== WebSocket.CLOSING) {\n return this.__socket;\n }\n }\n }\n\n else if (closedByIntention) {\n // if the connection was closed intentionally, and it's not a reconnect attempt\n visibilitychange = () => {\n if (!document.hidden && !closedByIntention) {\n connectRealtime.bind(this)(cb, 0, 'reconnect');\n }\n }\n\n if (this.__socket instanceof Promise) {\n return this.__socket;\n }\n }\n\n if (__keepAliveInterval) {\n __keepAliveInterval.terminate();\n __keepAliveInterval = null;\n }\n\n this.__socket = new Promise(async (resolve) => {\n await getJwtToken.bind(this)();\n\n setTimeout(async () => {\n let socket: WebSocket = await prepareWebsocket.bind(this)();\n\n socket.onopen = () => {\n closedByIntention = false;\n reconnectAttempts = 0;\n\n if (reconnect !== 'reconnect') {\n window.addEventListener('visibilitychange', visibilitychange);\n }\n\n this.log('realtime onopen', 'Connected to WebSocket server.');\n cb({ type: 'success', message: 'Connected to WebSocket server.' });\n\n if (__current_socket_room) {\n socket.send(JSON.stringify({\n action: 'joinRoom',\n rid: __current_socket_room,\n token: this.session.accessToken.jwtToken\n }));\n }\n\n // // keep alive\n\n // Define worker script as a string\n const workerScript = /*js*/`\n let interval = 15000; // Set interval time 15 seconds\n\n function runInterval() {\n postMessage({ type: \"ping\" });\n setTimeout(runInterval, interval); // Use setTimeout instead of setInterval\n }\n\n runInterval(); // Start interval\n `;\n\n // Create a Blob URL for the worker\n const blob = new Blob([workerScript], { type: \"application/javascript\" });\n __keepAliveInterval = new Worker(URL.createObjectURL(blob));\n\n // Listen for messages from the worker\n __keepAliveInterval.onmessage = (event) => {\n if (socket.readyState === 1) {\n socket.send(JSON.stringify({\n action: 'keepAlive'\n }));\n }\n };\n\n resolve(socket);\n };\n\n socket.onmessage = async (event) => {\n let data = ''\n\n try {\n data = JSON.parse(decodeURI(event.data));\n this.log('socket onmessage', data);\n }\n catch (e) {\n return;\n }\n\n let type;\n switch (true) {\n case !!data?.['#message']:\n type = 'message';\n break;\n case !!data?.['#private']:\n type = 'private';\n break;\n case !!data?.['#notice']:\n type = 'notice';\n break;\n case !!data?.['#rtc']:\n type = 'rtc';\n break;\n case !!data?.['#error']:\n type = 'error';\n break;\n }\n\n if (!type) {\n return;\n }\n\n let msg: WebSocketMessage = {\n type,\n message: data?.['#rtc'] || data?.['#message'] || data?.['#private'] || data?.['#notice'] || data?.['#error'] || null,\n sender: data?.['#user_id'] || null,\n sender_cid: !!data?.['#scid'] ? \"cid:\" + data['#scid'] : null,\n sender_rid: data?.['#srid'] || null,\n code: data?.['#code'] || null\n };\n\n if (type === 'notice') {\n // if (__current_socket_room && (msg.code === 'USER_LEFT' || msg.code === 'USER_DISCONNECTED')) {\n // let user_id = msg.sender;\n // if (__roomList?.[__current_socket_room]?.[user_id]) {\n // __roomList[__current_socket_room][user_id] = __roomList[__current_socket_room][user_id].filter(v => v !== msg.sender_cid);\n // }\n\n // if (__roomList?.[__current_socket_room]?.[user_id] && __roomList[__current_socket_room][user_id].length === 0) {\n // delete __roomList[__current_socket_room][user_id];\n // }\n\n // if (__roomList?.[__current_socket_room]?.[user_id]) {\n // // user is still in the group don't call the callback\n // return\n // }\n // }\n // else if (__current_socket_room && msg.code === 'USER_JOINED') {\n // let user_id = msg.sender;\n // if (!__roomList?.[__current_socket_room]) {\n // __roomList[__current_socket_room] = {};\n // }\n // if (!__roomList[__current_socket_room][user_id]) {\n // __roomList[__current_socket_room][user_id] = [msg.sender_cid];\n // }\n // else {\n // if (!__roomList[__current_socket_room][user_id].includes(msg.sender_cid)) {\n // __roomList[__current_socket_room][user_id].push(msg.sender_cid);\n // }\n // return;\n // }\n // }\n cb(msg);\n }\n else if (type === 'rtc') {\n // rtc signaling\n if (msg.sender !== this.user.user_id) {\n let rtc = msg.message;\n if (rtc.hungup) {\n // otherside has hung up the call\n if (__caller_ringing[msg.sender_cid]) {\n __caller_ringing[msg.sender_cid](false);\n delete __caller_ringing[msg.sender_cid];\n }\n if (__receiver_ringing[msg.sender_cid]) {\n delete __receiver_ringing[msg.sender_cid];\n }\n if (__peerConnection?.[msg.sender_cid]) {\n closeRTC.bind(this)({ cid: msg.sender_cid });\n }\n msg.type = 'rtc:closed';\n cb(msg);\n return;\n }\n if (rtc.candidate) {\n receiveIceCandidate.bind(this)(rtc.candidate, msg.sender_cid);\n }\n if (rtc.sdpoffer) {\n answerSdpOffer.bind(this)(rtc.sdpoffer, msg.sender_cid);\n if (!__receiver_ringing[msg.sender_cid]) {\n __receiver_ringing[msg.sender_cid] = msg.sender_cid;\n delete msg.message;\n\n msg.connectRTC = respondRTC.bind(this)(msg);\n msg.type = 'rtc:incoming';\n msg.hangup = (() => {\n if (__peerConnection[msg.sender_cid]) {\n closeRTC.bind(this)({ cid: msg.sender_cid });\n }\n else if (__receiver_ringing[msg.sender_cid]) {\n delete __receiver_ringing[msg.sender_cid];\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: msg.sender_cid,\n content: { hungup: this.user.user_id },\n token: this.session.accessToken.jwtToken\n }));\n }\n }).bind(this);\n\n cb(msg);\n }\n }\n if (rtc.pickup) {\n // receiver has answered the call\n if (__caller_ringing[msg.sender_cid]) {\n __caller_ringing[msg.sender_cid](true);\n delete __caller_ringing[msg.sender_cid];\n }\n }\n if (rtc.sdpanswer) {\n if (__peerConnection[msg.sender_cid]) {\n // receive answer from the receiver\n if (__peerConnection[msg.sender_cid].signalingState === 'have-local-offer') {\n await __peerConnection[msg.sender_cid].setRemoteDescription(new RTCSessionDescription(rtc.sdpanswer));\n }\n else {\n throw new SkapiError(`Invalid signaling state.`, { code: 'INVALID_REQUEST' });\n }\n }\n }\n }\n }\n else {\n cb(msg);\n }\n };\n\n socket.onclose = () => {\n if (closedByIntention) {\n this.log('realtime onclose', 'WebSocket connection closed.');\n cb({ type: 'close', message: 'WebSocket connection closed.' });\n }\n else {\n this.log('realtime onclose', 'WebSocket unexpected close.');\n cb({ type: 'error', message: 'Skapi: WebSocket unexpected close.' });\n\n reconnectAttempts++;\n if (reconnectAttempts < 3) {\n this.log('realtime onclose', 'Reconnecting to WebSocket server...' + reconnectAttempts);\n cb({ type: 'reconnect', message: 'Reconnecting to WebSocket server...' + reconnectAttempts });\n connectRealtime.bind(this)(cb, 3000, 'reconnect');\n }\n else {\n this.log('realtime onclose', 'Max reconnection attempts reached.');\n cb({ type: 'error', message: 'Skapi: Max reconnection attempts reached.' });\n }\n }\n };\n\n socket.onerror = () => {\n this.log('realtime onerror', 'WebSocket connection error.');\n cb({ type: 'error', message: 'Skapi: WebSocket connection error.' });\n };\n }, delay);\n });\n}\n\n\nexport async function postRealtime(message: any, recipient: string, notification?: { config?: { always: boolean; }; title: string; body: string; }): Promise<{ type: 'success', message: 'Message sent.' }> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebSocket is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n let socket: WebSocket = this.__socket ? await this.__socket : this.__socket;\n\n if (!socket) {\n throw new SkapiError(`No realtime connection. Execute connectRealtime() before this method.`, { code: 'INVALID_REQUEST' });\n }\n\n if (!recipient) {\n throw new SkapiError(`No recipient.`, { code: 'INVALID_REQUEST' });\n }\n\n await getJwtToken.bind(this)();\n\n message = extractFormData(message).data;\n\n let notificationStr = '';\n if (notification) {\n notification = validator.Params(\n notification,\n {\n config: {\n always: 'boolean'\n },\n title: 'string',\n body: 'string'\n },\n ['title', 'body']\n );\n // stringify notification and check if size exceeds 3kb\n notificationStr = JSON.stringify({ title: notification.title, body: notification.body });\n let notificationSize = new Blob([notificationStr]).size;\n if (notificationSize > 3072) {\n throw new SkapiError(`Notification size exceeds 3kb.`, { code: 'INVALID_PARAMETER' });\n }\n }\n\n if (socket.readyState === 1) {\n try {\n validator.UserId(recipient);\n socket.send(JSON.stringify({\n action: 'sendMessage',\n uid: recipient,\n content: message,\n notification: notificationStr,\n notificationConfig: notification?.config || {},\n // token: this.session.accessToken.jwtToken\n token: `IdT:${this.service}:${this.owner}:` + (this.bearerToken || this.session?.idToken?.jwtToken || 'null')\n }));\n\n } catch (err) {\n this.log('postRealtime:err', { err });\n if (__current_socket_room !== recipient) {\n throw new SkapiError(`User has not joined to the recipient group. Run joinRealtime({ group: \"${recipient}\" })`, { code: 'INVALID_REQUEST' });\n }\n\n socket.send(JSON.stringify({\n action: 'broadcast',\n rid: recipient,\n content: message,\n notification: notificationStr,\n notificationConfig: notification?.config || {},\n // token: this.session.accessToken.jwtToken,\n token: `IdT:${this.service}:${this.owner}:` + (this.bearerToken || this.session?.idToken?.jwtToken || 'null')\n }));\n }\n\n return { type: 'success', message: 'Message sent.' };\n }\n\n throw new SkapiError('Realtime connection is not open. Try reconnecting with connectRealtime().', { code: 'INVALID_REQUEST' });\n}\n\nexport async function joinRealtime(params: { group?: string | null }): Promise<{ type: 'success', message: string }> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebSocket is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n let socket: WebSocket = this.__socket ? await this.__socket : this.__socket;\n\n if (!socket) {\n throw new SkapiError(`No realtime connection. Execute connectRealtime() before this method.`, { code: 'INVALID_REQUEST' });\n }\n\n await getJwtToken.bind(this)();\n params = extractFormData(params, { nullIfEmpty: true }).data;\n\n let { group = null } = params;\n if (!group && !__current_socket_room) {\n return { type: 'success', message: 'Left realtime message group.' }\n }\n\n if (group !== null && typeof group !== 'string') {\n throw new SkapiError(`\"group\" must be a string | null.`, { code: 'INVALID_PARAMETER' });\n }\n\n socket.send(JSON.stringify({\n action: 'joinRoom',\n rid: group,\n token: this.session.accessToken.jwtToken\n }));\n\n __current_socket_room = group;\n\n return { type: 'success', message: group ? `Joined realtime message group: \"${group}\".` : 'Left realtime message group.' }\n}\n\nexport async function getRealtimeUsers(params: { group: string, user_id?: string }, fetchOptions?: FetchOptions): Promise<DatabaseResponse<{ user_id: string; cid: string }[]>> {\n params = validator.Params(\n params,\n {\n user_id: (v: string) => validator.UserId(v, 'User ID in \"user_id\"'),\n group: ['string', () => {\n if (!__current_socket_room) {\n throw new SkapiError(`No group has been joined. Otherwise \"group\" is required.`, { code: 'INVALID_REQUEST' });\n }\n return __current_socket_room;\n }]\n }\n );\n\n let res = await request.bind(this)(\n 'get-ws-group',\n params,\n {\n fetchOptions,\n auth: true,\n method: 'post'\n }\n );\n\n res.list = res.list.map((v: any) => {\n let user_id = v.uid.split('#')[1];\n // if (!params.user_id) {\n // if (!__roomList[params.group]) {\n // __roomList[params.group] = {};\n // }\n // if (!__roomList[params.group][user_id]) {\n // __roomList[params.group][user_id] = [v.cid];\n // }\n // else if (!__roomList[params.group][user_id].includes(v.cid)) {\n // __roomList[params.group][user_id].push(v.cid);\n // }\n // }\n\n return {\n user_id,\n cid: \"cid:\" + v.cid\n }\n });\n\n return res;\n}\n\nexport async function getRealtimeGroups(\n params?: {\n /** Index name to search. */\n searchFor: 'group' | 'number_of_users';\n /** Index value to search. */\n value?: string | number;\n /** Search condition. */\n condition?: '>' | '>=' | '=' | '<' | '<=' | '!=' | 'gt' | 'gte' | 'eq' | 'lt' | 'lte' | 'ne';\n /** Range of search. */\n range?: string | number;\n } | null,\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<{ group: string; number_of_users: number; }>> {\n await this.__connection;\n\n if (!params) {\n params = { searchFor: 'group', value: ' ', condition: '>' };\n }\n\n params = validator.Params(\n params,\n {\n searchFor: ['group', 'number_of_users', () => 'group'],\n value: ['string', 'number', () => {\n if (params?.searchFor && params?.searchFor === 'number_of_users') {\n return 0;\n }\n\n return ' ';\n }],\n condition: ['>', '>=', '=', '<', '<=', '!=', 'gt', 'gte', 'eq', 'lt', 'lte', 'ne'],\n range: ['string', 'number']\n }\n );\n\n if (!params.condition) {\n if (params.value === ' ' || !params.value) {\n params.condition = '>';\n }\n else {\n params.condition = '=';\n }\n }\n\n if (params.range && params.condition) {\n delete params.condition;\n }\n\n if (params.searchFor === 'number_of_users' && typeof params.value !== 'number') {\n throw new SkapiError(`\"value\" must be a number.`, { code: 'INVALID_PARAMETER' });\n }\n if (params.searchFor === 'group' && typeof params.value !== 'string') {\n throw new SkapiError(`\"value\" must be a string.`, { code: 'INVALID_PARAMETER' });\n }\n if (params.hasOwnProperty('range') && typeof params.range !== typeof params.value) {\n throw new SkapiError(`\"range\" must be a ${typeof params.value}.`, { code: 'INVALID_PARAMETER' });\n }\n\n let res = await request.bind(this)(\n 'get-ws-group',\n params,\n {\n fetchOptions,\n auth: true,\n method: 'post'\n }\n )\n\n res.list = res.list.map((v: any) => {\n return {\n group: v.rid.split('#')[1],\n number_of_users: v.cnt\n }\n });\n\n return res;\n}","import {\n\tForm,\n\tFetchOptions,\n\tProgressCallback,\n\tDatabaseResponse,\n\tRequestHistory,\n} from '../Types';\nimport SkapiError from '../main/error';\nimport validator from '../utils/validator';\nimport { request } from '../utils/network';\nimport { extractFormData, generateRandom } from '../utils/utils';\nimport Qpass from \"qpass\";\n\nconst hasFormData = typeof FormData !== 'undefined';\nconst hasHTMLFormElement = typeof HTMLFormElement !== 'undefined';\nconst hasSubmitEvent = typeof SubmitEvent !== 'undefined';\n\nlet queuePromiseList: {\n\t[polling_name: string]: Qpass\n} = {};\n\nlet queueJobId: {\n\t[full_id: string]: string;\n} = {};\n\n/**\n * Live polls, keyed by the full request id, so a caller can stop one it already\n * started. Without this the setInterval below is unreachable from outside: it is a\n * closure local and is only ever cleared when the request settles, so a request that\n * never settles polls forever — and because polls run through Qpass with batchSize 1,\n * it also blocks every poll queued behind it on the same queue.\n */\nlet activePolls: {\n\t[full_id: string]: {\n\t\tstop: (() => void) | null;\n\t\taborted: boolean;\n\t\tqueue?: string;\n\t};\n} = {};\n\n/**\n * Value a stopped poll resolves with. Deliberately a RESOLVE, not a reject: callers\n * await these promises in many places without a rejection handler, and turning a stop\n * into a rejection would surface as an error state in their UI (and, where a `.catch`\n * already exists for real failures, would run the failure path).\n */\nfunction stoppedResult(id: string) {\n\treturn Object.freeze({ id, status: 'stopped' });\n}\n\n/**\n * True if a poll result came from stopPolling rather than the server. Consumers that\n * cannot import from this package can duck-type the same check (`res.status === 'stopped'`).\n */\nexport function isPollStopped(res: any): boolean {\n\treturn !!res && typeof res === 'object' && (res as any).status === 'stopped';\n}\n\nfunction pollClientSecretResponse(\n\tthis: any,\n\t{\n\t\tid,\n\t\tauth,\n\t\tservice,\n\t\towner,\n\t\tlatency = 1000,\n\t\tqueue,\n\t\tonResponse,\n\t\tonError\n\t}: {\n\t\tid: string;\n\t\tauth: boolean;\n\t\tservice?: any;\n\t\towner?: any;\n\t\tlatency?: number;\n\t\tqueue?: string;\n\t\tonResponse?: (res: any) => void;\n\t\tonError?: (err: any) => void;\n\t},\n):any | void {\n\tif (typeof latency !== 'number') {\n\t\tthrow new SkapiError('\"latency\" should be a number.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\n\tif (latency < 0) {\n\t\tthrow new SkapiError('\"latency\" should be a non-negative number.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\n\tif (queue && !queuePromiseList?.[queue]) {\n\t\tqueuePromiseList[queue] = new Qpass({\n\t\t\tbreakWhenError: false,\n\t\t\tbatchSize: 1\n\t\t});\n\t}\n\n\t// One registry entry per poll invocation. `stop` is filled in as soon as there is\n\t// something to stop; a stop that arrives while the job is still WAITING in the Qpass\n\t// queue sets `aborted` instead, which the job checks when it eventually starts.\n\tlet entry: { stop: (() => void) | null; aborted: boolean; queue?: string } = {\n\t\tstop: null,\n\t\taborted: false,\n\t\tqueue,\n\t};\n\tactivePolls[id] = entry;\n\tlet release = () => {\n\t\tif (activePolls[id] === entry) delete activePolls[id];\n\t};\n\n\tlet prom = () => new Promise<any>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tif (entry.aborted) {\n\t\t\t// Stopped before this job ever got a turn.\n\t\t\trelease();\n\t\t\tresolve(stoppedResult(id));\n\t\t\treturn;\n\t\t}\n\t\tlet interval = setInterval(async () => {\n\t\t\ttry {\n\t\t\t\tlet result = await request.bind(this)(\n\t\t\t\t\t'csr-poll',\n\t\t\t\t\t{\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tservice,\n\t\t\t\t\t\towner,\n\t\t\t\t\t},\n\t\t\t\t\t{ auth },\n\t\t\t\t);\n\n\t\t\t\tif (result.status === 'running' || result.status === 'pending') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (onResponse)\n\t\t\t\t\tonResponse(result);\n\t\t\t\tclearInterval(interval);\n\t\t\t\trelease();\n\t\t\t\tresolve(result);\n\t\t\t} catch (e) {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (onError)\n\t\t\t\t\tonError(e);\n\t\t\t\tclearInterval(interval);\n\t\t\t\trelease();\n\t\t\t\treject(e);\n\t\t\t}\n\t\t}, latency);\n\t\tentry.stop = () => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearInterval(interval);\n\t\t\trelease();\n\t\t\t// onResponse/onError are deliberately NOT called: a stop is not a result,\n\t\t\t// and firing them would make callers render a reply that never arrived.\n\t\t\tresolve(stoppedResult(id));\n\t\t};\n\t});\n\n\t// Exposed on the returned promise so a caller holding it can stop this exact poll\n\t// without having to reconstruct the full request id.\n\tlet publicStop = () => {\n\t\tlet e = activePolls[id];\n\t\tif (!e) return; // already settled\n\t\tif (e.stop) e.stop();\n\t\telse {\n\t\t\te.aborted = true;\n\t\t\tdelete activePolls[id];\n\t\t}\n\t};\n\n\tif (queue) {\n\t\tlet outer = new Promise<any>((resolve, reject) => {\n\t\t\tlet outerSettled = false;\n\t\t\tlet jobId = queuePromiseList[queue].add([async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlet result = await prom();\n\t\t\t\t\tif (!outerSettled) {\n\t\t\t\t\t\touterSettled = true;\n\t\t\t\t\t\tresolve(result);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (!outerSettled) {\n\t\t\t\t\t\touterSettled = true;\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t}\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}])[0];\n\t\t\tqueueJobId[id] = jobId;\n\t\t\t// Stopping a job that has not started yet must ALSO drop it from the queue,\n\t\t\t// or its batchSize-1 slot stays occupied and everything behind it stalls —\n\t\t\t// and must settle this outer promise, or the caller awaits forever.\n\t\t\tentry.stop = () => {\n\t\t\t\tif (outerSettled) return;\n\t\t\t\tentry.aborted = true;\n\t\t\t\ttry {\n\t\t\t\t\tif (queuePromiseList[queue]) {\n\t\t\t\t\t\tqueuePromiseList[queue].remove(queueJobId[id]);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) { /* already started or already removed */ }\n\t\t\t\tdelete queueJobId[id];\n\t\t\t\trelease();\n\t\t\t\touterSettled = true;\n\t\t\t\tresolve(stoppedResult(id));\n\t\t\t};\n\t\t});\n\t\treturn Object.assign(outer, { stop: publicStop });\n\t}\n\telse {\n\t\treturn Object.assign(prom(), { stop: publicStop });\n\t}\n}\n\n/**\n * Stop live polls. Returns how many were stopped.\n *\n * Matched by full request id when `id` is given, otherwise by queue. Note the two poll\n * call sites pass DIFFERENT queue namespaces — the dispatch path passes the caller's\n * queue string, the history path passes the server-side qid — so a queue match only\n * reaches the polls that were started with that same string. Prefer stopping by id.\n */\nexport function stopClientSecretPolling(\n\tthis: any,\n\tparams: {\n\t\turl?: string;\n\t\tmethod?: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\tid?: string;\n\t\tqueue?: string;\n\t\tservice?: string;\n\t\towner?: string;\n\t},\n): number {\n\tlet stopped = 0;\n\tlet ids: string[] = [];\n\n\tif (params?.id) {\n\t\tif (params.url && params.method) {\n\t\t\tlet service = params.service || this.service;\n\t\t\tids.push(\n\t\t\t\t`[${params.method.toUpperCase()}]${params.url.toLowerCase()}#${service}:${params.id}`,\n\t\t\t);\n\t\t}\n\t\t// Also accept an already-full id, so callers holding the registry key work.\n\t\tids.push(params.id);\n\t} else if (params?.queue) {\n\t\tfor (let key in activePolls) {\n\t\t\tif (activePolls[key]?.queue === params.queue) ids.push(key);\n\t\t}\n\t} else {\n\t\tfor (let key in activePolls) ids.push(key);\n\t}\n\n\tfor (let key of ids) {\n\t\tlet entry = activePolls[key];\n\t\tif (!entry) continue;\n\t\tif (entry.stop) {\n\t\t\tentry.stop();\n\t\t} else {\n\t\t\t// Queued but not started, and no stop published yet: mark it so the job\n\t\t\t// short-circuits the moment it gets a turn.\n\t\t\tentry.aborted = true;\n\t\t\tdelete activePolls[key];\n\t\t}\n\t\tstopped += 1;\n\t}\n\n\treturn stopped;\n}\n\nexport function clientSecretRequestQueueCount(\n\tparams: { service?: string; owner?: string; queue: string },\n\tfetchOptions?: FetchOptions\n): Promise<\n\t{\n\t\tqueue_name: string;\n\t\tin_queue: number; // number of requests in the queue that are waiting to be processed.\n\t}\n> {\n\tif (!params.queue) {\n\t\tthrow new SkapiError('\"queue\" is required.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\n\tlet p = {\n\t\tservice: params.service || this.service,\n\t\towner: params.owner || this.owner,\n\t\tqueue: params.queue + ':',\n\t}\n\n\treturn request.bind(this)('csr-poll', p, { auth: true });\n};\n\nexport async function clientSecretRequest(params: {\n\turl: string;\n\tclientSecretName: string;\n\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\theaders?: { [key: string]: string };\n\tdata?: { [key: string]: any };\n\tparams?: { [key: string]: string };\n\tpoll?: number; // enable polling with specified latency in ms.\n\tqueue?: string; // optional queue name to distinguish requests with same url and method. Only effective when polling is enabled. Requests with the same url, method and queue will be handled sequentially on the server side.\n\texpires?: number; // optional history expiration time in seconds after it's resolved.\n\tonResponse?: (res: any) => void; // response callback that works on both polling request and regular.\n\tonError?: (err: any) => void; // error callback that works on both pollubg request error and regular.\n}): Promise<any | void | {\n\tid: string; // request id: \"stamp:entropy\"\n\tstatus: \"pending\";\n\tqueue_name: string;\n\tin_queue: number;\n\tpoll?: (arg?: { latency?: number }) => Promise<any>;\n}> {\n\tlet hasSecret = false;\n\n\tif (typeof params.poll === 'number' && params.poll < 0) {\n\t\tthrow new SkapiError('\"poll\" should be a non-negative number.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\tlet onResponse = params?.onResponse;\n\tlet onError = params?.onError;\n\tlet latency = typeof params.poll === 'number' ? params.poll : params.poll ? 1000 : 0;\n\tdelete params.poll;\n\n\tif (latency && !params.queue) {\n\t\t// create random queue id\n\t\tparams.queue = (this.__user?.user_id || \"anonymous\") + \"-\" + generateRandom();\n\t}\n\n\tlet checkClientSecretPlaceholder = (v: any) => {\n\t\tfor (let k in v) {\n\t\t\tif (typeof v[k] === 'string' && v[k].includes('$CLIENT_SECRET')) {\n\t\t\t\thasSecret = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\tparams = validator.Params(\n\t\tparams,\n\t\t{\n\t\t\turl: (v: string) => {\n\t\t\t\tif (!v || typeof v !== 'string') {\n\t\t\t\t\tthrow new SkapiError('\"url\" should be type: <string>.', {\n\t\t\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tvalidator.Url(v);\n\t\t\t\tif (v.includes('$CLIENT_SECRET')) {\n\t\t\t\t\thasSecret = true;\n\t\t\t\t}\n\t\t\t\treturn v;\n\t\t\t},\n\t\t\tclientSecretName: 'string',\n\t\t\tmethod: (v: string) => {\n\t\t\t\tif (v && typeof v !== 'string') {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'\"method\" should be either \"GET\" or \"POST\" or \"DELETE\" or \"PUT\".',\n\t\t\t\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tlet lo = v.toLowerCase();\n\t\t\t\tif (\n\t\t\t\t\tlo !== 'get' &&\n\t\t\t\t\tlo !== 'post' &&\n\t\t\t\t\tlo !== 'delete' &&\n\t\t\t\t\tlo !== 'put'\n\t\t\t\t) {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'\"method\" should be either \"GET\" or \"POST\" or \"DELETE\" or \"PUT\".',\n\t\t\t\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn lo;\n\t\t\t},\n\t\t\theaders: (v: any) => {\n\t\t\t\tif (v && typeof v !== 'object') {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'\"headers\" should be type: <object>.',\n\t\t\t\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcheckClientSecretPlaceholder(v);\n\t\t\t\treturn v;\n\t\t\t},\n\t\t\tdata: (v: any) => {\n\t\t\t\tif (v && typeof v !== 'object') {\n\t\t\t\t\tthrow new SkapiError('\"data\" should be type: <object>.', {\n\t\t\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcheckClientSecretPlaceholder(v);\n\t\t\t\treturn v;\n\t\t\t},\n\t\t\tparams: (v: any) => {\n\t\t\t\tif (v && typeof v !== 'object') {\n\t\t\t\t\tthrow new SkapiError('\"params\" should be type: <object>.', {\n\t\t\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcheckClientSecretPlaceholder(v);\n\t\t\t\treturn v;\n\t\t\t},\n\t\t\texpires: 'number',\n\t\t\tqueue: 'string',\n\t\t},\n\t\t['clientSecretName', 'method', 'url'],\n\t);\n\n\tif (!hasSecret) {\n\t\tthrow new SkapiError(\n\t\t\t`At least one parameter value should include \"$CLIENT_SECRET\" in ${params.method.toLowerCase() === 'post' ? '\"data\"' : '\"params\"'} or \"headers\".`,\n\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t);\n\t}\n\n\tawait this.__connection;\n\tlet auth = !!this.__user;\n\n\tlet req_prom = () => {\n\t\treturn request\n\t\t\t.bind(this)('csr', params, {\n\t\t\t\tauth,\n\t\t\t\ttokenHeaders: {\n\t\t\t\t\taccessToken: !!auth,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.then((res) => {\n\t\t\t\tif (res.status === 'running' || res.status === 'pending') {\n\t\t\t\t\tlet url = `[${params.method.toUpperCase()}]${params.url.toLowerCase()}`;\n\t\t\t\t\tlet serviceId = params.service || this.service;\n\t\t\t\t\tlet ownerId = params.owner || this.owner;\n\t\t\t\t\tlet fullId = `${url}#${serviceId}:${res.id}`;\n\t\t\t\t\tObject.assign(res, {\n\t\t\t\t\t\t// NOT async: an async arrow returns a NEW native promise wrapping the\n\t\t\t\t\t\t// result, which discards the `stop` handle pollClientSecretResponse\n\t\t\t\t\t\t// attaches to the promise it returns. The caller would then hold an\n\t\t\t\t\t\t// unstoppable poll. pollClientSecretResponse already returns a\n\t\t\t\t\t\t// promise, so awaiting this is unchanged.\n\t\t\t\t\t\tpoll: (arg?: { latency?: number }) => pollClientSecretResponse.call(this, {\n\t\t\t\t\t\t\tid: fullId,\n\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\tservice: serviceId,\n\t\t\t\t\t\t\towner: ownerId,\n\t\t\t\t\t\t\tlatency: arg?.latency || 1000,\n\t\t\t\t\t\t\tqueue: params?.queue,\n\t\t\t\t\t\t\tonResponse,\n\t\t\t\t\t\t\tonError\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (onResponse) return onResponse(res);\n\t\t\t\treturn res;\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tif (onError) return onError(err);\n\t\t\t\tthrow err;\n\t\t\t});\n\t};\n\n\tif (params?.queue) {\n\t\tlet base_queue = 'base:' + params.queue;\n\n\t\tif (!queuePromiseList?.[base_queue]) {\n\t\t\tqueuePromiseList[base_queue] = new Qpass({\n\t\t\t\tbreakWhenError: false,\n\t\t\t\tbatchSize: 1\n\t\t\t});\n\t\t}\n\n\t\treturn new Promise<any>((resolve, reject) => {\n\t\t\tqueuePromiseList[base_queue].add([async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlet result = await req_prom();\n\n\t\t\t\t\tif (latency > 0) {\n\t\t\t\t\t\tlet polling = result.poll({latency});\n\t\t\t\t\t\tresolve(polling);\n\t\t\t\t\t\treturn polling;\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(result);\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (err) {\n\t\t\t\t\treject(err);\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}]);\n\t\t});\n\t}\n\telse {\n\t\treturn req_prom();\n\t}\n}\n\nexport async function clientSecretRequestHistory(\n\tparams: {\n\t\turl: string;\n\t\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\tqueue?: string;\n\t\tstatus?: 'pending' | 'running' | 'resolved' | 'failed';\n\t\t/** Compact listing: each item carries label/marker STUBS (request_text,\n\t\t * response_text, response_complete_marker) INSTEAD of the full\n\t\t * request_body/response_body, which never leave the server. Enough to\n\t\t * list, label and color rows; re-fetch without `compact` (or poll the\n\t\t * item) when a full body is actually needed. */\n\t\tcompact?: boolean;\n\t\t/** Only rows belonging to exactly `queue`. Without it the queue lookup\n\t\t * is a PREFIX range, so queue \"u1\" also matches \"u1-bg\". The filter is\n\t\t * applied server-side after the range read, so a page may come back\n\t\t * short (or empty) while more matches remain — keep paging by\n\t\t * startKey/endOfList as usual. */\n\t\tqueue_exact?: boolean;\n\t\t/** Drop one queue's rows from the listing — e.g. fetch a chat surface\n\t\t * WITHOUT its background queue. Same short-page caveat as\n\t\t * `queue_exact`. */\n\t\tqueue_exclude?: string;\n\t},\n\tfetchOptions?: FetchOptions,\n): Promise<\n\tDatabaseResponse<RequestHistory[]>\n> {\n\tawait this.__connection;\n\n\t// Capture before validator strips unknown fields\n\tlet service = (params as any).service || this.service;\n\tlet owner = (params as any).owner || this.owner;\n\n\tparams = validator.Params(\n\t\tparams,\n\t\t{\n\t\t\turl: 'string',\n\t\t\tmethod: ['GET', 'POST', 'DELETE', 'PUT'],\n\t\t\tqueue: 'string',\n\t\t\tstatus: ['pending', 'running', 'resolved', 'failed'],\n\t\t\t// Listing modifiers (see the polling lambda): `compact` returns\n\t\t\t// label/marker STUBS instead of full request/response bodies;\n\t\t\t// `queue_exact` post-filters the qid prefix range to the named\n\t\t\t// queue (without it, queue \"u1\" also matches \"u1-bg\");\n\t\t\t// `queue_exclude` drops one queue's rows from an id-prefix listing\n\t\t\t// (how a chat fetches its surface WITHOUT the bg-indexing queue).\n\t\t\tcompact: 'boolean',\n\t\t\tqueue_exact: 'boolean',\n\t\t\tqueue_exclude: 'string',\n\t\t},\n\t\t['url', 'method'],\n\t);\n\n\tlet auth = !!this.__user;\n\tlet id = `[${params.method.toUpperCase()}]${params.url.toLowerCase()}#${service}:`;\n\n\tlet his_req: any = { id, queue: params?.queue, status: params?.status, service, owner };\n\tif (params?.compact) his_req.compact = true;\n\tif (params?.queue_exact) his_req.queue_exact = true;\n\tif (params?.queue_exclude) his_req.queue_exclude = params.queue_exclude;\n\n\tObject.keys(his_req).forEach((k) => {\n\t\tif (!his_req[k]) {\n\t\t\tdelete his_req[k];\n\t\t}\n\t});\n\n\tif (his_req.queue) {\n\t\t// A QUEUE name carries no provider: the background-indexing queue is\n\t\t// \"<userId>-bg\" for BOTH the Claude chat and the ChatGPT chat of the\n\t\t// same project. Dropping the id (which begins\n\t\t// \"[POST]<provider url>#<service>:\") therefore made every queue listing\n\t\t// span both platforms — the other platform's indexing passes and\n\t\t// attachment-send turns surfaced in a chat they do not belong to, where\n\t\t// nothing could ever confirm or cover them. The id cannot stay as `id`\n\t\t// (that selects a different query path server-side), so it is sent as a\n\t\t// FILTER instead. Requires the updated polling lambda; older backends\n\t\t// reject unknown keys, so this ships after that deploy.\n\t\this_req.id_prefix = his_req.id;\n\t\tdelete his_req.id;\n\t}\n\n\tlet res = await request.bind(this)(\n\t\t'csr-poll',\n\t\this_req,\n\t\t{ auth, fetchOptions },\n\t);\n\n\tres.list = res.list.map((item: any) => {\n\t\tlet result = {\n\t\t\tid: item.id,\n\t\t\tstatus_code: item.rslv?.status_code || null,\n\t\t\tresponse_body: item.rslv?.body || item.rslv?.truncated || null,\n\t\t\terror: item?.err,\n\t\t\t// `stmp` is stamped once when the request is created and never rewritten;\n\t\t\t// `utmp` moves on every status change. So `created` is the request time and\n\t\t\t// `updated` is the time of the latest response/status change.\n\t\t\tcreated: item?.stmp,\n\t\t\tupdated: item?.utmp,\n\t\t\trequest_body: item?.reqbdy,\n\t\t\texpires: item?.expt,\n\t\t\tstatus: item.stts,\n\t\t\tqueue_name: item?.qid,\n\t\t\t// Compact-listing stubs (only present when `compact` was requested):\n\t\t\t// the label line of the request, the head of the response, whether\n\t\t\t// the reply carried the indexing completion marker, and the flag\n\t\t\t// itself so consumers know bodies were deliberately omitted.\n\t\t\trequest_text: item?.reqtxt,\n\t\t\tresponse_text: item?.rslvtxt,\n\t\t\tresponse_complete_marker: item?.rslvmk != null ? !!item.rslvmk : undefined,\n\t\t\tcompact: item?.cmpct ? true : undefined,\n\t\t};\n\t\tfor (let k in result) {\n\t\t\tif (result[k] === undefined) {\n\t\t\t\tdelete result[k];\n\t\t\t}\n\t\t}\n\t\tif (result.status === 'running' || result.status === 'pending') {\n\t\t\tresult.poll = (arg?: {\n\t\t\t\tlatency?: number;\n\t\t\t\tonResponse?: (res: any) => void;\n\t\t\t\tonError?: (err: any) => void;\n\t\t\t}) => pollClientSecretResponse.call(this, {\n\t\t\t\tid: id + result.id,\n\t\t\t\tauth,\n\t\t\t\tservice: service,\n\t\t\t\towner: owner,\n\t\t\t\tlatency: arg?.latency || 1000,\n\t\t\t\tqueue: item?.qid,\n\t\t\t\tonResponse: arg?.onResponse,\n\t\t\t\tonError: arg?.onError\n\t\t\t})\n\t\t}\n\t\treturn result;\n\t});\n\n\treturn res;\n}\n\nexport async function cancelClientSecretRequest(params: {\n\turl: string;\n\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\tid: string;\n\tqueue?: string;\n}): Promise<{ removed: boolean; message: string }> {\n\tawait this.__connection;\n\n\tparams = validator.Params(\n\t\tparams,\n\t\t{\n\t\t\turl: 'string',\n\t\t\tmethod: ['GET', 'POST', 'DELETE', 'PUT'],\n\t\t\tid: 'string',\n\t\t\tqueue: 'string'\n\t\t},\n\t\t['url', 'method', 'id'],\n\t);\n\n\tlet service = params?.service || this.service;\n\tlet owner = params?.owner || this.owner;\n\tlet auth = !!this.__user;\n\tlet base_id = `[${params.method.toUpperCase()}]${params.url.toLowerCase()}#${service}`;\n\tlet id = params.id\n\tlet fullId = `${base_id}:${id}`;\n\tlet queue = params?.queue;\n\n\tif (queue && queuePromiseList?.[queue]) {\n\t\tqueuePromiseList[queue].remove(queueJobId[fullId]);\n\t\tdelete queueJobId[fullId];\n\t}\n\n\treturn request.bind(this)('csr-cancel', { id: fullId, service, owner }, { auth });\n}\n\nexport async function sendInquiry(\n\tdata: Form<{\n\t\tname: string;\n\t\temail: string;\n\t\tsubject: string;\n\t\tmessage: string;\n\t}>,\n): Promise<'SUCCESS: Inquiry has been sent.'> {\n\tawait this.__connection;\n\n\tlet params = {\n\t\tname: 'string',\n\t\temail: (v) => {\n\t\t\tvalidator.Email(v);\n\t\t\treturn v;\n\t\t},\n\t\tsubject: 'string',\n\t\tmessage: 'string',\n\t};\n\n\tdata = validator.Params(data, params, [\n\t\t'name',\n\t\t'email',\n\t\t'subject',\n\t\t'message',\n\t]);\n\n\tawait request.bind(this)('send-inquiry', data);\n\n\treturn 'SUCCESS: Inquiry has been sent.';\n}\n\nexport async function secureRequest<\n\tRequestParams = {\n\t\t/** Request url */\n\t\turl: string;\n\t\t/** Request data */\n\t\tdata?: any;\n\t\t/** requests are sync when true */\n\t\tsync?: boolean;\n\t},\n\tResponse = { response: any; statusCode: number; url: string },\n>(\n\tparams: RequestParams[] | Form<RequestParams>,\n\turl?: string,\n): Promise<Response | Response[]> {\n\tawait this.__connection;\n\n\tif (\n\t\t(hasFormData && params instanceof FormData) ||\n\t\t(hasHTMLFormElement && params instanceof HTMLFormElement) ||\n\t\t(hasSubmitEvent && params instanceof SubmitEvent)\n\t) {\n\t\tif (!url) {\n\t\t\tthrow new SkapiError(\n\t\t\t\t'Url string as a second argument is required when form is passed.',\n\t\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t\t);\n\t\t}\n\n\t\tlet formData = extractFormData(params);\n\n\t\tparams = {\n\t\t\turl,\n\t\t\tdata: formData.data,\n\t\t\tsync: true,\n\t\t} as Form<RequestParams>;\n\t}\n\n\tlet paramsStruct = {\n\t\turl: (v: string) => {\n\t\t\treturn validator.Url(v);\n\t\t},\n\t\tdata: (v) => v,\n\t\tsync: ['boolean', () => true],\n\t};\n\n\tif (Array.isArray(params)) {\n\t\tfor (let r of params) {\n\t\t\tr = validator.Params(r, paramsStruct);\n\t\t}\n\t} else {\n\t\tparams = validator.Params(params, paramsStruct);\n\t}\n\n\treturn request.bind(this)('post-secure', params, { auth: true });\n}\n\nexport async function mock(\n\tdata: Form<\n\t\t{ [key: string]: any } & {\n\t\t\traise?:\n\t\t\t| 'ERR_INVALID_REQUEST'\n\t\t\t| 'ERR_INVALID_PARAMETER'\n\t\t\t| 'SOMETHING_WENT_WRONG'\n\t\t\t| 'ERR_EXISTS'\n\t\t\t| 'ERR_NOT_EXISTS';\n\t\t}\n\t>,\n\toptions?: {\n\t\tauth?: boolean;\n\t\tmethod?: string;\n\t\tresponseType?:\n\t\t| 'blob'\n\t\t| 'json'\n\t\t| 'text'\n\t\t| 'arrayBuffer'\n\t\t| 'formData'\n\t\t| 'document';\n\t\tcontentType?: string;\n\t\ttokenHeaders?: {\n\t\t\taccessToken?: boolean | string;\n\t\t\tidToken?: boolean | string;\n\t\t};\n\t\tprogress?: ProgressCallback;\n\t},\n): Promise<{ [key: string]: any }> {\n\tawait this.__connection;\n\tlet {\n\t\tauth = false,\n\t\tmethod = 'POST',\n\t\tbypassAwaitConnection = false,\n\t\tresponseType,\n\t\tcontentType,\n\t\ttokenHeaders,\n\t\tprogress,\n\t} = (options as any) || {};\n\n\toptions = Object.assign(\n\t\t{\n\t\t\tauth,\n\t\t\tmethod,\n\t\t\tbypassAwaitConnection,\n\t\t\tresponseType,\n\t\t\tcontentType,\n\t\t\ttokenHeaders,\n\t\t},\n\t\t{\n\t\t\tfetchOptions: { progress },\n\t\t},\n\t);\n\n\tif (\n\t\ttypeof data !== 'object' &&\n\t\t(contentType === 'application/json' || contentType === undefined)\n\t) {\n\t\tthrow new SkapiError('\"data\" should be type: <object>.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\n\treturn request.bind(this)('mock', data, options);\n}\n\n/**\n * Relays a request to a destination of your choosing, from the server rather\n * than the browser, and streams the destination's response back as it arrives.\n *\n * Unlike {@link secureRequest}, the body is relayed VERBATIM: an html form\n * reaches the destination as multipart/form-data, files included. The form's own\n * enctype and method attributes are not used; the method comes from\n * options.method. The destination url and the headers\n * to send with it travel in the Content-Meta header, so nothing has to be mixed\n * into the body. Your service api key is added server side, where the browser\n * cannot read it; when the project has no key set the header is still sent, with\n * the value \"none\", so a backend can treat a missing header as \"not from skapi\".\n *\n * The destination's status code and response headers come back to the caller,\n * apart from hop-by-hop headers, set-cookie, and access-control-* (skapi writes\n * those from the project's cors setting, and a duplicate would make the browser\n * reject the response). Headers in `options.headers` go OUTBOUND only and have\n * no bearing on what the browser is allowed to read.\n *\n * ```js\n * // buffered\n * const res = await skapi.forwardRequest(formElement, {\n * url: 'https://api.example.com/v1/report',\n * headers: { Accept: 'application/json' }\n * });\n *\n * // streaming: onStream fires per chunk, the promise resolves with the whole body\n * await skapi.forwardRequest(formElement, {\n * url: 'https://api.example.com/v1/chat',\n * onStream: (chunk) => { output.textContent += chunk; }\n * });\n * ```\n *\n * This method deliberately bypasses the shared request pipeline: that pipeline\n * flattens forms into JSON, forces its own Content-Type, and reads responses\n * through XMLHttpRequest, which cannot surface bytes before the response is\n * complete.\n */\nexport async function forwardRequest(\n\tform: any,\n\toptions: {\n\t\t/** Destination url. Must be http(s) and resolve to a public address. */\n\t\turl: string;\n\t\t/** Destination method. Defaults to POST. */\n\t\tmethod?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD';\n\t\t/** Headers to send TO the destination. */\n\t\theaders?: { [key: string]: string };\n\t\t/** Header name to carry the service api key. Defaults to \"x-api-key\". */\n\t\tapiKeyHeader?: string;\n\t\t/** Scheme prefix for the api key, e.g. \"Bearer\". */\n\t\tapiKeyScheme?: string;\n\t\t/** Called with each chunk of text as it arrives. Presence of this enables streaming. */\n\t\tonStream?: (chunk: string) => void;\n\t\t/** Stops the client receiving the response. The request already sent to\n\t\t * the destination is NOT cancelled and runs to completion. */\n\t\tsignal?: AbortSignal;\n\t\t/** How to resolve the promise. Defaults to 'json' when the destination says json, else 'text'. */\n\t\tresponseType?: 'json' | 'text' | 'response';\n\t},\n): Promise<any> {\n\tawait this.__connection;\n\n\tif (!options?.url || typeof options.url !== 'string') {\n\t\tthrow new SkapiError('\"url\" is required in the second argument.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\tvalidator.Url(options.url);\n\n\tconst admin = await this.admin_endpoint;\n\tconst endpoint = admin?.forward_request;\n\tif (!endpoint) {\n\t\t// An older cached endpoint json simply has no entry for this: say so,\n\t\t// rather than failing later with an opaque network error.\n\t\tthrow new SkapiError('forwardRequest is not available on this service region yet.', {\n\t\t\tcode: 'NOT_EXISTS',\n\t\t});\n\t}\n\n\t// The body is relayed as-is. A form element or submit event becomes native\n\t// FormData (multipart, boundary chosen by the browser, files preserved);\n\t// anything else is sent as json.\n\tlet body: any = null;\n\tlet contentType: string | null = null;\n\tconst el =\n\t\thasSubmitEvent && form instanceof SubmitEvent\n\t\t\t? (form.target as HTMLFormElement)\n\t\t\t: hasHTMLFormElement && form instanceof HTMLFormElement\n\t\t\t\t? form\n\t\t\t\t: null;\n\n\tif (el) {\n\t\tbody = new FormData(el);\n\t} else if (hasFormData && form instanceof FormData) {\n\t\tbody = form;\n\t} else if (form !== null && form !== undefined) {\n\t\tbody = JSON.stringify(form);\n\t\tcontentType = 'application/json';\n\t}\n\n\tconst meta = {\n\t\tpublic_identifier: this.__public_identifier,\n\t\tservice: this.service,\n\t\towner: this.owner,\n\t\tforward: {\n\t\t\turl: options.url,\n\t\t\tmethod: options.method || 'POST',\n\t\t\theaders: options.headers || {},\n\t\t\tapiKeyHeader: options.apiKeyHeader,\n\t\t\tapiKeyScheme: options.apiKeyScheme,\n\t\t},\n\t};\n\n\t// A header value is a byte string: fetch() refuses any character above U+00FF,\n\t// so a destination url or a header value carrying non-ascii text (a Korean\n\t// query string, an accented note) would throw a bare TypeError from fetch and\n\t// never leave the browser. Escaping those to \\uXXXX keeps this pure ascii and\n\t// still valid JSON, so the forwarder's JSON.parse sees the original text.\n\tconst metaHeader = JSON.stringify(meta).replace(\n\t\t/[\\u007f-\\uffff]/g,\n\t\t(c) => '\\\\u' + c.charCodeAt(0).toString(16).padStart(4, '0'),\n\t);\n\t// Measured on the ESCAPED string, since that is what goes on the wire.\n\tif (metaHeader.length > 4096) {\n\t\t// Header budget is shared with the tokens below; a destination that needs\n\t\t// more than this wants the payload in the body instead.\n\t\tthrow new SkapiError('Destination url and headers are too large for Content-Meta.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\n\tconst idToken = this.bearerToken || this.session?.idToken?.jwtToken || null;\n\tif (!idToken) {\n\t\tthrow new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n\t}\n\n\tconst headers: { [key: string]: string } = {\n\t\t'Content-Meta': metaHeader,\n\t\tAuthorization: idToken,\n\t};\n\tif (contentType) headers['Content-Type'] = contentType;\n\t// FormData intentionally has no Content-Type set here: the browser must add\n\t// its own, including the multipart boundary.\n\n\tconst res = await fetch(endpoint, {\n\t\tmethod: 'POST',\n\t\theaders,\n\t\tbody,\n\t\tsignal: options.signal,\n\t});\n\n\tif (options.responseType === 'response') return res;\n\n\t// An error response throws whether or not onStream was supplied. Gating this\n\t// on `!options.onStream` meant a streaming caller had the forwarder's own\n\t// error body ({\"message\":\"Destination host is not routable.\",\"code\":...})\n\t// delivered to their callback as if it were backend output, and the promise\n\t// then RESOLVED with it. A failure must not look like content.\n\tif (!res.ok) {\n\t\tlet payload: any = await res.text();\n\t\ttry {\n\t\t\tpayload = JSON.parse(payload);\n\t\t} catch { }\n\t\tthrow new SkapiError(\n\t\t\tpayload?.message || (typeof payload === 'string' ? payload : JSON.stringify(payload)),\n\t\t\t{ code: payload?.code || 'ERROR' },\n\t\t);\n\t}\n\n\tif (options.onStream && res.body) {\n\t\tconst reader = res.body.getReader();\n\t\tconst decoder = new TextDecoder();\n\t\tlet whole = '';\n\t\tfor (; ;) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tconst chunk = decoder.decode(value, { stream: true });\n\t\t\twhole += chunk;\n\t\t\ttry {\n\t\t\t\toptions.onStream(chunk);\n\t\t\t} catch (err) {\n\t\t\t\t// A throwing callback should not strand the reader.\n\t\t\t\tconsole.error(err);\n\t\t\t}\n\t\t}\n\t\treturn whole;\n\t}\n\n\tconst text = await res.text();\n\tif (options.responseType === 'text') return text;\n\ttry {\n\t\treturn JSON.parse(text);\n\t} catch {\n\t\treturn text;\n\t}\n}\n","import {\n DatabaseResponse,\n FetchOptions,\n Form,\n Newsletter,\n Subscription,\n RecordData\n} from '../Types';\nimport SkapiError from '../main/error';\nimport validator from '../utils/validator';\nimport { request } from '../utils/network';\nimport { checkAdmin } from './user';\nimport { normalizeRecord } from './database';\nimport { extractFormData } from '../utils/utils';\n\nexport async function getFeed(params?: { access_group?: number; }, fetchOptions?: FetchOptions): Promise<DatabaseResponse<RecordData>> {\n await this.__connection;\n\n params = validator.Params(\n params || {},\n {\n access_group: v => {\n if(v === 'authorized') {\n v = 1;\n }\n if(v === 'public') {\n v = 0;\n }\n if (typeof v !== 'number') {\n throw new SkapiError('\"access_group\" should be type number.', { code: 'INVALID_PARAMETER' });\n }\n if (v < 0) {\n throw new SkapiError('\"access_group\" should be zero or a positive number.', { code: 'INVALID_PARAMETER' });\n }\n if(v > this.__user.access_group) {\n throw new SkapiError('User has no access.', { code: 'INVALID_REQUEST' });\n }\n return v;\n }\n }\n );\n let recs = await request.bind(this)('get-feed', params, { auth: true, fetchOptions });\n for (let i in recs.list) {\n recs.list[i] = await normalizeRecord.bind(this)(recs.list[i]);\n }\n return recs;\n}\n\nfunction cannotBeSelfId(v) {\n if (v === this.__user.user_id) {\n throw new SkapiError(`\"user_id\" cannot be the user's own ID.`, { code: 'INVALID_PARAMETER' });\n }\n return validator.UserId(v, '\"user_id\"');\n}\n\nexport async function getSubscriptions(\n params: {\n /** Subscribers user id. */\n subscriber?: string;\n /** User ID of the subscription. User id that subscriber has subscribed to. */\n subscription?: string;\n /** Fetch blocked subscription when True */\n blocked?: boolean;\n },\n fetchOptions?: FetchOptions,\n): Promise<DatabaseResponse<Subscription>> {\n params = extractFormData(params, { ignoreEmpty: true }).data as any;\n params = validator.Params(params, {\n subscriber: (v: string) => validator.UserId(v, 'User ID in \"subscriber\"'),\n subscription: cannotBeSelfId.bind(this),\n blocked: 'boolean'\n });\n\n if (!params.subscriber && !params.subscription) {\n throw new SkapiError('At least either \"subscriber\" or \"subscription\" should have a value.', { code: 'INVALID_PARAMETER' });\n }\n\n let response = await request.bind(this)('get-subscription', params, Object.assign({ auth: true }, { fetchOptions }));\n\n response.list = response.list.map(((s: Record<string, any>) => {\n let subscription: Record<string, any> = {};\n if(s.sub) {\n let subSplit = s.sub.split('#');\n subscription.subscriber = subSplit[2];\n subscription.subscription = subSplit[0];\n }\n else {\n subscription.subscriber = s.subscriber;\n subscription.subscription = s.subscription;\n }\n subscription.timestamp = s?.timestamp || s.stmp;\n subscription.blocked = s?.blocked || s.grp.substring(0, 1) === 'N';\n Object.assign(subscription, s.opt);\n return subscription;\n }));\n\n return response;\n}\n\nexport async function subscribe(params: { user_id: string; get_feed?: boolean; get_notified?: boolean; get_email?: boolean; }): Promise<Subscription> {\n await this.__connection;\n params = validator.Params(params, {\n user_id: cannotBeSelfId.bind(this),\n get_feed: ['boolean', ()=>false],\n get_notified: ['boolean', ()=>false],\n get_email: v => {\n if (v && !this.__user.email || !this.__user.email_verified) {\n throw new SkapiError('User has no verified email address.', { code: 'INVALID_REQUEST' });\n }\n return !!v;\n }\n }, ['user_id']);\n\n let s = await request.bind(this)('subscription', {\n subscribe: params.user_id,\n option: {\n get_feed: params.get_feed,\n get_notified: params.get_notified,\n get_email: params.get_email || false\n }\n }, { auth: true });\n\n let subscription:any = {};\n if(s.sub) {\n let subSplit = s.sub.split('#');\n subscription.subscriber = subSplit[2];\n subscription.subscription = subSplit[0];\n }\n else {\n subscription.subscriber = s.subscriber;\n subscription.subscription = s.subscription;\n }\n subscription.timestamp = s?.timestamp || s.stmp;\n subscription.blocked = s?.blocked || s.grp.substring(0, 1) === 'N';\n Object.assign(subscription, s.opt);\n return subscription;\n}\n\nexport async function unsubscribe(params: { user_id: string; }): Promise<'SUCCESS: The user has unsubscribed.'> {\n await this.__connection;\n let { user_id } = validator.Params(params, {\n user_id: cannotBeSelfId.bind(this),\n }, ['user_id']);\n\n return await request.bind(this)('subscription', {\n unsubscribe: user_id,\n }, { auth: true });\n}\n\nexport async function blockSubscriber(params: { user_id: string; }): Promise<'SUCCESS: Blocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'> {\n await this.__connection;\n let { user_id } = validator.Params(params, {\n user_id: cannotBeSelfId.bind(this),\n }, ['user_id']);\n return await request.bind(this)('subscription', { block: user_id }, { auth: true });\n}\n\nexport async function unblockSubscriber(params: { user_id: string; }): Promise<'SUCCESS: Unblocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'> {\n await this.__connection;\n let { user_id } = validator.Params(params, {\n user_id: cannotBeSelfId.bind(this),\n }, ['user_id']);\n return await request.bind(this)('subscription', { unblock: user_id }, { auth: true });\n}\n\n// requires auth\nexport async function getNewsletterSubscription(params: {group?: number | 'public' | 'authorized';},\nfetchOptions?: FetchOptions): Promise<{\n active: boolean;\n timestamp: number;\n group: number;\n subscribed_email: string;\n}[]> {\n await this.__connection;\n let isAdmin = await checkAdmin.bind(this)();\n\n params = validator.Params(\n params,\n {\n user_id: v => {\n if (v !== this.__user.user_id && !isAdmin) {\n throw new SkapiError(`No access.`, { code: 'INVALID_REQUEST' });\n }\n\n return v;\n },\n group: v => {\n if (v === 'public') {\n v = 0\n }\n if (v === 'authorized') {\n v = 1;\n }\n if (typeof v !== 'number') {\n throw new SkapiError('\"group\" should be type number | \"public\" | \"authorized\".', { code: 'INVALID_PARAMETER' })\n }\n return v;\n }\n }\n );\n\n let data = await request.bind(this)('get-newsletter-subscription', params, { auth: true, fetchOptions: fetchOptions || null });\n let list = data?.list || data;\n \n let result = [];\n if(!Array.isArray(list)) {\n list = [];\n }\n for (let sub of list) {\n let subt = sub['subt'].split('#');\n let active = true;\n\n if (subt[0].charAt(0) === '@') {\n active = false;\n subt[0] = subt[0].substring(1);\n }\n\n let group = parseInt(subt[0]);\n\n result.push({\n timestamp: sub['stmp'],\n group,\n subscribed_email: subt[1],\n active\n });\n }\n\n if(data?.list) {\n data.list = result;\n return data;\n }\n\n return result;\n}\n\n/**\n * Anyone who submits their E-Mail address will receive newsletters from you.<br>\n * The newsletters you send out will have unsubscribe link at the bottom.<br>\n * Both Signed and unsigned users can subscribe to your newsletter.<br>\n * Signed users can also subscribe to groups other than 0.\n * redirect is for newsletter subscribe confirmation link which it will only be sent to group 0 subscribers.\n * ```\n * let params = {\n * email: 'visitors@email.com'\n * };\n * \n * skapi.subscribeNewsletter(params);\n * ```\n */\nexport async function subscribeNewsletter(\n form: Form<{\n email?: string;\n group: number | 'public' | 'authorized' | 'admin' | string; \n redirect?: string;\n }>\n): Promise<string> {\n await this.__connection;\n\n let params = validator.Params(\n form || {},\n {\n email: (v: string) => {\n if(Array.isArray(v) && v.length > 0) {\n if(v.length === 1) {\n return validator.Email(v[0]);\n }\n else {\n return v.map(e => validator.Email(e));\n }\n }\n return validator.Email(v);\n },\n group: ['number', 'public', 'authorized', 'admin', (v: string) => {\n if (typeof v !== 'string' || v.length > 20 || !/^[a-zA-Z0-9]+$/.test(v)) {\n throw new SkapiError('\"group\" should be an alphanumeric string without spaces and less than 20 characters.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n }], \n redirect: (v: string) => validator.Url(v)\n },\n this.__user ? ['group'] : ['email', 'group']\n );\n\n return request.bind(this)(`subscribe-${this.__user ? '' : 'public-'}newsletter`, params, { auth: !!this.__user });\n}\n\n// /* depricate from the user api */\n// export async function adminNewsletterRequest(params) {\n// await this.__connection;\n// let response = await request.bind(this)('admin-newsletter-request', params, { auth: true });\n\n// return response\n// }\n\n// /* depricate from the user api */\n// export async function registerNewsletterGroup(\n// form: Form<{\n// group: string;\n// restriction: number;\n// }>\n// ): Promise<string> {\n// await this.__connection;\n\n// let params = validator.Params(\n// form || {},\n// {\n// group: (v: string) => {\n// if (typeof v !== 'string' || v.length > 20 || !/^[a-zA-Z0-9]+$/.test(v)) {\n// throw new SkapiError('\"group\" should be an alphanumeric string without spaces and less than 20 characters.', { code: 'INVALID_PARAMETER' });\n// }\n// return v;\n// },\n// restriction: (v: number) => {\n// if (typeof v !== 'number' || v < 0 || v > 99) {\n// throw new SkapiError('\"restriction\" should be a number between 0 and 99.', { code: 'INVALID_PARAMETER' });\n// }\n// return v;\n// }\n// },\n// ['group', 'restriction']\n// );\n\n// return request.bind(this)('register-newsletter-group', params, { auth: true });\n// }\n\n// /* depricate from the user api */\n// export async function newsletterGroupEndpoint(params) {\n// await this.__connection;\n// let response = await request.bind(this)('newsletter-group-endpoint', params, { auth: true });\n\n// return response\n// }\n\n/**\n * Only signed users can unsubscribe newsletter via api.\n * if form.group is null, unsubscribes from all groups.\n */\nexport async function unsubscribeNewsletter(\n params: { group: number | 'public' | 'authorized' | 'admin' | null; }\n): Promise<string> {\n await this.__connection;\n\n params = validator.Params(\n params,\n {\n group: ['number', 'public', 'authorized', 'admin']\n },\n ['group']\n );\n\n let param_send = Object.assign({\n action: 'unsubscribe'\n }, params);\n\n return request.bind(this)('subscribe-newsletter', param_send, { auth: true });\n}\n\nexport async function getNewsletters(\n params?: {\n /**\n * Search points.<br>\n * 'message_id' and 'subject' value should be string.<br>\n * Others numbers.\n */\n searchFor: 'message_id' | 'timestamp' | 'read' | 'complaint' | 'subject';\n value: string | number;\n group: 'public' | 'authorized' | number;\n range?: string | number;\n /**\n * Defaults to '='\n */\n condition?: '>' | '>=' | '=' | '<' | '<=' | 'gt' | 'gte' | 'eq' | 'lt' | 'lte';\n },\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<Newsletter>> {\n let isAdmin = await checkAdmin.bind(this)();\n\n let searchType = {\n 'message_id': 'string',\n 'timestamp': 'number',\n 'read': 'number',\n 'complaint': 'number',\n 'subject': 'string',\n 'bounced': 'number'\n };\n\n if (!params) {\n fetchOptions = Object.assign({ ascending: false }, (fetchOptions || {}));\n }\n\n params = extractFormData(params).data as any;\n\n params = params || {\n searchFor: 'timestamp',\n value: Date.now(),\n condition: '<',\n group: 'public'\n };\n\n params = validator.Params(params, {\n searchFor: [\n \"message_id\",\n \"timestamp\",\n \"subject\",\n \"complaint\",\n \"read\",\n \"bounced\",\n ],\n value: (v: number | string) => {\n if (typeof v !== searchType[params.searchFor]) {\n throw new SkapiError(`\"value\" type does not match the type of \"${params.searchFor}\" index.`, { code: 'INVALID_PARAMETER' });\n }\n else if (typeof v === 'string' && !v) {\n throw new SkapiError('\"value\" should not be empty string.', { code: 'INVALID_PARAMETER' });\n }\n\n return v;\n },\n range: (v: number | string) => {\n if (!params.hasOwnProperty('value') || typeof v !== typeof params.value) {\n throw new SkapiError('\"range\" should match type of \"value\".', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n condition: ['>', '>=', '=', '<', '<=', 'gt', 'gte', 'eq', 'lt', 'lte', () => '='],\n group: (x: number | string) => {\n if (x === 'public') {\n return 0;\n }\n\n if (!this.session) {\n throw new SkapiError('User should be logged in.', { code: 'INVALID_REQUEST' });\n }\n\n if (x === 'authorized') {\n return 1;\n }\n\n if (typeof x === 'number') {\n if (!isAdmin && x > parseInt(this.user?.access_group || this.session?.idToken?.payload?.access_group)) {\n throw new SkapiError('User has no access.', { code: 'INVALID_REQUEST' });\n }\n\n return x;\n }\n\n throw new SkapiError('\"group\" should be type: number | \"public\" | \"authorized\".', { code: 'INVALID_PARAMETER' });\n }\n }, ['searchFor', 'value', 'group']);\n\n let endpointTarget = params.group === 0 ? 'get-public-newsletters' : 'get-newsletters';\n let mails = await request.bind(this)(\n endpointTarget,\n params,\n Object.assign({ method: 'get', auth: endpointTarget === 'get-public-newsletters' ? !!this.__user : true }, { fetchOptions })\n );\n\n let remap = {\n 'message_id': 'mid',\n 'timestamp': 'stmp',\n 'complaint': 'cmpl',\n 'read': 'read',\n 'subject': 'subj',\n 'bounced': 'bnce',\n 'url': 'url',\n 'delivered': 'delv'\n };\n let defaults = {\n 'message_id': '',\n 'timestamp': 0,\n 'complaint': 0,\n 'read': 0,\n 'subject': '',\n 'bounced': '',\n 'url': '',\n 'delivered': 0\n };\n\n mails.list = mails.list.map(m => {\n let remapped = {};\n for (let k in remap) {\n remapped[k] = m[remap[k]] || defaults[k];\n }\n remapped['bounced'] = String(remapped['bounced']);\n return remapped;\n });\n\n return mails;\n}","import validator from '../utils/validator';\nimport { request } from '../utils/network';\nimport { checkAdmin } from './user';\nimport { Form, UserAttributes, UserProfile, UserPublic, DatabaseResponse, FetchOptions } from '../Types';\nimport SkapiError from '../main/error';\nimport { parseUserAttributes, MD5 } from '../utils/utils';\n\nexport async function blockAccount(form: Form<{\n user_id: string;\n owner?: string;\n service?: string;\n}>): Promise<'SUCCESS: The user has been blocked.'> {\n let params = validator.Params(form, {\n user_id: (v: string) => {\n return validator.UserId(v, '\"user_id\"');\n },\n }, ['user_id']);\n\n if (params?.service && params?.owner) {\n params = { service: params?.service, owner: params?.owner, block: params.user_id };\n }\n else {\n params = { block: params.user_id };\n }\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('block-account', params, { auth: true });\n}\n\nexport async function unblockAccount(form: Form<{\n user_id: string;\n owner?: string;\n service?: string;\n}>): Promise<'SUCCESS: The user has been unblocked.'> {\n let params = validator.Params(form, {\n user_id: (v: string) => {\n return validator.UserId(v, '\"user_id\"');\n },\n }, ['user_id']);\n\n if (params?.service && params?.owner) {\n params = { service: params?.service, owner: params?.owner, unblock: params.user_id };\n } else {\n params = { unblock: params.user_id };\n }\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('block-account', params, { auth: true });\n}\n\nexport async function deleteAccount(form: Form<{\n user_id: string;\n owner?: string;\n service?: string;\n}>): Promise<'SUCCESS: Account has been deleted.'> {\n let params = validator.Params(form, {\n user_id: (v: string) => {\n return validator.UserId(v, '\"user_id\"');\n },\n }, ['user_id']);\n\n if (params?.service && params?.owner) {\n params = { service: params?.service, owner: params?.owner, delete: params.user_id };\n } else {\n params = { delete: params.user_id };\n }\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('remove-account', params, { auth: true });\n}\n\nexport async function inviteUser(\n form: Form<UserAttributes & { openid_id: string; access_group: number; } & { service?: string; owner?: string; }>,\n options?: {\n confirmation_url?: string;\n email_subscription?: boolean;\n template?: {\n url: string;\n subject: string;\n }\n }\n): Promise<'SUCCESS: Invitation has been sent. (User ID: xxx...)'> {\n let paramRestrictions = {\n email: (v: string) => validator.Email(v),\n password: (v: string) => validator.Password(v),\n\n name: 'string',\n username: 'string',\n gender: 'string',\n address: (v: any) => {\n if (!v) return '';\n\n if (typeof v === 'string') {\n return v;\n }\n\n if (typeof v === 'object') {\n return JSON.stringify(v);\n }\n\n return undefined;\n },\n birthdate: (v: string) => validator.Birthdate(v),\n phone_number: (v: string) => validator.PhoneNumber(v),\n picture: (v: string) => { if (v) return validator.Url(v); else return undefined },\n profile: (v: string) => { if (v) return validator.Url(v); else return undefined },\n website: (v: string) => { if (v) return validator.Url(v); else return undefined },\n nickname: 'string',\n misc: 'string',\n\n email_public: ['boolean', () => false],\n gender_public: ['boolean', () => false],\n address_public: ['boolean', () => false],\n birthdate_public: ['boolean', () => false],\n phone_number_public: ['boolean', () => false],\n openid_id: 'string',\n access_group: (v: number) => {\n // if string try to convert to number and if it's not a number, throw error\n try {\n if (typeof v === 'string') {\n v = v === 'admin' ? 99 : parseInt(v);\n }\n }\n catch (e) {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number>.', { code: 'INVALID_PARAMETER' });\n }\n if (typeof v !== 'number' || v < 1 || v > 100) {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number> of range 1~99', { code: 'INVALID_PARAMETER' });\n }\n return v;\n }\n };\n\n let params = validator.Params(form, paramRestrictions, ['email']);\n\n options = validator.Params(options, {\n confirmation_url: (v: string) => {\n let value = v;\n\n if (typeof v === 'string') {\n value = validator.Url(v);\n }\n else {\n throw new SkapiError('\"options.confirmation_url\" should be type: <string>.', { code: 'INVALID_PARAMETER' });\n }\n\n if (value && !params.email) {\n throw new SkapiError('\"email\" is required for signup confirmation.', { code: 'INVALID_PARAMETER' });\n }\n\n return value;\n },\n email_subscription: (v: boolean) => {\n if (typeof v !== 'boolean') {\n throw new SkapiError('\"options.email_subscription\" should be type: <boolean>.', { code: 'INVALID_PARAMETER' });\n }\n if (!options?.confirmation_url) {\n // requires to be url or true\n throw new SkapiError('\"options.confirmation_url\" is required for email subscription.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n template: (v: { url: string; subject: string; }) => {\n if (typeof v !== 'object' || !v.url || !v.subject) {\n throw new SkapiError('\"options.template\" should be type: <object> with \"url\" and \"subject\".', { code: 'INVALID_PARAMETER' });\n }\n return {\n url: validator.Url(v.url),\n subject: v.subject,\n };\n },\n });\n\n params.signup_confirmation = options?.confirmation_url || true;\n params.email_subscription = options?.email_subscription || false;\n params.template = options?.template || {};\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('admin-signup', params, { auth: true });\n}\n\nexport async function createAccount(\n form: Form<\n UserAttributes & { access_group: number; password: string; } &\n { service?: string; owner?: string; }\n >,\n): Promise<UserProfile & { email_admin: string; username: string; }> {\n let paramRestrictions = {\n email: (v: string) => validator.Email(v),\n password: (v: string) => validator.Password(v),\n openid_id: 'string',\n name: 'string',\n username: 'string',\n gender: 'string',\n address: (v: any) => {\n if (!v) return '';\n\n if (typeof v === 'string') {\n return v;\n }\n\n if (typeof v === 'object') {\n return JSON.stringify(v);\n }\n\n return undefined;\n },\n birthdate: (v: string) => validator.Birthdate(v),\n phone_number: (v: string) => validator.PhoneNumber(v),\n picture: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n profile: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n website: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n nickname: 'string',\n misc: 'string',\n\n email_public: ['boolean', () => false],\n gender_public: ['boolean', () => false],\n address_public: ['boolean', () => false],\n birthdate_public: ['boolean', () => false],\n phone_number_public: ['boolean', () => false],\n access_group: (v: number) => {\n // if string try to convert to number and if it's not a number, throw error\n try {\n if (typeof v === 'string') {\n v = parseInt(v);\n }\n }\n catch (e) {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number>.', { code: 'INVALID_PARAMETER' });\n }\n if (typeof v !== 'number' || v < 1 || v > 100) {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number> of range 1~99', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n };\n\n let required = [\n 'email',\n 'password'\n ];\n\n let params = validator.Params(form, paramRestrictions, required);\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('admin-signup', params, { auth: true });\n}\n\nexport async function grantAccess(params: Form<{\n user_id: string;\n access_group: number;\n service?: string;\n owner?: string;\n}>): Promise<'SUCCESS: Access has been granted to the user.'> {\n params = validator.Params(params, {\n user_id: (v: string) => {\n return validator.UserId(v, '\"user_id\"');\n },\n access_group: (v: number) => {\n // if string try to convert to number and if it's not a number, throw error\n try {\n if (typeof v === 'string') {\n v = parseInt(v);\n }\n }\n catch (e) {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number>.', { code: 'INVALID_PARAMETER' });\n }\n if (typeof v === 'number' && v > 0 && v < 100) {\n return v;\n } else {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number> of range 1~99', { code: 'INVALID_PARAMETER' });\n }\n }\n }, ['user_id', 'access_group']);\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('grant-access', params, { auth: true })\n}\n\nexport async function getInvitations(params?: Form<{\n service?: string;\n owner?: string;\n email?: string;\n}>, fetchOptions?: FetchOptions): Promise<DatabaseResponse<UserProfile>> {\n params = validator.Params(params, {\n email: 'string',\n });\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n let resp = await request.bind(this)('invitation-list', Object.assign({ mode: 'search' }, params), { fetchOptions, auth: true });\n resp.list = resp.list.map((v: any) => parseUserAttributes(v.user));\n return resp;\n}\n\nexport async function cancelInvitation(params: Form<{\n service?: string;\n owner?: string;\n email: string;\n}>): Promise<\"SUCCESS: Invitation has been canceled.\"> {\n params = validator.Params(params, {\n email: v => validator.Email(v),\n }, ['email']);\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('invitation-list', Object.assign({ mode: 'cancel' }, params), { auth: true });\n}\n\nexport async function resendInvitation(params: Form<{\n service?: string;\n owner?: string;\n email: string;\n}>): Promise<\"SUCCESS: Invitation has been re-sent. (User ID: xxx...)\"> {\n params = validator.Params(params, {\n email: v => validator.Email(v),\n }, ['email']);\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('invitation-list', Object.assign({ mode: 'resend' }, params), { auth: true });\n}\n\nexport async function updateUserAttributes(\n form: Form<UserAttributes & { user_id: string; }>,\n): Promise<'SUCCESS: User attributes updated.'> {\n let params: any = validator.Params(form, {\n user_id: (v: string) => validator.UserId(v, '\"user_id\"'),\n email: (v: string) => validator.Email(v),\n address: (v: any) => {\n if (!v) return '';\n\n if (typeof v === 'string') {\n return v;\n }\n\n if (typeof v === 'object') {\n return JSON.stringify(v);\n }\n\n return undefined;\n },\n name: 'string',\n gender: 'string',\n birthdate: (v: string) => v ? validator.Birthdate(v) : \"\",\n phone_number: (v: string) => v ? validator.PhoneNumber(v) : \"\",\n email_public: 'boolean',\n phone_number_public: 'boolean',\n address_public: 'boolean',\n gender_public: 'boolean',\n birthdate_public: 'boolean',\n misc: 'string',\n picture: (v: string) => v ? validator.Url(v) : \"\",\n profile: (v: string) => v ? validator.Url(v) : \"\",\n nickname: 'string',\n website: (v: string) => v ? validator.Url(v) : \"\",\n }, ['user_id']);\n\n // \"service\" and \"owner\" are auto-allowed by validator.Params. They target another\n // service and must be lifted to the top level of the request (like the sibling admin\n // methods), otherwise they route against the wrong service and get sent to Cognito as\n // invalid attribute names. this.service / this.owner are used when they are omitted.\n let service = params.service;\n let owner = params.owner;\n delete params.service;\n delete params.owner;\n\n // user_id is the only required field, but at least one attribute to update must be provided.\n if (Object.keys(params).filter(k => k !== 'user_id' && params[k] !== undefined).length === 0) {\n throw new SkapiError('At least one attribute to update is required.', { code: 'INVALID_PARAMETER' });\n }\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n // when the e-mail is changed, update the alternative sign-in lookup key as well\n if (params.email) {\n params.preferred_username = (service || this.service) + '-' + MD5.hash(params.email);\n }\n\n let reqData: { attributes: any; service?: string; owner?: string; } = { attributes: params };\n if (service && owner) {\n reqData.service = service;\n reqData.owner = owner;\n }\n\n return await request.bind(this)('admin-edit-profile', reqData, { auth: true });\n}","import { SkapiError } from \"../Main\";\nimport { request } from \"../utils/network\";\nimport { extractFormData } from \"../utils/utils\";\n\nexport async function subscribeNotification(params: {\n endpoint: string;\n keys: {\n p256dh: string;\n auth: string;\n };\n}): Promise<\"SUCCESS: Subscribed to receive notifications.\"> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('Push Notifications are not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n await this.__connection;\n\n if (!params.endpoint) {\n throw new SkapiError(\"Missing parameter: endpoint\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n if (!params.keys || !params.keys.p256dh || !params.keys.auth) {\n throw new SkapiError(\"Missing parameter: keys.p256dh or keys.auth\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n\n await request.bind(this)(\n \"store-subscription\",\n { endpoint: params.endpoint, keys: params.keys },\n { auth: true }\n );\n\n return \"SUCCESS: Subscribed to receive notifications.\";\n}\n\nexport async function unsubscribeNotification(params: {\n endpoint: string;\n keys: {\n p256dh: string;\n auth: string;\n };\n}): Promise<\"SUCCESS: Unsubscribed from notifications.\"> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('Push Notifications are not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n await this.__connection;\n\n if (!params.endpoint) {\n throw new SkapiError(\"Missing parameter: endpoint\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n if (!params.keys || !params.keys.p256dh || !params.keys.auth) {\n throw new SkapiError(\"Missing parameter: keys.p256dh or keys.auth\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n\n await request.bind(this)(\n \"delete-subscription\",\n { endpoint: params.endpoint, keys: params.keys },\n { auth: true }\n );\n return \"SUCCESS: Unsubscribed from notifications.\";\n}\n\n\nexport async function vapidPublicKey() {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('Push Notifications are not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n await this.__connection;\n\n let vapid = await request.bind(this)(\"get-vapid-public-key\", null, {\n auth: true,\n });\n\n return { VAPIDPublicKey: vapid };\n}\n\nexport async function pushNotification(\n form: {\n title: string;\n body: string;\n },\n user_ids?: string | string[]): Promise<\"SUCCESS: Notification sent.\"> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('Push Notifications are not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n await this.__connection;\n\n let { title, body } = extractFormData(form || {}, { nullIfEmpty: true }).data;\n\n if (!title) {\n throw new SkapiError(\"Missing parameter: message title\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n if (!body) {\n throw new SkapiError(\"Missing parameter: message body\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n\n const payload = { title, body };\n\n if (user_ids) {\n if (typeof user_ids === 'string') {\n user_ids = [user_ids];\n }\n payload['user_ids'] = user_ids;\n }\n else {\n payload['user_ids'] = 'all_users';\n }\n\n await request.bind(this)(\n \"push-notification\",\n payload,\n {\n auth: true,\n }\n );\n\n return \"SUCCESS: Notification sent.\";\n}\n","import { request } from '../utils/network';\nimport validator from '../utils/validator';\nimport {\n isBrowserRuntime,\n} from '../utils/utils';\nimport {\n DatabaseResponse,\n} from '../Types';\nexport async function spellcast(params: {\n spell: string,\n name: string,\n magic?: any\n}): Promise<string> {\n await this.__connection;\n params = validator.Params(params, {\n 'spell': 'string',\n 'name': 'string',\n 'magic': x=>x\n }, ['spell', 'name'])\n\n let response = await request.bind(this)('castspell', params);\n return `The spell \"${params.spell}\" has been cast.`;\n}\n\nexport async function getspell(params?: {\n search?: 'spell' | 'name',\n value?: string,\n}): Promise<DatabaseResponse<{\n spell: string;\n magic?: any;\n name: string;\n}>> {\n await this.__connection;\n params = validator.Params(params || {}, {\n 'search': ['spell', 'name', () => \"spell\"],\n 'value': 'string'\n });\n\n let response = await request.bind(this)('getspell', params);\n return response;\n}\n\nexport async function dopamine(params: {\n message: string,\n name: string\n}): Promise<string> {\n await this.__connection;\n params = validator.Params(params, {\n 'message': 'string',\n 'name': 'string'\n }, ['message', 'name'])\n\n let response = await request.bind(this)('dopamine', params, { auth: true });\n\n let message = response?.previous_message?.message;\n let name = response?.previous_message?.name;\n\n if (isBrowserRuntime()) {\n if (message && name)\n window.alert(`${name} said: ${message}`)\n\n window.location.href = response.video\n }\n else {\n if(message && name) {\n return `${name} said: ${message}\\nWatch the video here: ${response.video}`;\n }\n else {\n return `Your message has been uploaded for future generations to receive.\\nWatch the video here: ${response.video}`;\n }\n }\n}","import {\n\tDatabaseResponse,\n\tConnection,\n\tProgressCallback,\n\tGetRecordQuery,\n\tFetchOptions,\n\tRecordData,\n\tCondition,\n\tUserAttributes,\n\tUserProfile,\n\tNewsletter,\n\tForm,\n\tPostRecordConfig,\n\tUserPublic,\n\tFileInfo,\n\tRTCEvent,\n\tRealtimeCallback,\n\tRTCConnectorParams,\n\tRTCConnector,\n\tDelRecordQuery,\n\tConnectionInfo,\n\tTable,\n\tIndex,\n\tTag,\n\tUniqueId,\n\tSubscription,\n RequestHistory,\n} from '../Types';\nimport { CognitoUserPool } from 'amazon-cognito-identity-js';\nimport SkapiError from './error';\nimport validator from '../utils/validator';\nimport {\n\tgetRecords,\n\tpostRecord,\n\tdeleteRecords,\n\tgetTables,\n\tgetIndexes,\n\tgetTags,\n\tgetFile,\n\tgrantPrivateRecordAccess,\n\tremovePrivateRecordAccess,\n\tlistPrivateRecordAccess,\n\trequestPrivateRecordAccessKey,\n\tdeleteFiles,\n\tgetUniqueId,\n\tbulkPostRecords,\n} from '../methods/database';\nimport {\n\tconnectRealtime,\n\tjoinRealtime,\n\tpostRealtime,\n\tcloseRealtime,\n\tgetRealtimeUsers,\n\tgetRealtimeGroups,\n} from '../methods/realtime';\nimport { closeRTC, connectRTC } from '../methods/webrtc';\nimport {\n\tsecureRequest,\n\tforwardRequest,\n\tmock,\n\tclientSecretRequest,\n\tclientSecretRequestHistory,\n\tsendInquiry,\n\tcancelClientSecretRequest,\n\tclientSecretRequestQueueCount,\n\tstopClientSecretPolling,\n\tisPollStopped,\n} from '../methods/request';\nimport {\n\trequest,\n\tgetFormResponse,\n\tformHandler,\n\tuploadFiles,\n\tterminatePendingRequests,\n} from '../utils/network';\nimport {\n\tsubscribe,\n\tunsubscribe,\n\tblockSubscriber,\n\tunblockSubscriber,\n\tgetSubscriptions,\n\tsubscribeNewsletter,\n\tgetNewsletters,\n\tunsubscribeNewsletter,\n\tgetNewsletterSubscription,\n\tgetFeed,\n\t// adminNewsletterRequest,\n\t// registerNewsletterGroup,\n\t// newsletterGroupEndpoint,\n} from '../methods/subscription';\nimport {\n\tgetProfile,\n\tlogout,\n\trecoverAccount,\n\tresendSignupConfirmation,\n\tauthentication,\n\tlogin,\n\tsignup,\n\tdisableAccount,\n\tresetPassword,\n\tverifyEmail,\n\tverifyPhoneNumber,\n\tforgotPassword,\n\tchangePassword,\n\tupdateProfile,\n\tgetUsers,\n\tlastVerifiedEmail,\n\trequestUsernameChange,\n\tconsumeTicket,\n\tgetConsumedTickets,\n\tgetTickets,\n\tregisterTicket,\n\tunregisterTicket,\n\t_out,\n\topenIdLogin,\n\tloginWithToken,\n} from '../methods/user';\nimport {\n\textractFormData,\n\tfromBase62,\n\tgenerateRandom,\n\ttoBase62,\n\tMD5,\n\tisBrowserRuntime,\n\tisNodeRuntime,\n\tdecodeProjectId,\n\tformatServiceId,\n} from '../utils/utils';\nimport {\n\tblockAccount,\n\tunblockAccount,\n\tdeleteAccount,\n\tinviteUser,\n\tcreateAccount,\n\tgrantAccess,\n\tgetInvitations,\n\tcancelInvitation,\n\tresendInvitation,\n\tupdateUserAttributes\n} from '../methods/admin';\nimport {\n\tsubscribeNotification,\n\tvapidPublicKey,\n\tpushNotification,\n\tunsubscribeNotification,\n} from '../methods/notification';\nimport { spellcast, dopamine, getspell } from '../methods/vivian';\n\ndeclare const __SKAPI_VERSION__: string;\n\ntype Options = {\n\tautoLogin: boolean;\n\trefetchServiceInfo?: boolean; // bypasses cached service info and always fetch new service info on load.\n\trequestBatchSize?: number; // default 30. number of requests to be handled in a batch\n\t// bearerToken?: string; // custom bearer token for authentication\n\teventListener?: {\n\t\tonLogin?: (user: UserProfile | null) => void;\n\t\tonUserUpdate?: (user: UserProfile | null) => void;\n\t\tonBatchProcess?: (process: {\n\t\t\tbatchToProcess: number;\n\t\t\titemsToProcess: number;\n\t\t\tcompleted: any[];\n\t\t}) => void;\n\t};\n};\n\nexport default class Skapi {\n\t// current version\n\tprivate __version = __SKAPI_VERSION__;\n\tservice: string;\n\towner: string;\n\t/**\n\t * The public project ID: the single two-segment token composed from service + owner\n\t * (the same value formatServiceId returns, and the form external tools accept).\n\t * Empty string when the service has no uuid owner (e.g. host-owned), since the\n\t * compound form cannot be built without one.\n\t */\n\tproject_id: string = '';\n\tsession: Record<string, any> | null = null;\n\tconnection: Connection | null = null;\n\t/**\n\t * unique_id -> record_id, bucketed by a \"<service>/<owner>\" scope key.\n\t *\n\t * The scope is mandatory. One Skapi instance routinely serves MANY services: the\n\t * MCP server keeps a single instance per user and names the target project on every\n\t * call, and the dashboard switches projects without reconstructing. A flat map let\n\t * the same unique_id from two projects collide on one key, so a post carrying\n\t * `reference: \"src::<file>\"` was silently rewritten to the OTHER project's\n\t * record_id and the backend rejected it as non-existent. Never key this by\n\t * unique_id alone, and never scope it by `this.service` when the call names its own.\n\t */\n\tprivate __my_unique_ids: { [serviceKey: string]: { [unique_id: string]: string } } = {};\n\tprivate __uniqueIdsPersistTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate userPool: CognitoUserPool | null = null;\n\tprivate __socket: Promise<WebSocket> | null = null;\n\tprivate __mediaStream: MediaStream = null;\n\n\tprivate host = 'skapi';\n\tprivate hostDomain = 'skapi.com';\n\tprivate target_cdn = 'd3e9syvbtso631';\n\tprivate customApiDomain = 'skapi.dev';\n\tprivate requestBatchSize = 30;\n\n\t// privates\n\tprivate __disabledAccount: string | null = null;\n\tprivate __cached_requests: {\n\t\t/** Cached url requests */\n\t\t[url: string]: {\n\t\t\t/** Array of data stored in hashed params key */\n\t\t\t[hashedParams: string]: DatabaseResponse<any>;\n\t\t};\n\t} = {};\n\n\tprivate __startKeyHistory: {\n\t\t/** List of startkeys */\n\t\t[url: string]: {\n\t\t\t[hashedParams: string]: string[];\n\t\t};\n\t} = {};\n\tprivate __request_signup_confirmation: string | null = null;\n\tprivate __private_access_key: {\n\t\t[record_id: string]: string;\n\t} = {};\n\n\t// true when session is stored successfully to session storage\n\t// this property prevents duplicate stores when window closes on some device\n\tprivate __class_properties_has_been_cached = false;\n\n\t/** Current logged in user object. null if not logged. */\n\tprivate __user: UserProfile | null = null;\n\n\tget user(): UserProfile | null {\n\t\tif (this.__user && Object.keys(this.__user).length) {\n\t\t\treturn JSON.parse(JSON.stringify(this.__user));\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tset user(value) {\n\t\t// setting user is bypassed\n\t}\n\n\tprivate _userProfileListeners: Function[] = [];\n\tprivate _onLoginListeners: Function[] = [];\n\n\tget onLogin(): Function[] {\n\t\treturn this._onLoginListeners;\n\t}\n\n\tset onLogin(listener: (user: UserProfile | null) => void) {\n\t\tif (typeof listener === 'function') {\n\t\t\tthis._onLoginListeners.push(listener);\n\t\t}\n\t}\n\n\tget onUserUpdate(): Function[] {\n\t\treturn this._userProfileListeners;\n\t}\n\n\tset onUserUpdate(listener: (user: UserProfile | null) => void) {\n\t\tif (typeof listener === 'function') {\n\t\t\tthis._userProfileListeners.push(listener);\n\t\t}\n\t}\n\n\tprivate _runOnUserUpdateListeners(user: UserProfile | null) {\n\t\tfor (let listener of this._userProfileListeners) {\n\t\t\tif (typeof listener === 'function') {\n\t\t\t\tlistener(user);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _runOnLoginListeners(user: UserProfile | null) {\n\t\tfor (let listener of this._onLoginListeners) {\n\t\t\tif (typeof listener === 'function') {\n\t\t\t\tlistener(user);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate admin_endpoint: Promise<Record<string, any>>;\n\tprivate record_endpoint: Promise<Record<string, any>>;\n\n\tprivate _onBatchProcessListeners: ((process: {\n\t\tbatchToProcess: number;\n\t\titemsToProcess: number;\n\t\tcompleted: any[];\n\t}) => void)[] = [];\n\n\tget onBatchProcess(): ((process: {\n\t\tbatchToProcess: number;\n\t\titemsToProcess: number;\n\t\tcompleted: any[];\n\t}) => void)[] {\n\t\treturn this._onBatchProcessListeners;\n\t}\n\n\tset onBatchProcess(\n\t\tlistener: (process: {\n\t\t\tbatchToProcess: number;\n\t\t\titemsToProcess: number;\n\t\t\tcompleted: any[];\n\t\t}) => void,\n\t) {\n\t\tif (typeof listener === 'function') {\n\t\t\tthis._onBatchProcessListeners.push(listener);\n\t\t}\n\t}\n\n\tvalidate = {\n\t\tuserId(val: string) {\n\t\t\ttry {\n\t\t\t\tvalidator.UserId(val);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\turl(val: string | string[]) {\n\t\t\ttry {\n\t\t\t\tvalidator.Url(val);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tphoneNumber(val: string) {\n\t\t\ttry {\n\t\t\t\tvalidator.PhoneNumber(val);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tbirthdate(val: string) {\n\t\t\ttry {\n\t\t\t\tvalidator.Birthdate(val);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\temail(val: string) {\n\t\t\ttry {\n\t\t\t\tvalidator.Email(val);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tparams(val: any, schema: Record<string, any>, required?: string[]) {\n\t\t\treturn validator.Params(val, schema, required);\n\t\t},\n\t};\n\n\tutil = {\n\t\tMD5,\n\t\tgenerateRandom,\n\t\ttoBase62,\n\t\tfromBase62,\n\t\tdecodeProjectId,\n\t\tformatServiceId,\n\t\textractFormData,\n\t\tterminatePendingRequests,\n\t\trequest: (\n\t\t\turl: string,\n\t\t\tdata?: Form<any>,\n\t\t\toptions?: {\n\t\t\t\tfetchOptions?: FetchOptions;\n\t\t\t\tauth?: boolean;\n\t\t\t\tmethod?: string;\n\t\t\t\tbypassAwaitConnection?: boolean;\n\t\t\t\tresponseType?:\n\t\t\t\t\t| 'json'\n\t\t\t\t\t| 'blob'\n\t\t\t\t\t| 'text'\n\t\t\t\t\t| 'arrayBuffer'\n\t\t\t\t\t| 'formData'\n\t\t\t\t\t| 'document';\n\t\t\t\tcontentType?: string;\n\t\t\t\ttokenHeaders?: {\n\t\t\t\t\taccessToken?: boolean | string;\n\t\t\t\t\tidToken?: boolean | string;\n\t\t\t\t};\n\t\t\t\t// Both matter only to a CACHEABLE request, and both were reachable\n\t\t\t\t// at runtime but missing from this type — so the callers that need\n\t\t\t\t// them (a browser-cached signed-url mint) could not ask for them\n\t\t\t\t// without a cast, and silently did without:\n\t\t\t\t//\n\t\t\t\t// stableGateway pins the record host. Without it the round robin\n\t\t\t\t// alternates between record_private and record_private_2, which is\n\t\t\t\t// two urls for one mint, two cache entries, two signed urls, and\n\t\t\t\t// the same file downloaded twice.\n\t\t\t\t//\n\t\t\t\t// revalidate sends Cache-Control: no-cache so the browser REPLACES\n\t\t\t\t// what it has stored under this exact url, which a cache-busting\n\t\t\t\t// query param cannot do (a different url leaves the stale entry\n\t\t\t\t// answering every ordinary call).\n\t\t\t\t//\n\t\t\t\t// USELESS CROSS-ORIGIN, and worse than useless: Cache-Control is\n\t\t\t\t// not a CORS-safelisted request header, and the record gateway's\n\t\t\t\t// preflight does not list it, so the browser REFUSES TO SEND a\n\t\t\t\t// request carrying it. Every mint that asked for this failed with\n\t\t\t\t// a network error rather than being revalidated. Bust the cache\n\t\t\t\t// with a `nocache` parameter instead (see getFile's\n\t\t\t\t// mintCacheToken), or add Cache-Control to the gateway's\n\t\t\t\t// Access-Control-Allow-Headers first.\n\t\t\t\tstableGateway?: boolean;\n\t\t\t\trevalidate?: boolean;\n\t\t\t},\n\t\t) => request.bind(this)(url, data, options, { ignoreService: true }),\n\t};\n\n\tprivate __connection: Promise<Connection>;\n\tprivate __authConnection: Promise<void>;\n\tprivate __network_logs = false;\n\t// Which per-region endpoint file this SDK boots from:\n\t// <cdn>/<short_region>/admin-<version>.json and record-<version>.json.\n\t// v2 adds forward_request (the streaming forwarder's Function URL), which v1\n\t// has no slot for.\n\t//\n\t// This version must not move ahead of what is published: the fetch below\n\t// rejects on a missing file and every call then throws \"Service does not\n\t// exist\". Publish with infra/cdn/publish_endpoints.py for EVERY region\n\t// first, and leave v1 in place while older clients are still in the wild.\n\tprivate __endpoint_version = 'v2';\n\tprivate __public_identifier = '';\n\tprivate bearerToken: string = '';\n\n\tprivate _alert(message: string) {\n\t\tif (isBrowserRuntime() && typeof window.alert === 'function') {\n\t\t\twindow.alert(message);\n\t\t}\n\t}\n\n\tconstructor(\n\t\tservice: string,\n\t\towner?: string | Options,\n\t\toptions?: Options | any,\n\t\t__etc?: any,\n\t) {\n\t\tif (!service || typeof service !== 'string') {\n\t\t\tthis._alert('Service ID is required.');\n\t\t\tthrow new SkapiError('Service ID is required.', {\n\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t});\n\t\t}\n\t\t// The docs' copy-paste placeholder was never replaced. Checked FIRST, before any\n\t\t// decoding or owner validation, so the user gets this message and not a puzzling\n\t\t// \"Owner ID is invalid\".\n\t\t//\n\t\t// Every spelling the docs have ever used is caught by normalizing away the angle\n\t\t// brackets, spacing and separators the placeholder is written with: '<Project ID>'\n\t\t// (current), 'project_id', and the older 'service_id' / 'SERVICE_ID'. Matching only\n\t\t// the exact literals meant a docs change to a new placeholder form silently\n\t\t// disabled this check, which is what happened when '<Project ID>' was adopted.\n\t\tconst placeholderForm = service.trim().toLowerCase().replace(/^<|>$/g, '').replace(/[\\s_\\-.]+/g, '');\n\t\tif (placeholderForm === 'serviceid' || placeholderForm === 'projectid') {\n\t\t\tthis._alert(`Replace \"${service}\" with your actual Project ID.`);\n\t\t\tthrow new SkapiError('Project ID is required.', {\n\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t});\n\t\t}\n\t\tlet idSplitLen = service.split('-').length;\n\t\tlet isV2 = idSplitLen === 2;\n\t\tlet isV1 = idSplitLen === 7;\n\t\tif (isV2 || isV1) {\n\t\t\ttry {\n\t\t\t\tlet decoded = decodeProjectId(service);\n\t\t\t\tif (options && typeof options === 'object') {\n\t\t\t\t\t__etc = options;\n\t\t\t\t}\n\n\t\t\t\tif (owner && typeof owner === 'object') {\n\t\t\t\t\toptions = owner;\n\t\t\t\t}\n\n\t\t\t\towner = decoded.owner;\n\t\t\t\tservice = decoded.service;\n\t\t\t} catch (err) {\n\t\t\t\tthis._alert('Service ID is invalid.');\n\t\t\t\tthrow new SkapiError('Service ID is invalid.', {\n\t\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// if (!window.sessionStorage) {\n\t\t// throw new SkapiError('Web browser API is not available.', { code: 'NOT_SUPPORTED' });\n\t\t// }\n\t\t// window.sessionStorage.setItem('__skapi_kiss', 'kiss');\n\t\t// if (window.sessionStorage.getItem('__skapi_kiss') !== 'kiss') {\n\t\t// window.alert('Session storage is disabled. Please enable session storage.');\n\t\t// throw new SkapiError('Session storage is disabled. Please enable session storage.', { code: 'SESSION_STORAGE_DISABLED' });\n\t\t// }\n\n\t\t// window.sessionStorage.removeItem('__skapi_kiss');\n\n\t\tif (!owner || typeof owner !== 'string') {\n\t\t\tthis._alert('Owner ID is invalid.');\n\t\t\tthrow new SkapiError('Owner ID is invalid.', {\n\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t});\n\t\t}\n\n\n\n\t\tif (owner !== this.host) {\n\t\t\ttry {\n\t\t\t\tvalidator.UserId(owner, '\"owner\"');\n\t\t\t} catch (err: any) {\n\t\t\t\tthis._alert('Owner ID is invalid.');\n\t\t\t\tthrow new SkapiError('Owner ID is invalid.', {\n\t\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.service = service;\n\t\tthis.owner = owner;\n\t\ttry {\n\t\t\tthis.project_id = formatServiceId(service, owner);\n\t\t} catch (err) {\n\t\t\t// Non-uuid owner (host-owned service): there is no public compound form.\n\t\t\tthis.project_id = '';\n\t\t}\n\n\t\tlet autoLogin = true;\n\t\tlet refetchServiceInfo = false;\n\t\tif (options) {\n\t\t\tif (typeof options.refetchServiceInfo === 'boolean') {\n\t\t\t\trefetchServiceInfo = options.refetchServiceInfo;\n\t\t\t}\n\t\t\tif (typeof options.autoLogin === 'boolean') {\n\t\t\t\tautoLogin = options.autoLogin;\n\t\t\t}\n\t\t\tif (typeof options.requestBatchSize === 'number') {\n\t\t\t\tif (options.requestBatchSize < 1) {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'\"requestBatchSize\" must be greater than 0.',\n\t\t\t\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.requestBatchSize = options.requestBatchSize;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\toptions?.eventListener &&\n\t\t\ttypeof options.eventListener === 'object'\n\t\t) {\n\t\t\tif (\n\t\t\t\toptions.eventListener?.onLogin &&\n\t\t\t\ttypeof options.eventListener.onLogin === 'function'\n\t\t\t) {\n\t\t\t\tthis.onLogin = options.eventListener.onLogin;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\toptions.eventListener?.onUserUpdate &&\n\t\t\t\ttypeof options.eventListener.onUserUpdate === 'function'\n\t\t\t) {\n\t\t\t\tthis.onUserUpdate = options.eventListener.onUserUpdate;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\toptions.eventListener?.onBatchProcess &&\n\t\t\t\ttypeof options.eventListener.onBatchProcess === 'function'\n\t\t\t) {\n\t\t\t\tthis.onBatchProcess = options.eventListener.onBatchProcess;\n\t\t\t}\n\t\t}\n\n\t\t// get endpoints\n\n\t\tthis.target_cdn = __etc?.target_cdn || this.target_cdn;\n\t\tthis.hostDomain = __etc?.hostDomain || this.hostDomain;\n\t\tthis.customApiDomain = __etc?.customApiDomain || this.customApiDomain;\n\n\t\tthis.__network_logs = !!__etc?.network_logs;\n\n\t\tconst cdn_domain = `https://${this.target_cdn}.cloudfront.net`; // don't change this\n\t\tlet sreg = service.substring(0, 4);\n\n\t\tthis.admin_endpoint = fetch(\n\t\t\t`${cdn_domain}/${sreg}/admin-${this.__endpoint_version}.json`,\n\t\t)\n\t\t\t.then((response) => response.blob())\n\t\t\t.then(\n\t\t\t\t(blob) =>\n\t\t\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\t\treader.onloadend = () => resolve(reader.result);\n\t\t\t\t\t\treader.onerror = reject;\n\t\t\t\t\t\treader.readAsDataURL(blob);\n\t\t\t\t\t}),\n\t\t\t)\n\t\t\t.then((data) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn typeof data === 'string'\n\t\t\t\t\t\t? JSON.parse(atob(data.split(',')[1]))\n\t\t\t\t\t\t: null;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'Service does not exist. Create your service from skapi.com',\n\t\t\t\t\t\t{ code: 'NOT_EXISTS' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.record_endpoint = fetch(\n\t\t\t`${cdn_domain}/${sreg}/record-${this.__endpoint_version}.json`,\n\t\t)\n\t\t\t.then((response) => response.blob())\n\t\t\t.then(\n\t\t\t\t(blob) =>\n\t\t\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\t\treader.onloadend = () => resolve(reader.result);\n\t\t\t\t\t\treader.onerror = reject;\n\t\t\t\t\t\treader.readAsDataURL(blob);\n\t\t\t\t\t}),\n\t\t\t)\n\t\t\t.then((data) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn typeof data === 'string'\n\t\t\t\t\t\t? JSON.parse(atob(data.split(',')[1]))\n\t\t\t\t\t\t: null;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'Service does not exist. Create your service from skapi.com',\n\t\t\t\t\t\t{ code: 'NOT_EXISTS' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\tconst hasWindow = isBrowserRuntime();\n\n\t\tif (hasWindow && !window.sessionStorage) {\n\t\t\tthis._alert('This browser is not supported.');\n\t\t\tthrow new Error(`This browser is not supported.`);\n\t\t}\n\n\t\tconst restore = hasWindow\n\t\t\t? JSON.parse(\n\t\t\t\t\twindow.sessionStorage.getItem(`${service}#${owner}`) ||\n\t\t\t\t\t\t'null',\n\t\t\t\t)\n\t\t\t: null;\n\n\t\tthis.log('constructor:restore', restore);\n\n\t\tif (restore?.connection) {\n\t\t\t// apply all data to class properties\n\t\t\tfor (let k in restore) {\n\t\t\t\tthis[k] = restore[k];\n\t\t\t}\n\n\t\t\tif (!restore.__public_identifier) {\n\t\t\t\tthis.__public_identifier = `${this.service}:${this.owner}:${generateRandom(16)}`;\n\t\t\t}\n\t\t}\n\n\t\tthis.__authConnection = (async (): Promise<void> => {\n\t\t\tconst admin_endpoint = await this.admin_endpoint;\n\t\t\tconst poolSetting = {\n\t\t\t\tUserPoolId: admin_endpoint.userpool_id,\n\t\t\t\tClientId: admin_endpoint.userpool_client,\n\t\t\t} as any;\n\t\t\tif (isNodeRuntime()) {\n\t\t\t\tpoolSetting.Storage = window.localStorage;\n\t\t\t}\n\t\t\tthis.userPool = new CognitoUserPool(poolSetting);\n\n\t\t\ttry {\n\t\t\t\tif (!this.user) {\n\t\t\t\t\t// if (autoLogin && typeof autoLogin === 'object') {\n\t\t\t\t\t// let { idToken = '', accessToken = '', refreshToken = '' } = autoLogin || {};\n\t\t\t\t\t// if (idToken) {\n\t\t\t\t\t// await this.loginWithToken({ idToken, accessToken, refreshToken });\n\t\t\t\t\t// }\n\t\t\t\t\t// }\n\t\t\t\t\tawait authentication.bind(this)().getSession({\n\t\t\t\t\t\tskipUserUpdateEventTrigger: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (this.user) {\n\t\t\t\t\tif (!restore?.connection && !autoLogin) {\n\t\t\t\t\t\t_out.bind(this)();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// only run login listeners if user is logged in (auto login successful)\n\t\t\t\t\t\tthis._runOnLoginListeners(this.user);\n\t\t\t\t\t\tthis._runOnUserUpdateListeners(this.user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (err) {}\n\t\t})();\n\n\t\t// Restore only THIS instance's own scope, under a key that names both service\n\t\t// and owner. The pre-1.8.2 key (`<service>:uniqueids`) held a flat map that\n\t\t// could already have entries from several projects mixed together, so those\n\t\t// blobs are deliberately not read back: a poisoned cache is worse than none.\n\t\t// Other scopes are simply not preloaded, which costs one backend resolve.\n\t\tlet uniqueIdScope = `${this.service}/${this.owner}`;\n\t\tlet uniqueids = hasWindow\n\t\t\t? window.sessionStorage.getItem(`${uniqueIdScope}:uniqueids`)\n\t\t\t: null;\n\t\tif (uniqueids) {\n\t\t\ttry {\n\t\t\t\t// sessionStorage is same-origin writable and the key is guessable, so do not\n\t\t\t\t// trust the shape. The string \"null\" parses without throwing, and anything\n\t\t\t\t// that is not a plain object would poison every later lookup.\n\t\t\t\tlet parsed = JSON.parse(uniqueids);\n\t\t\t\tthis.__my_unique_ids = (parsed && typeof parsed === 'object' && !Array.isArray(parsed))\n\t\t\t\t\t? { [uniqueIdScope]: parsed }\n\t\t\t\t\t: {};\n\t\t\t} catch (err) {\n\t\t\t\tthis.__my_unique_ids = {};\n\t\t\t}\n\t\t}\n\n\t\t// connects to server\n\t\tthis.__connection = (async (): Promise<Connection> => {\n\t\t\tlet connection: Promise<Connection> = null;\n\t\t\tawait this.record_endpoint;\n\n\t\t\tif (!restore?.connection) {\n\t\t\t\t// await for first connection\n\t\t\t\tconnection = this._updateConnection({refresh: refetchServiceInfo});\n\t\t\t}\n\n\t\t\tconst storeClassProperties = () => {\n\t\t\t\tif (this.__class_properties_has_been_cached) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet exec = () => {\n\t\t\t\t\tlet data: Record<string, any> = {};\n\n\t\t\t\t\tconst to_be_cached = [\n\t\t\t\t\t\t'__startKeyHistory', // startKey key : {}\n\t\t\t\t\t\t'__disabledAccount', // disabled account : null\n\t\t\t\t\t\t'__cached_requests', // cached records : {}\n\t\t\t\t\t\t'__request_signup_confirmation', // for resend signup confirmation : null\n\t\t\t\t\t\t'__public_identifier', // public identifier : ''\n\t\t\t\t\t\t'connection', // service info : null\n\t\t\t\t\t];\n\n\t\t\t\t\tif (this.connection) {\n\t\t\t\t\t\tfor (let k of to_be_cached) {\n\t\t\t\t\t\t\tdata[k] = this[k];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (hasWindow) {\n\t\t\t\t\t\t\tconst storageKey = `${service}#${owner}`;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\twindow.sessionStorage.setItem(\n\t\t\t\t\t\t\t\t\tstorageKey,\n\t\t\t\t\t\t\t\t\tJSON.stringify(data),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// QuotaExceededError: __cached_requests can hold\n\t\t\t\t\t\t\t\t// megabytes of paged history (indexing-pass bodies),\n\t\t\t\t\t\t\t\t// and this runs inside beforeunload/visibilitychange —\n\t\t\t\t\t\t\t\t// throwing here surfaced as an uncaught error on every\n\t\t\t\t\t\t\t\t// tab switch. The paging cache is an optimization\n\t\t\t\t\t\t\t\t// (losing it costs a refetch after reload, never\n\t\t\t\t\t\t\t\t// correctness), so retry WITHOUT the paging state —\n\t\t\t\t\t\t\t\t// dropped as a PAIR: cursors without their cached\n\t\t\t\t\t\t\t\t// pages would desync fetchMore after a restore.\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tconst slim = Object.assign({}, data, {\n\t\t\t\t\t\t\t\t\t\t__cached_requests: {},\n\t\t\t\t\t\t\t\t\t\t__startKeyHistory: {},\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\twindow.sessionStorage.setItem(\n\t\t\t\t\t\t\t\t\t\tstorageKey,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(slim),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (err2) {\n\t\t\t\t\t\t\t\t\t// Still over quota (something else filled it):\n\t\t\t\t\t\t\t\t\t// remove any STALE snapshot rather than letting a\n\t\t\t\t\t\t\t\t\t// previous session's state restore against this\n\t\t\t\t\t\t\t\t\t// one's reality.\n\t\t\t\t\t\t\t\t\ttry { window.sessionStorage.removeItem(storageKey); } catch (_e) { /* nothing left to do */ }\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.__class_properties_has_been_cached = true;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\treturn connection instanceof Promise\n\t\t\t\t\t? connection.then(() => exec())\n\t\t\t\t\t: exec();\n\t\t\t};\n\n\t\t\t// attach event to save session on close\n\t\t\tif (hasWindow) {\n\t\t\t\twindow.addEventListener('beforeunload', () => {\n\t\t\t\t\tthis.closeRealtime();\n\t\t\t\t\tstoreClassProperties();\n\t\t\t\t});\n\t\t\t\t// for mobile\n\t\t\t\twindow.addEventListener('visibilitychange', () => {\n\t\t\t\t\tstoreClassProperties();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tawait connection;\n\t\t\tawait this.__authConnection;\n\t\t\treturn this.connection;\n\t\t})();\n\n\t\tthis.__connection.then((conn) => {\n\t\t\tif ((conn?.group || 0) < 3 || this.__network_logs) {\n\t\t\t\tthis.version();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Returns current connection metadata such as service name, client IP, user agent, locale, and SDK version.\n\t * @param params Request parameters. When `refresh` is true, the cached connection metadata is re-fetched before returning; otherwise the cached connection is returned.\n\t * @returns A promise that resolves to Promise<ConnectionInfo>.\n\t */\n\tasync getConnectionInfo(params?: { refresh?: boolean }): Promise<ConnectionInfo> {\n\t\tlet refresh = params?.refresh || false;\n\t\t\n\t\tif (refresh) {\n\t\t\tif(this.__connection instanceof Promise) {\n\t\t\t\tawait this.__connection;\n\t\t\t}\n\t\t\tthis.__connection = this._updateConnection({ refresh: true });\n\t\t}\n\t\tlet conn = await this.__connection;\n\t\t// get browser user-agent info\n\t\tlet ua =\n\t\t\tconn?.user_agent ||\n\t\t\t(isBrowserRuntime() &&\n\t\t\ttypeof window.navigator?.userAgent === 'string'\n\t\t\t\t? window.navigator.userAgent\n\t\t\t\t: `skapi-node/${(globalThis as any)?.process?.versions?.node || 'unknown'}`);\n\t\treturn {\n\t\t\tproject_id: this.project_id,\n\t\t\tuser_ip: conn.ip,\n\t\t\tuser_agent: ua,\n\t\t\tuser_location: conn.locale,\n\t\t\tservice_name: conn.service_name,\n\t\t\tversion: this.__version,\n\t\t\tservice_description: conn?.service_description || \"\",\n\t\t\tai_agent: conn?.ai_agent || \"\",\n\t\t\tconf: conn?.opt\n\t\t};\n\t}\n\n\tprivate async _updateConnection(params?: { refresh: Boolean }): Promise<Connection> {\n\t\tlet refresh = params?.refresh || false;\n\t\ttry {\n\t\t\tthis.connection = await request.bind(this)(\n\t\t\t\t'service',\n\t\t\t\t{\n\t\t\t\t\tservice: this.service,\n\t\t\t\t\towner: this.owner,\n\t\t\t\t\trefresh\n\t\t\t\t},\n\t\t\t\t{ bypassAwaitConnection: true, method: 'get' },\n\t\t\t);\n\t\t} catch (err: any) {\n\t\t\tthis.log('connection fail', err);\n\t\t\tthis._alert(\n\t\t\t\t'Service is not available: ' + (err.message || err.toString()),\n\t\t\t);\n\n\t\t\tthis.connection = null;\n\t\t\tthrow err;\n\t\t}\n\t\treturn this.connection;\n\t}\n\n\tprivate registerTicket = registerTicket.bind(this);\n\tprivate unregisterTicket = unregisterTicket.bind(this);\n\n\t/**\n\t * Returns the current SDK version and prints runtime version details in browser environments.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\tasync version(): Promise<string> {\n\t\tawait this.__connection;\n\n\t\tif (isBrowserRuntime()) {\n\t\t\tlet skapi = `%c\\r\\n $$\\\\ $$\\\\ \\r\\n $$ | \\\\__|\\r\\n $$$$$$$\\\\ $$ | $$\\\\ $$$$$$\\\\ $$$$$$\\\\ $$\\\\ \\r\\n$$ _____|$$ | $$ |\\\\____$$\\\\ $$ __$$\\\\ $$ |\\r\\n\\\\$$$$$$\\\\ $$$$$$ \\/ $$$$$$$ |$$ \\/ $$ |$$ |\\r\\n \\\\____$$\\\\ $$ _$$< $$ __$$ |$$ | $$ |$$ |\\r\\n$$$$$$$ |$$ | \\\\$$\\\\\\\\$$$$$$$ |$$$$$$$ |$$ |\\r\\n\\\\_______\\/ \\\\__| \\\\__|\\\\_______|$$ ____\\/ \\\\__|\\r\\n $$ | \\r\\n $$ | \\r\\n \\\\__| \\r\\n`;\n\t\t\tlet message = `Built with:\\n${skapi}Version: ${this.__version}\\n\\nFull Documentation: https://docs.skapi.com/skapi.md`;\n\t\t\tconsole.log(message, `font-family: monospace; color:blue;`);\n\t\t\tif (this.connection.group === 1) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`%cSKAPI: THE SERVICE IS IN TRIAL MODE.`,\n\t\t\t\t\t`font-family: monospace; color:red;`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn this.__version;\n\t}\n\n\tprivate log(n: string, v: any) {\n\t\tif (this.__network_logs) {\n\t\t\tif (v !== null && typeof v === 'object') {\n\t\t\t\ttry {\n\t\t\t\t\t// if it's not a browser runtime, print as a string to avoid [Object object] issue\n\t\t\t\t\tif (!isBrowserRuntime()) {\n\t\t\t\t\t\tv = JSON.stringify(v, null, 2);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv = JSON.parse(JSON.stringify(v));\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tv = String(v);\n\t\t\t\t}\n\t\t\t} else if (typeof v === 'string' && v.length > 100) {\n\t\t\t\tv = v.substring(0, 100) + '...';\n\t\t\t}\n\n\t\t\tconsole.log(`%c${n}:`, 'color: blue;', v);\n\t\t}\n\t}\n\n\t/**\n\t * Fetches feed records visible to the current user with optional access-group filtering and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<RecordData>>.\n\t */\n\t@formHandler()\n\tgetFeed(\n\t\tparams?: { access_group?: number },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<RecordData>> {\n\t\treturn getFeed.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Closes an active WebRTC connection by cid or closes all active RTC connections.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<void>.\n\t */\n\t@formHandler()\n\tcloseRTC(params: { cid?: string; close_all?: boolean }): Promise<void> {\n\t\treturn closeRTC.bind(this)(params);\n\t}\n\n\t/**\n\t * Creates or joins a WebRTC session and returns an RTC connector for streaming events and controls.\n\t * @param params Request parameters.\n\t * @param callback Callback invoked for events or updates.\n\t * @returns A promise that resolves to Promise<RTCConnector>.\n\t */\n\t@formHandler()\n\tconnectRTC(\n\t\tparams: RTCConnectorParams,\n\t\tcallback: (e: RTCEvent) => void,\n\t): Promise<RTCConnector> {\n\t\treturn connectRTC.bind(this)(params, callback);\n\t}\n\n\t/**\n\t * Opens a realtime WebSocket connection and registers a callback for incoming realtime messages.\n\t * The WebSocket is delivered through the callback (and stored on the instance); on the initial connection the returned promise resolves to undefined rather than the socket.\n\t * @param callback Callback invoked for events or updates.\n\t * @returns A promise that resolves to Promise<WebSocket | void>.\n\t */\n\tconnectRealtime(callback: RealtimeCallback): Promise<WebSocket | void> {\n\t\treturn connectRealtime.bind(this)(callback);\n\t}\n\n\t/**\n\t * Casts a spell (uploads the given spell/name). The server response is not surfaced; resolves to a fixed confirmation string.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\tspellcast(params: {\n\t\tspell: string;\n\t\tname: string;\n\t\tmagic?: any;\n\t}): Promise<string> {\n\t\treturn spellcast.bind(this)(params);\n\t}\n\n\t/**\n\t * Searches previously stored spell records by spell text or name. Defaults to 'spell' search if no search type is specified.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<{ spell: string; magic?: any; name: string; }>>.\n\t */\n\t@formHandler()\n\tgetspell(params?: { search?: 'spell' | 'name'; value?: string }): Promise<\n\t\tDatabaseResponse<{\n\t\t\tspell: string;\n\t\t\tname: string;\n\t\t\tmagic?: any;\n\t\t}>\n\t> {\n\t\treturn getspell.bind(this)(params);\n\t}\n\n\t/**\n\t * Uploads a dopamine message. In non-browser runtimes, resolves to a formatted string (including the video URL, and the previous message if one exists); in the browser it alerts and redirects, resolving to undefined.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string | void>.\n\t */\n\t@formHandler()\n\tdopamine(params: { message: string; name: string }): Promise<string | void> {\n\t\treturn dopamine.bind(this)(params);\n\t}\n\t/**\n\t * Queries unique ID records by unique_id or condition filters.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<UniqueId>>.\n\t */\n\t@formHandler()\n\tgetUniqueId(\n\t\tparams?: Form<{\n\t\t\t/** Unique ID */\n\t\t\tunique_id?: string;\n\t\t\t/** String query condition for the unique_id value. */\n\t\t\tcondition?: Condition | 'ne' | '!=';\n\t\t}>,\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<UniqueId>> {\n\t\treturn getUniqueId.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Resends an existing user invitation email to the target address.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Invitation has been re-sent. (User ID: xxx...)\">.\n\t */\n\t@formHandler()\n\tresendInvitation(\n\t\tparams: Form<{\n\t\t\temail: string;\n\t\t}>,\n\t): Promise<'SUCCESS: Invitation has been re-sent. (User ID: xxx...)'> {\n\t\treturn resendInvitation.bind(this)(params);\n\t}\n\n\t/**\n\t * Cancels a pending invitation for the target email address.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Invitation has been canceled.\">.\n\t */\n\t@formHandler()\n\tcancelInvitation(\n\t\tparams: Form<{\n\t\t\temail: string;\n\t\t}>,\n\t): Promise<'SUCCESS: Invitation has been canceled.'> {\n\t\treturn cancelInvitation.bind(this)(params);\n\t}\n\n\t/**\n\t * Lists invitation records with optional email filtering and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<UserProfile>>.\n\t */\n\t@formHandler()\n\tgetInvitations(\n\t\tparams?: Form<{\n\t\t\temail?: string;\n\t\t}>,\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<UserProfile>> {\n\t\treturn getInvitations.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Completes OpenID login and optionally merges the OpenID identity with an existing account.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<{ userProfile: UserProfile; openid: { [attribute: string]: string } }>.\n\t */\n\t@formHandler()\n\topenIdLogin(params: {\n\t\ttoken: string;\n\t\tid: string;\n\t\tmerge?: boolean | string[];\n\t\ttemplate?: {\n\t\t\t/** message_id of the template to use for the welcome e-mail (sent the first time this OpenID user account is created). */\n\t\t\twelcome?: string;\n\t\t};\n\t}): Promise<{\n\t\tuserProfile: UserProfile;\n\t\topenid: { [attribute: string]: string };\n\t}> {\n\t\treturn openIdLogin.bind(this)(params);\n\t}\n\n\t/**\n\t * Logs in a user with externally issued id/access/refresh tokens.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<UserProfile>.\n\t */\n\t@formHandler()\n\tloginWithToken(params: {\n\t\tidToken: string;\n\t\taccessToken?: string;\n\t\trefreshToken?: string;\n\t}): Promise<UserProfile> {\n\t\treturn loginWithToken.bind(this)(params);\n\t}\n\n\t// /**\n\t// * Creates or updates a newsletter group with its delivery restriction settings.\n\t// * @param params Request parameters.\n\t// * @returns A promise that resolves to Promise<\"SUCCESS: Your newsletter group has been registered.\">.\n\t// */\n\t// @formHandler()\n\t// registerNewsletterGroup(params: Form<{\n\t// group: string;\n\t// restriction: number;\n\t// }>): Promise<\"SUCCESS: Your newsletter group has been registered.\"> {\n\t// return registerNewsletterGroup.bind(this)(params) as Promise<\"SUCCESS: Your newsletter group has been registered.\">;\n\t// }\n\t/**\n\t * Sends a secure outbound request using a Skapi client secret key.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to the final API response, or to a status object when the request is queued.\n\t */\n\t@formHandler()\n\tclientSecretRequest(params: {\n\t\turl: string;\n\t\tclientSecretName: string;\n\t\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\theaders?: { [key: string]: string };\n\t\tdata?: { [key: string]: any };\n\t\tparams?: { [key: string]: string };\n\t\tpoll?: number; // Polling interval in milliseconds. When > 0 the promise resolves immediately with the initial status object and the final result is delivered via onResponse/onError. When omitted or 0, the status object is returned with a poll() method to start polling manually.\n\t\tqueue?: string; // Optional queue name. Requests sharing the same queue are processed sequentially.\n\t\texpires?: number; // Optional expiration time in seconds for the request record.\n\t\tonResponse?: (res: any) => void; // Called with the final API response once polling resolves, or immediately for non-queued responses.\n\t\tonError?: (err: any) => void; // Called when polling or the initial request fails.\n\t}): Promise<any | {\n\t\tid: string;\n\t\tstatus: 'running' | 'pending';\n\t\tqueue_name: string;\n\t\tin_queue: number;\n\t\tpoll?: (arg?: { latency?: number }) => Promise<any>;\n\t}> {\n\t\treturn clientSecretRequest.bind(this)(params);\n\t}\n\n\t/**\n\t * Retrieves the history of client secret requests for a given URL and method.\n\t *\n\t * Listing modifiers: `compact` returns lightweight label/marker stubs\n\t * (request_text, response_text, response_complete_marker) instead of the\n\t * full request/response bodies, which stay on the server; `queue_exact`\n\t * restricts a queue listing to exactly the named queue (the queue lookup is\n\t * otherwise a prefix range, so queue \"u1\" would also match \"u1-bg\");\n\t * `queue_exclude` drops one queue's rows from the listing. Both queue\n\t * filters are applied server-side after the range read, so a page can come\n\t * back short while more matches remain - keep paging by startKey/endOfList.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to a paginated list of request history items.\n\t */\n\t@formHandler()\n\tclientSecretRequestHistory(\n\t\tparams: {\n\t\t\turl: string;\n\t\t\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\t\tqueue?: string; // Optional queue name to filter results.\n\t\t\tstatus?: 'pending' | 'running' | 'resolved' | 'failed'; // Optional status filter.\n\t\t\tcompact?: boolean; // Return label/marker stubs instead of full request/response bodies.\n\t\t\tqueue_exact?: boolean; // Match the named queue exactly (a bare queue lookup is a prefix range: \"u1\" also matches \"u1-bg\").\n\t\t\tqueue_exclude?: string; // Drop this queue's rows from the listing.\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<RequestHistory[]>> {\n\t\treturn clientSecretRequestHistory.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Cancels a pending client secret request and removes it from the client-side queue if applicable.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to a result object with removed status and message.\n\t */\n\t@formHandler()\n\tcancelClientSecretRequest(params: {\n\t\turl: string;\n\t\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\tid: string; // Request ID to cancel.\n\t\tqueue?: string; // Optional queue name the request belongs to, used to remove it from the client-side queue.\n\t}): Promise<{ removed: boolean; message: string }> {\n\t\treturn cancelClientSecretRequest.bind(this)(params);\n\t}\n\n\t/**\n\t * Stops live polling for client secret requests without cancelling the requests\n\t * themselves. The server-side work continues; only this client stops asking about it.\n\t *\n\t * Use it to drop polling traffic while the user is not looking at the results (a\n\t * hidden tab, a closed view), then simply poll again when they return. Polls run\n\t * one-at-a-time per queue, so a poll for a request that never settles otherwise\n\t * blocks every poll queued behind it.\n\t *\n\t * Pass `id` (with `url` and `method`) to stop one request, `queue` to stop a queue's\n\t * polls, or neither to stop all of them. A stopped poll resolves with\n\t * `{ id, status: 'stopped' }` rather than rejecting, and its `onResponse`/`onError`\n\t * callbacks are not called.\n\t *\n\t * @param params Which polls to stop.\n\t * @returns The number of polls stopped.\n\t */\n\tstopClientSecretPolling(params?: {\n\t\turl?: string;\n\t\tmethod?: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\tid?: string; // Request ID (short form, paired with url+method, or an already-full id).\n\t\tqueue?: string; // Queue name the polls were started with.\n\t\tservice?: string;\n\t\towner?: string;\n\t}): number {\n\t\treturn stopClientSecretPolling.bind(this)(params || {});\n\t}\n\n\t/**\n\t * True if a poll result came from stopClientSecretPolling rather than the server.\n\t * @param res A resolved poll result.\n\t */\n\tisPollStopped(res: any): boolean {\n\t\treturn isPollStopped(res);\n\t}\n\n\t/**\n\t * Returns the number of requests currently waiting in a named client secret request queue.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to queue count information.\n\t */\n\tclientSecretRequestQueueCount(params: {\n\t\tqueue: string;\n\t\tservice?: string;\n\t\towner?: string;\n\t}): Promise<{ queue_name: string; in_queue: number }> {\n\t\treturn clientSecretRequestQueueCount.bind(this)(params);\n\t}\n\n\t/**\n\t * Consumes a one-time ticket and executes the ticketed request payload.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<any>.\n\t */\n\t@formHandler()\n\tconsumeTicket(params: {\n\t\tticket_id: string;\n\t\tmethod: string; // GET | POST\n\t\tauth?: boolean;\n\t\tdata?: {\n\t\t\t[key: string]: any;\n\t\t};\n\t}): Promise<any> {\n\t\treturn consumeTicket.bind(this)(params);\n\t}\n\n\t/**\n\t * Lists consumed tickets with optional filters and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<any>>.\n\t */\n\t@formHandler()\n\tgetConsumedTickets(\n\t\tparams: { ticket_id?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<any>> {\n\t\treturn getConsumedTickets.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Lists issued tickets with optional filters and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<any>>.\n\t */\n\t@formHandler()\n\tgetTickets(\n\t\tparams: { ticket_id?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<any>> {\n\t\treturn getTickets.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Closes the active realtime WebSocket connection.\n\t * @returns A promise that resolves to Promise<void>.\n\t */\n\tcloseRealtime(): Promise<void> {\n\t\treturn closeRealtime.bind(this)();\n\t}\n\n\t/**\n\t * Fetches currently connected users in a realtime group.\n\t * @param params Request parameters. When `group` is omitted, it defaults to the realtime group the user is currently joined to.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<{ user_id: string; cid: string }[]>>.\n\t */\n\t@formHandler()\n\tgetRealtimeUsers(\n\t\tparams?: { group?: string; user_id?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<{ user_id: string; cid: string }[]>> {\n\t\treturn getRealtimeUsers.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Sends an inquiry email payload to the service contact channel.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Inquiry has been sent.\">.\n\t */\n\t@formHandler()\n\tsendInquiry(\n\t\tparams: Form<{\n\t\t\tname: string;\n\t\t\temail: string;\n\t\t\tsubject: string;\n\t\t\tmessage: string;\n\t\t}>,\n\t): Promise<'SUCCESS: Inquiry has been sent.'> {\n\t\treturn sendInquiry.bind(this)(params);\n\t}\n\n\t/**\n\t * Blocks a user account by user_id.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: The user has been blocked.\">.\n\t */\n\t@formHandler()\n\tblockAccount(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: The user has been blocked.'> {\n\t\treturn blockAccount.bind(this)(params);\n\t}\n\n\t/**\n\t * Unblocks a previously blocked user account by user_id.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: The user has been unblocked.\">.\n\t */\n\t@formHandler()\n\tunblockAccount(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: The user has been unblocked.'> {\n\t\treturn unblockAccount.bind(this)(params);\n\t}\n\n\t/**\n\t * Deletes a user account by user_id.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Account has been deleted.\">.\n\t */\n\t@formHandler()\n\tdeleteAccount(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: Account has been deleted.'> {\n\t\treturn deleteAccount.bind(this)(params);\n\t}\n\n\t/**\n\t * Invites a user by email with optional attributes and invitation email options.\n\t * @param params Payload for the request.\n\t * @param options Optional behavior configuration.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Invitation has been sent. (User ID: xxx...)'>.\n\t */\n\t@formHandler()\n\tinviteUser(\n\t\tparams: UserAttributes & { openid_id?: string; access_group?: number },\n\t\toptions?: {\n\t\t\tconfirmation_url?: string;\n\t\t\temail_subscription?: boolean;\n\t\t\ttemplate?: {\n\t\t\t\turl: string;\n\t\t\t\tsubject: string;\n\t\t\t};\n\t\t},\n\t): Promise<'SUCCESS: Invitation has been sent. (User ID: xxx...)'> {\n\t\treturn inviteUser.bind(this)(params, options);\n\t}\n\n\t/**\n\t * Creates a user account directly from admin context.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<UserProfile & { email_admin: string; username: string; }>.\n\t */\n\t@formHandler()\n\tcreateAccount(\n\t\tparams: UserAttributes & { email: string; password: string; access_group?: number },\n\t): Promise<UserProfile & { email_admin: string; username: string }> {\n\t\treturn createAccount.bind(this)(params);\n\t}\n\n\t/**\n\t * Updates a user's access_group level.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Access has been granted to the user.'>.\n\t */\n\t@formHandler()\n\tgrantAccess(params: {\n\t\tuser_id: string;\n\t\taccess_group: number;\n\t}): Promise<'SUCCESS: Access has been granted to the user.'> {\n\t\treturn grantAccess.bind(this)(params);\n\t}\n\n\t/**\n\t * Updates another user's profile attributes from admin context.\n\t * Requires the target user's user_id plus at least one attribute to update.\n\t * @param params Target user_id and the attributes to update.\n\t * @returns A promise that resolves to Promise<'SUCCESS: User attributes updated.'>.\n\t */\n\t@formHandler()\n\tupdateUserAttributes(\n\t\tparams: UserAttributes & { user_id: string },\n\t): Promise<'SUCCESS: User attributes updated.'> {\n\t\treturn updateUserAttributes.bind(this)(params);\n\t}\n\n\t/**\n\t * Lists realtime groups with optional search conditions and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<{ group: string; number_of_users: number; }>>.\n\t */\n\t@formHandler()\n\tgetRealtimeGroups(\n\t\tparams?: {\n\t\t\t/** Index name to search. */\n\t\t\tsearchFor?: 'group' | 'number_of_users';\n\t\t\t/** Index value to search. */\n\t\t\tvalue?: string | number;\n\t\t\t/** Search condition. */\n\t\t\tcondition?:\n\t\t\t\t| '>'\n\t\t\t\t| '>='\n\t\t\t\t| '='\n\t\t\t\t| '<'\n\t\t\t\t| '<='\n\t\t\t\t| '!='\n\t\t\t\t| 'gt'\n\t\t\t\t| 'gte'\n\t\t\t\t| 'eq'\n\t\t\t\t| 'lt'\n\t\t\t\t| 'lte'\n\t\t\t\t| 'ne';\n\t\t\t/** Range of search. */\n\t\t\trange?: string | number;\n\t\t} | null,\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<{ group: string; number_of_users: number }>> {\n\t\treturn getRealtimeGroups.bind(this)(params, fetchOptions);\n\t}\n\t// /**\n\t// * Calls the newsletter group endpoint for administrative group operations.\n\t// * @param params Request parameters.\n\t// */\n\t// @formHandler()\n\t// newsletterGroupEndpoint(params) {\n\t// return newsletterGroupEndpoint.bind(this)(params);\n\t// }\n\t/**\n\t * Sends realtime data to a user or group with optional push notification metadata.\n\t * @param message Message payload to send.\n\t * @param recipient Recipient user or group target.\n\t * @param notification Optional notification payload.\n\t * @returns A promise that resolves to Promise<{ type: 'success', message: 'Message sent.' }>.\n\t */\n\t@formHandler()\n\tpostRealtime(\n\t\tmessage: any,\n\t\trecipient: string,\n\t\tnotification?: {\n\t\t\tconfig?: { always: boolean };\n\t\t\ttitle: string;\n\t\t\tbody: string;\n\t\t},\n\t): Promise<{ type: 'success'; message: 'Message sent.' }> {\n\t\treturn postRealtime.bind(this)(message, recipient, notification);\n\t}\n\n\t/**\n\t * Joins the current connection to a realtime group or leaves group membership when null.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<{ type: 'success', message: string }>.\n\t */\n\t@formHandler()\n\tjoinRealtime(params: {\n\t\tgroup?: string | null;\n\t}): Promise<{ type: 'success'; message: string }> {\n\t\treturn joinRealtime.bind(this)(params);\n\t}\n\n\t// /**\n\t// * Returns the active service connection object after initialization.\n\t// * @returns A promise that resolves to Promise<Connection>.\n\t// */\n\t// private _getConnection(): Promise<Connection> {\n\t// return this.__connection;\n\t// }\n\n\t/**\n\t * Retrieves the currently authenticated user profile, optionally refreshing token/session state.\n\t * @param options Optional behavior configuration.\n\t * @returns A promise that resolves to Promise<UserProfile | null>.\n\t */\n\t@formHandler()\n\tgetProfile(options?: {\n\t\trefreshToken?: boolean;\n\t}): Promise<UserProfile | null> {\n\t\treturn getProfile.bind(this)(options);\n\t}\n\t/**\n\t * Retrieves a file by URL with optional conversion mode, expiration, and progress handling.\n\t * @param url Target URL.\n\t * @param config Additional configuration options.\n\t * @returns A promise that resolves to Promise<Blob | string | void | FileInfo>.\n\t */\n\t@formHandler()\n\tgetFile(\n\t\turl: string, // cdn endpoint url https://xxxx.cloudfront.net/path/file\n\t\tconfig?: {\n\t\t\tdataType?:\n\t\t\t\t| 'base64'\n\t\t\t\t| 'download'\n\t\t\t\t| 'endpoint'\n\t\t\t\t| 'blob'\n\t\t\t\t| 'text'\n\t\t\t\t| 'info'; // default 'download'\n\t\t\texpires?: number; // uses url that expires. this option does not use the cdn (slow). can be used for private files. (does not work on public files).\n\t\t\t// Seconds the browser may reuse the url minted for `expires`. Without\n\t\t\t// it every call mints a new signed url, which is a new cache key, so\n\t\t\t// the file downloads again every time. See getFile in\n\t\t\t// methods/database.ts. Only meaningful together with `expires`.\n\t\t\tbrowserCache?: number;\n\t\t\t// Bypass the cached mint above and force a fresh signed url.\n\t\t\trefresh?: boolean;\n\t\t\tprogress?: ProgressCallback;\n\t\t},\n\t): Promise<Blob | string | void | FileInfo> {\n\t\treturn getFile.bind(this)(url, config);\n\t}\n\t/**\n\t * Executes authenticated secure API requests in single or batch mode.\n\t * @param params Request parameters.\n\t * @param url Target URL.\n\t * @returns A promise that resolves to Promise<Response | Response[]>.\n\t */\n\t@formHandler()\n\tsecureRequest<\n\t\tParams = {\n\t\t\t/** Request url */\n\t\t\turl: string;\n\t\t\t/** Request data */\n\t\t\tdata?: any;\n\t\t\t/** requests are sync when true */\n\t\t\tsync?: boolean;\n\t\t},\n\t\tResponse = { response: any; statusCode: number; url: string },\n\t>(\n\t\tparams: Params[] | Form<Params>,\n\t\turl?: string,\n\t): Promise<Response | Response[]> {\n\t\treturn secureRequest.bind(this)(params, url);\n\t}\n\t/**\n\t * Relays a request to a destination of your choosing from the server side,\n\t * with the service api key added where the browser cannot read it, and\n\t * streams the destination's response back as it arrives.\n\t *\n\t * The body is relayed verbatim, so an html form reaches the destination as\n\t * multipart/form-data, files included; the form's own enctype and method\n\t * attributes are not used. Supply options.onStream to receive the response\n\t * chunk by chunk. An error response throws a SkapiError either way; reading\n\t * the status code or a response header needs options.responseType\n\t * 'response'. options.signal stops the client receiving the response, it\n\t * does not cancel the request already sent to the destination.\n\t *\n\t * @param form Form element, submit event, FormData, or a plain object. Sent to the destination verbatim.\n\t * @param options Destination url, method, headers, and an optional onStream callback.\n\t * @returns A promise that resolves to the destination's response.\n\t */\n\t// Decorated like every other form-taking method, so\n\t// onsubmit=\"skapi.forwardRequest(event, {...})\" works with no preventDefault\n\t// from the caller: the decorator calls it and passes the event through\n\t// untouched.\n\t//\n\t// One caveat belongs with a STREAMING call. When the form carries an `action`\n\t// attribute the decorator serializes the resolved value into sessionStorage\n\t// and navigates there, which throws the stream away. Streaming forms should\n\t// have no action.\n\t@formHandler()\n\tforwardRequest(\n\t\tform: any,\n\t\toptions: {\n\t\t\turl: string;\n\t\t\tmethod?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD';\n\t\t\theaders?: { [key: string]: string };\n\t\t\tapiKeyHeader?: string;\n\t\t\tapiKeyScheme?: string;\n\t\t\tonStream?: (chunk: string) => void;\n\t\t\tsignal?: AbortSignal;\n\t\t\tresponseType?: 'json' | 'text' | 'response';\n\t\t},\n\t): Promise<any> {\n\t\treturn forwardRequest.bind(this)(form, options);\n\t}\n\t/**\n\t * Returns a normalized response object for form-based handler flows.\n\t * @returns A promise that resolves to Promise<any>.\n\t */\n\t@formHandler()\n\tgetFormResponse(): Promise<any> {\n\t\treturn getFormResponse.bind(this)();\n\t}\n\t/**\n\t * Queries database records with filtering, sorting, and pagination options.\n\t * @param query Query object used to filter results.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<RecordData>>.\n\t */\n\t@formHandler()\n\tgetRecords(\n\t\tquery: GetRecordQuery & { private_key?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<RecordData>> {\n\t\treturn getRecords.bind(this)(query, fetchOptions);\n\t}\n\t/**\n\t * Lists table metadata with optional table-name filters.\n\t * @param query Query object used to filter results.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<Table>>.\n\t */\n\t@formHandler()\n\tgetTables(\n\t\t/** If omitted, fetches the full list of tables. */\n\t\tquery?: {\n\t\t\ttable?: string;\n\t\t\t/** Condition operator of table name. */\n\t\t\tcondition?: Condition;\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<Table>> {\n\t\treturn getTables.bind(this)(query, fetchOptions);\n\t}\n\t/**\n\t * Lists index metadata and aggregated index statistics for a table.\n\t * @param query Query object used to filter results.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<Index>>.\n\t */\n\t@formHandler()\n\tgetIndexes(\n\t\tquery: {\n\t\t\t/** Table name */\n\t\t\ttable: string;\n\t\t\t/** Index name. When period is at the end of name, querys nested index keys. */\n\t\t\tindex?: string;\n\t\t\t/** Queries order by */\n\t\t\torder?: {\n\t\t\t\t/** Key name to order by. */\n\t\t\t\tby:\n\t\t\t\t\t| 'average_number'\n\t\t\t\t\t| 'total_number'\n\t\t\t\t\t| 'number_count'\n\t\t\t\t\t| 'average_bool'\n\t\t\t\t\t| 'total_bool'\n\t\t\t\t\t| 'bool_count'\n\t\t\t\t\t| 'string_count'\n\t\t\t\t\t| 'index_name'\n\t\t\t\t\t| 'number_of_records';\n\t\t\t\t/** Value to query. */\n\t\t\t\tvalue?: number | boolean | string;\n\t\t\t\tcondition?: Condition;\n\t\t\t};\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<Index>> {\n\t\treturn getIndexes.bind(this)(query, fetchOptions);\n\t}\n\t/**\n\t * Lists tags used in a table with optional tag-name filtering.\n\t * @param query Query object used to filter results.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<Tag>>.\n\t */\n\t@formHandler()\n\tgetTags(\n\t\tquery?: {\n\t\t\t/** Table name */\n\t\t\ttable?: string;\n\t\t\t/** Tag name */\n\t\t\ttag?: string;\n\t\t\t/** String query condition for tag name. */\n\t\t\tcondition?: Condition;\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<Tag>> {\n\t\treturn getTags.bind(this)(query, fetchOptions);\n\t}\n\t/**\n\t * Deletes records by query or record_id and returns deletion results.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<string | DatabaseResponse<RecordData>>.\n\t */\n\t@formHandler()\n\tdeleteRecords(\n\t\tparams: DelRecordQuery & { private_key?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<string | DatabaseResponse<RecordData>> {\n\t\treturn deleteRecords.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Resends the signup confirmation email for the current pending account.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Signup confirmation e-mail has been sent.'>.\n\t */\n\t@formHandler()\n\tresendSignupConfirmation(): Promise<'SUCCESS: Signup confirmation e-mail has been sent.'> {\n\t\treturn resendSignupConfirmation.bind(this)();\n\t}\n\t/**\n\t * Sends an account recovery email and optionally sets a recovery redirect URL.\n\t * @param redirect Redirect URL or false to disable redirect.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Recovery e-mail has been sent.\">.\n\t */\n\t@formHandler()\n\trecoverAccount(\n\t\t/** Redirect url on confirmation success. */\n\t\tredirect: boolean | string = false,\n\t): Promise<'SUCCESS: Recovery e-mail has been sent.'> {\n\t\treturn recoverAccount.bind(this)(redirect);\n\t}\n\t/**\n\t * Queries users by supported profile/search fields with pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<UserPublic>>.\n\t */\n\t@formHandler()\n\tgetUsers(\n\t\tparams?: {\n\t\t\t/** Index name to search. */\n\t\t\tsearchFor:\n\t\t\t\t| 'user_id'\n\t\t\t\t| 'email'\n\t\t\t\t| 'phone_number'\n\t\t\t\t| 'locale'\n\t\t\t\t| 'name'\n\t\t\t\t| 'address'\n\t\t\t\t| 'gender'\n\t\t\t\t| 'birthdate'\n\t\t\t\t| 'subscribers'\n\t\t\t\t| 'timestamp'\n\t\t\t\t| 'access_group'\n\t\t\t\t| 'approved';\n\t\t\t/** Index value to search. */\n\t\t\tvalue: string | number | string[];\n\t\t\t/** Search condition. */\n\t\t\tcondition?:\n\t\t\t\t| '>'\n\t\t\t\t| '>='\n\t\t\t\t| '='\n\t\t\t\t| '<'\n\t\t\t\t| '<='\n\t\t\t\t| 'gt'\n\t\t\t\t| 'gte'\n\t\t\t\t| 'eq'\n\t\t\t\t| 'lt'\n\t\t\t\t| 'lte';\n\t\t\t/** Range of search. */\n\t\t\trange?: string | number;\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<UserPublic>> {\n\t\treturn getUsers.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Disables the currently logged-in user account.\n\t * @returns A promise that resolves to Promise<'SUCCESS: account has been disabled.'>.\n\t */\n\t@formHandler()\n\tdisableAccount(): Promise<'SUCCESS: account has been disabled.'> {\n\t\treturn disableAccount.bind(this)();\n\t}\n\t/**\n\t * Returns the last verified email or reverts to it when revert is requested.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string | UserProfile>.\n\t */\n\t@formHandler()\n\tlastVerifiedEmail(params?: {\n\t\trevert: boolean; // Reverts to last verified e-mail when true.\n\t}): Promise<string | UserProfile> {\n\t\treturn lastVerifiedEmail.bind(this)(params);\n\t}\n\t/**\n\t * Unsubscribes the user from a newsletter group.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\tunsubscribeNewsletter(params: {\n\t\tgroup: number | 'public' | 'authorized' | 'admin';\n\t}): Promise<string> {\n\t\treturn unsubscribeNewsletter.bind(this)(params);\n\t}\n\t// /**\n\t// * Sends an administrative newsletter request payload.\n\t// * @param params Request parameters.\n\t// */\n\t// @formHandler()\n\t// adminNewsletterRequest(params) {\n\t// return adminNewsletterRequest.bind(this)(params);\n\t// }\n\t/**\n\t * Registers a web push subscription endpoint for notifications.\n\t * @param endpoint Push subscription endpoint URL.\n\t * @param keys Web Push key pair values.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Subscribed to receive notifications.'>.\n\t */\n\t@formHandler()\n\tsubscribeNotification(\n\t\tendpoint: string,\n\t\tkeys: {\n\t\t\tp256dh: string;\n\t\t\tauth: string;\n\t\t},\n\t): Promise<'SUCCESS: Subscribed to receive notifications.'> {\n\t\treturn subscribeNotification.bind(this)({ endpoint, keys });\n\t}\n\t/**\n\t * Removes a registered web push subscription endpoint.\n\t * @param endpoint Push subscription endpoint URL.\n\t * @param keys Web Push key pair values.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Unsubscribed from notifications.'>.\n\t */\n\t@formHandler()\n\tunsubscribeNotification(\n\t\tendpoint: string,\n\t\tkeys: {\n\t\t\tp256dh: string;\n\t\t\tauth: string;\n\t\t},\n\t): Promise<'SUCCESS: Unsubscribed from notifications.'> {\n\t\treturn unsubscribeNotification.bind(this)({ endpoint, keys });\n\t}\n\t/**\n\t * Returns the VAPID public key required for browser push subscription setup.\n\t * @returns A promise that resolves to Promise<{ VAPIDPublicKey: string }>.\n\t */\n\t@formHandler()\n\tvapidPublicKey(): Promise<{ VAPIDPublicKey: string }> {\n\t\treturn vapidPublicKey.bind(this)();\n\t}\n\t/**\n\t * Sends push notifications to one or more users.\n\t * @param params Payload for the request.\n\t * @param user_ids Parameter for this operation.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Notification sent.\">.\n\t */\n\t@formHandler()\n\tpushNotification(\n\t\tparams: {\n\t\t\ttitle: string;\n\t\t\tbody: string;\n\t\t},\n\t\tuser_ids?: string | string[],\n\t): Promise<'SUCCESS: Notification sent.'> {\n\t\treturn pushNotification.bind(this)(params, user_ids);\n\t}\n\n\t/**\n\t * Fetches newsletter delivery records with filters and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<Newsletter>>.\n\t */\n\t@formHandler()\n\tgetNewsletters(\n\t\tparams?: {\n\t\t\t/**\n\t\t\t * Search points.<br>\n\t\t\t * 'message_id' and 'subject' value should be string.<br>\n\t\t\t * Others numbers.\n\t\t\t */\n\t\t\tsearchFor:\n\t\t\t\t| 'message_id'\n\t\t\t\t| 'timestamp'\n\t\t\t\t| 'read'\n\t\t\t\t| 'complaint'\n\t\t\t\t| 'bounced'\n\t\t\t\t| 'subject';\n\t\t\tvalue: string | number;\n\t\t\trange?: string | number;\n\t\t\t/**\n\t\t\t * Defaults to '=',\n\t\t\t * Condition does not work with range.\n\t\t\t */\n\t\t\tcondition?:\n\t\t\t\t| '>'\n\t\t\t\t| '>='\n\t\t\t\t| '='\n\t\t\t\t| '<'\n\t\t\t\t| '<='\n\t\t\t\t| 'gt'\n\t\t\t\t| 'gte'\n\t\t\t\t| 'eq'\n\t\t\t\t| 'lt'\n\t\t\t\t| 'lte';\n\t\t\tgroup: 'public' | 'authorized' | number;\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<Newsletter>> {\n\t\treturn getNewsletters.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Gets newsletter subscription status for the requested groups.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<{ active: boolean; timestamp: number; group: number; subscribed_email: string; }[]>.\n\t */\n\t@formHandler()\n\tgetNewsletterSubscription(\n\t\tparams: { group?: number | 'public' | 'authorized'; user_id?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<\n\t\t| {\n\t\t\tactive: boolean;\n\t\t\ttimestamp: number;\n\t\t\tgroup: number;\n\t\t\tsubscribed_email: string;\n\t\t}[]\n\t\t| DatabaseResponse<{\n\t\t\tactive: boolean;\n\t\t\ttimestamp: number;\n\t\t\tgroup: number;\n\t\t\tsubscribed_email: string;\n\t\t}>\n\t> {\n\t\treturn getNewsletterSubscription.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Requests a username change confirmation flow for the current user.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: confirmation e-mail has been sent.'>.\n\t */\n\t@formHandler()\n\trequestUsernameChange(params: {\n\t\t/** Redirect URL when user clicks on the link. */\n\t\tredirect?: string;\n\t\t/** username(e-mail) user wish to change to. */\n\t\tusername: string;\n\t}): Promise<'SUCCESS: confirmation e-mail has been sent.'> {\n\t\treturn requestUsernameChange.bind(this)(params);\n\t}\n\t/**\n\t * Grants users access to a private record.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\tgrantPrivateRecordAccess(params: {\n\t\trecord_id: string;\n\t\tuser_id: string | string[];\n\t}): Promise<string> {\n\t\treturn grantPrivateRecordAccess.bind(this)(params);\n\t}\n\t/**\n\t * Removes previously granted private record access.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\tremovePrivateRecordAccess(params: {\n\t\trecord_id: string;\n\t\tuser_id: string | string[];\n\t}): Promise<string> {\n\t\treturn removePrivateRecordAccess.bind(this)(params);\n\t}\n\t/**\n\t * Lists current private record access grants.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<{ record_id: string; user_id: string; }>>.\n\t */\n\t@formHandler()\n\tlistPrivateRecordAccess(\n\t\tparams: {\n\t\t\trecord_id?: string;\n\t\t\tuser_id?: string | string[];\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<{ record_id: string; user_id: string }>> {\n\t\treturn listPrivateRecordAccess.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Requests a temporary access key for reading a private record.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\trequestPrivateRecordAccessKey(params: {\n\t\trecord_id: string;\n\t\treference_id?: string;\n\t}): Promise<string> {\n\t\treturn requestPrivateRecordAccessKey.bind(this)(params);\n\t}\n\t/**\n\t * Deletes uploaded files by endpoint list.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<RecordData[]>.\n\t */\n\t@formHandler()\n\tdeleteFiles(params: {\n\t\tendpoints: string | string[]; // bin file endpoints\n\t}): Promise<RecordData[]> {\n\t\treturn deleteFiles.bind(this)(params);\n\t}\n\t/**\n\t * Uploads files to an existing record and returns completed and failed results.\n\t * @param fileList Files or form event containing files.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<{ completed: File[], failed: File[], bin_endpoints: string[] }>.\n\t */\n\t@formHandler()\n\tuploadFiles(\n\t\tfileList: FormData | HTMLFormElement | SubmitEvent,\n\t\tparams: {\n\t\t\trecord_id: string; // Record ID of a record to upload files to.\n\t\t\tprogress?: ProgressCallback;\n\t\t},\n\t): Promise<{ completed: File[]; failed: File[]; bin_endpoints: string[] }> {\n\t\treturn uploadFiles.bind(this)(fileList, params);\n\t}\n\t/**\n\t * Calls the mock endpoint for testing request and error handling flows.\n\t * @param data Data payload for the request.\n\t * @param options Optional behavior configuration.\n\t * @returns A promise that resolves to Promise<{ [key: string]: any }>.\n\t */\n\t@formHandler()\n\tmock(\n\t\tdata: Form<\n\t\t\t| any\n\t\t\t| {\n\t\t\t\t\traise:\n\t\t\t\t\t\t| 'ERR_INVALID_REQUEST'\n\t\t\t\t\t\t| 'ERR_INVALID_PARAMETER'\n\t\t\t\t\t\t| 'SOMETHING_WENT_WRONG'\n\t\t\t\t\t\t| 'ERR_EXISTS'\n\t\t\t\t\t\t| 'ERR_NOT_EXISTS';\n\t\t\t }\n\t\t>,\n\t\toptions?: {\n\t\t\tauth?: boolean;\n\t\t\tmethod?: string;\n\t\t\tresponseType?:\n\t\t\t\t| 'blob'\n\t\t\t\t| 'json'\n\t\t\t\t| 'text'\n\t\t\t\t| 'arrayBuffer'\n\t\t\t\t| 'formData'\n\t\t\t\t| 'document';\n\t\t\tcontentType?: string;\n\t\t\ttokenHeaders?: {\n\t\t\t\taccessToken?: boolean | string;\n\t\t\t\tidToken?: boolean | string;\n\t\t\t};\n\t\t\tprogress?: ProgressCallback;\n\t\t},\n\t): Promise<{ [key: string]: any }> {\n\t\treturn mock.bind(this)(data, options);\n\t}\n\t/**\n\t * Authenticates a user with email/username and password.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<UserProfile>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tlogin(\n\t\tparams: Form<{\n\t\t\t/** if given, username will be used instead of email. */\n\t\t\tusername?: string;\n\t\t\t/** E-Mail for signin. 64 character max. */\n\t\t\temail: string;\n\t\t\t/** Password for signin. Should be at least 6 characters. */\n\t\t\tpassword: string;\n\t\t}>,\n\t): Promise<UserProfile> {\n\t\treturn login.bind(this)(params);\n\t}\n\t/**\n\t * Logs out the current user session (optionally globally).\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<'SUCCESS: The user has been logged out.'>.\n\t */\n\t@formHandler()\n\tlogout(\n\t\tparams?: Form<{ global: boolean }>,\n\t): Promise<'SUCCESS: The user has been logged out.'> {\n\t\treturn logout.bind(this)(params);\n\t}\n\n\t/**\n\t * Creates a new user account with optional signup and login behavior settings.\n\t * @param params Payload for the request.\n\t * @param option Optional behavior configuration.\n\t * @returns A promise that resolves to Promise<UserProfile | \"SUCCESS: The account has been created. User's signup confirmation is required.\" | 'SUCCESS: The account has been created.'>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tsignup(\n\t\tparams: Form<UserAttributes & { password: String; username?: string }>,\n\t\toption?: {\n\t\t\t/**\n\t\t\t * When true, the service will send out confirmation E-Mail.\n\t\t\t * User will not be able to signin to their account unless they have confirm their email.\n\t\t\t * Parameter also accepts URL string for user to be taken to when clicked on confirmation link.\n\t\t\t * Default is false.\n\t\t\t */\n\t\t\tsignup_confirmation?: boolean | string;\n\t\t\t/**\n\t\t\t * When true, user will be subscribed to the service newsletter (group 1) once they are signed up.\n\t\t\t * User's signup confirmation is required for this parameter.\n\t\t\t * Default is false.\n\t\t\t */\n\t\t\temail_subscription?: boolean;\n\t\t\t/**\n\t\t\t * Automatically login to account after signup. Will not work if signup confirmation is required.\n\t\t\t */\n\t\t\tlogin?: boolean;\n\t\t\ttemplate?: {\n\t\t\t\t/** message_id of the template to use for the signup confirmation e-mail. */\n\t\t\t\tsignup_confirmation?: string;\n\t\t\t\t/** message_id of the template to use for the welcome e-mail (sent on the user's first confirmed login). */\n\t\t\t\twelcome?: string;\n\t\t\t};\n\t\t},\n\t): Promise<\n\t\t| UserProfile\n\t\t| \"SUCCESS: The account has been created. User's signup confirmation is required.\"\n\t\t| 'SUCCESS: The account has been created.'\n\t> {\n\t\treturn signup.bind(this)(params, option);\n\t}\n\n\t/**\n\t * Resets a password using email, verification code, and new password.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: New password has been set.\">.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tresetPassword(\n\t\tparams: Form<{\n\t\t\t/** Signin E-Mail */\n\t\t\temail: string;\n\t\t\t/** The verification code user has received. */\n\t\t\tcode: string | number;\n\t\t\t/** New password to set. Verification code is required. */\n\t\t\tnew_password: string;\n\t\t}>,\n\t): Promise<'SUCCESS: New password has been set.'> {\n\t\treturn resetPassword.bind(this)(params);\n\t}\n\t/**\n\t * Verifies the user email address with a confirmation code.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tverifyEmail(params?: Form<{ code: string }>, options?: { template?: { verification?: string } }): Promise<string> {\n\t\t// 'SUCCESS: Verification code has been sent.' | 'SUCCESS: \"email\" is verified.'\n\t\treturn verifyEmail.bind(this)(params, options);\n\t}\n\t/**\n\t * Verifies the user phone number with a confirmation code.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tverifyPhoneNumber(params?: Form<{ code: string }>, options?: { template?: { verification?: string } }): Promise<string> {\n\t\t// 'SUCCESS: Verification code has been sent.' | 'SUCCESS: \"phone_number\" is verified.'\n\t\treturn verifyPhoneNumber.bind(this)(params, options);\n\t}\n\t/**\n\t * Sends a password reset verification code to the user email.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Verification code has been sent.\">.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tforgotPassword(\n\t\tparams: Form<{\n\t\t\t/** Signin E-Mail. */\n\t\t\temail: string;\n\t\t}>,\n\t\toptions?: {\n\t\t\ttemplate?: {\n\t\t\t\t/** message_id of the template to use for the password-reset verification e-mail. */\n\t\t\t\tverification?: string;\n\t\t\t};\n\t\t},\n\t): Promise<'SUCCESS: Verification code has been sent.'> {\n\t\treturn forgotPassword.bind(this)(params, options);\n\t}\n\t/**\n\t * Changes password for the authenticated user.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Password has been changed.'>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tchangePassword(params: {\n\t\tnew_password: string;\n\t\tcurrent_password: string;\n\t}): Promise<'SUCCESS: Password has been changed.'> {\n\t\treturn changePassword.bind(this)(params);\n\t}\n\t/**\n\t * Updates profile attributes for the authenticated user.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<UserProfile>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tupdateProfile(params: Form<UserAttributes>): Promise<UserProfile> {\n\t\treturn updateProfile.bind(this)(params);\n\t}\n\t/**\n\t * Creates or updates a database record with optional file uploads.\n\t * @param params Payload for the request.\n\t * @param config Required record configuration (table, record_id, index, tags, source, reference, etc.).\n\t * @param files File list to process.\n\t * @returns A promise that resolves to Promise<RecordData>.\n\t */\n\t@formHandler()\n\tpostRecord(\n\t\tparams: Form<Record<string, any>> | null | undefined,\n\t\tconfig: PostRecordConfig,\n\t\tfiles?: { name: string; file: File }[],\n\t): Promise<RecordData> {\n\t\treturn postRecord.bind(this)(params, config, files);\n\t}\n\t/**\n\t * Fetches subscriber/subscription relationships with filters and pagination. At least one of `subscriber` or `subscription` must be provided.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<Subscription>>.\n\t */\n\t@formHandler()\n\tgetSubscriptions(\n\t\tparams: {\n\t\t\t/** Subscribers user id. */\n\t\t\tsubscriber?: string;\n\t\t\t/** User ID of the subscription. User id that subscriber has subscribed to. */\n\t\t\tsubscription?: string;\n\t\t\t/** Fetch blocked subscription when True */\n\t\t\tblocked?: boolean;\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<Subscription>> {\n\t\treturn getSubscriptions.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Subscribes to another user with optional feed/notification/email preferences.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<Subscription>.\n\t */\n\t@formHandler()\n\tsubscribe(params: {\n\t\tuser_id: string;\n\t\tget_feed?: boolean;\n\t\tget_notified?: boolean;\n\t\tget_email?: boolean;\n\t}): Promise<Subscription> {\n\t\treturn subscribe.bind(this)(params);\n\t}\n\t/**\n\t * Unsubscribes from another user.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: The user has unsubscribed.'>.\n\t */\n\t@formHandler()\n\tunsubscribe(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: The user has unsubscribed.'> {\n\t\treturn unsubscribe.bind(this)(params);\n\t}\n\t/**\n\t * Blocks a subscriber user_id.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Blocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'>.\n\t */\n\t@formHandler()\n\tblockSubscriber(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: Blocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'> {\n\t\treturn blockSubscriber.bind(this)(params);\n\t}\n\t/**\n\t * Unblocks a previously blocked subscriber user_id.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Unblocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'>.\n\t */\n\t@formHandler()\n\tunblockSubscriber(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: Unblocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'> {\n\t\treturn unblockSubscriber.bind(this)(params);\n\t}\n\t/**\n\t * Subscribes an email/user to a newsletter group with optional redirect flow.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\tsubscribeNewsletter(\n\t\tparams: Form<{\n\t\t\temail?: string | string[];\n\t\t\tgroup: number | 'public' | 'authorized' | 'admin' | (string & {});\n\t\t\tredirect?: string;\n\t\t}>,\n\t): Promise<string> {\n\t\treturn subscribeNewsletter.bind(this)(params);\n\t}\n\n\t/**\n\t * Creates or updates multiple database records in a single bulk request. Requires a non-empty array, and all entries must share the same table/service.\n\t * @param config Non-empty array of record configurations to post.\n\t * @returns A promise that resolves to Promise<RecordData[]>.\n\t */\n\tbulkPostRecords(config: PostRecordConfig[]): Promise<RecordData[]> {\n\t\treturn bulkPostRecords.bind(this)(config);\n\t}\n}\n","export type Condition = 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | '>' | '>=' | '<' | '<=' | '=';\n\n\nexport type RTCReceiverParams = {\n ice?: string;\n media?: {\n video: boolean;\n audio: boolean;\n } | MediaStream | MediaStreamConstraints;\n}\n\nexport type RTCConnectorParams = {\n cid: string;\n ice?: string;\n media?: {\n video: boolean;\n audio: boolean;\n } | MediaStream | MediaStreamConstraints;\n channels?: Array<RTCDataChannelInit | 'text-chat' | 'file-transfer' | 'video-chat' | 'voice-chat' | 'gaming'>;\n}\n\nexport type RTCConnector = {\n hangup: () => void;\n connection: Promise<RTCResolved>;\n}\n\nexport type RTCResolved = {\n target: RTCPeerConnection;\n channels: {\n [protocol: string]: RTCDataChannel\n };\n hangup: () => void;\n media: MediaStream;\n}\n\nexport type RTCEvent = {\n type: 'track' | 'connectionstatechange' | 'close' | 'message' | 'open' | 'bufferedamountlow' | 'error' | 'icecandidate' | 'icecandidateend' | 'icegatheringstatechange' | 'negotiationneeded' | 'signalingstatechange';\n [key: string]: any;\n}\n\nexport type WebSocketMessage = {\n type: 'message' | 'error' | 'success' | 'close' | 'notice' | 'private' | 'reconnect' | 'rtc:incoming' | 'rtc:closed';\n message?: any;\n connectRTC?: (params: RTCReceiverParams, callback: (e: RTCEvent) => void) => Promise<RTCResolved>;\n hangup?: () => void; // Reject incoming RTC connection.\n sender?: string; // user_id of the sender\n sender_cid?: string; // scid of the sender\n sender_rid?: string; // group of the sender\n code?: 'USER_LEFT' | 'USER_DISCONNECTED' | 'USER_JOINED' | null; // code for notice messeges\n}\n\nexport type RealtimeCallback = (rt: WebSocketMessage) => void;\n\nexport type DelRecordQuery = GetRecordQuery & {\n unique_id?: string;\n record_id?: string;\n};\n\nexport type GetRecordQuery = {\n unique_id?: string; // When unique_id is given, it will fetch the record with the given unique_id.\n record_id?: string; // When record_id is given, it will fetch the record with the given record_id. This overrides all other parameters.\n\n /** Table name not required when \"record_id\" is given. A bare string is shorthand for { name: <string> }. */\n table?: string | {\n /** Max 256 characters, where / ! * # % each count as 3. Blocks control chars and sentinel 􏿿. */\n name: string;\n /** Number range: 0 ~ 99. Default: 'public' */\n access_group?: number | 'private' | 'public' | 'authorized' | 'admin';\n /** User ID of subscription */\n subscription?: string;\n };\n\n reference?: string | { record_id?: string; unique_id?: string; user_id?: string } // Referenced record ID or unique ID (string), or the object form. If user ID is given, it will fetch records that are uploaded by the user.\n\n /** Index condition and range cannot be used simultaneously.*/\n index?: {\n /** Custom names: max 256 characters, where / ! * # % each count as 3. Cannot start with \"$\". Blocks control chars and sentinel 􏿿. Reserved names: $uploaded, $updated, $referenced_count, $user_id. */\n name: string | '$updated' | '$uploaded' | '$referenced_count' | '$user_id';\n /** String value max 256 characters. Any punctuation is allowed and counts as one character, and values compare exactly as written. Blocks control chars and sentinel 􏿿. */\n value: string | number | boolean;\n /** For a string value: '>=' = 'starts with', '<=' = 'ends with'. When the name is a compound name ending in '.', '>=' / '<=' match the child name segment (starts / ends with). '>' / '<' are lexicographic; numbers/booleans compare normally. */\n condition?: Condition;\n range?: string | number | boolean;\n };\n tag?: string;\n}\n\nexport type PostRecordConfig = {\n record_id?: string; // when record_id is given, it will update the record with the given record_id. If record_id is not given, it will create a new record. If unique ID is given as a record ID, it will update the record with the given unique ID. \n unique_id?: string | null; // You can set unique_id to the record with the given unique_id. Null will remove unique_id from the record.\n readonly?: boolean; // When true, record cannot be updated or deleted.\n\n /** Table name not required when \"record_id\" is given.*/\n table?: {\n /** Max 256 characters, where / ! * # % each count as 3. Blocks control chars and sentinel 􏿿. */\n name?: string;\n /** Number range: 0 ~ 99. Default: 'public' */\n access_group?: number | 'private' | 'public' | 'authorized' | 'admin';\n\n /** When true, Record will be only accessible for subscribed users. */\n subscription?: {\n is_subscription_record?: boolean; // When true, this record is a subscription record.\n upload_to_feed?: boolean; // When true, record will be uploaded to the feed of the subscribers.\n notify_subscribers?: boolean; // When true, subscribers will receive notification when the record is uploaded.\n feed_referencing_records?: boolean; // When true, records referencing this record will be included to the subscribers feed.\n notify_referencing_records?: boolean; // When true, records referencing this record will be notified to subscribers.\n } | null; // When null, it will remove all subscription settings from the record.\n };\n\n source?: {\n referencing_limit?: number; // Default: null (Infinite)\n prevent_multiple_referencing?: boolean; // If true, a single user can reference this record only once.\n can_remove_referencing_records?: boolean; // When true, owner of the record can remove any record that are referencing this record. Also when this record is deleted, all the record referencing this record will be deleted.\n only_granted_can_reference?: boolean; // When true, only the user who has granted private access to the record can reference this record.\n /** Index restrictions for referencing records. null removes all restrictions. */\n referencing_index_restrictions?: {\n /** Not allowed: White space, special characters. Allowed: Alphanumeric, Periods. */\n name: string; // Allowed index name\n /** Not allowed: Periods, special characters. Allowed: Alphanumeric, White space. */\n value?: string | number | boolean; // Allowed index value\n range?: string | number | boolean; // Allowed index range\n condition?: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!='; // Allowed index value condition\n }[] | null;\n allow_granted_to_grant_others?: boolean; // When true, the user who has granted private access to the record can grant access to other users.\n };\n\n /** Can be record ID or unique ID */\n reference?: string | null; // When null, it will remove reference from the record.\n\n /** null removes index */\n index?: {\n /** Max 256 characters, where / ! * # % each count as 3. Cannot start with \"$\". Blocks control chars and sentinel 􏿿. */\n name: string;\n /** String value max 256 characters. Any punctuation is allowed and counts as one character, and values compare exactly as written. Blocks control chars and sentinel 􏿿. */\n value: string | number | boolean;\n } | null;\n\n tags?: string[] | null; // null removes all tags. each tag 1..256 characters, where / ! * # % each count as 3. Blocks control chars and sentinel 􏿿.\n remove_bin?: BinaryFile[] | string[] | null; // Removes bin data from the record. When null, it will remove all bin data.\n progress?: ProgressCallback; // Callback for database request progress. Useful when building progress bar.\n reference_private_key?: string; // When referencing a record that has private access, you can provide the private key of the referenced record to pass the access check. This is only required when the referenced record has private access and the user does not have access to the record through subscription or granted access.\n}\n\nexport type BinaryFile = {\n access_group: number | 'private' | 'public' | 'authorized' | 'admin';\n filename: string;\n url: string;\n path: string;\n size: number;\n uploaded: number;\n getFile: (dataType?: 'base64' | 'download' | 'endpoint' | 'blob' | 'text' | 'info', progress?: ProgressCallback) => Promise<Blob | string | void | FileInfo>;\n}\n\nexport type RecordData = {\n record_id: string;\n unique_id?: string;\n user_id: string;\n updated: number;\n uploaded: number;\n referenced_count: number;\n\n table: {\n name: string;\n /** Number range: 0 ~ 99 */\n access_group: number | 'private' | 'public' | 'authorized' | 'admin';\n /** User ID of subscription */\n subscription?: {\n upload_to_feed: boolean; // When true, record will be uploaded to the feed of the subscribers.\n notify_subscribers: boolean; // When true, subscribers will receive notification when the record is uploaded.\n feed_referencing_records: boolean; // When true, records referencing this record will be included to the subscribers feed.\n notify_referencing_records: boolean; // When true, records referencing this record will be notified to subscribers.\n };\n };\n source: {\n referencing_limit: number; // Default: null (Infinite)\n prevent_multiple_referencing: boolean; // If true, a single user can reference this record only once.\n can_remove_referencing_records: boolean; // When true, owner of the record can remove any record that are referencing this record. Also when this record is deleted, all the record referencing this record will be deleted.\n only_granted_can_reference: boolean; // When true, only the user who has granted private access to the record can reference this record.\n referencing_index_restrictions?: {\n name: string; // Allowed index name\n value?: string | number | boolean; // Allowed index value\n range?: string | number | boolean; // Allowed index range\n condition?: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!='; // Allowed index value condition\n }[];\n };\n reference?: string; // record id of the referenced record.\n index?: {\n name: string;\n value: string | number | boolean;\n };\n data?: Record<string, any>;\n tags?: string[];\n bin: { [key: string]: BinaryFile[] };\n ip: string;\n readonly: boolean;\n /**\n * Present ONLY on an element of a postRecords() result that the backend refused.\n * Such an element is an empty record (record_id is \"\"), and this carries the reason\n * the backend gave, e.g. { code: 'NOT_EXISTS', message: 'Reference \"...\" does not exists.' }.\n * A saved record never has it, so `record_id` stays the test for \"did this save\".\n */\n error?: { code?: string; message?: string;[key: string]: any };\n}\n\nexport type Connection = {\n /** User's locale */\n locale: string;\n user_agent: string;\n /** Connected user's IP address */\n ip: string;\n /** Service group */\n group: number;\n /** Service name */\n service_name: string;\n /** Service description */\n service_description: string;\n /** Service options */\n opt: {\n freeze_database: boolean;\n prevent_inquiry: boolean;\n prevent_signup: boolean;\n prevent_anonymous: boolean;\n },\n ai_agent?: string; // AI agent info.\n}\n\nexport type Form<T> = HTMLFormElement | FormData | SubmitEvent | T;\n\nexport type Newsletter = {\n /** Newsletter id */\n message_id: string;\n /** Time sent out */\n timestamp: number;\n /** Number of complaints */\n complaint: number;\n /** Number of read */\n read: number;\n /** Subject */\n subject: string;\n /**\n * Number of bounced.<br>\n * When e-mail address is bounced, skapi no longer sends e-mail to the bounced address.\n */\n bounced: string;\n /**\n * Url of the message html.\n */\n url: string;\n /** Number users delivered */\n delivered: number;\n}\n\nexport type UserAttributes = {\n /** User's name */\n name?: string;\n /**\n * User's E-Mail for signin.<br>\n * 64 character max.<br>\n * When E-Mail is changed, E-Mail verified state will be changed to false.\n * E-Mail is only visible to others when set to public.\n * E-Mail should be verified to set to public.\n * */\n email?: string;\n /**\n * User's phone number. Format: \"+0012341234\"<br>\n * When phone number is changed, phone number verified state will be changed to false.\n * Phone number is only visible to others when set to public.\n * Phone number should be verified to set to public.\n */\n phone_number?: string;\n /** User's address, only visible to others when set to public. */\n address?: string | {\n /**\n * Full mailing address, formatted for display or use on a mailing label. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n * street_address\n * Full street address component, which MAY include house number, street name, Post Office Box, and multi-line extended street address information. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n */\n formatted: string;\n // City or locality component.\n locality: string;\n // State, province, prefecture, or region component.\n region: string;\n // Zip code or postal code component.\n postal_code: string;\n // Country name component.\n country: string;\n };\n /**\n * User's gender. Can be \"female\" and \"male\".\n * Other values may be used when neither of the defined values are applicable.\n * Only visible to others when set to public.\n */\n gender?: string;\n /** User's birthdate. String format: \"1969-07-16\", only visible to others when set to public.*/\n birthdate?: string;\n\n /** Additional string value that can be used freely. This is only accessible to the owner of the account and the admins. */\n misc?: string;\n picture?: string;\n profile?: string;\n website?: string;\n nickname?: string;\n\n /** User's E-Mail is public when true. E-Mail should be verified. */\n email_public?: boolean;\n /** User's phone number is public when true. Phone number should be verified. */\n phone_number_public?: boolean;\n /** User's address is public when true. */\n address_public?: boolean;\n /** User's gender is public when true. */\n gender_public?: boolean;\n /** User's birthdate is public when true. */\n birthdate_public?: boolean;\n}\n\nexport type UserProfile = {\n /** Service id of the user account. */\n service: string;\n /** User ID of the service owner. */\n owner: string;\n /** Access level of the user's account. */\n access_group: number;\n /** User's ID. */\n user_id: string;\n /** Country code of where user first signed up from. */\n locale: string;\n /**\n Account approval info and timestamp.\n Comes with string with the following format: \"{approver}:{approved | suspended}:{approved_timestamp}\"\n \n {approver} is who approved the account:\n [by_master] is when account approval is done manually from skapi admin panel,\n [by_admin] is when approval is done by the admin account with api call within your service.\n [by_skapi] is when account approval is automatically done.\n Open ID logger ID will be the value if the user is logged with openIdLogin()\n This timestamp is generated when the user confirms their signup, or recovers their disabled account.\n \n {approved | suspended}\n [approved] is when the account is approved.\n [suspended] is when the account is blocked by the admin or the master.\n \n {approved_timestamp} is the timestamp when the account is approved or suspended.\n\n */\n approved: string;\n /** Last login timestamp(Seconds). */\n log: number;\n /** Shows true when user has verified their E-Mail. */\n email_verified?: boolean;\n /** Shows true when user has verified their phone number. */\n phone_number_verified?: boolean;\n /** User's E-Mail is public when true. E-Mail should be verified. */\n email_public?: boolean;\n /** User's phone number is public when true. Phone number should be verified. */\n phone_number_public?: boolean;\n /** User's address is public when true. */\n address_public?: boolean;\n /** User's gender is public when true. */\n gender_public?: boolean;\n /** User's birthdate is public when true. */\n birthdate_public?: boolean;\n\n /** User's name */\n name?: string;\n /**\n * User's E-Mail for signin.<br>\n * 64 character max.<br>\n * When E-Mail is changed, E-Mail verified state will be changed to false.\n * E-Mail is only visible to others when set to public.\n * E-Mail should be verified to set to public.\n * */\n email?: string;\n /**\n * User's phone number. Format: \"+0012341234\"<br>\n * When phone number is changed, phone number verified state will be changed to false.\n * Phone number is only visible to others when set to public.\n * Phone number should be verified to set to public.\n */\n phone_number?: string;\n /** User's address, only visible to others when set to public. */\n address?: string | {\n /**\n * Full mailing address, formatted for display or use on a mailing label. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n * street_address\n * Full street address component, which MAY include house number, street name, Post Office Box, and multi-line extended street address information. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n */\n formatted: string;\n // City or locality component.\n locality: string;\n // State, province, prefecture, or region component.\n region: string;\n // Zip code or postal code component.\n postal_code: string;\n // Country name component.\n country: string;\n };\n /**\n * User's gender. Can be \"female\" and \"male\".\n * Other values may be used when neither of the defined values are applicable.\n * Only visible to others when set to public.\n */\n gender?: string;\n /** User's birthdate. String format: \"1969-07-16\", only visible to others when set to public.*/\n birthdate?: string;\n\n /** Additional string value that can be used freely. This is only accessible to the owner of the account and the admins. */\n misc?: string;\n picture?: string;\n profile?: string;\n website?: string;\n nickname?: string;\n};\n\nexport type UserPublic = {\n /** Access level of the user's account. */\n access_group: number;\n /** User's ID. */\n user_id: string;\n /** Country code of where user first signed up from. */\n locale: string;\n /**\n Account approval info and timestamp.\n Comes with string with the following format: \"{approver}:{approved | suspended}:{approved_timestamp}\"\n \n {approver} is who approved the account:\n [by_master] is when account approval is done manually from skapi admin panel,\n [by_admin] is when approval is done by the admin account with api call within your service.\n [by_skapi] is when account approval is automatically done.\n Open ID logger ID will be the value if the user is logged with openIdLogin()\n This timestamp is generated when the user confirms their signup, or recovers their disabled account.\n \n {approved | suspended}\n [approved] is when the account is approved.\n [suspended] is when the account is blocked by the admin or the master.\n \n {approved_timestamp} is the timestamp when the account is approved or suspended.\n\n */\n approved: string;\n /** Account created timestamp(13 digit milliseconds). */\n timestamp: number;\n /** Last login timestamp(Seconds). */\n log: number;\n /** Number of the user's subscribers. */\n subscribers: number;\n /** Number of subscription the user has made */\n subscribed: number;\n /** Number of the records the user have created. */\n records: number;\n\n /** User's name */\n name?: string;\n /**\n * User's E-Mail for signin.<br>\n * 64 character max.<br>\n * When E-Mail is changed, E-Mail verified state will be changed to false.\n * E-Mail is only visible to others when set to public.\n * E-Mail should be verified to set to public.\n * */\n email?: string;\n /**\n * User's phone number. Format: \"+0012341234\"<br>\n * When phone number is changed, phone number verified state will be changed to false.\n * Phone number is only visible to others when set to public.\n * Phone number should be verified to set to public.\n */\n phone_number?: string;\n /** User's address, only visible to others when set to public. */\n address?: string | {\n /**\n * Full mailing address, formatted for display or use on a mailing label. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n * street_address\n * Full street address component, which MAY include house number, street name, Post Office Box, and multi-line extended street address information. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n */\n formatted: string;\n // City or locality component.\n locality: string;\n // State, province, prefecture, or region component.\n region: string;\n // Zip code or postal code component.\n postal_code: string;\n // Country name component.\n country: string;\n };\n /**\n * User's gender. Can be \"female\" and \"male\".\n * Other values may be used when neither of the defined values are applicable.\n * Only visible to others when set to public.\n */\n gender?: string;\n /** User's birthdate. String format: \"1969-07-16\", only visible to others when set to public.*/\n birthdate?: string;\n\n picture?: string;\n profile?: string;\n website?: string;\n nickname?: string;\n};\n\nexport type ProgressCallback = (e: {\n status: 'upload' | 'download';\n progress: number; // 0 ~ 100, number of percent completed.\n loaded: number; // Number of bytes loaded.\n total: number; // Total number of bytes to be loaded.\n currentFile?: File, // Only for uploadFiles()\n completed?: File[]; // Only for uploadFiles()\n failed?: File[]; // Only for uploadFiles()\n abort: () => void; // Aborts current data transfer. When abort is triggered during the FileList is on trasmit, it will continue to next file.\n}) => void;\n\nexport type FetchOptions = {\n /** Maximum number of records to fetch per call */\n limit?: number;\n /** Fetch next batch of data. Will return empty list if there is nothing more to fetch. */\n fetchMore?: boolean;\n /** Result in ascending order if true, decending when false. */\n ascending?: boolean;\n /** Start key to be used to query from the certain batch of fetch. */\n startKey?: { [key: string]: any; };\n /** Callback for database request progress. Useful when building progress bar. */\n progress?: ProgressCallback;\n}\nexport type RequestHistory = {\n id: string; // request id. Format: {stamp}:{entropy}\n status_code: number; // http status code of the request\n response_body: any;\n error?: any;\n created: number; // timestamp of when the request was created, in milliseconds. Set once and never changes.\n updated: number; // timestamp of the last update of the request status (e.g. when the response arrived), in milliseconds.\n request_body: any;\n expires?: number; // timestamp of when the request history will be deleted in epoch time (seconds).\n status: 'pending' | 'running' | 'resolved' | 'failed';\n queue_name?: string; // queue name if the request is in queue, empty string if the request is not in queue.\n // Compact-listing stubs. Present ONLY when the history was fetched with `compact: true`,\n // in which case request_body/response_body are omitted (the full bodies never leave the\n // server); re-fetch without `compact`, or poll the item, when a full body is needed.\n request_text?: string; // stub: first text of the request's LAST user message, truncated. Missing when the request body's shape was unrecognisable.\n response_text?: string; // stub: the head of the response text, truncated.\n response_complete_marker?: boolean; // stub: whether the response carried the indexing completion marker.\n compact?: boolean; // true on items returned by a `compact: true` listing, so consumers know bodies were deliberately omitted rather than empty.\n poll?: (arg?: {\n latency?: number;\n onResponse?: (res:any)=>void;\n onError?: (err:any)=>void;\n }) => Promise<any>; // function to poll the request status until it settles. The promise resolves with the final result of the request: the third-party API response body when it resolves, or the error payload when it fails. It does not resolve with a RequestHistory item, so \"created\" and \"updated\" are not on the polled value. A poll stopped by stopClientSecretPolling() resolves with { id, status: 'stopped' }. Optional argument \"latency\" can be used to set the latency of the polling in milliseconds. Default latency is 1000ms.\n}\n\nexport type DatabaseResponse<T> = {\n list: T[];\n startKey: { [key: string]: any; } | 'end';\n endOfList: boolean;\n startKeyHistory: string[];\n}\n\nexport type FileInfo = {\n url: string;\n filename: string;\n access_group: number | 'private' | 'public' | 'authorized';\n filesize: number;\n record_id: string;\n uploader: string;\n uploaded: number;\n fileKey: string;\n}\n\nexport type ConnectionInfo = {\n /** Public project ID (service + owner composed into the two-segment token). Empty when the service has no uuid owner. */\n project_id: string;\n user_ip: string;\n user_agent: string;\n user_location: string;\n service_name: string;\n service_description: string;\n version: string;\n ai_agent: string;\n conf: {\n freeze_database: boolean;\n prevent_signup: boolean;\n prevent_inquiry: boolean;\n prevent_anonymous: boolean;\n }\n};\n\nexport type Table = {\n table: string;\n number_of_records: string;\n size: number;\n number_of_records_in_access_group_public?: number;\n number_of_records_in_access_group_private?: number;\n number_of_records_in_access_group_authorized?: number;\n number_of_records_in_access_group_admin?: number;\n [number_of_records_in_access_group_xx: string]: number | string | undefined; // for other access groups\n}\n\nexport type Index = {\n table: string;\n index: string;\n number_of_records: number;\n string_count: number;\n number_count: number;\n boolean_count: number;\n total_number: number;\n total_bool: number;\n average_number: number;\n average_bool: number;\n}\n\nexport type Tag = {\n table: string;\n tag: string;\n number_of_records: number;\n}\n\nexport type UniqueId = {\n unique_id: string;\n record_id: string;\n}\n\nexport type Subscription = {\n subscriber: string;\n subscription: string;\n timestamp: number;\n blocked: boolean;\n get_feed: boolean;\n get_notified: boolean;\n get_email: boolean;\n}"]}
1
+ {"version":3,"sources":["../src/polyfills/global.ts","../src/main/error.ts","../src/utils/utils.ts","../src/utils/validator.ts","../src/utils/crypto.ts","../src/methods/encryption.ts","../src/methods/user.ts","../src/utils/network.ts","../src/methods/param_restrictions.ts","../src/methods/database.ts","../src/methods/webrtc.ts","../src/methods/realtime.ts","../src/methods/request.ts","../src/methods/subscription.ts","../src/methods/admin.ts","../src/methods/notification.ts","../src/methods/vivian.ts","../src/main/skapi.ts","../src/Types.ts"],"names":["root","win","toBase64Url","input","binary","bytes","chunk","slice","NodeFileReader","blob","buffer","base64","mimeType","err","encoding","text","NodeXMLHttpRequest","method","url","name","value","body","fetchOptions","response","error","message","key","fs","path","filePath","dirPath","constraints","SkapiError","options","msg","BASE62_ALPHABET","BASE62","MAX_FORM_DATA_SIZE","USER_ATTRIBUTE_EXCLUDES","USER_ATTRIBUTE_CONVERTS","SERVICE_REGION_ALPHABET","SERVICE_REGION_KEYS","textEncoder","getGlobalBuffer","encodeUtf8","i","toUint8Array","BufferCtor","_MD5","str","x","a","b","c","d","lastA","lastB","lastC","lastD","n","s","j","y","l","q","t","numBlocks","blocks","MD5","toBase62","num","result","fromBase62","chars","prev","curr","generateRandom","length","characters","charactersLength","counter","isNodeRuntime","isBrowserRuntime","assertMaxFormDataSize","serialized","isDefaultTruthyInputValue","isDefaultFalsyInputValue","appendNamedElementValue","data","element","appendData","isBrowser","hasSubmitEvent","hasHTMLFormElement","extractFormData","form","callback","files","val","v","keys","k","numb","obj","handleFile","idx","file","handleInput","pair","json","inputs","selects","textarea","parseUserAttributes","attr","user","addr_main","decodeProjectId","service","decompressCompoundId","idSplit","region","owner","formatServiceId","serviceId","ownerId","regionIndex","regionChar","formattedServiceId","compressCompoundId","b62ToBigInt","ch","bigIntToB62","minLength","output","current","remainder","bigIntToBytes","bytesToBigInt","buf","uuidToBytes","uuid","hex","bytesToUuid","buf16","inputString","match","firstPart","secondPart","movedPrefix","movedFirstPart","movedMiddlePart","part1","uuidBytes","part2","token","tokenString","split","secondLength","compacted","movedMiddleLength","uuidValue","uuidRaw","decodeUtf8","concatBytes","parts","total","p","out","at","UserId","id","param","uuid_regex","PhoneNumber","Birthdate","birthdate","date_regex","Password","password","Email","email","paramName","Url","hasWindow","baseUrl","check","cu","curr_loc","_url","u","Params","params","struct","required","ext","toCheck","cocochex","validator_default","ENC_V","PBKDF2_ITERATIONS","IV_LEN","_subtleCache","_cryptoCache","notSupported","resolveCrypto","g","nodeCrypto","__require","getSubtle","cryptoAvailable","getRandom","MAX","b64uFromBytes","u8","std","b64uToBytes","pad","sha256","hkdf","ikm","salt","info","len","subtle","base","bits","deriveKek","iterations","pwBytes","prk","kekBytes","zeroize","importAesGcm","raw","generateAesGcm","sealGcm","plaintext","aad","iv","ct","openGcm","pt","ECDH_P256","generateIdentity","pubRaw","pkcs8","priv","importIdentityPriv","importPeerPub","fingerprint","wrapEcdhEs","peerPubRaw","dek","peer","eph","z","kwBytes","kw","unwrapEcdhEs","myPriv","epkRaw","epk","bytesEqual","diff","canonicalAad","recipientAad","baseAad","userId","bind","B32","RECOVERY_BYTES","RECOVERY_DATA_CHARS","RECOVERY_TOTAL_CHARS","checkBits","h","encodeRecoveryCode","acc","chk","decodeRecoveryCode","code","cleaned","deriveRecoveryKey","FILE_MAGIC","FILE_VERSION","FILE_HEADER_FIXED","FILE_ID_BYTES","FILE_CHUNK_BYTES","isEncryptedFile","writeU32","readU32","writeU64","hi","readU64","deriveFileKey","fileId","recordOwner","recordId","dekIdOf","chunkAad","headerHash","index","count","buildHeader","chunkBytes","plainLen","dekId","metaBytes","encryptFileBytes","plain","ctx","meta","header","sealed","readFileHeader","container","metaLen","headerLen","decryptFileBytes","expect","w","KEYRING_TABLE","ENC_MARKER","ENVELOPE_V","IDB_NAME","IDB_STORE","ENC","parseEncryptionOptions","trustPolicy","encState","initEncryption","cfg","clearEncryptionState","deleteDevice","entry","getEncryptionStatus","isEncTable","tableName","scopeOf","payloadAad","scope","own","anch","anchor","wrapInfo","recipient","fpr","anchorOf","env","isEnvelope","NO_ACCESS_MARKER","withheldValue","reason","recipients","isWithheld","resolveWriteGroup","rawConfig","resolvedId","table","normalizeGroup","cached","rec","readOwnRecord","query","maybeEncrypt","hasData","rawId","unique_id","group","record","old","rolling","stale","dekBytes","dekKey","gen","ownerAad","ownerSealed","rewrapAll","envelope","envSize","bindRecordDek","record_id","ids","peers","getPeerPublicKeys","wrapFor","rAad","maybeDecrypt","me","wrap","kekInfo","user_id","mkAad","recoveryInfo","recoveryAad","selfAad","ikAad","readKeyring","list","r","mintRecoveryWrap","mkBytes","saltB64","rkek","openWithRecoveryCode","wraps","candidates","mintPasswordWrap","kek","provisionKeyring","mkSealed","mk","ident","ikSealed","recovery","selfSealed","now","keyring","settled","unlockKeyring","pwWraps","adoptKeyring","ikPriv","pins","pinBytes","ensureKeyring","saveDevice","unlockEncryption","lockEncryption","rewrapForPasswordChange","currentPassword","newPassword","nextWraps","pruneKeyringWraps","pw","other","idbAvailable","openIdb","res","rej","req","db","deviceKey","tx","loadDevice","startDeviceUnlock","unlockFromDevice","stored","userIds","need","newPins","hit","inflight","pinned","got","persistPins","loadForRewrap","after","addRecipients","loaded","missing","writeRecipients","dropRecipientsAndRoll","keep","assertReadable","pinPeerKey","takeRecoveryCode","unlockWithRecoveryCode","repaired","nextCode","minted","regenerateRecoveryCode","self","FILE_MARKER","B62","toB62","fromB62","parseFileMarker","formKey","size","encryptedFileFromUrl","seg","marked","fileCtx","maybeEncryptFile","decryptFileBlob","opened","type","cognitoUser","map_ticket_obj","mapper","new_obj","tkid","rand","timestampStr","consumeTicket","ticket_id","resp","request","getTickets","tickets","getConsumedTickets","registerTicket","unregisterTicket","TOKEN_REFRESH_SKEW_SECONDS","getJwtToken","currentTime","idTokenExp","authentication","_out","refreshSession","session","refreshErr","refreshedSession","getUserProfile","getSession","option","refreshToken","skipUserUpdateEventTrigger","respond","sessionAttribute","idToken","isExpired","createCognitoUser","un","username","CognitoUser","is_openid","initUser","authenticationDetails","AuthenticationDetails","userAttributes","requiredAttributes","_","parsed","cognitoErrorParser","cognitoMessage","errCode","errMsg","attributes","original_code","err_msg","custom","err_code","err_msg_custom","getProfile","openIdLogin","item","payload","oplog","logger","decodeBase64Utf8","getUserFromToken","accessToken","decoded","loginWithToken","idTokenPayload","CognitoUserSession","CognitoIdToken","CognitoAccessToken","CognitoRefreshToken","up","symbols","descriptors","e","checkAdmin","logout","global","toReturn","to_be_erased","resendSignupConfirmation","recoverAccount","redirect","login","signup","paramRestrictions","logUser","newUser","signup_key","signup_ticket","attributeList","CognitoUserAttribute","customParams","disableAccount","resetPassword","new_password","verifyAttribute","attribute","clientMetadata","verificationMid","verifyPhoneNumber","verifyEmail","forgotPassword","mappedCode","changePassword","updateProfile","collision","toRemove","parseValue","toSet","getUsers","searchForTypes","checker","lastVerifiedEmail","requestUsernameChange","requestQueue","request_counter","getRetryDelayMs","retryAfter","seconds","dateMs","toPercent","selectGateway","auth","endpoints","stable","admin","gateways_admin_round_robin","gateways_record_round_robin","getEndpoint","dest","stableGateway","__pendingRequest","terminatePendingRequests","_etc","bypassAwaitConnection","__connection","endpoint","wantsIdTokenHeader","fetchMore","progress","requestFingerprint","hashedParams","sortObject","requestKey","requestKeyWithStartKey","load_startKey_keys","headers","configuredContentType","resolveTokenValue","configuredValue","fallbackValue","opt","stringValue","separator","encoded","config","cb","Qpass","promise","_fetch","update_startKey_keys","hashedParams_cached","list_of_startKeys","last_startKey_key","stripDecrypted","scrub","xhr","retryDelayMs","status","cause","hashedParam","fetched","startKey_string","uploadFiles","fileList","getSignedParams","fetchProgress","progressCallback","base62Chars","completed","failed","bin_endpoints","f","uploadFile","uploadKey","signedParams","fields","cdn","pendPromise","formHandler","preventMultipleCalls","target","propertyKey","descriptor","fn","arg","storeResponseKey","formEl","actionDestination","fileBase64String","refreshPage","currentUrl","href","placeholders","inputElement","reader","handleResponse","storable","handleError","executeMethod","resolved","pendingKey","getFormResponse","responseKey","MAX_TABLE_NAME_LENGTH","MAX_TAG_LENGTH","MAX_INDEX_NAME_LENGTH","MAX_INDEX_STRING_VALUE_LENGTH","SENTINEL_CHAR","CONTROL_OR_SENTINEL_REGEX","DELIMITER_ENCODING_MAP","DELIMITER_DECODING_MAP","encodeReservedDelimiters","char","decodeReservedDelimiters","validateStringByPolicy","fieldName","allowEmpty","maxLength","blockKeyDelimiters","disallowLeadingDollar","onlyAlphanumeric","validateTableName","validateTag","validateCustomIndexName","validateIndexStringValue","isNestIndexName","validateNestIndexSegment","recordIdOrUniqueId","outputObj","accessGroup","__index_number_range","indexValue","indexRange","pendingPrivateAccessKeyRequest","PRIVATE_FILE_BROWSER_CACHE_SECONDS","PRIVATE_FILE_URL_EXPIRES_SECONDS","MINT_CACHE_GENERATION","mintCacheToken","expiresSeconds","refresh","windowMs","canBrowserCacheRecordFile","splitPath","access_group","user_access_group","parseStoredData","blobToText","resolve","reject","fr","normalizeRecord","_called_from","_skipDataFetch","_skipDecrypt","is_anonymous","dataFileUrls","access_group_set","split_ip","ip","base62timestamp","uploaded","rSplit","normalizeTypedString","tag","binObj","_ref","parsedBin","filename","pathKey","url_endpoint","privateCache","getFile","dataType","tokenPath","restriction","encCtx","markUnavailable","finishData","markerPath","rawUrl","sp","toWait","exec","splitDec","calcNumb","deleteFiles","updatedRec","to_process","requestedUrl","splitQuery","queryString","validatedBaseUrl","isValidEndpoint","splitUrl","splitHost","subdomain","target_key","needAuth","expires","browserCache","mintOptions","uid","currTime","objUrl","retryErr","cacheScope","getScopedUniqueId","bucket","setScopedUniqueId","deleteScopedUniqueId","getQuery","isDel","is_reference_fetch","rec_or_uniq","isAdmin","ref","ref_user_is_me","buildStruct","indexTypes","tp","getRecords","setupPostRecordConfig","is_reference_post","_config","qq","vv","arr","pc","hasEnabledSubscriptionOptions","bulkPostRecords","reference_posts","bulkPlain","postData","mangled","elemHasData","encRes","recList","records","postRecord","postConf","to_bin","extractedForm","rawPayload","bin_formData","uploadFileParams","dataOffloaded","getTables","convert","gk","getIndexes","iSplit","getTags","tSplit","getUniqueId","rawRecordEncContext","table_name","hashAt","deleteRecords","grantPrivateRecordAccess","recordAccess","removePrivateRecordAccess","listPrivateRecordAccess","requestPrivateRecordAccessKey","reference_id","privateKey","__peerConnection","__dataChannel","__caller_ringing","__receiver_ringing","__rtcEvents","__rtcCandidatesBuffer","__rtcSdpOfferBuffer","setBuffer","processBuffer","proceed","process","answerSdpOffer","offer","socket","sendAnswer","answer","receiveIceCandidate","candidate","closeRTC","cid","close_all","close","channel","track","createMediaStream","media","dummyStream","canvas","dummyVideoTrack","connectRTC","ice","configuration","protocol","dataChannel","handleDataChannel","peerConnectionHandler","sendOffer","respondRTC","sender","event","sdpoffer","sendIceCandidate","skipKey","skip","handlers","state","handler","events","closed","__current_socket_room","__keepAliveInterval","closedByIntention","reconnectAttempts","prepareWebsocket","visibilitychange","closeRealtime","joinRealtime","connectRealtime","delay","reconnect","workerScript","rtc","postRealtime","notification","notificationStr","getRealtimeUsers","getRealtimeGroups","hasFormData","queuePromiseList","queueJobId","activePolls","stoppedResult","isPollStopped","pollClientSecretResponse","latency","queue","onResponse","onError","release","prom","interval","publicStop","outer","outerSettled","jobId","stopClientSecretPolling","stopped","clientSecretRequestQueueCount","clientSecretRequest","hasSecret","checkClientSecretPlaceholder","lo","req_prom","fullId","base_queue","polling","clientSecretRequestHistory","his_req","cancelClientSecretRequest","base_id","sendInquiry","secureRequest","formData","paramsStruct","mock","responseType","contentType","tokenHeaders","forwardRequest","el","metaHeader","decoder","whole","done","getFeed","recs","cannotBeSelfId","getSubscriptions","subscription","subSplit","subscribe","unsubscribe","blockSubscriber","unblockSubscriber","getNewsletterSubscription","sub","subt","active","subscribeNewsletter","unsubscribeNewsletter","param_send","getNewsletters","searchType","endpointTarget","mails","remap","defaults","m","remapped","blockAccount","unblockAccount","deleteAccount","inviteUser","createAccount","grantAccess","getInvitations","cancelInvitation","resendInvitation","updateUserAttributes","reqData","subscribeNotification","unsubscribeNotification","vapidPublicKey","pushNotification","user_ids","title","spellcast","getspell","dopamine","Skapi","__etc","schema","placeholderForm","idSplitLen","autoLogin","refetchServiceInfo","encryptionConfig","cdn_domain","sreg","restore","admin_endpoint","poolSetting","CognitoUserPool","uniqueIdScope","uniqueids","connection","storeClassProperties","to_be_cached","storageKey","slim","conn","listener","ua","__decorateClass","Types_exports"],"mappings":"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","file":"skapi.cjs","sourcesContent":["// Platform-aware global polyfill\nconst root = typeof globalThis !== 'undefined' ? (globalThis as any) : undefined;\nconst win = root?.window;\n\nfunction toBase64Url(input) {\n if (Buffer) {\n return Buffer.from(input).toString('base64');\n }\n\n let binary = '';\n const bytes = new Uint8Array(input);\n const chunk = 0x8000;\n\n for (let i = 0; i < bytes.length; i += chunk) {\n const slice = bytes.subarray(i, i + chunk);\n binary += String.fromCharCode.apply(null, Array.from(slice));\n }\n\n if (typeof btoa === 'function') {\n return btoa(binary);\n }\n\n throw new Error('No base64 encoder available in this environment.');\n}\n\nif (win) {\n win.global = win;\n win.global._runningInNodeJS = false;\n} else if (root) {\n root.global = root;\n \n // Polyfill browser APIs for Node.js\n if (typeof root.window === 'undefined') {\n // FileReader polyfill for Node.js\n class NodeFileReader {\n result: string | ArrayBuffer | null = null;\n error: Error | null = null;\n onload: ((this: NodeFileReader, ev: any) => any) | null = null;\n onloadend: ((this: NodeFileReader, ev: any) => any) | null = null;\n onerror: ((this: NodeFileReader, ev: any) => any) | null = null;\n\n readAsDataURL(blob: Blob) {\n blob.arrayBuffer().then(buffer => {\n const base64 = toBase64Url(buffer);\n const mimeType = (blob as any).type || 'application/octet-stream';\n this.result = `data:${mimeType};base64,${base64}`;\n if (this.onload) this.onload({ target: this });\n if (this.onloadend) this.onloadend({ target: this });\n }).catch(err => {\n this.error = err;\n if (this.onerror) this.onerror({ target: this });\n });\n }\n\n readAsArrayBuffer(blob: Blob) {\n blob.arrayBuffer().then(buffer => {\n this.result = buffer;\n if (this.onload) this.onload({ target: this });\n if (this.onloadend) this.onloadend({ target: this });\n }).catch(err => {\n this.error = err;\n if (this.onerror) this.onerror({ target: this });\n });\n }\n\n readAsText(blob: Blob, encoding = 'utf-8') {\n blob.text().then(text => {\n this.result = text;\n if (this.onload) this.onload({ target: this });\n if (this.onloadend) this.onloadend({ target: this });\n }).catch(err => {\n this.error = err;\n if (this.onerror) this.onerror({ target: this });\n });\n }\n }\n\n root.FileReader = NodeFileReader;\n\n // XMLHttpRequest polyfill for Node.js using node-fetch\n class NodeXMLHttpRequest {\n status: number = 0;\n statusText: string = '';\n readyState: number = 0;\n responseText: string = '';\n response: any = null;\n responseType: string = '';\n responseURL: string = '';\n timeout: number = 0;\n withCredentials: boolean = false;\n \n onload: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n onerror: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n onabort: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n ontimeout: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n onprogress: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n onreadystatechange: ((this: NodeXMLHttpRequest, ev: any) => any) | null = null;\n \n upload: { onprogress: ((this: NodeXMLHttpRequest, ev: any) => any) | null } = { onprogress: null };\n\n private _method: string = 'GET';\n private _url: string = '';\n private _headers: Record<string, string> = {};\n private _aborted: boolean = false;\n\n open(method: string, url: string) {\n this._method = method;\n this._url = url;\n this.readyState = 1;\n }\n\n setRequestHeader(name: string, value: string) {\n this._headers[name] = value;\n }\n\n getResponseHeader(name: string): string | null {\n return null; // Simplified implementation\n }\n\n abort() {\n this._aborted = true;\n if (this.onabort) this.onabort({});\n }\n\n send(body?: any) {\n if (this._aborted) return;\n \n const fetchOptions: RequestInit = {\n method: this._method,\n headers: this._headers,\n };\n \n if (body && this._method !== 'GET' && this._method !== 'HEAD') {\n fetchOptions.body = body;\n }\n\n fetch(this._url, fetchOptions)\n .then(async response => {\n if (this._aborted) return;\n \n this.status = response.status;\n this.statusText = response.statusText;\n this.responseURL = response.url;\n this.readyState = 4;\n\n if (this.responseType === 'blob') {\n this.response = await response.blob();\n } else if (this.responseType === 'json') {\n try {\n this.response = await response.json();\n } catch {\n this.response = null;\n }\n } else if (this.responseType === 'arraybuffer') {\n this.response = await response.arrayBuffer();\n } else {\n this.responseText = await response.text();\n this.response = this.responseText;\n }\n\n if (this.onload) this.onload({});\n })\n .catch(error => {\n if (this._aborted) return;\n if (this.onerror) this.onerror(error);\n });\n }\n }\n\n root.XMLHttpRequest = NodeXMLHttpRequest;\n\n root.window = {\n _runningInNodeJS: true,\n alert: (message: string) => console.error('[Alert]', message),\n sessionStorage: {\n getItem: (key: string) => null,\n setItem: (key: string, value: string) => {},\n removeItem: (key: string) => {},\n },\n localStorage: {\n getItem: (key: string) => {\n const fs = require('fs');\n const path = require('path');\n // read file \"{key}.skapi\" in ./states/localStorage/ as string\n try {\n const filePath = path.resolve(process.cwd(), 'states', 'localStorage', `${key}.skapi`);\n if (fs.existsSync(filePath)) {\n return fs.readFileSync(filePath, 'utf8');\n }\n return null;\n } catch (e) {\n return null;\n }\n },\n setItem: (key: string, value: string) => {\n const fs = require('fs');\n const path = require('path');\n // write file \"{key}.skapi\" in ./states/localStorage/ with value as content\n try {\n const dirPath = path.resolve(process.cwd(), 'states', 'localStorage');\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n const filePath = path.resolve(dirPath, `${key}.skapi`);\n fs.writeFileSync(filePath, value, 'utf8');\n } catch (e) {\n // ignore write errors\n }\n },\n removeItem: (key: string) => {\n const fs = require('fs');\n const path = require('path');\n try {\n const filePath = path.resolve(process.cwd(), 'states', 'localStorage', `${key}.skapi`);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n } catch (e) {\n // ignore delete errors\n }\n },\n },\n location: { \n href: '', \n origin: '', \n hostname: '', \n protocol: '', \n replace: (url: string) => {} \n },\n navigator: { \n userAgent: `nodejs/${root?.process?.versions?.node || 'unknown'}`,\n mediaDevices: {\n getUserMedia: async (constraints: any) => {\n throw new Error('getUserMedia is not supported in Node.js environment.');\n }\n }\n },\n addEventListener: () => {},\n removeEventListener: () => {}\n };\n }\n}","export default class SkapiError extends Error {\n code: string | number;\n cause: Error;\n\n constructor(\n error: any,\n options?: {\n name?: string;\n code?: string;\n cause?: Error;\n }) {\n\n if (Array.isArray(error) && error.length <= 2) {\n // \"code: msg\".split(':') => [\"code\", \"msg\"]\n\n let msg = error[1];\n if (error.length > 2) {\n for (let i = 2; i < error.length; i++) {\n if (typeof error[i] === 'string') {\n msg += error[i];\n }\n else {\n break;\n }\n }\n }\n\n super((msg || 'Something went wrong.').trim());\n this.name = options?.name || \"SKAPI\";\n this.code = options?.code || error[0] || \"ERROR\";\n if (options?.cause) {\n this.cause = options.cause;\n }\n }\n else {\n super((error?.message || ((typeof error === 'string') ? error : 'Something went wrong.')).trim());\n\n if (typeof error === 'string') {\n this.name = options?.name || \"SKAPI\";\n this.code = options?.code || 'ERROR';\n if (options?.cause) {\n this.cause = options.cause;\n }\n }\n\n else if (error instanceof Error) {\n this.cause = error;\n this.name = error.name;\n if (error.hasOwnProperty('code')) {\n this.code = (error as any).code;\n }\n }\n\n else if (typeof error === 'object' && error?.code && error?.message) {\n this.name = options?.name || \"SKAPI\";\n this.code = options?.code || 'ERROR';\n this.cause = error?.cause;\n }\n }\n }\n}","import SkapiError from \"../main/error\";\n\nconst BASE62_ALPHABET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\nconst BASE62 = BigInt(BASE62_ALPHABET.length);\nconst MAX_FORM_DATA_SIZE = 2 * 1024 * 1024;\nconst USER_ATTRIBUTE_EXCLUDES = ['aud', 'cognito:username', 'event_id', 'exp', 'iat', 'iss', 'jti', 'origin_jti', 'secret_key', 'token_use'];\nconst USER_ATTRIBUTE_CONVERTS = {\n auth_time: 'log',\n sub: 'user_id'\n};\nconst SERVICE_REGION_ALPHABET = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',\n 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'\n];\nconst SERVICE_REGION_KEYS = [\n 'us31', 'us72', 'ap51', 'ap22', 'ap41', 'eu71', 'ap21', 'us32', 'us71',\n 'af51', 'ap31', 'ap43', 'ap23', 'ap42', 'ca01', 'eu01', 'eu72', 'eu51',\n 'eu73', 'eu11', 'me51', 'sa31'\n];\n\nconst textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;\n\nfunction getGlobalBuffer() {\n if (typeof globalThis !== 'undefined') {\n return (globalThis as any).Buffer;\n }\n return undefined;\n}\n\nfunction encodeUtf8(value: string): Uint8Array {\n if (textEncoder) {\n return textEncoder.encode(value);\n }\n\n const binary = unescape(encodeURIComponent(value));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction toUint8Array(input: any): Uint8Array {\n if (input instanceof Uint8Array) {\n return input;\n }\n if (typeof input === 'string') {\n return encodeUtf8(input);\n }\n if (typeof ArrayBuffer !== 'undefined' && input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(input)) {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n if (Array.isArray(input)) {\n return Uint8Array.from(input);\n }\n\n const BufferCtor = getGlobalBuffer();\n if (BufferCtor) {\n return new Uint8Array(BufferCtor.from(input));\n }\n\n throw new Error('No byte conversion available in this environment.');\n}\n\nclass MD5 {\n private static readonly alphabet = '0123456789abcdef';\n\n public static hash(str?: string): string {\n if (typeof str !== 'string') {\n console.warn('coercing non-string value to empty string');\n str = '';\n }\n\n const x = MD5.sb(str);\n let a = 1732584193;\n let b = -271733879;\n let c = -1732584194;\n let d = 271733878;\n let lastA;\n let lastB;\n let lastC;\n let lastD;\n for (let i = 0; i < x.length; i += 16) {\n lastA = a;\n lastB = b;\n lastC = c;\n lastD = d;\n\n a = MD5.ff(a, b, c, d, x[i], 7, -680876936);\n d = MD5.ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = MD5.ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = MD5.ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = MD5.ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = MD5.ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = MD5.ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = MD5.ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = MD5.ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = MD5.ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = MD5.ff(c, d, a, b, x[i + 10], 17, -42063);\n b = MD5.ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = MD5.ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = MD5.ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = MD5.ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = MD5.ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = MD5.gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = MD5.gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = MD5.gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = MD5.gg(b, c, d, a, x[i], 20, -373897302);\n a = MD5.gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = MD5.gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = MD5.gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = MD5.gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = MD5.gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = MD5.gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = MD5.gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = MD5.gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = MD5.gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = MD5.gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = MD5.gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = MD5.gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = MD5.hh(a, b, c, d, x[i + 5], 4, -378558);\n d = MD5.hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = MD5.hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = MD5.hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = MD5.hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = MD5.hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = MD5.hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = MD5.hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = MD5.hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = MD5.hh(d, a, b, c, x[i], 11, -358537222);\n c = MD5.hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = MD5.hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = MD5.hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = MD5.hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = MD5.hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = MD5.hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = MD5.ii(a, b, c, d, x[i], 6, -198630844);\n d = MD5.ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = MD5.ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = MD5.ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = MD5.ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = MD5.ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = MD5.ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = MD5.ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = MD5.ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = MD5.ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = MD5.ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = MD5.ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = MD5.ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = MD5.ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = MD5.ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = MD5.ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = MD5.ad(a, lastA);\n b = MD5.ad(b, lastB);\n c = MD5.ad(c, lastC);\n d = MD5.ad(d, lastD);\n }\n\n return MD5.rh(a) + MD5.rh(b) + MD5.rh(c) + MD5.rh(d);\n }\n\n private static rh(n: number): string {\n let s = '';\n for (let j = 0; j <= 3; j++) {\n s += MD5.alphabet.charAt((n >> (j * 8 + 4)) & 0x0F) + MD5.alphabet.charAt((n >> (j * 8)) & 0x0F);\n }\n\n return s;\n }\n\n private static ad(x: number, y: number): number {\n const l = (x & 0xFFFF) + (y & 0xFFFF);\n const m = (x >> 16) + (y >> 16) + (l >> 16);\n\n return (m << 16) | (l & 0xFFFF);\n }\n\n private static rl(n: number, c: number): number {\n return (n << c) | (n >>> (32 - c));\n }\n\n private static cm(q: number, a: number, b: number, x: number, s: number, t: number): number {\n return MD5.ad(MD5.rl(MD5.ad(MD5.ad(a, q), MD5.ad(x, t)), s), b);\n }\n\n private static ff(a: number, b: number, c: number, d: number, x: number, s: number, t: number): number {\n return MD5.cm(b & c | ~b & d, a, b, x, s, t);\n }\n\n private static gg(a: number, b: number, c: number, d: number, x: number, s: number, t: number): number {\n return MD5.cm(b & d | c & ~d, a, b, x, s, t);\n }\n\n private static hh(a: number, b: number, c: number, d: number, x: number, s: number, t: number): number {\n return MD5.cm(b ^ c ^ d, a, b, x, s, t);\n }\n\n private static ii(a: number, b: number, c: number, d: number, x: number, s: number, t: number): number {\n return MD5.cm(c ^ (b | ~d), a, b, x, s, t);\n }\n\n private static sb(x: string): number[] {\n let i;\n const numBlocks = ((x.length + 8) >> 6) + 1;\n\n const blocks = new Array(numBlocks * 16);\n for (i = 0; i < numBlocks * 16; i++) {\n blocks[i] = 0;\n }\n\n for (i = 0; i < x.length; i++) {\n blocks[i >> 2] |= x.charCodeAt(i) << ((i % 4) * 8);\n }\n\n blocks[i >> 2] |= 0x80 << ((i % 4) * 8);\n blocks[numBlocks * 16 - 2] = x.length * 8;\n\n return blocks;\n }\n}\n\nfunction toBase62(num: number): string {\n if (num === 0) return BASE62_ALPHABET[0];\n let result = '';\n while (num > 0) {\n result = BASE62_ALPHABET[num % 62] + result;\n num = Math.floor(num / 62);\n }\n return result;\n}\n\nfunction fromBase62(chars: string): number {\n return chars.split('').reverse().reduce((prev, curr, i) =>\n prev + (BASE62_ALPHABET.indexOf(curr) * (62 ** i)), 0);\n}\n\nfunction generateRandom(length: number = 6): string {\n let result = '';\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n const charactersLength = characters.length;\n let counter = 0;\n while (counter < length) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n counter += 1;\n }\n return result;\n}\n\nfunction isNodeRuntime(): boolean {\n return typeof window === 'undefined' || !!(window as any)?._runningInNodeJS;\n}\n\nfunction isBrowserRuntime(): boolean {\n return !isNodeRuntime()\n && typeof document !== 'undefined'\n && typeof document.createElement === 'function';\n}\n\nfunction assertMaxFormDataSize(value: any): void {\n let serialized: string;\n\n try {\n serialized = JSON.stringify(value);\n }\n catch (e) {\n throw new SkapiError('Invalid data type.', { code: 'INVALID_REQUEST' });\n }\n\n if (new Blob([serialized]).size > MAX_FORM_DATA_SIZE) {\n throw new SkapiError('Data should not exceed 2MB', { code: 'INVALID_REQUEST' });\n }\n}\n\nfunction isDefaultTruthyInputValue(value: string): boolean {\n return value === '' || value === 'on' || value === 'true';\n}\n\nfunction isDefaultFalsyInputValue(value: string): boolean {\n return value === 'false';\n}\n\nfunction appendNamedElementValue(\n data: Record<string, any>,\n element: { name: string; value: string },\n appendData: (data: Record<string, any>, key: string, value: any) => void\n): void {\n if (element.name) {\n appendData(data, element.name, element.value);\n }\n}\n\n// Check if we're in a browser environment\nconst isBrowser = isBrowserRuntime();\nconst hasSubmitEvent = typeof SubmitEvent !== 'undefined';\nconst hasHTMLFormElement = typeof HTMLFormElement !== 'undefined';\n\nfunction extractFormData(\n form: FormData | HTMLFormElement | SubmitEvent | { [key: string]: any } | number | string | boolean | null,\n options?: {\n nullIfEmpty?: boolean,\n ignoreEmpty?: boolean,\n },\n callback?: (name: string, value: any) => any\n): { data: any, files: { name: string, file: File }[] } {\n let data = {};\n let files = [];\n\n function appendData(data, key, val) {\n if (options?.ignoreEmpty && val === '') {\n return;\n }\n if (options?.nullIfEmpty && val === '') {\n val = null;\n }\n if (typeof callback === 'function') {\n let v = callback(key, val);\n if (v !== undefined) {\n val = v;\n }\n }\n // key is a[b][c]\n // a[b][c][0] when array\n // if a[b][c] exists, then a[b][c] = [a[b][c], val]\n let keys = key.split('[').map(k => {\n let key = k.replace(']', '')\n let numb = Number(key);\n if (!isNaN(numb) && !key.includes('.')) {\n key = numb;\n }\n else if (key[0] === '\"' && key[key.length - 1] === '\"' || key[0] === \"'\" && key[key.length - 1] === \"'\") {\n key = key.replace(/\"/g, '').replace(/'/g, '');\n }\n return key;\n });\n let obj = data;\n if (typeof keys[0] === 'number') {\n throw new SkapiError('Form key cannot start with an array index.', { code: 'INVALID_REQUEST' });\n }\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i < keys.length - 1) {\n if (obj[k] === undefined) {\n let next = keys[i + 1];\n if (typeof next === 'number') {\n obj[k] = [];\n }\n else {\n obj[k] = {};\n }\n }\n obj = obj[k];\n }\n else {\n if (obj[k] === undefined) {\n obj[k] = val;\n }\n else if (Array.isArray(obj[k])) {\n obj[k].push(val);\n }\n else {\n obj[k] = [obj[k], val];\n }\n }\n }\n }\n\n function handleFile(files, name, v) {\n if (v instanceof File) {\n files.push({ name, file: v });\n }\n else if (v instanceof FileList) {\n if (v && v.length > 0) {\n for (let idx = 0; idx <= v.length - 1; idx++) {\n let file = v.item(idx)\n if (file) {\n files.push({ name, file });\n }\n }\n }\n }\n }\n\n let handleInput = (i: HTMLInputElement) => {\n if (i.name) {\n if (i.type === 'number') {\n if (i.value) {\n appendData(data, i.name, Number(i.value));\n }\n }\n else if (i.type === 'checkbox' || i.type === 'radio') {\n if (i.checked) {\n if ((i.type === 'checkbox' && i.value === '') || isDefaultTruthyInputValue(i.value)) {\n appendData(data, i.name, true);\n }\n else if (isDefaultFalsyInputValue(i.value)) {\n appendData(data, i.name, false);\n }\n else if (i.value) {\n appendData(data, i.name, i.value);\n }\n }\n else if (i.type === 'checkbox') {\n if (isDefaultTruthyInputValue(i.value)) {\n appendData(data, i.name, false);\n }\n else if (isDefaultFalsyInputValue(i.value)) {\n appendData(data, i.name, true);\n }\n }\n }\n else if (i.type === 'file') {\n if (i.files && i.files.length > 0) {\n handleFile(files, i.name, i.files);\n }\n }\n else {\n appendData(data, i.name, i.value);\n }\n }\n }\n\n if (isBrowser && (form instanceof HTMLInputElement || form instanceof HTMLSelectElement || form instanceof HTMLTextAreaElement)) {\n handleInput(form as HTMLInputElement);\n assertMaxFormDataSize(data);\n return { data, files };\n }\n\n else {\n if (isBrowser && form instanceof FormData) {\n for (let pair of form.entries()) {\n let name = pair[0];\n let v = pair[1];\n if ((v instanceof File) || ((v as any) instanceof FileList)) {\n handleFile(files, name, v);\n }\n else if ((v as any) instanceof Blob) {\n let j = v as any;\n if (j.type === 'application/json') {\n try {\n let json = JSON.parse(j.text());\n appendData(data, name, json);\n }\n catch (err) {\n appendData(data, name, j);\n }\n }\n }\n else {\n appendData(data, name, v);\n }\n }\n assertMaxFormDataSize(data);\n return { data, files };\n }\n if (isBrowser && hasSubmitEvent && form instanceof SubmitEvent) {\n form = form.target;\n }\n if (isBrowser && hasHTMLFormElement && form instanceof HTMLFormElement) {\n let inputs = form.querySelectorAll('input');\n let selects = form.querySelectorAll('select');\n let textarea = form.querySelectorAll('textarea');\n for (let idx = 0; idx < selects.length; idx++) {\n appendNamedElementValue(data, selects[idx], appendData);\n }\n for (let idx = 0; idx < textarea.length; idx++) {\n appendNamedElementValue(data, textarea[idx], appendData);\n }\n for (let idx = 0; idx < inputs.length; idx++) {\n handleInput(inputs[idx]);\n }\n\n assertMaxFormDataSize(data);\n return { data, files };\n }\n }\n\n assertMaxFormDataSize(form);\n\n return { data: form, files };\n}\n\nfunction parseUserAttributes(attr: { [key: string]: any }) {\n let user: any = {};\n // parse attribute structure: [ { Name, Value }, ... ]\n for (let name in attr) {\n let value = attr[name];\n\n if (USER_ATTRIBUTE_EXCLUDES.includes(name)) continue;\n\n if (USER_ATTRIBUTE_CONVERTS[name]) {\n user[USER_ATTRIBUTE_CONVERTS[name]] = value;\n }\n\n else if (name.includes('custom:')) {\n // if (name === 'custom:service' && value !== this.service) {\n // throw new SkapiError('The user is not registered to the service.', { code: 'INVALID_REQUEST' });\n // }\n user[name.replace('custom:', '')] = value;\n }\n\n else if (name === 'address') {\n let addr_main: any = value;\n if (addr_main && typeof addr_main === 'object' && Object.keys(addr_main).length) {\n if (addr_main?.formatted) {\n try {\n user[name] = JSON.parse(addr_main.formatted);\n }\n catch (err) {\n user[name] = addr_main.formatted;\n }\n }\n }\n else {\n user[name] = addr_main;\n }\n }\n else {\n user[name] = value;\n }\n }\n\n for (let k of [\n 'address_public',\n 'birthdate_public',\n 'email_public',\n 'gender_public',\n 'phone_number_public',\n 'access_group'\n ]) {\n if (k.includes('_public')) {\n if (user.hasOwnProperty(k.split('_')[0])) user[k] = user.hasOwnProperty(k) ? !!Number(user[k]) : false;\n else delete user[k];\n }\n else user[k] = user.hasOwnProperty(k) ? Number(user[k]) : 0;\n }\n\n for (let k of [\n 'email',\n 'phone_number'\n ]) {\n if (user.hasOwnProperty(k)) {\n user[k + '_verified'] = user[k + '_verified'] === true;\n }\n else {\n delete user[k + '_verified'];\n }\n }\n\n return user;\n}\n\nfunction decodeProjectId(service) {\n service = decompressCompoundId(service); // validate format and throw if invalid\n if (service.split(\"-\").length === 7) {\n const idSplit = service.split(\"-\");\n let region;\n let owner;\n\n try {\n region = SERVICE_REGION_KEYS[fromBase62(idSplit[1][0])];\n owner = idSplit.slice(2).join(\"-\");\n }\n catch (err) {\n throw new Error('INVALID_PARAMETER: Service ID is invalid: ' + service);\n }\n\n if (!region) {\n throw new Error('INVALID_PARAMETER: Service ID is invalid: ' + service);\n }\n\n return { service: region + idSplit[0] + idSplit[1].slice(1), owner };\n }\n\n return { service, owner: \"\" };\n}\n\nfunction formatServiceId(serviceId, ownerId) {\n // format service ID\n const regionIndex = SERVICE_REGION_KEYS.indexOf(serviceId.slice(0, 4));\n const regionChar = SERVICE_REGION_ALPHABET[regionIndex];\n const subRegionId = serviceId.slice(4, -4);\n\n let formattedServiceId = `${subRegionId}-${regionChar}${serviceId.slice(-4)}-${ownerId}`;\n return compressCompoundId(formattedServiceId);\n}\n\nfunction b62ToBigInt(str) {\n let value = 0n;\n\n for (const ch of str) {\n const idx = BASE62_ALPHABET.indexOf(ch);\n if (idx < 0) {\n throw new Error(`INVALID_PARAMETER: Invalid base62 character: ${ch}`);\n }\n value = value * BASE62 + BigInt(idx);\n }\n\n return value;\n}\n\nfunction bigIntToB62(value, minLength = 1) {\n if (value < 0n) {\n throw new Error('INVALID_PARAMETER: Negative values are not supported.');\n }\n\n if (value === 0n) {\n return '0'.repeat(Math.max(1, minLength));\n }\n\n let output = '';\n let current = value;\n\n while (current > 0n) {\n const remainder = Number(current % BASE62);\n output = BASE62_ALPHABET[remainder] + output;\n current /= BASE62;\n }\n\n if (output.length < minLength) {\n output = '0'.repeat(minLength - output.length) + output;\n }\n\n return output;\n}\n\nfunction bigIntToBytes(value) {\n if (value === 0n) {\n return Uint8Array.from([0]);\n }\n\n const bytes = [];\n let current = value;\n\n while (current > 0n) {\n bytes.push(Number(current & 0xffn));\n current >>= 8n;\n }\n\n bytes.reverse();\n return Uint8Array.from(bytes);\n}\n\nfunction bytesToBigInt(buf) {\n let value = 0n;\n\n for (const b of buf) {\n value = (value << 8n) + BigInt(b);\n }\n\n return value;\n}\n\nfunction uuidToBytes(uuid) {\n const hex = String(uuid).replace(/-/g, '');\n\n if (!/^[0-9a-fA-F]{32}$/.test(hex)) {\n throw new Error('INVALID_PARAMETER: Invalid UUID format.');\n }\n\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i++) {\n bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n\n return bytes;\n}\n\nfunction bytesToUuid(buf16) {\n const hex = Array.from(toUint8Array(buf16), b => b.toString(16).padStart(2, '0')).join('');\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20)\n ].join('-');\n}\n\n\nfunction compressCompoundId(input) {\n const inputString = String(input);\n\n if (inputString.split('-').length === 2) {\n return inputString;\n }\n\n const match = inputString.match(/^([0-9A-Za-z]+)-([0-9A-Za-z]+)-([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/);\n\n if (!match) {\n throw new Error('INVALID_PARAMETER: Input must match <base62>-<base62>-<uuid>.');\n }\n\n const [, firstPart, secondPart, uuid] = match;\n\n if (firstPart.length < 2) {\n throw new Error('INVALID_PARAMETER: The first part must contain at least 2 characters.');\n }\n\n if (secondPart.length >= BASE62_ALPHABET.length) {\n throw new Error('INVALID_PARAMETER: The middle section is too long to encode.');\n }\n\n const movedPrefix = firstPart.slice(0, 2);\n const movedFirstPart = firstPart.slice(2);\n const movedMiddlePart = secondPart + movedPrefix;\n\n // Part1 token format: [secondPartLength(base62:1char)][movedFirstPart][movedMiddlePart]\n const part1 = BASE62_ALPHABET[secondPart.length] + movedFirstPart + movedMiddlePart;\n\n const uuidBytes = uuidToBytes(uuid);\n const part2 = bigIntToB62(bytesToBigInt(uuidBytes));\n\n return `${part1}-${part2}`;\n}\n\nfunction decompressCompoundId(token) {\n const tokenString = String(token);\n\n if (tokenString.split('-').length !== 2) {\n return tokenString;\n }\n\n const split = tokenString.split('-');\n\n if (split.length !== 2 || !split[0] || !split[1]) {\n throw new Error('INVALID_PARAMETER: Corrupt compressed token: ' + tokenString);\n }\n\n const [part1, part2] = split;\n const secondLength = BASE62_ALPHABET.indexOf(part1[0]);\n\n if (secondLength < 0) {\n throw new Error('INVALID_PARAMETER: Corrupt compressed token: ' + tokenString);\n }\n\n const compacted = part1.slice(1);\n const movedMiddleLength = secondLength + 2;\n\n if (compacted.length < movedMiddleLength) {\n throw new Error('INVALID_PARAMETER: Corrupt compressed token: ' + tokenString);\n }\n\n const movedFirstPart = compacted.slice(0, compacted.length - movedMiddleLength);\n const movedMiddlePart = compacted.slice(compacted.length - movedMiddleLength);\n\n const movedPrefix = movedMiddlePart.slice(secondLength);\n const secondPart = movedMiddlePart.slice(0, secondLength);\n const firstPart = movedPrefix + movedFirstPart;\n\n if (!/^[0-9A-Za-z]+$/.test(firstPart) || !/^[0-9A-Za-z]+$/.test(secondPart)) {\n throw new Error('INVALID_PARAMETER: Corrupt compressed token: ' + tokenString);\n }\n\n const uuidValue = b62ToBigInt(part2);\n const uuidRaw = bigIntToBytes(uuidValue);\n\n if (uuidRaw.length > 16) {\n throw new Error('INVALID_PARAMETER: Corrupt compressed token: ' + tokenString);\n }\n\n const uuidBytes = new Uint8Array(16);\n uuidBytes.set(uuidRaw, 16 - uuidRaw.length);\n const uuid = bytesToUuid(uuidBytes);\n\n return `${firstPart}-${secondPart}-${uuid}`;\n}\n\n\n\n/** UTF-8 decode bytes back to a string. Inverse of encodeUtf8. */\nfunction decodeUtf8(bytes: Uint8Array): string {\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder().decode(bytes);\n }\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return decodeURIComponent(escape(binary));\n}\n\n/** Concatenate byte runs into one Uint8Array. */\nfunction concatBytes(...parts: Uint8Array[]): Uint8Array {\n let total = 0;\n for (let p of parts) {\n total += p.length;\n }\n let out = new Uint8Array(total);\n let at = 0;\n for (let p of parts) {\n out.set(p, at);\n at += p.length;\n }\n return out;\n}\n\n\nexport {\n fromBase62,\n toBase62,\n isNodeRuntime,\n isBrowserRuntime,\n extractFormData,\n MD5,\n generateRandom,\n parseUserAttributes,\n compressCompoundId,\n decompressCompoundId,\n formatServiceId,\n decodeProjectId,\n encodeUtf8,\n decodeUtf8,\n toUint8Array,\n concatBytes\n};","\nimport SkapiError from '../main/error';\nimport { extractFormData } from './utils';\nimport cocochex from \"cocochex\";\n\nfunction UserId(id: string, param = 'User ID') {\n // let uuid_regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n // let uuid_regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n let uuid_regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (!id) {\n throw new SkapiError(`${param} is empty.`, { code: 'INVALID_PARAMETER' });\n }\n else if (typeof id !== 'string') {\n throw new SkapiError(`${param} should be type: string.`, { code: 'INVALID_PARAMETER' });\n }\n else if (!id.match(uuid_regex)) {\n throw new SkapiError(`${param} is invalid.`, { code: 'INVALID_PARAMETER' });\n }\n\n return id;\n}\n\nfunction PhoneNumber(value: string) {\n if (value) {\n if (typeof value !== 'string' || value.charAt(0) !== '+' || isNaN(Number(value.substring(1)))) {\n throw new SkapiError('\"phone_number\" is invalid. The format should be \"+00123456789\". Type: string.', { code: 'INVALID_PARAMETER' });\n }\n }\n return value || '';\n}\n\nfunction Birthdate(birthdate: string) {\n // yyyy-mm-dd\n if (birthdate) {\n if (typeof birthdate !== 'string') {\n throw new SkapiError('\"birthdate\" is invalid. The format should be \"yyyy-mm-dd\". Type: string.', { code: 'INVALID_PARAMETER' });\n }\n\n else {\n let date_regex = new RegExp(/([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))/);\n if (birthdate.length !== 10 || birthdate.split('-').length !== 3 || !date_regex.test(birthdate)) {\n throw new SkapiError('\"birthdate\" is invalid. The format should be \"yyyy-mm-dd\". Type: string.', { code: 'INVALID_PARAMETER' });\n }\n }\n }\n return birthdate || '';\n}\n\nfunction Password(password: string) {\n if (!password) {\n throw new SkapiError('\"password\" is required.', { code: 'INVALID_PARAMETER' });\n }\n else if (typeof password !== 'string') {\n throw new SkapiError('\"password\" should be type: string.', { code: 'INVALID_PARAMETER' });\n }\n else if (password.length < 6) {\n throw new SkapiError('\"password\" should be at least 6 characters.', { code: 'INVALID_PARAMETER' });\n }\n else if (password.length > 60) {\n throw new SkapiError('\"password\" can be up to 60 characters max.', { code: 'INVALID_PARAMETER' });\n }\n\n return password;\n}\n\nfunction Email(email: string, paramName: string = 'email') {\n if (!email) {\n throw new SkapiError(`\"${paramName}\" is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n else if (typeof email !== 'string') {\n throw new SkapiError(`\"${paramName}\"should be type: string.`, { code: 'INVALID_PARAMETER' });\n }\n\n else if (email.length < 5) {\n throw new SkapiError(`\"${paramName}\" should be at least 5 characters.`, { code: 'INVALID_PARAMETER' });\n }\n\n else if (/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/.test(email)) {\n email = email.trim();\n let splitAt = email.split('@');\n let tld = splitAt[1].split('.');\n\n if (tld.length >= 2) {\n return email.toLowerCase();\n }\n }\n\n throw new SkapiError(`\"${email}\" is an invalid email.`, { code: 'INVALID_PARAMETER' });\n}\n\nfunction Url(url: string | string[]) {\n const hasWindow = typeof window !== 'undefined';\n const baseUrl = (() => {\n let baseUrl = hasWindow ? window.location.origin || null : null;\n if (baseUrl && baseUrl.slice(-1) === '/') {\n baseUrl = baseUrl.slice(0, -1);\n }\n\n return baseUrl;\n })();\n let check = (c: string) => {\n if (typeof c === 'string') {\n if (c === '*') {\n return '*';\n }\n else {\n let cu = c.trim();\n if (cu[0] === '/' && baseUrl) {\n if (baseUrl.slice(0, 5) === 'file:') {\n throw new SkapiError(`\"${c}\" is an invalid url. Relative URL does not work on local file system. Use full URL string.`, { code: 'INVALID_PARAMETER' });\n }\n cu = baseUrl + cu;\n }\n else if (cu[0] === '.' && baseUrl) {\n if (baseUrl.slice(0, 5) === 'file:') {\n throw new SkapiError(`\"${c}\" is an invalid url. Relative URL does not work on local file system. Use full URL string.`, { code: 'INVALID_PARAMETER' });\n }\n let curr_loc = hasWindow ? window.location.href.split('?')[0] : '';\n if (curr_loc.slice(-1) !== '/') {\n curr_loc += '/';\n }\n\n cu = curr_loc + cu.slice(1);\n }\n\n let _url;\n\n try {\n _url = new URL(cu);\n }\n catch (err) {\n throw new SkapiError(`\"${c}\" is an invalid url.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (_url.protocol) {\n let url = _url.href;\n return url;\n }\n }\n }\n\n throw new SkapiError(`\"${c}\" is an invalid url.`, { code: 'INVALID_PARAMETER' });\n };\n\n if (Array.isArray(url)) {\n return url.map(u => check(u));\n }\n else {\n return check(url);\n }\n}\n\nfunction Params<T = any>(\n params: T,\n struct: Record<string, any>,\n required: string[] = [],\n options?: {\n ignoreEmpty?: boolean;\n nullIfEmpty?: boolean;\n precall?: (pre: { data: any, files: any }) => void\n }\n): T {\n // struct = {\n // a: 'type or value',\n // b: ['number', 'boolean', 'string', 'array', 'function', 'custom value', () => 'default value when none match, or is missing'],\n // c: (v: any) => { return 'value to assign'; }\n // }\n let ext = extractFormData(params, options);\n let p = ext.data;\n struct.service = 'string';\n struct.owner = 'string';\n\n let toCheck = {};\n\n // Extra user input fields not in schema are ignored.\n // If a field value is already a function, it copies it directly (JSON clone would break functions).\n // For each allowed field, it tries to deep-copy via JSON stringify/parse so later validation/mutation does not mutate the original input object.\n for (let s in struct) {\n if (p && typeof p === 'object' && !Array.isArray(p) && p.hasOwnProperty(s)) {\n if (typeof p[s] === 'function') {\n toCheck[s] = p[s];\n }\n else {\n try {\n toCheck[s] = JSON.parse(JSON.stringify(p[s]));\n }\n catch (err) {\n toCheck[s] = p[s];\n }\n }\n }\n }\n\n if (options?.precall) {\n options.precall({ data: toCheck, files: ext?.files || [] });\n }\n\n try {\n return cocochex(toCheck, struct, required) as T;\n }\n catch (err: any) {\n throw new SkapiError(err.message, { code: 'INVALID_PARAMETER' });\n }\n}\n\nexport default {\n UserId,\n PhoneNumber,\n Birthdate,\n Password,\n Email,\n Url,\n Params\n};","/**\n * Web Crypto primitives for skapi's client-side record encryption.\n *\n * This is the ONLY file in the SDK that touches WebCrypto directly. Every\n * feature-detection and encoding decision lives here exactly once, so the\n * feature module above it never has to think about runtime differences.\n *\n * Rules this file holds to, all of which are load-bearing for the security\n * claim and are easy to break by accident:\n *\n * - No `this`, no network, no imports from src/methods/. Pure functions.\n * - No subtle.wrapKey/unwrapKey ANYWHERE. wrapKey throws InvalidAccessError\n * unless the key being wrapped is extractable:true, which would make every\n * DEK and identity key in the process exportable by injected script. We\n * encrypt raw bytes with plain encrypt/decrypt and re-import the result\n * non-extractable instead.\n * - Every key that lives longer than one function call is imported with\n * extractable:false. Extractable private material exists transiently at\n * exactly one place (generateIdentity) and is zeroized before return.\n * - All binary crosses the wire as UNPADDED base64url.\n */\n\nimport SkapiError from '../main/error';\nimport { encodeUtf8, decodeUtf8, toUint8Array, concatBytes } from './utils';\n\n/** Domain-separation prefix. Bump alongside the envelope version. */\nexport const ENC_V = 'skapi.enc.v1';\n\n/** PBKDF2 iteration floor (OWASP guidance for PBKDF2-HMAC-SHA-256). */\nexport const PBKDF2_ITERATIONS = 600000;\n\n/** AES-GCM nonce length. 96 bits is the only size the spec optimizes for. */\nconst IV_LEN = 12;\n\nlet _subtleCache: SubtleCrypto | null = null;\nlet _cryptoCache: Crypto | null = null;\n\nfunction notSupported(): SkapiError {\n return new SkapiError(\n 'Encryption requires Web Crypto, which needs a secure context (https, or localhost) in the browser, or Node 18 or newer. ' +\n 'A page served over plain http has crypto.getRandomValues but crypto.subtle is undefined.',\n { code: 'NOT_SUPPORTED' }\n );\n}\n\n/**\n * Resolve the platform Crypto object.\n *\n * The ladder matters. In a browser on http:// (not localhost) globalThis.crypto\n * EXISTS but crypto.subtle is undefined, so testing for `crypto` alone is not\n * enough and never has been. On Node 18 globalThis.crypto was still behind a\n * flag in some builds, so we fall back to node:crypto's webcrypto export. The\n * require is lazy and inside the function so bundlers can alias it away for the\n * browser build without the module failing to load.\n */\nfunction resolveCrypto(): Crypto {\n if (_cryptoCache) {\n return _cryptoCache;\n }\n\n let g: any = typeof globalThis !== 'undefined' ? globalThis : undefined;\n\n if (g?.crypto?.subtle && typeof g.crypto.getRandomValues === 'function') {\n _cryptoCache = g.crypto;\n return _cryptoCache;\n }\n\n // Node fallback. Wrapped because in a browser bundle this identifier may not\n // exist at all, and because the alias in tsup.config.ts replaces it with an\n // empty shim for the IIFE/browser builds.\n try {\n // eslint-disable-next-line\n let nodeCrypto = typeof require === 'function' ? require('node:crypto') : null;\n if (nodeCrypto?.webcrypto?.subtle) {\n _cryptoCache = nodeCrypto.webcrypto as Crypto;\n return _cryptoCache;\n }\n }\n catch (err) {\n // fall through to the throw below\n }\n\n throw notSupported();\n}\n\nexport function getSubtle(): SubtleCrypto {\n if (_subtleCache) {\n return _subtleCache;\n }\n let c = resolveCrypto();\n if (!c.subtle) {\n throw notSupported();\n }\n _subtleCache = c.subtle;\n return _subtleCache;\n}\n\n/** True when this runtime can do record encryption at all. Never throws. */\nexport function cryptoAvailable(): boolean {\n try {\n getSubtle();\n return true;\n }\n catch (err) {\n return false;\n }\n}\n\n/**\n * CSPRNG bytes.\n *\n * Deliberately NOT utils.generateRandom(), which is Math.random based and is\n * only ever used for non-secret ids. Nothing in this file may use Math.random.\n */\nexport function getRandom(n: number): Uint8Array {\n let c = resolveCrypto();\n let out = new Uint8Array(n);\n\n // getRandomValues throws QuotaExceededError past 65536 bytes per call, in\n // both the browser and Node. Nothing here asks for more than 32 at a time\n // today, but a helper that silently explodes at 64KB is a landmine for the\n // next caller, so fill in chunks.\n const MAX = 65536;\n for (let i = 0; i < n; i += MAX) {\n c.getRandomValues(out.subarray(i, Math.min(i + MAX, n)));\n }\n\n return out;\n}\n\nexport function randomUuid(): string {\n let c: any = resolveCrypto();\n if (typeof c.randomUUID === 'function') {\n return c.randomUUID();\n }\n // RFC 4122 v4 from CSPRNG bytes, for targets without randomUUID.\n let b = getRandom(16);\n b[6] = (b[6] & 0x0f) | 0x40;\n b[8] = (b[8] & 0x3f) | 0x80;\n let hex = Array.from(b, x => x.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/* ------------------------------------------------------------------ *\n * base64url\n *\n * The one canonical pair for the SDK. Do NOT reuse toBase64Url from\n * src/polyfills/global.ts: despite its name it emits STANDARD base64\n * (it never substitutes -/_ nor strips padding), and its first line is a\n * bare `if (Buffer)` with no typeof guard, which throws ReferenceError in\n * a browser that has no Buffer shim.\n * ------------------------------------------------------------------ */\n\nexport function b64uFromBytes(input: Uint8Array | ArrayBuffer): string {\n let u8 = toUint8Array(input);\n\n let std: string;\n if (typeof Buffer !== 'undefined' && typeof Buffer.from === 'function') {\n std = Buffer.from(u8).toString('base64');\n }\n else if (typeof btoa === 'function') {\n // Chunked: String.fromCharCode.apply on a large array blows the stack.\n let binary = '';\n const chunk = 0x8000;\n for (let i = 0; i < u8.length; i += chunk) {\n binary += String.fromCharCode.apply(null, Array.from(u8.subarray(i, i + chunk)));\n }\n std = btoa(binary);\n }\n else {\n throw new SkapiError('No base64 encoder available in this environment.', { code: 'NOT_SUPPORTED' });\n }\n\n return std.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nexport function b64uToBytes(input: string): Uint8Array {\n if (typeof input !== 'string') {\n throw new SkapiError('Expected a base64url string.', { code: 'INVALID_PARAMETER' });\n }\n\n let std = input.replace(/-/g, '+').replace(/_/g, '/');\n let pad = std.length % 4;\n if (pad === 2) {\n std += '==';\n }\n else if (pad === 3) {\n std += '=';\n }\n else if (pad === 1) {\n throw new SkapiError('Malformed base64url string.', { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof Buffer !== 'undefined' && typeof Buffer.from === 'function') {\n let buf = Buffer.from(std, 'base64');\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n }\n\n if (typeof atob === 'function') {\n let binary = atob(std);\n let out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n out[i] = binary.charCodeAt(i);\n }\n return out;\n }\n\n throw new SkapiError('No base64 decoder available in this environment.', { code: 'NOT_SUPPORTED' });\n}\n\n/* ------------------------------------------------------------------ *\n * Hash / KDF\n * ------------------------------------------------------------------ */\n\nexport async function sha256(data: Uint8Array): Promise<Uint8Array> {\n // `as BufferSource` because TS's lib.dom types for digest do not accept a\n // Uint8Array<ArrayBufferLike> union cleanly across our two tsconfig targets.\n let out = await getSubtle().digest('SHA-256', data as BufferSource);\n return new Uint8Array(out);\n}\n\nexport async function hkdf(ikm: Uint8Array, salt: Uint8Array, info: Uint8Array, len: number): Promise<Uint8Array> {\n let subtle = getSubtle();\n let base = await subtle.importKey('raw', ikm as BufferSource, 'HKDF', false, ['deriveBits']);\n let bits = await subtle.deriveBits(\n { name: 'HKDF', hash: 'SHA-256', salt: salt as BufferSource, info: info as BufferSource },\n base,\n len * 8\n );\n return new Uint8Array(bits);\n}\n\n/**\n * Derive the key-encryption key from the user's login password.\n *\n * PBKDF2 first (the only password KDF WebCrypto offers: there is no Argon2id\n * and no scrypt, which is the ceiling on this whole design), then a\n * non-optional HKDF domain-separation step that binds the KEK to\n * (service, owner, user_id). That binding is what stops a keyring blob lifted\n * out of one project from being opened by a KEK derived in another.\n *\n * The password is NFC-normalized first so that a composed and a decomposed\n * form of the same accented character derive the same key. Without this, a\n * user who types \"e\" + combining acute on macOS and precomposed on Windows\n * gets two different keys from the same visible password.\n */\nexport async function deriveKek(\n password: string,\n salt: Uint8Array,\n iterations: number,\n info: Uint8Array\n): Promise<CryptoKey> {\n let subtle = getSubtle();\n let pwBytes = encodeUtf8(password.normalize('NFC'));\n\n let base = await subtle.importKey('raw', pwBytes as BufferSource, 'PBKDF2', false, ['deriveBits']);\n let prk = new Uint8Array(await subtle.deriveBits(\n { name: 'PBKDF2', salt: salt as BufferSource, iterations, hash: 'SHA-256' },\n base,\n 256\n ));\n\n let kekBytes = await hkdf(prk, salt, info, 32);\n zeroize(prk);\n zeroize(pwBytes);\n\n let key = await importAesGcm(kekBytes);\n zeroize(kekBytes);\n return key;\n}\n\n/* ------------------------------------------------------------------ *\n * AES-GCM\n * ------------------------------------------------------------------ */\n\n/** Import raw bytes as a non-extractable AES-GCM key. */\nexport async function importAesGcm(raw: Uint8Array): Promise<CryptoKey> {\n return getSubtle().importKey('raw', raw as BufferSource, { name: 'AES-GCM' }, false, ['encrypt', 'decrypt']);\n}\n\n/** Fresh 256-bit AES-GCM key material. Returns both the bytes and the key. */\nexport async function generateAesGcm(): Promise<{ bytes: Uint8Array; key: CryptoKey }> {\n let bytes = getRandom(32);\n let key = await importAesGcm(bytes);\n return { bytes, key };\n}\n\n/**\n * Authenticated encrypt. A FRESH random IV every single call, no exceptions:\n * reusing an (key, iv) pair under GCM is a catastrophic break, not a weakening.\n */\nexport async function sealGcm(key: CryptoKey, plaintext: Uint8Array, aad: Uint8Array): Promise<{ iv: Uint8Array; ct: Uint8Array }> {\n let iv = getRandom(IV_LEN);\n let ct = await getSubtle().encrypt(\n { name: 'AES-GCM', iv: iv as BufferSource, additionalData: aad as BufferSource, tagLength: 128 },\n key,\n plaintext as BufferSource\n );\n return { iv, ct: new Uint8Array(ct) };\n}\n\n/**\n * Authenticated decrypt. Throws on a tag mismatch, which is the ONLY signal\n * that matters: a wrong key, a tampered ciphertext, a tampered AAD and a\n * transplanted envelope all surface here identically and must all be treated\n * as failure. Callers translate this into a flag, never into a partial result.\n */\nexport async function openGcm(key: CryptoKey, iv: Uint8Array, ct: Uint8Array, aad: Uint8Array): Promise<Uint8Array> {\n let pt = await getSubtle().decrypt(\n { name: 'AES-GCM', iv: iv as BufferSource, additionalData: aad as BufferSource, tagLength: 128 },\n key,\n ct as BufferSource\n );\n return new Uint8Array(pt);\n}\n\n/* ------------------------------------------------------------------ *\n * ECDH P-256 identity\n *\n * P-256 and not X25519: X25519 is still missing from Node 18's WebCrypto\n * (Node 18 is in the CI matrix) and from older Safari. The keyring's `alg`\n * field and the envelope's `kw` field exist so a better curve can be adopted\n * later behind feature detection without a format break.\n * ------------------------------------------------------------------ */\n\nconst ECDH_P256 = { name: 'ECDH', namedCurve: 'P-256' };\n\n/**\n * Generate a fresh identity keypair.\n *\n * The private key is generated extractable so it can be exported to pkcs8 and\n * encrypted under MK. That extractable handle is the one moment of exposure in\n * the whole design and it never escapes this function: the caller receives only\n * the pkcs8 bytes (to encrypt immediately) and a re-imported NON-extractable\n * key for use. Zeroize the pkcs8 buffer as soon as it is sealed.\n */\nexport async function generateIdentity(): Promise<{ pubRaw: Uint8Array; pkcs8: Uint8Array; priv: CryptoKey }> {\n let subtle = getSubtle();\n let pair = await subtle.generateKey(ECDH_P256, true, ['deriveBits']) as CryptoKeyPair;\n\n let pubRaw = new Uint8Array(await subtle.exportKey('raw', pair.publicKey));\n let pkcs8 = new Uint8Array(await subtle.exportKey('pkcs8', pair.privateKey));\n\n // Re-import non-extractable. The extractable handle in `pair` goes out of\n // scope here and is never stored.\n let priv = await importIdentityPriv(pkcs8);\n\n return { pubRaw, pkcs8, priv };\n}\n\n/** Import a pkcs8 private key, NON-extractable. */\nexport async function importIdentityPriv(pkcs8: Uint8Array): Promise<CryptoKey> {\n return getSubtle().importKey('pkcs8', pkcs8 as BufferSource, ECDH_P256, false, ['deriveBits']);\n}\n\n/** Import a peer's 65-byte uncompressed raw P-256 point. */\nexport async function importPeerPub(raw: Uint8Array): Promise<CryptoKey> {\n if (raw.length !== 65 || raw[0] !== 0x04) {\n throw new SkapiError('Malformed public key: expected a 65 byte uncompressed P-256 point.', { code: 'INVALID_PARAMETER' });\n }\n return getSubtle().importKey('raw', raw as BufferSource, ECDH_P256, false, []);\n}\n\n/** Stable fingerprint of a published public key, for pinning and display. */\nexport async function fingerprint(pubRaw: Uint8Array): Promise<string> {\n return b64uFromBytes(await sha256(pubRaw));\n}\n\n/**\n * ECDH-ES wrap: seal `dek` so only the holder of `peerPubRaw`'s private half\n * can open it.\n *\n * Ephemeral-static, so a fresh Z per wrap and no HKDF salt is needed. `info`\n * carries the record anchor, the owner, the recipient id and the recipient's\n * key fingerprint, and the same facts are repeated in `aad`. A wrap copied to\n * another record, replayed for another user, or re-pointed at a substituted\n * key therefore fails the GCM tag instead of decrypting.\n */\nexport async function wrapEcdhEs(\n peerPubRaw: Uint8Array,\n dek: Uint8Array,\n info: Uint8Array,\n aad: Uint8Array\n): Promise<{ epk: Uint8Array; iv: Uint8Array; ct: Uint8Array }> {\n let subtle = getSubtle();\n let peer = await importPeerPub(peerPubRaw);\n let eph = await subtle.generateKey(ECDH_P256, true, ['deriveBits']) as CryptoKeyPair;\n\n let z = new Uint8Array(await subtle.deriveBits({ name: 'ECDH', public: peer } as any, eph.privateKey, 256));\n let kwBytes = await hkdf(z, new Uint8Array(32), info, 32);\n zeroize(z);\n\n let kw = await importAesGcm(kwBytes);\n zeroize(kwBytes);\n\n let { iv, ct } = await sealGcm(kw, dek, aad);\n let epk = new Uint8Array(await subtle.exportKey('raw', eph.publicKey));\n\n return { epk, iv, ct };\n}\n\n/** Inverse of wrapEcdhEs. Throws on any tag failure. */\nexport async function unwrapEcdhEs(\n myPriv: CryptoKey,\n epkRaw: Uint8Array,\n iv: Uint8Array,\n ct: Uint8Array,\n info: Uint8Array,\n aad: Uint8Array\n): Promise<Uint8Array> {\n let subtle = getSubtle();\n let epk = await importPeerPub(epkRaw);\n\n let z = new Uint8Array(await subtle.deriveBits({ name: 'ECDH', public: epk } as any, myPriv, 256));\n let kwBytes = await hkdf(z, new Uint8Array(32), info, 32);\n zeroize(z);\n\n let kw = await importAesGcm(kwBytes);\n zeroize(kwBytes);\n\n return openGcm(kw, iv, ct, aad);\n}\n\n/* ------------------------------------------------------------------ *\n * Misc\n * ------------------------------------------------------------------ */\n\n/**\n * Overwrite a buffer.\n *\n * Honest about what this is: JS gives no guarantee the engine has not already\n * copied the bytes elsewhere, and a GC'd copy is beyond reach. It shrinks the\n * window in which raw key material sits readable in a heap snapshot. It is\n * hygiene, not a control.\n */\nexport function zeroize(buf: Uint8Array | null | undefined): void {\n if (buf && buf.length) {\n buf.fill(0);\n }\n}\n\n/** Constant-time-ish comparison for short tags and fingerprints. */\nexport function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a[i] ^ b[i];\n }\n return diff === 0;\n}\n\n/**\n * Build the canonical AAD byte string. JSON.stringify over an ARRAY (not an\n * object) so field order is fixed by position and can never be reordered by\n * an engine's key ordering.\n */\nexport function canonicalAad(parts: (string | number)[]): Uint8Array {\n return encodeUtf8(JSON.stringify(parts));\n}\n\n/** Per-recipient AAD: the payload AAD, plus who this wrap is for. */\nexport function recipientAad(baseAad: Uint8Array, userId: string, bind: string): Uint8Array {\n return concatBytes(baseAad, new Uint8Array([0]), encodeUtf8(userId), new Uint8Array([0]), encodeUtf8(bind));\n}\n\n/* ------------------------------------------------------------------ *\n * Recovery codes\n *\n * A recovery code is a HIGH-ENTROPY secret this SDK generates, so it needs no\n * password stretching: PBKDF2's 600k iterations exist because human passwords\n * are guessable, and 128 random bits are not. HKDF is the right tool, and it is\n * instant. This makes the recovery path cryptographically STRONGER than the\n * password path, not weaker.\n *\n * Crockford base32: no I, L, O or U, so a code read off a screen and typed back\n * cannot be mangled by the usual confusions. Two trailing check characters turn\n * a typo into \"that is not a valid code\" instead of \"wrong code\".\n * ------------------------------------------------------------------ */\n\nconst B32 = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n\n/** Bytes of entropy in a recovery code. 128 bits. */\nexport const RECOVERY_BYTES = 16;\n\n/** Data characters (26) plus two check characters. */\nconst RECOVERY_DATA_CHARS = 26;\nconst RECOVERY_TOTAL_CHARS = 28;\n\n/** Cheap synchronous hash, for typo detection only. Not a security control. */\nfunction checkBits(raw: Uint8Array): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < raw.length; i++) {\n h ^= raw[i];\n h = (h * 0x01000193) >>> 0;\n }\n return h & 0x3ff; // 10 bits -> two base32 characters\n}\n\n/**\n * Format raw entropy as a human-transcribable code:\n * \"XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX\" (28 chars, 7 groups of 4).\n */\nexport function encodeRecoveryCode(raw: Uint8Array): string {\n if (raw.length !== RECOVERY_BYTES) {\n throw new SkapiError(`A recovery code needs exactly ${RECOVERY_BYTES} bytes.`, { code: 'INVALID_PARAMETER' });\n }\n\n let out = '';\n let acc = 0;\n let bits = 0;\n for (let i = 0; i < raw.length; i++) {\n acc = (acc << 8) | raw[i];\n bits += 8;\n while (bits >= 5) {\n bits -= 5;\n out += B32[(acc >> bits) & 31];\n }\n }\n if (bits > 0) {\n out += B32[(acc << (5 - bits)) & 31];\n }\n\n let chk = checkBits(raw);\n out += B32[(chk >> 5) & 31] + B32[chk & 31];\n\n return (out.match(/.{1,4}/g) || []).join('-');\n}\n\n/**\n * Parse a code the user typed. Tolerant of case, spacing, hyphens and the\n * classic O/0 and I/1/L confusions; strict about everything else.\n */\nexport function decodeRecoveryCode(code: string): Uint8Array {\n if (typeof code !== 'string') {\n throw new SkapiError('Recovery code should be a string.', { code: 'INVALID_PARAMETER' });\n }\n\n let cleaned = code\n .toUpperCase()\n .replace(/[\\s\\-_]/g, '')\n .replace(/O/g, '0')\n .replace(/[IL]/g, '1');\n\n if (cleaned.length !== RECOVERY_TOTAL_CHARS) {\n throw new SkapiError(\n `That does not look like a recovery code: expected ${RECOVERY_TOTAL_CHARS} characters, got ${cleaned.length}.`,\n { code: 'ENCRYPTION_BAD_RECOVERY_CODE' }\n );\n }\n\n let data = cleaned.slice(0, RECOVERY_DATA_CHARS);\n let check = cleaned.slice(RECOVERY_DATA_CHARS);\n\n let acc = 0;\n let bits = 0;\n let bytes: number[] = [];\n for (let i = 0; i < data.length; i++) {\n let v = B32.indexOf(data[i]);\n if (v < 0) {\n throw new SkapiError(\n `That does not look like a recovery code: \"${data[i]}\" is not a valid character.`,\n { code: 'ENCRYPTION_BAD_RECOVERY_CODE' }\n );\n }\n acc = (acc << 5) | v;\n bits += 5;\n if (bits >= 8) {\n bits -= 8;\n bytes.push((acc >> bits) & 0xff);\n }\n }\n\n let raw = new Uint8Array(bytes.slice(0, RECOVERY_BYTES));\n let chk = checkBits(raw);\n if (check !== B32[(chk >> 5) & 31] + B32[chk & 31]) {\n throw new SkapiError(\n 'That recovery code has a typo in it: the check characters do not match.',\n { code: 'ENCRYPTION_BAD_RECOVERY_CODE' }\n );\n }\n\n return raw;\n}\n\n/**\n * Derive the wrapping key for a recovery code.\n *\n * HKDF only, deliberately. See the note above: stretching a 128-bit random\n * secret buys nothing and only makes recovery slow.\n */\nexport async function deriveRecoveryKey(raw: Uint8Array, salt: Uint8Array, info: Uint8Array): Promise<CryptoKey> {\n let bytes = await hkdf(raw, salt, info, 32);\n let key = await importAesGcm(bytes);\n zeroize(bytes);\n return key;\n}\n\n/* ------------------------------------------------------------------ *\n * Encrypted file container (SKENCF v2)\n *\n * WebCrypto's AES-GCM is one-shot: subtle.encrypt wants the whole plaintext as\n * one buffer. Applied naively to an upload that means a 500MB file needs the\n * original, the ciphertext and the Blob all resident, and one GCM operation\n * over half a gigabyte. So the container is CHUNKED, each chunk sealed with its\n * own IV, with its position bound into its AAD.\n *\n * Layout, integers big-endian:\n *\n * 0 6 magic \"SKENCF\"\n * 6 1 version 0x02\n * 7 1 flags (bit0 = meta present)\n * 8 4 chunkSize, PLAINTEXT bytes per chunk\n * 12 4 chunkCount (always >= 1)\n * 16 16 fileId, fresh CSPRNG per encryption\n * 32 8 plainLen\n * 40 8 dekId, so \"sealed under a retired data key\" is distinguishable\n * from \"corrupt\" after a revoke rolls the record's key\n * 48 4 metaLen\n * 52 4 reserved\n * 56 metaLen meta: UTF-8 JSON {n:filename, t:contentType, lm:lastModified}\n * ---------------------------------------------- header\n * per chunk: len(4) | iv(12) | ciphertext||tag\n *\n * Two decisions worth keeping:\n *\n * - The FILENAME is authenticated inside `meta` but is NOT in the chunk AAD.\n * S3 stores the exact upload byte-form, macOS submits NFD, and the server\n * unquote_plus's the key, so a name can legitimately come back in a different\n * Unicode form. Binding it into the AAD would turn that drift into permanent\n * undecryptability; authenticating it in the header lets a mismatch be\n * reported instead of fatal.\n * - The per-file key is DERIVED from the record's data key rather than being it.\n * The derivation binds project, owner and record, so a container moved to\n * another record simply yields a wrong key, and the record DEK is never used\n * as a bulk key.\n * ------------------------------------------------------------------ */\n\nconst FILE_MAGIC = [0x53, 0x4b, 0x45, 0x4e, 0x43, 0x46]; // \"SKENCF\"\nconst FILE_VERSION = 2;\nconst FILE_HEADER_FIXED = 56;\nconst FILE_ID_BYTES = 16;\n\n/** Plaintext bytes per chunk. 4 MiB keeps any single GCM operation modest. */\nexport const FILE_CHUNK_BYTES = 4 * 1024 * 1024;\n\n/** Per-chunk overhead: the length prefix, the IV and the GCM tag. */\nexport const FILE_CHUNK_OVERHEAD = 4 + IV_LEN + 16;\n\nexport type FileMeta = { n?: string; t?: string; lm?: number };\n\n/** Cheap check for the container magic. Never throws. */\nexport function isEncryptedFile(bytes: Uint8Array): boolean {\n if (!bytes || bytes.length < FILE_HEADER_FIXED) {\n return false;\n }\n for (let i = 0; i < FILE_MAGIC.length; i++) {\n if (bytes[i] !== FILE_MAGIC[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction writeU32(t: Uint8Array, at: number, v: number): void {\n t[at] = (v >>> 24) & 0xff; t[at + 1] = (v >>> 16) & 0xff; t[at + 2] = (v >>> 8) & 0xff; t[at + 3] = v & 0xff;\n}\nfunction readU32(s: Uint8Array, at: number): number {\n return ((s[at] << 24) >>> 0) + (s[at + 1] << 16) + (s[at + 2] << 8) + s[at + 3];\n}\nfunction writeU64(t: Uint8Array, at: number, v: number): void {\n // JS numbers are exact to 2^53, far beyond any uploadable file.\n let hi = Math.floor(v / 0x100000000);\n writeU32(t, at, hi);\n writeU32(t, at + 4, v >>> 0);\n}\nfunction readU64(s: Uint8Array, at: number): number {\n return readU32(s, at) * 0x100000000 + readU32(s, at + 4);\n}\n\n/**\n * Derive the per-file key from a record's data key.\n *\n * Binding service, owner, record owner and record_id here means a container\n * lifted onto another record yields a wrong key rather than needing those\n * facts repeated in every chunk's AAD.\n */\nexport async function deriveFileKey(\n dek: Uint8Array,\n fileId: Uint8Array,\n service: string,\n owner: string,\n recordOwner: string,\n recordId: string\n): Promise<CryptoKey> {\n let info = encodeUtf8(`${ENC_V}|binfile|${service}|${owner}|${recordOwner}|${recordId}`);\n let bytes = await hkdf(dek, fileId, info, 32);\n let key = await importAesGcm(bytes);\n zeroize(bytes);\n return key;\n}\n\n/** Short, non-secret identifier for a data key, so a stale key is diagnosable. */\nexport async function dekIdOf(dek: Uint8Array): Promise<Uint8Array> {\n let h = await sha256(concatBytes(encodeUtf8(`${ENC_V}|dekid`), dek));\n return h.subarray(0, 8);\n}\n\n/** Exact stored size before encrypting a byte, so an upload can declare it. */\nexport function encryptedFileSize(plainLen: number, metaLen: number, chunkBytes: number = FILE_CHUNK_BYTES): number {\n let count = plainLen === 0 ? 1 : Math.ceil(plainLen / chunkBytes);\n return FILE_HEADER_FIXED + metaLen + count * FILE_CHUNK_OVERHEAD + plainLen;\n}\n\n/**\n * Chunk AAD. Binds the WHOLE header by hash, so chunkSize, chunkCount,\n * plainLen, dekId and the meta block are all authenticated, plus this chunk's\n * position, which is what rejects a reordered, duplicated or truncated stream.\n */\nfunction chunkAad(headerHash: Uint8Array, index: number, count: number): Uint8Array {\n return canonicalAad([`${ENC_V}|binchunk`, b64uFromBytes(headerHash), index, count]);\n}\n\nfunction buildHeader(\n chunkBytes: number, count: number, fileId: Uint8Array,\n plainLen: number, dekId: Uint8Array, metaBytes: Uint8Array\n): Uint8Array {\n let h = new Uint8Array(FILE_HEADER_FIXED + metaBytes.length);\n h.set(FILE_MAGIC, 0);\n h[6] = FILE_VERSION;\n h[7] = metaBytes.length ? 1 : 0;\n writeU32(h, 8, chunkBytes);\n writeU32(h, 12, count);\n h.set(fileId, 16);\n writeU64(h, 32, plainLen);\n h.set(dekId, 40);\n writeU32(h, 48, metaBytes.length);\n writeU32(h, 52, 0);\n if (metaBytes.length) {\n h.set(metaBytes, FILE_HEADER_FIXED);\n }\n return h;\n}\n\n/** Seal a file's bytes under a key derived from the record's data key. */\nexport async function encryptFileBytes(\n dek: Uint8Array,\n plain: Uint8Array,\n ctx: { service: string; owner: string; recordOwner: string; recordId: string },\n meta?: FileMeta,\n chunkBytes: number = FILE_CHUNK_BYTES\n): Promise<Uint8Array> {\n let fileId = getRandom(FILE_ID_BYTES);\n let key = await deriveFileKey(dek, fileId, ctx.service, ctx.owner, ctx.recordOwner, ctx.recordId);\n let dekId = await dekIdOf(dek);\n\n let metaBytes = meta ? encodeUtf8(JSON.stringify(meta)) : new Uint8Array(0);\n if (metaBytes.length > 4096) {\n throw new SkapiError('Encrypted file metadata is too large.', { code: 'INVALID_PARAMETER' });\n }\n\n // An empty file is ONE empty chunk, not zero, so its emptiness is signed.\n let count = plain.length === 0 ? 1 : Math.ceil(plain.length / chunkBytes);\n let header = buildHeader(chunkBytes, count, fileId, plain.length, dekId, metaBytes);\n let headerHash = await sha256(header);\n\n let sealed: { iv: Uint8Array; ct: Uint8Array }[] = [];\n let total = header.length;\n for (let i = 0; i < count; i++) {\n let slice = plain.subarray(i * chunkBytes, Math.min((i + 1) * chunkBytes, plain.length));\n let s = await sealGcm(key, slice, chunkAad(headerHash, i, count));\n sealed.push(s);\n total += 4 + s.iv.length + s.ct.length;\n }\n\n let out = new Uint8Array(total);\n out.set(header, 0);\n let at = header.length;\n for (let s of sealed) {\n writeU32(out, at, s.iv.length + s.ct.length);\n at += 4;\n out.set(s.iv, at); at += s.iv.length;\n out.set(s.ct, at); at += s.ct.length;\n }\n return out;\n}\n\n/** Read a container's header without needing a key. */\nexport function readFileHeader(container: Uint8Array): {\n version: number; chunkBytes: number; count: number; fileId: Uint8Array;\n plainLen: number; dekId: Uint8Array; meta: FileMeta | null; headerLen: number;\n} {\n if (!isEncryptedFile(container)) {\n throw new SkapiError('This file is not an encrypted skapi file.', { code: 'INVALID_PARAMETER' });\n }\n let metaLen = readU32(container, 48);\n let headerLen = FILE_HEADER_FIXED + metaLen;\n if (container.length < headerLen) {\n throw new SkapiError('Encrypted file header is truncated.', { code: 'INVALID_REQUEST' });\n }\n let meta: FileMeta | null = null;\n if (metaLen) {\n // Deliberately NOT swallowed. Meta is authenticated by the chunk AAD, so\n // if it is present it must be parseable; returning null on a parse\n // failure once hid a missing import and made every file look\n // meta-less.\n meta = JSON.parse(decodeUtf8(container.subarray(FILE_HEADER_FIXED, headerLen)));\n }\n return {\n version: container[6],\n chunkBytes: readU32(container, 8),\n count: readU32(container, 12),\n fileId: container.subarray(16, 16 + FILE_ID_BYTES),\n plainLen: readU64(container, 32),\n dekId: container.subarray(40, 48),\n meta,\n headerLen\n };\n}\n\n/** Open a sealed file. Throws on tampering, truncation, reordering or a stale key. */\nexport async function decryptFileBytes(\n dek: Uint8Array,\n container: Uint8Array,\n ctx: { service: string; owner: string; recordOwner: string; recordId: string }\n): Promise<{ bytes: Uint8Array; meta: FileMeta | null }> {\n let h = readFileHeader(container);\n\n if (h.version !== FILE_VERSION) {\n throw new SkapiError(\n `This file was encrypted by a different version of the SDK (container v${h.version}).`,\n { code: 'NOT_SUPPORTED' }\n );\n }\n if (!h.count || !h.chunkBytes) {\n throw new SkapiError('Encrypted file header is malformed.', { code: 'INVALID_PARAMETER' });\n }\n\n // Distinguish \"sealed under a data key that has since been rolled\" from\n // \"corrupt\". A revoke mints a fresh DEK, and a file that was not re-keyed\n // in that flow lands here.\n let expect = await dekIdOf(dek);\n if (!bytesEqual(expect, h.dekId)) {\n throw new SkapiError(\n 'This file was encrypted under a previous data key for this record, so it can no longer be opened. ' +\n 'It was most likely left behind by an interrupted access change.',\n { code: 'ENCRYPTION_FILE_STALE_KEY' }\n );\n }\n\n let key = await deriveFileKey(dek, h.fileId, ctx.service, ctx.owner, ctx.recordOwner, ctx.recordId);\n let headerHash = await sha256(container.subarray(0, h.headerLen));\n\n let parts: Uint8Array[] = [];\n let at = h.headerLen;\n let plainLen = 0;\n\n for (let i = 0; i < h.count; i++) {\n if (at + 4 > container.length) {\n throw new SkapiError('Encrypted file is truncated.', { code: 'INVALID_REQUEST' });\n }\n let len = readU32(container, at);\n at += 4;\n if (len < IV_LEN + 16 || at + len > container.length) {\n throw new SkapiError('Encrypted file is truncated.', { code: 'INVALID_REQUEST' });\n }\n let chunk = await openGcm(key, container.subarray(at, at + IV_LEN), container.subarray(at + IV_LEN, at + len), chunkAad(headerHash, i, h.count));\n at += len;\n parts.push(chunk);\n plainLen += chunk.length;\n }\n\n let out = new Uint8Array(plainLen);\n let w = 0;\n for (let c of parts) {\n out.set(c, w);\n w += c.length;\n }\n return { bytes: out, meta: h.meta };\n}\n","/**\n * Client-side encryption for private record data.\n *\n * WHAT THIS DOES: when a record is written to `access_group: 'private'` and the\n * feature is enabled, the value of the record's `data` attribute is sealed with\n * AES-256-GCM before it leaves the browser, and opened again on read. Nothing\n * else about the record changes: record_id, unique_id, index name and value,\n * tags, reference, bin files and timestamps are all still plaintext, because\n * every query path in the SDK depends on them.\n *\n * WHAT THIS BUYS, stated exactly and without inflation: a service provider who\n * dumps DynamoDB, the storage bucket and every request log cannot recover a\n * private record's `data` without a successful offline guess against the user's\n * password. That is the whole claim. It is bounded by password entropy, because\n * WebCrypto offers only PBKDF2 (no Argon2id, no memory hardness) and because\n * validator.Password permits six characters. Read the limitations in the\n * documentation before promising a customer anything stronger.\n *\n * WHERE STATE LIVES: in a module-level WeakMap keyed by the Skapi instance,\n * never in an instance field. src/main/skapi.ts does\n * `for (let k in restore) { this[k] = restore[k]; }` over a sessionStorage blob\n * that any same-origin script can write, so anything reachable as `this.<key>`\n * is attacker-assignable. Key material must not be.\n */\n\nimport SkapiError from '../main/error';\nimport { encodeUtf8, decodeUtf8 } from '../utils/utils';\nimport {\n ENC_V,\n PBKDF2_ITERATIONS,\n RECOVERY_BYTES,\n b64uFromBytes,\n b64uToBytes,\n canonicalAad,\n cryptoAvailable,\n decodeRecoveryCode,\n deriveKek,\n deriveRecoveryKey,\n encodeRecoveryCode,\n fingerprint,\n generateAesGcm,\n generateIdentity,\n getRandom,\n importAesGcm,\n importIdentityPriv,\n openGcm,\n recipientAad,\n sealGcm,\n unwrapEcdhEs,\n wrapEcdhEs,\n zeroize,\n encryptFileBytes,\n decryptFileBytes,\n isEncryptedFile,\n encryptedFileSize\n} from '../utils/crypto';\n\n/* ------------------------------------------------------------------ *\n * Constants\n * ------------------------------------------------------------------ */\n\n/** Reserved table holding every user's keyring. Never itself encrypted. */\nexport const KEYRING_TABLE = 'skapi__keyring';\n\n/** Reserved top-level key marking an encrypted payload. Joins __json__/__data__. */\nexport const ENC_MARKER = '__skapi_enc__';\n\n/** Envelope format version. */\nconst ENVELOPE_V = 1;\n\nconst IDB_NAME = 'skapi-enc';\nconst IDB_STORE = 'keys';\n\n/* ------------------------------------------------------------------ *\n * Types\n * ------------------------------------------------------------------ */\n\nexport type EncryptionConfig = {\n enabled: boolean;\n iterations: number;\n /** 'tofu' pins a peer key on first sight; 'strict' requires a prior pin. */\n trustPolicy: 'tofu' | 'strict';\n /** Persist the master key to IndexedDB so a page reload stays unlocked. */\n persistDevice: boolean;\n /** Refuse to enroll a password shorter than this. 0 disables the check. */\n minPasswordLength: number;\n /**\n * What `record.data` becomes when this session cannot decrypt it.\n * 'null' (default) keeps `if (record.data)` working as a data test.\n * 'sentinel' returns a self-describing frozen marker instead, which is\n * unambiguous but TRUTHY, so those guards stop working.\n */\n withheld: 'null' | 'sentinel';\n /**\n * Issue a one-time recovery code at enrollment. 'code' (default) is the\n * only thing standing between a forgotten password and permanent data loss,\n * because a password RESET proves control of an email address, not\n * knowledge of the old password, so there is nothing to unwrap the master\n * key with. 'none' opts out and accepts that.\n */\n recovery: 'code' | 'none';\n table: string;\n};\n\ntype Wrap = { t: 'mk'; iv: string; ct: string } | { t: 'ecdh'; epk: string; iv: string; ct: string; fpr: string };\n\ntype Envelope = {\n [ENC_MARKER]: number;\n enc: string;\n kw: string;\n anch: 'uid' | 'rid' | 'new';\n uid: string;\n rid: string;\n own: string;\n iv: string;\n ct: string;\n k: Record<string, Wrap>;\n};\n\ntype DekEntry = {\n bytes: Uint8Array;\n key: CryptoKey;\n recipients: Record<string, Wrap>;\n anch: 'uid' | 'rid' | 'new';\n uid: string;\n rid: string;\n own: string;\n access_group: 'private' | number;\n};\n\ntype EncState = {\n cfg: EncryptionConfig;\n status: 'disabled' | 'locked' | 'unlocked';\n reason: string;\n user_id: string;\n scope: string;\n mk: CryptoKey | null;\n ikPriv: CryptoKey | null;\n pubRaw: Uint8Array | null;\n fpr: string;\n keyringRecordId: string;\n pins: Record<string, string>;\n /** record_id -> DEK material, so grant/revoke/update need no extra read. */\n dek: Map<string, DekEntry>;\n /** record_ids whose next encrypt MUST mint a fresh data key (revocation). */\n roll: Set<string>;\n /**\n * Resolves when the device-store unlock attempt has finished. Read and\n * write hooks wait on it so an app call issued during page bootstrap does\n * not see a spuriously locked session. NEVER awaited while `unlocking` is\n * true: the unlock itself issues a getRecords, and waiting on itself is\n * how the first version of this deadlocked the whole SDK.\n */\n ready: Promise<void> | null;\n unlocking: boolean;\n /**\n * A recovery code that has just been minted and NOT yet handed to the app.\n * One-shot: takeRecoveryCode() returns it and clears it. Held only in\n * memory, never written anywhere, and never recoverable afterwards -- if it\n * could be fetched again later, this SDK would be holding the key.\n */\n pendingRecoveryCode: string;\n peerPub: Map<string, { pubRaw: Uint8Array; fpr: string }>;\n peerInflight: Map<string, Promise<any>>;\n};\n\nexport type RecordEncryptionInfo = {\n status: 'encrypted' | 'failed';\n reason?: string;\n recipients?: string[];\n};\n\nconst ENC = new WeakMap<any, EncState>();\n\n/* ------------------------------------------------------------------ *\n * Config / state\n * ------------------------------------------------------------------ */\n\nexport function parseEncryptionOptions(raw: any): EncryptionConfig | null {\n if (!raw) {\n return null;\n }\n if (raw === true) {\n raw = {};\n }\n if (typeof raw !== 'object') {\n throw new SkapiError('\"options.encryption\" should be a boolean or an object.', { code: 'INVALID_PARAMETER' });\n }\n\n let iterations = typeof raw.iterations === 'number' ? raw.iterations : PBKDF2_ITERATIONS;\n if (iterations < 100000) {\n throw new SkapiError('\"encryption.iterations\" must be at least 100000.', { code: 'INVALID_PARAMETER' });\n }\n\n let trustPolicy = raw.trustPolicy === 'strict' ? 'strict' : 'tofu';\n\n return {\n enabled: true,\n iterations,\n trustPolicy: trustPolicy as 'tofu' | 'strict',\n persistDevice: raw.persistDevice === false ? false : true,\n minPasswordLength: typeof raw.minPasswordLength === 'number' ? raw.minPasswordLength : 0,\n withheld: raw.withheld === 'sentinel' ? 'sentinel' : 'null',\n recovery: raw.recovery === 'none' ? 'none' : 'code',\n table: typeof raw.table === 'string' && raw.table ? raw.table : KEYRING_TABLE\n };\n}\n\n/** First line of every hook. Returns null fast when encryption is off. */\nexport function encState(this: any): EncState | null {\n return ENC.get(this) || null;\n}\n\nexport function initEncryption(this: any, cfg: EncryptionConfig | null): void {\n if (!cfg) {\n ENC.delete(this);\n return;\n }\n ENC.set(this, {\n cfg,\n status: 'locked',\n reason: 'NO_SESSION_KEY',\n user_id: '',\n scope: '',\n mk: null,\n ikPriv: null,\n pubRaw: null,\n fpr: '',\n keyringRecordId: '',\n pins: {},\n dek: new Map(),\n roll: new Set(),\n ready: null,\n unlocking: false,\n pendingRecoveryCode: '',\n peerPub: new Map(),\n peerInflight: new Map()\n });\n}\n\n/** Wipe every key and cached DEK. Called on logout and on lockEncryption(). */\nexport function clearEncryptionState(this: any): void {\n let s = encState.call(this);\n if (!s) {\n return;\n }\n\n // Take the persisted master key with it. Leaving it in IndexedDB meant the\n // next person to use the browser could reach the previous user's keys\n // simply by logging in as them without their password, which is exactly the\n // property logging out is supposed to remove.\n if (s.user_id) {\n deleteDevice.call(this, s).catch(() => { });\n }\n\n s.ready = null;\n s.unlocking = false;\n s.pendingRecoveryCode = '';\n for (let [, entry] of s.dek) {\n zeroize(entry.bytes);\n }\n s.dek.clear();\n s.roll.clear();\n s.peerPub.clear();\n s.peerInflight.clear();\n s.pins = {};\n s.mk = null;\n s.ikPriv = null;\n s.pubRaw = null;\n s.fpr = '';\n s.keyringRecordId = '';\n s.user_id = '';\n s.status = 'locked';\n s.reason = 'NO_SESSION_KEY';\n}\n\nexport function getEncryptionStatus(this: any): { status: string; reason?: string; user_id?: string; fingerprint?: string } {\n let s = encState.call(this);\n if (!s) {\n return { status: 'disabled' };\n }\n return {\n status: s.status,\n reason: s.status === 'unlocked' ? undefined : s.reason,\n user_id: s.user_id || undefined,\n fingerprint: s.fpr || undefined\n };\n}\n\nfunction isEncTable(s: EncState, tableName: any): boolean {\n return typeof tableName === 'string' && tableName === s.cfg.table;\n}\n\n/**\n * The project this instance's encryption is bound to.\n *\n * Deliberately ignores per-call service/owner overrides. The scope goes into\n * the KEK derivation AND every AAD, so if a write used one project and a read\n * resolved another, the record would be permanently undecryptable. Encryption\n * is therefore scoped to the instance's own project, and a cross-project\n * encrypted write is refused outright rather than silently corrupted.\n */\nfunction scopeOf(this: any): string {\n return `${this.service}/${this.owner}`;\n}\n\n/* ------------------------------------------------------------------ *\n * AAD\n * ------------------------------------------------------------------ */\n\nfunction payloadAad(scope: string, own: string, anch: string, anchor: string): Uint8Array {\n let [service, owner] = scope.split('/');\n return canonicalAad([ENC_V, service, owner, own, anch, anchor]);\n}\n\nfunction wrapInfo(scope: string, anchor: string, own: string, recipient: string, fpr: string): Uint8Array {\n let [service, owner] = scope.split('/');\n return encodeUtf8(`${ENC_V}|dekwrap|${service}|${owner}|${anchor}|${own}|${recipient}|${fpr}`);\n}\n\nfunction anchorOf(env: { anch: string; uid: string; rid: string }): string {\n return env.anch === 'uid' ? env.uid : env.anch === 'rid' ? env.rid : '';\n}\n\n/* ------------------------------------------------------------------ *\n * Envelope detection\n * ------------------------------------------------------------------ */\n\n/**\n * Is this value an encryption envelope?\n *\n * Deliberately as conservative as the existing '!D%{}' / __json__ / __data__\n * guards in normalizeRecord: a value that merely looks like a marker but is not\n * shaped like one must fall through and be returned verbatim, because it is\n * somebody's real data.\n */\nexport function isEnvelope(v: any): v is Envelope {\n return !!v\n && typeof v === 'object'\n && !Array.isArray(v)\n && typeof v[ENC_MARKER] === 'number'\n && typeof v.ct === 'string'\n && typeof v.iv === 'string'\n && typeof v.own === 'string'\n && typeof v.anch === 'string'\n && !!v.k\n && typeof v.k === 'object'\n && !Array.isArray(v.k);\n}\n\n\n/** Marker key on the withheld-data sentinel. Reserved in record data. */\nexport const NO_ACCESS_MARKER = '__skapi_no_access__';\n\n/**\n * The value `record.data` takes when this session cannot decrypt it, under\n * `withheld: 'sentinel'`.\n *\n * Frozen so nothing can patch it into looking like real data, and\n * self-describing so a value that leaks into a render reads as a marker rather\n * than as plausible content. It carries its own reason, so the common check\n * needs only `record.data` and not a second field.\n *\n * It is TRUTHY, because every JS object is. That is the whole cost of this\n * option: `if (record.data)` stops being a valid \"do I have data\" test. That is\n * why 'null' remains the default.\n */\nfunction withheldValue(cfg: EncryptionConfig, reason: string, recipients?: string[]): any {\n if (cfg.withheld !== 'sentinel') {\n return null;\n }\n let v: Record<string, any> = { [NO_ACCESS_MARKER]: true, reason };\n if (recipients) {\n v.recipients = recipients;\n }\n return Object.freeze(v);\n}\n\n/** True when a value is the withheld-data sentinel. */\nexport function isWithheld(this: any, value: any): boolean {\n return !!value && typeof value === 'object' && (value as any)[NO_ACCESS_MARKER] === true;\n}\n\n/* ------------------------------------------------------------------ *\n * WRITE PATH\n * ------------------------------------------------------------------ */\n\n/**\n * Decide the access group this write lands on.\n *\n * Returns 'private' when the payload must be encrypted, or a number when it\n * must be written in the clear. Encryption is driven entirely by this, so a\n * wrong answer either leaks plaintext or strands ciphertext in a record nobody\n * can read. When the caller omits `table` on an update the group is whatever\n * the record already has, so we resolve it rather than guess: from the DEK\n * cache if this instance has already touched the record, otherwise with one\n * getRecords.\n */\nasync function resolveWriteGroup(\n this: any,\n s: EncState,\n rawConfig: any,\n resolvedId: string\n): Promise<{ group: 'private' | number; table: string; record: any }> {\n let table = rawConfig?.table;\n let tableName = typeof table === 'string' ? table : table?.name;\n\n if (table && (typeof table === 'string' || table.access_group !== undefined)) {\n let group = typeof table === 'string' ? 0 : normalizeGroup(table.access_group);\n return { group, table: tableName, record: null };\n }\n\n // Table omitted or partial. On a create that means access_group 0 (the\n // accessGroup validator's default), which is not private, so nothing to do.\n if (!resolvedId) {\n return {\n group: table?.access_group !== undefined ? normalizeGroup(table.access_group) : 0,\n table: tableName,\n record: null\n };\n }\n\n // Update with no stated group: resolve the record's real one.\n let cached = s.dek.get(resolvedId);\n if (cached) {\n return { group: cached.access_group, table: tableName, record: null };\n }\n\n let rec = await readOwnRecord.call(this, resolvedId);\n if (!rec) {\n throw new SkapiError(`Record \"${resolvedId}\" not found.`, { code: 'NOT_EXISTS' });\n }\n return { group: rec.table.access_group, table: rec.table.name, record: rec };\n}\n\n/**\n * Read one record by record_id OR unique_id.\n *\n * postRecord accepts a unique_id in the `record_id` slot, but getRecords\n * validates `record_id` as alphanumeric-only, so passing a unique_id such as\n * \"src::folder/file.pdf\" straight through throws INVALID_PARAMETER. Route by\n * shape instead, so enabling encryption never breaks a call that works today.\n */\nasync function readOwnRecord(this: any, id: string): Promise<any | null> {\n let query = /^[a-zA-Z0-9]+$/.test(id) ? { record_id: id } : { unique_id: id };\n let res = await this.getRecords(query, { limit: 1 });\n return res?.list?.[0] || null;\n}\n\nfunction normalizeGroup(v: any): 'private' | number {\n if (v === 'private' || v === '**') {\n return 'private';\n }\n if (v === 'public') {\n return 0;\n }\n if (v === 'authorized') {\n return 1;\n }\n if (v === 'admin') {\n return 99;\n }\n return typeof v === 'number' ? v : 0;\n}\n\n/**\n * Seal the caller's data if this write is a private one.\n *\n * NEVER mutates its input: the caller keeps the object they handed us, and\n * postRecord restores `plain` onto the returned record so the round trip is\n * transparent.\n */\nexport async function maybeEncrypt(\n this: any,\n value: any,\n rawConfig: any,\n hasData: boolean\n): Promise<{ send: any; plain: any; encrypted: boolean; omit: boolean; dek?: DekEntry }> {\n let s = encState.call(this);\n if (!s) {\n return { send: value, plain: value, encrypted: false, omit: false };\n }\n\n // `record_id` may actually be a unique_id: postRecord documents that, and\n // setupPostRecordConfig resolves it from a local cache when it can. Resolve\n // it the same way here, because the DEK cache is keyed by the REAL\n // record_id and the envelope anchor must be the real identifier too.\n let rawId: string = rawConfig?.record_id || '';\n let resolvedId = rawId;\n let unique_id: string = rawConfig?.unique_id || '';\n\n let { group, table, record } = await resolveWriteGroup.call(this, s, rawConfig, resolvedId);\n\n // Not private: write in the clear. This is the declassification path.\n if (group !== 'private') {\n if (resolvedId) {\n let old = s.dek.get(resolvedId);\n if (old) {\n zeroize(old.bytes);\n s.dek.delete(resolvedId);\n }\n }\n\n // Declassifying without restating the payload used to be refused,\n // because leaving the ciphertext in a record the read path no longer\n // inspects strands it forever. Refusing was unnecessary: while the\n // record is still private WE CAN STILL READ IT, so decrypt it here and\n // hand the plaintext to the same write that changes the group. One\n // extra read, and if the write fails nothing changed.\n if (!hasData && rawId) {\n let current = record || await readOwnRecord.call(this, rawId);\n if (current && current.encrypted) {\n if (current.encrypted.status === 'failed') {\n throw new SkapiError(\n `Cannot make record \"${rawId}\" non-private: its current contents could not be decrypted ` +\n `(${current.encrypted.reason}), so they cannot be written back in the clear. ` +\n `Unlock encryption, or supply the record's data with the access group change.`,\n { code: 'ENCRYPTION_LOCKED' }\n );\n }\n return { send: current.data, plain: current.data, encrypted: false, omit: false };\n }\n }\n\n // No payload and nothing to decrypt: omit the key so the server keeps\n // whatever is stored. `null` is NOT this case; it is a real value.\n return { send: value, plain: value, encrypted: false, omit: !hasData };\n }\n\n // The keyring itself is never encrypted, and must be checked BEFORE the\n // bootstrap gate below: provisioning writes the keyring, so waiting on the\n // unlock here would wait on ourselves.\n if (isEncTable(s, table)) {\n return { send: value, plain: value, encrypted: false, omit: false };\n }\n\n // A write issued while the page is still restoring its device key must wait\n // for that, not fail as \"locked\".\n if (s.ready && !s.unlocking) {\n try {\n await s.ready;\n }\n catch (err) { }\n }\n\n // No payload supplied. postRecord(null|undefined, config) is a documented\n // metadata-only update: with encryption off the `data` key is dropped from\n // the body and the server keeps the stored value. Encrypting `undefined`\n // here would seal a null over the record and destroy it.\n if (!hasData) {\n return { send: value, plain: value, encrypted: false, omit: true };\n }\n\n // Refuse to store the withheld-data sentinel. A read-modify-write by a\n // session that could not decrypt would otherwise overwrite the record with\n // the marker, destroying it: the exact failure the sentinel exists to make\n // visible.\n if (isWithheld.call(this, value)) {\n throw new SkapiError(\n 'This record\\'s data could not be decrypted by this session, so it cannot be written back. ' +\n 'Writing it would replace the record with the placeholder.',\n { code: 'ENCRYPTION_CANNOT_REWRITE_WITHHELD' }\n );\n }\n\n if (s.status !== 'unlocked' || !s.mk) {\n throw new SkapiError(\n 'Encryption is enabled but locked, so this private record cannot be written. ' +\n 'Call unlockEncryption({ password }) first, or the user must log in with their password.',\n { code: 'ENCRYPTION_LOCKED' }\n );\n }\n\n if (value && typeof value === 'object' && !Array.isArray(value) && Object.prototype.hasOwnProperty.call(value, ENC_MARKER)) {\n throw new SkapiError(`\"${ENC_MARKER}\" is a reserved key in record data.`, { code: 'INVALID_PARAMETER' });\n }\n\n\n if ((rawConfig?.service && rawConfig.service !== this.service) || (rawConfig?.owner && rawConfig.owner !== this.owner)) {\n throw new SkapiError(\n 'Encrypted records cannot be written to another project. The encryption key is derived per project, ' +\n 'so a record written under one service and read under another could never be decrypted. ' +\n 'Construct a separate Skapi instance for that project.',\n { code: 'INVALID_REQUEST' }\n );\n }\n\n let own = this.user?.user_id;\n if (!own) {\n throw new SkapiError('User login is required to write an encrypted record.', { code: 'INVALID_REQUEST' });\n }\n\n let scope = scopeOf.call(this);\n\n // A pending roll wins over everything: the whole point of a revoke is that\n // the next write must NOT reuse the key the revoked user holds.\n let rolling = false;\n if (rawId && s.roll.has(rawId)) {\n rolling = true;\n s.roll.delete(rawId);\n let stale = s.dek.get(rawId);\n s.dek.delete(rawId);\n if (stale) {\n zeroize(stale.bytes);\n }\n }\n\n // THE RECORD, NOT THE CACHE, IS THE SOURCE OF TRUTH FOR RECIPIENTS.\n //\n // Reading the recipient map out of an in-memory cache meant that any\n // session which had not already read the record (a page reload, a second\n // device, a different tab) wrote an envelope containing only the owner,\n // silently revoking every grantee while the backend ACL still said the\n // record was shared. On an update we therefore load the current envelope\n // unless this session already holds it.\n let entry: DekEntry | null = null;\n if (rawId && !rolling) {\n entry = s.dek.get(rawId) || null;\n if (!entry) {\n let current = record || await readOwnRecord.call(this, rawId);\n if (current) {\n resolvedId = current.record_id || rawId;\n entry = s.dek.get(resolvedId) || null;\n if (!unique_id && current.unique_id) {\n unique_id = current.unique_id;\n }\n if (!entry && current.encrypted?.status === 'failed') {\n throw new SkapiError(\n `Cannot update encrypted record \"${rawId}\": its current contents could not be decrypted (${current.encrypted.reason}), ` +\n `so its existing key wraps cannot be preserved. Updating anyway would revoke everyone it is shared with.`,\n { code: 'ENCRYPTION_LOCKED' }\n );\n }\n }\n }\n }\n\n if (resolvedId === rawId && entry && entry.rid) {\n resolvedId = entry.rid;\n }\n\n // Keep the anchor the record already has. A caller updating by record_id\n // rarely restates the unique_id, and letting the anchor flip from 'uid' to\n // 'rid' would invalidate every grantee wrap (the anchor is inside each\n // wrap's AAD) and force a full re-wrap on an ordinary update.\n if (!unique_id && entry && entry.anch === 'uid' && entry.uid) {\n unique_id = entry.uid;\n }\n\n let dekBytes: Uint8Array;\n let dekKey: CryptoKey;\n let recipients: Record<string, Wrap>;\n\n if (entry) {\n dekBytes = entry.bytes;\n dekKey = entry.key;\n recipients = Object.assign({}, entry.recipients);\n }\n else {\n let gen = await generateAesGcm();\n dekBytes = gen.bytes;\n dekKey = gen.key;\n recipients = {};\n }\n\n // Anchor selection. The anchor is bound into the AAD so an envelope cannot\n // be transplanted onto another record. On a create the server has not\n // minted a record_id yet and we refuse to burn a unique_id on the caller's\n // behalf, so a create uses the 'new' anchor and is re-anchored on its first\n // update.\n let anch: 'uid' | 'rid' | 'new' = unique_id ? 'uid' : resolvedId ? 'rid' : 'new';\n let anchor = anch === 'uid' ? unique_id : anch === 'rid' ? resolvedId : '';\n let aad = payloadAad(scope, own, anch, anchor);\n\n let ownerAad = recipientAad(aad, own, 'mk');\n let ownerSealed = await sealGcm(s.mk, dekBytes, ownerAad);\n recipients[own] = { t: 'mk', iv: b64uFromBytes(ownerSealed.iv), ct: b64uFromBytes(ownerSealed.ct) };\n\n // Every grantee wrap binds the anchor, so a changed anchor invalidates them\n // all and they have to be rebuilt.\n if (entry && (entry.anch !== anch || anchorOf(entry) !== anchor)) {\n recipients = await rewrapAll.call(this, s, dekBytes, recipients, scope, own, anch, anchor, aad);\n }\n\n let plaintext = encodeUtf8(JSON.stringify(value === undefined ? null : value));\n let sealed = await sealGcm(dekKey, plaintext, aad);\n zeroize(plaintext);\n\n let envelope: Envelope = {\n [ENC_MARKER]: ENVELOPE_V,\n enc: 'A256GCM',\n kw: 'ECDH-ES+A256GCM',\n anch,\n uid: unique_id,\n rid: resolvedId,\n own,\n iv: b64uFromBytes(sealed.iv),\n ct: b64uFromBytes(sealed.ct),\n k: recipients\n };\n\n let envSize = JSON.stringify(envelope).length;\n if (envSize > 2 * 1024 * 1024) {\n throw new SkapiError(\n `Encrypted record data is too large: once encrypted and base64 encoded it becomes ${envSize} bytes, ` +\n `over the ${2 * 1024 * 1024} byte limit. Encryption costs about 33% plus roughly 230 bytes per additional recipient.`,\n { code: 'ENCRYPTED_DATA_TOO_LARGE' }\n );\n }\n\n if (resolvedId) {\n s.dek.set(resolvedId, {\n bytes: dekBytes,\n key: dekKey,\n recipients,\n anch,\n uid: unique_id,\n rid: resolvedId,\n own,\n access_group: 'private'\n });\n }\n\n return {\n send: envelope,\n plain: value,\n encrypted: true,\n omit: false,\n dek: { bytes: dekBytes, key: dekKey, recipients, anch, uid: unique_id, rid: resolvedId, own, access_group: 'private' }\n };\n}\n\n/**\n * Bind a data key to the record_id the server just minted.\n *\n * On a CREATE there is no record_id at encrypt time, so nothing could be\n * cached; the attachments that upload immediately afterwards would then find no\n * key and go up in the clear. postRecord calls this the moment the id is known,\n * BEFORE uploadFiles runs.\n */\nexport function bindRecordDek(this: any, record_id: string, entry: DekEntry | undefined): void {\n let s = encState.call(this);\n if (!s || !entry || !record_id || s.dek.has(record_id)) {\n return;\n }\n s.dek.set(record_id, Object.assign({}, entry, { rid: record_id }));\n}\n\n/** Re-wrap every non-owner recipient after the record's anchor changed. */\nasync function rewrapAll(\n this: any,\n s: EncState,\n dekBytes: Uint8Array,\n recipients: Record<string, Wrap>,\n scope: string,\n own: string,\n anch: string,\n anchor: string,\n aad: Uint8Array\n): Promise<Record<string, Wrap>> {\n let ids = Object.keys(recipients).filter(id => id !== own);\n if (!ids.length) {\n return recipients;\n }\n\n let peers = await getPeerPublicKeys.call(this, ids);\n let out: Record<string, Wrap> = { [own]: recipients[own] };\n\n for (let id of ids) {\n let peer = peers[id];\n if (!peer) {\n continue;\n }\n out[id] = await wrapFor.call(this, dekBytes, peer, scope, anchor, own, id, aad);\n }\n return out;\n}\n\nasync function wrapFor(\n this: any,\n dekBytes: Uint8Array,\n peer: { pubRaw: Uint8Array; fpr: string },\n scope: string,\n anchor: string,\n own: string,\n recipient: string,\n aad: Uint8Array\n): Promise<Wrap> {\n let info = wrapInfo(scope, anchor, own, recipient, peer.fpr);\n let rAad = recipientAad(aad, recipient, peer.fpr);\n let w = await wrapEcdhEs(peer.pubRaw, dekBytes, info, rAad);\n return { t: 'ecdh', epk: b64uFromBytes(w.epk), iv: b64uFromBytes(w.iv), ct: b64uFromBytes(w.ct), fpr: peer.fpr };\n}\n\n/* ------------------------------------------------------------------ *\n * READ PATH\n * ------------------------------------------------------------------ */\n\n/**\n * Open an envelope, or explain why not.\n *\n * TOTAL: every path returns a value and nothing throws. A page of 50 records\n * where one is undecryptable must still resolve, with that one record carrying\n * a flag, rather than rejecting the whole getRecords.\n */\nexport async function maybeDecrypt(\n this: any,\n raw: any,\n ctx: { access_group: any; table_name: string; user_id: string; record_id: string; unique_id: string }\n): Promise<{ value: any; flag?: RecordEncryptionInfo }> {\n if (!isEnvelope(raw)) {\n return { value: raw };\n }\n\n // Only ever inspect private records, so a public record whose data happens\n // to contain __skapi_enc__ is never touched.\n if (ctx.access_group !== 'private') {\n return { value: raw };\n }\n\n let s = encState.call(this);\n if (!s) {\n // Encryption is off but this private record is encrypted. Do NOT hand\n // the envelope to app logic as if it were the record's data. No config\n // exists on this path, so the sentinel is not an option here.\n return { value: null, flag: { status: 'failed', reason: 'ENCRYPTION_DISABLED' } };\n }\n if (isEncTable(s, ctx.table_name)) {\n return { value: raw };\n }\n\n if (raw[ENC_MARKER] !== ENVELOPE_V) {\n return { value: withheldValue(s.cfg, 'UNSUPPORTED_VERSION'), flag: { status: 'failed', reason: 'UNSUPPORTED_VERSION' } };\n }\n\n // Wait for the device-store unlock before declaring the session locked.\n // Skipped while the unlock is itself in flight: that path issues its own\n // getRecords, and waiting on it here would be waiting on ourselves.\n if (s.ready && !s.unlocking) {\n try {\n await s.ready;\n }\n catch (err) { }\n }\n\n // Binding cross-check against the record the server actually returned.\n // This is what catches an envelope moved between records by the backend.\n if (raw.own !== ctx.user_id) {\n return { value: withheldValue(s.cfg, 'BINDING_MISMATCH'), flag: { status: 'failed', reason: 'BINDING_MISMATCH' } };\n }\n if (raw.uid && ctx.unique_id && raw.uid !== ctx.unique_id) {\n return { value: withheldValue(s.cfg, 'BINDING_MISMATCH'), flag: { status: 'failed', reason: 'BINDING_MISMATCH' } };\n }\n if (raw.rid && ctx.record_id && raw.rid !== ctx.record_id) {\n return { value: withheldValue(s.cfg, 'BINDING_MISMATCH'), flag: { status: 'failed', reason: 'BINDING_MISMATCH' } };\n }\n\n // Recipient membership BEFORE the lock check, deliberately: it is a map\n // lookup that needs no key, and the two answers are not interchangeable.\n // \"you are not on the list\" is true whether or not this session is\n // unlocked, and it is actionable in a way NO_SESSION_KEY is not: unlocking\n // will never help. A MASTER reading another user's private record lands\n // here, and telling it \"unlock your session\" would be a lie.\n let me = this.user?.user_id;\n let wrap = me ? raw.k[me] : null;\n if (!wrap) {\n return { value: withheldValue(s.cfg, 'NOT_A_RECIPIENT', Object.keys(raw.k)), flag: { status: 'failed', reason: 'NOT_A_RECIPIENT', recipients: Object.keys(raw.k) } };\n }\n\n // A recipient, but this session holds no key yet: unlocking WILL help.\n if (s.status !== 'unlocked' || !s.mk) {\n return { value: withheldValue(s.cfg, 'NO_SESSION_KEY'), flag: { status: 'failed', reason: 'NO_SESSION_KEY' } };\n }\n\n let scope = scopeOf.call(this);\n let anchor = anchorOf(raw);\n let aad = payloadAad(scope, raw.own, raw.anch, anchor);\n\n let dekBytes: Uint8Array;\n try {\n if (wrap.t === 'mk') {\n dekBytes = await openGcm(s.mk, b64uToBytes(wrap.iv), b64uToBytes(wrap.ct), recipientAad(aad, me, 'mk'));\n }\n else if (wrap.t === 'ecdh') {\n if (!s.ikPriv) {\n return { value: withheldValue(s.cfg, 'NO_SESSION_KEY'), flag: { status: 'failed', reason: 'NO_SESSION_KEY' } };\n }\n dekBytes = await unwrapEcdhEs(\n s.ikPriv,\n b64uToBytes(wrap.epk),\n b64uToBytes(wrap.iv),\n b64uToBytes(wrap.ct),\n wrapInfo(scope, anchor, raw.own, me, wrap.fpr),\n recipientAad(aad, me, wrap.fpr)\n );\n }\n else {\n return { value: withheldValue(s.cfg, 'UNSUPPORTED_VERSION'), flag: { status: 'failed', reason: 'UNSUPPORTED_VERSION' } };\n }\n }\n catch (err) {\n return { value: withheldValue(s.cfg, 'BAD_KEY'), flag: { status: 'failed', reason: 'BAD_KEY' } };\n }\n\n let plaintext: Uint8Array;\n let dekKey: CryptoKey;\n try {\n dekKey = await importAesGcm(dekBytes);\n plaintext = await openGcm(dekKey, b64uToBytes(raw.iv), b64uToBytes(raw.ct), aad);\n }\n catch (err) {\n zeroize(dekBytes);\n return { value: withheldValue(s.cfg, 'CORRUPT'), flag: { status: 'failed', reason: 'CORRUPT' } };\n }\n\n let out: any;\n try {\n out = JSON.parse(decodeUtf8(plaintext));\n }\n catch (err) {\n zeroize(plaintext);\n zeroize(dekBytes);\n return { value: withheldValue(s.cfg, 'CORRUPT'), flag: { status: 'failed', reason: 'CORRUPT' } };\n }\n zeroize(plaintext);\n\n // Cache the DEK so a later update, grant or revoke on this record needs no\n // extra read. Only the owner's DEK is cached: a grantee holds one too, but\n // a grantee cannot write the record anyway.\n // Cached for the OWNER and for every GRANTEE. Only owners were cached\n // originally, on the reasoning that a grantee cannot write the record\n // anyway; that was true until files arrived, and a grantee needs the data\n // key to open them. `own` still records who the owner is, so the write\n // paths can keep refusing non-owners.\n if (ctx.record_id) {\n // Update the EXISTING entry in place rather than replacing it, and\n // never zeroize the buffer it holds. addRecipients and the roll path\n // both keep a reference to an entry across a read, so wiping the old\n // buffer here would blank the data key mid-grant and seal the record\n // under all zeros. Reuse also keeps the entry's identity stable, which\n // is what lets those callers mutate `recipients` and have the write\n // path see it.\n let prev = s.dek.get(ctx.record_id);\n if (prev) {\n // Adopt the key material we just recovered, not only the wraps.\n // Keeping the old bytes while taking the server's newer recipient\n // map produced an entry describing DEK-new with DEK-old's bytes, so\n // the next write sealed the payload under a key none of the stored\n // wraps opened. Mutate in place rather than replacing the object:\n // addRecipients and the roll path hold a reference across a read.\n // The old buffer is deliberately NOT zeroized, because a caller may\n // still be holding it.\n prev.bytes = dekBytes;\n prev.key = dekKey;\n prev.recipients = raw.k;\n prev.anch = raw.anch;\n prev.uid = raw.uid;\n prev.own = raw.own;\n prev.access_group = 'private';\n }\n else {\n s.dek.set(ctx.record_id, {\n bytes: dekBytes,\n key: dekKey,\n recipients: raw.k,\n anch: raw.anch,\n uid: raw.uid,\n rid: ctx.record_id,\n own: raw.own,\n access_group: 'private'\n });\n }\n }\n else {\n zeroize(dekBytes);\n }\n\n return { value: out, flag: { status: 'encrypted', recipients: Object.keys(raw.k) } };\n}\n\n/* ------------------------------------------------------------------ *\n * KEYRING\n * ------------------------------------------------------------------ */\n\nfunction kekInfo(scope: string, user_id: string): Uint8Array {\n let [service, owner] = scope.split('/');\n return encodeUtf8(`${ENC_V}|kek|${service}|${owner}|${user_id}`);\n}\n\nfunction mkAad(scope: string, user_id: string, iterations: number, salt: string): Uint8Array {\n let [service, owner] = scope.split('/');\n // Iterations and salt are inside the AAD so a provider cannot downgrade the\n // stored iteration count to make an offline attack cheaper: a tampered\n // count fails the GCM tag instead of silently weakening the derivation.\n return encodeUtf8(`${ENC_V}|mk|${service}|${owner}|${user_id}|PBKDF2-SHA256|${iterations}|${salt}`);\n}\n\nfunction recoveryInfo(scope: string, user_id: string): Uint8Array {\n let [service, owner] = scope.split('/');\n return encodeUtf8(`${ENC_V}|recovery|${service}|${owner}|${user_id}`);\n}\n\nfunction recoveryAad(scope: string, user_id: string, salt: string): Uint8Array {\n let [service, owner] = scope.split('/');\n return encodeUtf8(`${ENC_V}|rk|${service}|${owner}|${user_id}|HKDF-SHA256|${salt}`);\n}\n\nfunction selfAad(scope: string, user_id: string): Uint8Array {\n let [service, owner] = scope.split('/');\n return encodeUtf8(`${ENC_V}|self|${service}|${owner}|${user_id}`);\n}\n\nfunction ikAad(scope: string, user_id: string): Uint8Array {\n let [service, owner] = scope.split('/');\n return encodeUtf8(`${ENC_V}|ik|${service}|${owner}|${user_id}`);\n}\n\n/** Read this user's own keyring record, or null when they have none yet. */\nasync function readKeyring(this: any, s: EncState): Promise<any | null> {\n let res = await this.getRecords({\n table: { name: s.cfg.table, access_group: 'private' },\n index: { name: '$user_id', value: this.user.user_id, condition: '=' }\n }, { limit: 2 });\n\n let list = (res?.list || []).filter((r: any) => r.user_id === this.user.user_id);\n if (!list.length) {\n return null;\n }\n // Two keyrings is an anomaly worth surfacing rather than silently picking\n // one: take the oldest, which is the one records were encrypted against.\n list.sort((a: any, b: any) => a.uploaded - b.uploaded);\n return list[0];\n}\n\n/**\n * Create this user's keyring. Runs once per user per project, at the first\n * login after the feature is enabled.\n */\n\n/**\n * Mint a recovery code and the wrap that lets it open the master key.\n *\n * The code is generated HERE, in the browser, from crypto.getRandomValues, and\n * is returned to the caller for display. It is never transmitted: only the\n * wrap goes to the server, and that wrap is exactly as safe to store as the\n * password wrap beside it. If the server ever generated or received this code,\n * the provider would hold the key and the whole guarantee would be void.\n */\nasync function mintRecoveryWrap(scope: string, user_id: string, mkBytes: Uint8Array): Promise<{ code: string; wrap: any }> {\n let raw = getRandom(RECOVERY_BYTES);\n let code = encodeRecoveryCode(raw);\n\n let salt = getRandom(16);\n let saltB64 = b64uFromBytes(salt);\n // HKDF, not PBKDF2: see the note in utils/crypto.ts. 128 random bits need\n // no stretching, and stretching would only make recovery slow.\n let rkek = await deriveRecoveryKey(raw, salt, recoveryInfo(scope, user_id));\n let sealed = await sealGcm(rkek, mkBytes, recoveryAad(scope, user_id, saltB64));\n zeroize(raw);\n\n return {\n code,\n wrap: {\n id: b64uFromBytes(getRandom(6)),\n p: 'recovery',\n kdf: { a: 'HKDF-SHA256', s: saltB64 },\n iv: b64uFromBytes(sealed.iv),\n ct: b64uFromBytes(sealed.ct),\n created: Date.now()\n }\n };\n}\n\n/** Open the master key with a recovery code. Returns null if none match. */\nasync function openWithRecoveryCode(scope: string, user_id: string, wraps: any[], code: string): Promise<Uint8Array | null> {\n let raw = decodeRecoveryCode(code); // throws on a typo, before any crypto\n let candidates = (wraps || []).filter((w: any) => w.p === 'recovery');\n candidates.sort((a: any, b: any) => (b.created || 0) - (a.created || 0));\n\n for (let w of candidates) {\n try {\n let rkek = await deriveRecoveryKey(raw, b64uToBytes(w.kdf.s), recoveryInfo(scope, user_id));\n let mkBytes = await openGcm(rkek, b64uToBytes(w.iv), b64uToBytes(w.ct), recoveryAad(scope, user_id, w.kdf.s));\n zeroize(raw);\n return mkBytes;\n }\n catch (err) {\n // Wrong code for this wrap; try any older one.\n }\n }\n\n zeroize(raw);\n return null;\n}\n\n/** Build a fresh password wrap for the given master key bytes. */\nasync function mintPasswordWrap(s: EncState, scope: string, user_id: string, password: string, mkBytes: Uint8Array): Promise<any> {\n let salt = getRandom(16);\n let saltB64 = b64uFromBytes(salt);\n let kek = await deriveKek(password, salt, s.cfg.iterations, kekInfo(scope, user_id));\n let sealed = await sealGcm(kek, mkBytes, mkAad(scope, user_id, s.cfg.iterations, saltB64));\n return {\n id: b64uFromBytes(getRandom(6)),\n p: 'password',\n kdf: { a: 'PBKDF2-SHA256', it: s.cfg.iterations, s: saltB64 },\n iv: b64uFromBytes(sealed.iv),\n ct: b64uFromBytes(sealed.ct),\n created: Date.now()\n };\n}\n\nasync function provisionKeyring(this: any, s: EncState, password: string): Promise<void> {\n let user_id = this.user.user_id;\n let scope = s.scope;\n\n let salt = getRandom(16);\n let saltB64 = b64uFromBytes(salt);\n let kek = await deriveKek(password, salt, s.cfg.iterations, kekInfo(scope, user_id));\n\n let mkBytes = getRandom(32);\n let mkSealed = await sealGcm(kek, mkBytes, mkAad(scope, user_id, s.cfg.iterations, saltB64));\n let mk = await importAesGcm(mkBytes);\n\n let ident = await generateIdentity();\n let ikSealed = await sealGcm(mk, ident.pkcs8, ikAad(scope, user_id));\n zeroize(ident.pkcs8);\n\n // The recovery wrap, minted while the master key bytes are still in hand.\n // After this function they are gone: MK lives on only as a non-extractable\n // CryptoKey, whose bytes cannot be read back out.\n let recovery: { code: string; wrap: any } | null = null;\n if (s.cfg.recovery === 'code') {\n recovery = await mintRecoveryWrap(scope, user_id, mkBytes);\n }\n\n // The master key sealed under itself, so a session holding only the\n // non-extractable CryptoKey can still recover the raw bytes when it needs\n // to mint a new wrap (rotating a recovery code, adding a recipient key).\n // Opening it requires already holding MK, so it grants nothing new.\n let selfSealed = await sealGcm(mk, mkBytes, selfAad(scope, user_id));\n\n zeroize(mkBytes);\n\n let fpr = await fingerprint(ident.pubRaw);\n let now = Date.now();\n\n let wraps: any[] = [{\n id: b64uFromBytes(getRandom(6)),\n p: 'password',\n kdf: { a: 'PBKDF2-SHA256', it: s.cfg.iterations, s: saltB64 },\n iv: b64uFromBytes(mkSealed.iv),\n ct: b64uFromBytes(mkSealed.ct),\n created: now\n }];\n if (recovery) {\n wraps.push(recovery.wrap);\n }\n\n let keyring = {\n v: 1,\n alg: 'ECDH-P-256',\n user_id,\n wraps,\n ik: { iv: b64uFromBytes(ikSealed.iv), ct: b64uFromBytes(ikSealed.ct) },\n self: { iv: b64uFromBytes(selfSealed.iv), ct: b64uFromBytes(selfSealed.ct) },\n pub: b64uFromBytes(ident.pubRaw),\n fpr,\n pins: null,\n created: now,\n updated: now\n };\n\n // The public directory entry goes FIRST. If the order were reversed and the\n // second post failed, the private keyring would exist, every later login\n // would find it and skip provisioning, and the user would permanently have\n // no published key: nobody could ever share a record with them. Written\n // this way round, a failure leaves no private keyring, so the next login\n // simply provisions again.\n await this.postRecord({\n v: 1,\n alg: 'ECDH-P-256',\n user_id,\n pub: b64uFromBytes(ident.pubRaw),\n fpr,\n created: now\n }, {\n table: { name: s.cfg.table, access_group: 'authorized' },\n index: { name: 'pubkey', value: user_id }\n });\n\n let rec = await this.postRecord(keyring, {\n table: { name: s.cfg.table, access_group: 'private' }\n });\n\n // Two devices logging in for the first time simultaneously can both see no\n // keyring and both create one. readKeyring resolves that by always taking\n // the OLDEST, so re-read here and adopt the winner: encrypting under a\n // keyring that later loses the tie-break would make those records\n // permanently unreadable.\n let settled = await readKeyring.call(this, s);\n if (settled && settled.record_id !== rec.record_id) {\n await unlockKeyring.call(this, s, settled, password);\n return;\n }\n\n s.mk = mk;\n s.ikPriv = ident.priv;\n s.pubRaw = ident.pubRaw;\n s.fpr = fpr;\n s.keyringRecordId = rec.record_id;\n // Parked for the app to collect ONCE. Set only after the keyring write\n // succeeded, so a code is never shown for a wrap that was never stored.\n if (recovery) {\n s.pendingRecoveryCode = recovery.code;\n }\n s.user_id = user_id;\n s.pins = {};\n s.status = 'unlocked';\n s.reason = '';\n}\n\n/** Open an existing keyring with the user's password. */\nasync function unlockKeyring(this: any, s: EncState, keyring: any, password: string): Promise<void> {\n let user_id = this.user.user_id;\n let scope = s.scope;\n let data = keyring.data;\n\n // Never derive keys from a keyring that is not ours. The $user_id index is\n // server-derived so this should be unreachable, but the whole identity of\n // the session hangs off this record and a cheap check costs nothing.\n if (keyring.user_id !== user_id || (data && data.user_id && data.user_id !== user_id)) {\n throw new SkapiError('The encryption keyring does not belong to this user.', { code: 'ENCRYPTION_KEYRING_CORRUPT' });\n }\n\n let wraps = Array.isArray(data?.wraps) ? data.wraps : [];\n let pwWraps = wraps.filter((w: any) => w.p === 'password');\n if (!pwWraps.length) {\n throw new SkapiError('The keyring has no password wrap.', { code: 'ENCRYPTION_KEYRING_CORRUPT' });\n }\n // Newest first: every failed attempt costs a full PBKDF2 run.\n pwWraps.sort((a: any, b: any) => (b.created || 0) - (a.created || 0));\n\n let mkBytes: Uint8Array | null = null;\n for (let w of pwWraps) {\n try {\n let salt = b64uToBytes(w.kdf.s);\n let kek = await deriveKek(password, salt, w.kdf.it, kekInfo(scope, user_id));\n mkBytes = await openGcm(kek, b64uToBytes(w.iv), b64uToBytes(w.ct), mkAad(scope, user_id, w.kdf.it, w.kdf.s));\n break;\n }\n catch (err) {\n // Wrong password for this wrap. Try the next (there is more than\n // one only mid-password-change, which is what makes that flow\n // crash-safe).\n }\n }\n\n if (!mkBytes) {\n throw new SkapiError('Incorrect password: the encryption keyring could not be opened.', { code: 'ENCRYPTION_BAD_PASSWORD' });\n }\n\n let mk = await importAesGcm(mkBytes);\n zeroize(mkBytes);\n\n await adoptKeyring.call(this, s, keyring, mk);\n}\n\n/** Load the identity key and pins out of a keyring record given an open MK. */\nasync function adoptKeyring(this: any, s: EncState, keyring: any, mk: CryptoKey): Promise<void> {\n let user_id = this.user.user_id;\n let data = keyring.data;\n\n let pkcs8 = await openGcm(mk, b64uToBytes(data.ik.iv), b64uToBytes(data.ik.ct), ikAad(s.scope, user_id));\n let ikPriv = await importIdentityPriv(pkcs8);\n zeroize(pkcs8);\n\n let pins: Record<string, string> = {};\n if (data.pins && typeof data.pins === 'object' && data.pins.ct) {\n try {\n let pinBytes = await openGcm(mk, b64uToBytes(data.pins.iv), b64uToBytes(data.pins.ct), encodeUtf8(`${ENC_V}|pins|${s.scope}|${user_id}`));\n pins = JSON.parse(decodeUtf8(pinBytes));\n zeroize(pinBytes);\n }\n catch (err) {\n // A destroyed pin map is loud (every peer becomes unseen again),\n // but it must not block the unlock.\n pins = {};\n }\n }\n\n s.mk = mk;\n s.ikPriv = ikPriv;\n s.pubRaw = b64uToBytes(data.pub);\n s.fpr = data.fpr;\n s.keyringRecordId = keyring.record_id;\n s.user_id = user_id;\n s.pins = pins;\n s.status = 'unlocked';\n s.reason = '';\n}\n\n/**\n * Provision or unlock, called from the login funnel with the password in hand.\n * Must never reject a login: a failure here leaves the session locked, and the\n * app can retry with unlockEncryption().\n */\nexport async function ensureKeyring(this: any, password: string): Promise<void> {\n let s = encState.call(this);\n if (!s || !this.user?.user_id) {\n return;\n }\n\n if (!cryptoAvailable()) {\n s.status = 'locked';\n s.reason = 'NO_WEB_CRYPTO';\n return;\n }\n\n // An OpenID session's \"password\" is minted by the skapi backend\n // (openIdLogin reads it out of an openid-logger response), so deriving a\n // key from it gives zero confidentiality against the provider. Refuse\n // rather than pretend.\n if (this.user?.is_openid) {\n s.status = 'locked';\n s.reason = 'OPENID_UNSUPPORTED';\n return;\n }\n\n if (s.cfg.minPasswordLength && password.length < s.cfg.minPasswordLength) {\n s.status = 'locked';\n s.reason = 'WEAK_PASSWORD';\n return;\n }\n\n s.scope = scopeOf.call(this);\n\n let keyring = await readKeyring.call(this, s);\n if (keyring) {\n await unlockKeyring.call(this, s, keyring, password);\n }\n else {\n await provisionKeyring.call(this, s, password);\n }\n\n if (s.cfg.persistDevice) {\n await saveDevice.call(this, s).catch(() => { });\n }\n}\n\n/** Explicit unlock, for a token-restored session with no device entry. */\nexport async function unlockEncryption(this: any, params: { password: string }): Promise<{ status: string }> {\n await this.__connection;\n let s = encState.call(this);\n if (!s) {\n throw new SkapiError('Encryption is not enabled for this instance.', { code: 'INVALID_REQUEST' });\n }\n if (!this.user?.user_id) {\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n if (!params?.password || typeof params.password !== 'string') {\n throw new SkapiError('\"password\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n await ensureKeyring.call(this, params.password);\n if (s.status !== 'unlocked') {\n throw new SkapiError(`Encryption could not be unlocked: ${s.reason}`, { code: 'ENCRYPTION_LOCKED' });\n }\n return { status: s.status };\n}\n\n/** Drop keys from memory (and optionally the device) without logging out. */\nexport async function lockEncryption(this: any, params?: { forgetDevice?: boolean }): Promise<{ status: string }> {\n let s = encState.call(this);\n if (!s) {\n return { status: 'disabled' };\n }\n if (params?.forgetDevice) {\n await deleteDevice.call(this, s).catch(() => { });\n }\n clearEncryptionState.call(this);\n // Cached responses can hold already-decrypted plaintext.\n this.__cached_requests = {};\n return { status: s.status };\n}\n\n/**\n * Re-wrap the master key for a new password.\n *\n * Three steps, in this order, so a crash between any two leaves the account\n * openable: append the new wrap, change the Cognito password, prune the old\n * wrap. Reversing it would strand the keyring on a password that no longer\n * exists.\n */\nexport async function rewrapForPasswordChange(this: any, currentPassword: string, newPassword: string): Promise<void> {\n let s = encState.call(this);\n if (!s) {\n return;\n }\n if (s.status !== 'unlocked' || !s.mk) {\n // Silently skipping here was the worst bug in this file: the Cognito\n // password would change while the keyring still held only a wrap under\n // the OLD password, so the user could log in and never open their own\n // data again. Fail before the password changes instead.\n throw new SkapiError(\n 'Encryption must be unlocked before changing the password, or the encryption keyring would be left ' +\n 'wrapped under a password that no longer exists. Call unlockEncryption({ password }) first.',\n { code: 'ENCRYPTION_LOCKED' }\n );\n }\n\n let res = await this.getRecords({ record_id: s.keyringRecordId }, { limit: 1 });\n let keyring = res?.list?.[0];\n if (!keyring) {\n throw new SkapiError(\n 'The encryption keyring could not be read, so the password change was stopped before it could strand it.',\n { code: 'ENCRYPTION_KEYRING_CORRUPT' }\n );\n }\n\n let user_id = this.user.user_id;\n let data = keyring.data;\n\n // Re-derive MK bytes by opening the current password wrap: MK itself is a\n // non-extractable CryptoKey, so its bytes cannot be read back out of it.\n let wraps = (data.wraps || []).filter((w: any) => w.p === 'password');\n wraps.sort((a: any, b: any) => (b.created || 0) - (a.created || 0));\n\n let mkBytes: Uint8Array | null = null;\n for (let w of wraps) {\n try {\n let kek = await deriveKek(currentPassword, b64uToBytes(w.kdf.s), w.kdf.it, kekInfo(s.scope, user_id));\n mkBytes = await openGcm(kek, b64uToBytes(w.iv), b64uToBytes(w.ct), mkAad(s.scope, user_id, w.kdf.it, w.kdf.s));\n break;\n }\n catch (err) { }\n }\n if (!mkBytes) {\n throw new SkapiError('Incorrect current password: the encryption keyring was not re-wrapped.', { code: 'ENCRYPTION_BAD_PASSWORD' });\n }\n\n let salt = getRandom(16);\n let saltB64 = b64uFromBytes(salt);\n let kek = await deriveKek(newPassword, salt, s.cfg.iterations, kekInfo(s.scope, user_id));\n let sealed = await sealGcm(kek, mkBytes, mkAad(s.scope, user_id, s.cfg.iterations, saltB64));\n zeroize(mkBytes);\n\n let now = Date.now();\n let nextWraps = (data.wraps || []).concat([{\n id: b64uFromBytes(getRandom(6)),\n p: 'password',\n kdf: { a: 'PBKDF2-SHA256', it: s.cfg.iterations, s: saltB64 },\n iv: b64uFromBytes(sealed.iv),\n ct: b64uFromBytes(sealed.ct),\n created: now\n }]);\n\n await this.postRecord(\n Object.assign({}, data, { wraps: nextWraps, updated: now }),\n { record_id: s.keyringRecordId }\n );\n}\n\n/** Drop every wrap but the newest password wrap. Run after the password changed. */\nexport async function pruneKeyringWraps(this: any): Promise<void> {\n let s = encState.call(this);\n if (!s || s.status !== 'unlocked' || !s.keyringRecordId) {\n return;\n }\n let res = await this.getRecords({ record_id: s.keyringRecordId }, { limit: 1 });\n let keyring = res?.list?.[0];\n if (!keyring) {\n return;\n }\n let data = keyring.data;\n let pw = (data.wraps || []).filter((w: any) => w.p === 'password').sort((a: any, b: any) => (b.created || 0) - (a.created || 0));\n let other = (data.wraps || []).filter((w: any) => w.p !== 'password');\n if (pw.length <= 1) {\n return;\n }\n await this.postRecord(\n Object.assign({}, data, { wraps: [pw[0]].concat(other), updated: Date.now() }),\n { record_id: s.keyringRecordId }\n );\n}\n\n/* ------------------------------------------------------------------ *\n * DEVICE STORE\n *\n * IndexedDB rather than localStorage/sessionStorage specifically because it\n * structured-clones CryptoKey objects and PRESERVES extractable:false. The\n * master key's bytes therefore never touch JavaScript and never touch disk in\n * the clear. Injected script on the origin can USE the stored key; it cannot\n * read or exfiltrate it. That is a reduction, not immunity, and it is the\n * honest price of keeping a page reload from prompting for a password.\n * ------------------------------------------------------------------ */\n\nfunction idbAvailable(): boolean {\n // Gated on IndexedDB itself, not on isBrowserRuntime(). Any runtime that\n // genuinely provides IndexedDB can persist the key; any runtime that does\n // not simply stays locked after a token restore and calls\n // unlockEncryption(). Deliberately NOT falling back to the Node\n // localStorage polyfill, which writes plain files under ./states/.\n return typeof indexedDB !== 'undefined' && !!indexedDB;\n}\n\nfunction openIdb(): Promise<any> {\n return new Promise((res, rej) => {\n let req = indexedDB.open(IDB_NAME, 1);\n req.onupgradeneeded = () => {\n let db = req.result;\n if (!db.objectStoreNames.contains(IDB_STORE)) {\n db.createObjectStore(IDB_STORE);\n }\n };\n req.onsuccess = () => res(req.result);\n req.onerror = () => rej(req.error);\n });\n}\n\nfunction deviceKey(this: any, s: EncState): string {\n return `${s.scope}#${this.user?.user_id}`;\n}\n\nasync function saveDevice(this: any, s: EncState): Promise<void> {\n if (!idbAvailable() || !s.mk) {\n return;\n }\n let db = await openIdb();\n await new Promise<void>((res, rej) => {\n let tx = db.transaction(IDB_STORE, 'readwrite');\n tx.objectStore(IDB_STORE).put({ mk: s.mk, keyringRecordId: s.keyringRecordId, saved: Date.now() }, deviceKey.call(this, s));\n tx.oncomplete = () => res();\n tx.onerror = () => rej(tx.error);\n });\n db.close();\n}\n\nasync function loadDevice(this: any, s: EncState): Promise<{ mk: CryptoKey; keyringRecordId: string } | null> {\n if (!idbAvailable()) {\n return null;\n }\n let db = await openIdb();\n let out = await new Promise<any>((res, rej) => {\n let tx = db.transaction(IDB_STORE, 'readonly');\n let req = tx.objectStore(IDB_STORE).get(deviceKey.call(this, s));\n req.onsuccess = () => res(req.result || null);\n req.onerror = () => rej(req.error);\n });\n db.close();\n return out && out.mk ? out : null;\n}\n\nasync function deleteDevice(this: any, s: EncState): Promise<void> {\n if (!idbAvailable()) {\n return;\n }\n let db = await openIdb();\n await new Promise<void>((res, rej) => {\n let tx = db.transaction(IDB_STORE, 'readwrite');\n tx.objectStore(IDB_STORE).delete(deviceKey.call(this, s));\n tx.oncomplete = () => res();\n tx.onerror = () => rej(tx.error);\n });\n db.close();\n}\n\n/**\n * Try to unlock from the device store. This is what makes a page reload\n * transparent: autoLogin restores the Cognito session but never the password,\n * so without this every refresh would prompt.\n */\nexport function startDeviceUnlock(this: any): void {\n let s = encState.call(this);\n if (!s || s.ready) {\n return;\n }\n s.unlocking = true;\n s.ready = unlockFromDevice.bind(this)()\n .catch(() => false)\n .then(() => { s.unlocking = false; });\n}\n\nasync function unlockFromDevice(this: any): Promise<boolean> {\n let s = encState.call(this);\n if (!s || !this.user?.user_id || !s.cfg.persistDevice || !cryptoAvailable()) {\n return false;\n }\n\n s.scope = scopeOf.call(this);\n\n try {\n let stored = await loadDevice.call(this, s);\n if (!stored) {\n return false;\n }\n let keyring = await readKeyring.call(this, s);\n if (!keyring) {\n await deleteDevice.call(this, s).catch(() => { });\n return false;\n }\n await adoptKeyring.call(this, s, keyring, stored.mk);\n return true;\n }\n catch (err) {\n // A stale device entry (password changed elsewhere, keyring rotated)\n // must degrade to \"locked\", never throw into the connection promise.\n s.status = 'locked';\n s.reason = 'NO_SESSION_KEY';\n return false;\n }\n}\n\n/* ------------------------------------------------------------------ *\n * PEER PUBLIC KEYS\n * ------------------------------------------------------------------ */\n\n/**\n * Fetch other users' public keys from the directory partition.\n *\n * Addressed by the reserved $user_id index rather than by unique_id: unique_id\n * is service-wide, first-come-first-served, and enumerable by any authenticated\n * user via getUniqueId, so a squatter could permanently block a victim's\n * enrollment. $user_id is derived server-side from the record's real owner and\n * cannot be forged.\n */\nexport async function getPeerPublicKeys(this: any, userIds: string[]): Promise<Record<string, { pubRaw: Uint8Array; fpr: string } | null>> {\n let s = encState.call(this);\n if (!s) {\n throw new SkapiError('Encryption is not enabled for this instance.', { code: 'INVALID_REQUEST' });\n }\n\n let out: Record<string, { pubRaw: Uint8Array; fpr: string } | null> = {};\n let need: string[] = [];\n let newPins = false;\n\n for (let id of userIds) {\n let hit = s.peerPub.get(id);\n if (hit) {\n out[id] = hit;\n }\n else {\n need.push(id);\n }\n }\n\n await Promise.all(need.map(async id => {\n let inflight = s.peerInflight.get(id);\n if (!inflight) {\n inflight = (async () => {\n let res = await this.getRecords({\n table: { name: s.cfg.table, access_group: 'authorized' },\n index: { name: '$user_id', value: id, condition: '=' }\n }, { limit: 10 });\n\n let list = (res?.list || []).filter((r: any) => r.user_id === id && r.data?.pub);\n if (!list.length) {\n return null;\n }\n list.sort((a: any, b: any) => b.uploaded - a.uploaded);\n let pubRaw = b64uToBytes(list[0].data.pub);\n let fpr = await fingerprint(pubRaw);\n\n // The provider serves this directory, so it can hand us a key\n // whose private half it holds. Nothing in the protocol can stop\n // that on first contact. What we can do is refuse to accept a\n // CHANGED key silently.\n let pinned = s.pins[id];\n if (pinned && pinned !== fpr) {\n throw new SkapiError(\n `The public key for user \"${id}\" has changed since it was first seen. ` +\n `This is expected if they reset their account, and is what a key substitution attack also looks like. ` +\n `Verify the new fingerprint out of band, then call pinPeerKey({ user_id, fingerprint }).`,\n { code: 'ENCRYPTION_PEER_KEY_CHANGED' }\n );\n }\n if (!pinned) {\n if (s.cfg.trustPolicy === 'strict') {\n throw new SkapiError(\n `No pinned key for user \"${id}\" and trustPolicy is \"strict\". Pin it first with pinPeerKey().`,\n { code: 'ENCRYPTION_PEER_NOT_PINNED' }\n );\n }\n // Persist immediately. A pin held only in memory resets on\n // every reload, which means the \"refuse a CHANGED key\"\n // check below could never fire across sessions and the TOFU\n // guarantee was decorative.\n s.pins[id] = fpr;\n newPins = true;\n }\n\n return { pubRaw, fpr };\n })().finally(() => s.peerInflight.delete(id));\n\n s.peerInflight.set(id, inflight);\n }\n\n let got = await inflight;\n if (got) {\n s.peerPub.set(id, got);\n }\n out[id] = got;\n }));\n\n if (newPins) {\n // Best effort: a failure to persist must not fail the grant, but it\n // does mean the pin is only good for this session.\n await persistPins.call(this, s).catch(() => { });\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * GRANT / REVOKE\n * ------------------------------------------------------------------ */\n\n/** Load a record's envelope and its DEK, from cache when possible. */\nasync function loadForRewrap(this: any, s: EncState, record_id: string): Promise<{ entry: DekEntry; scope: string } | null> {\n let scope = scopeOf.call(this);\n let cached = s.dek.get(record_id);\n if (cached) {\n return { entry: cached, scope };\n }\n\n let rec = await readOwnRecord.call(this, record_id);\n if (!rec) {\n throw new SkapiError(`Record \"${record_id}\" not found.`, { code: 'NOT_EXISTS' });\n }\n\n // Absence of evidence is not evidence of absence. A record whose payload\n // could not be READ (an offloaded data file that 404s or fails to fetch)\n // carries no envelope in hand, and treating that as \"plaintext record\"\n // meant a grant created an ACL row with no key wrap, and a revoke skipped\n // the key roll entirely while reporting success. Refuse loudly instead:\n // better a failed revoke than one that silently did not revoke.\n if (rec.encrypted?.status === 'failed' && rec.encrypted.reason === 'DATA_UNAVAILABLE') {\n throw new SkapiError(\n `Cannot change sharing on record \"${record_id}\": its data could not be read, ` +\n `so whether it is encrypted is unknown. Retry once the record reads normally.`,\n { code: 'ENCRYPTION_DATA_UNAVAILABLE' }\n );\n }\n\n // Not an encrypted record at all: nothing to wrap, and the caller's grant\n // should proceed untouched.\n if (!rec.encrypted) {\n return null;\n }\n\n // Encrypted, but this caller is not the owner, so no DEK was cached. Say so\n // explicitly instead of returning null, which the caller would read as\n // \"plaintext record\" and let a wrap-less grant through.\n if (rec.user_id !== this.user?.user_id) {\n throw new SkapiError(\n 'Only the record owner can share or revoke an encrypted record, because adding or removing a key wrap means writing the record.',\n { code: 'ENCRYPTION_GRANT_REQUIRES_OWNER' }\n );\n }\n\n let after = s.dek.get(rec.record_id) || s.dek.get(record_id);\n if (!after) {\n throw new SkapiError(\n `Cannot change sharing on record \"${record_id}\": its data could not be decrypted` +\n (rec.encrypted.reason ? ` (${rec.encrypted.reason})` : '') + '.',\n { code: 'ENCRYPTION_LOCKED' }\n );\n }\n return { entry: after, scope };\n}\n\n/**\n * Add decrypt access for other users, by wrapping this record's DEK to each of\n * their public keys. Called from grantPrivateRecordAccess BEFORE the backend\n * grant, so a crypto failure means nothing was granted at all.\n */\nexport async function addRecipients(this: any, record_id: string, userIds: string[]): Promise<void> {\n let s = encState.call(this);\n if (!s) {\n return;\n }\n\n // Deliberately NOT gated on the lock up front. A record that was never\n // encrypted (written before the flag was enabled, or in a non-private\n // group) must still be grantable exactly as before, and loadForRewrap is\n // what tells the two apart.\n let loaded = await loadForRewrap.call(this, s, record_id);\n if (!loaded) {\n return; // plaintext record, nothing to wrap\n }\n let { entry, scope } = loaded;\n\n let me = this.user.user_id;\n if (entry.own !== me) {\n throw new SkapiError(\n 'Only the record owner can share an encrypted record, because adding a key wrap means writing the record.',\n { code: 'ENCRYPTION_GRANT_REQUIRES_OWNER' }\n );\n }\n\n let peers = await getPeerPublicKeys.call(this, userIds);\n let missing = userIds.filter(id => !peers[id]);\n if (missing.length) {\n throw new SkapiError(\n `These users have no encryption key yet, so they cannot be given access: ${missing.join(', ')}. ` +\n `A user's key is created the first time they log in with encryption enabled.`,\n { code: 'ENCRYPTION_RECIPIENT_HAS_NO_KEY' }\n );\n }\n\n let anchor = anchorOf(entry);\n let aad = payloadAad(scope, entry.own, entry.anch, anchor);\n let recipients = Object.assign({}, entry.recipients);\n\n for (let id of userIds) {\n if (id === me) {\n continue;\n }\n recipients[id] = await wrapFor.call(this, entry.bytes, peers[id]!, scope, anchor, entry.own, id, aad);\n }\n\n await writeRecipients.call(this, s, record_id, entry, recipients);\n}\n\n/**\n * Remove recipients and ROLL the DEK.\n *\n * Rolling is what makes a revoke mean anything: dropping a wrap alone leaves\n * the revoked user able to read the ciphertext they already hold. Even so this\n * is FORWARD-ONLY. It cannot un-read what they read, and if the provider kept\n * the pre-roll ciphertext and their pre-roll wrap (it saw both), then that user\n * and that provider can jointly recover the old content forever.\n */\nexport async function dropRecipientsAndRoll(this: any, record_id: string, userIds: string[] | null): Promise<void> {\n let s = encState.call(this);\n if (!s) {\n return;\n }\n\n let loaded = await loadForRewrap.call(this, s, record_id);\n if (!loaded) {\n return;\n }\n let { entry } = loaded;\n\n let me = this.user.user_id;\n if (entry.own !== me) {\n throw new SkapiError(\n 'Only the record owner can revoke access to an encrypted record.',\n { code: 'ENCRYPTION_GRANT_REQUIRES_OWNER' }\n );\n }\n\n let keep = Object.keys(entry.recipients).filter(id => {\n if (id === me) {\n return true;\n }\n return userIds ? !userIds.includes(id) : false;\n }).filter(id => id !== me);\n\n // Read the plaintext FIRST, while the current key is still usable.\n let rec = await readOwnRecord.call(this, record_id);\n if (!rec) {\n throw new SkapiError(`Record \"${record_id}\" not found.`, { code: 'NOT_EXISTS' });\n }\n // NOT `rec.data === null`: null is a legitimate stored value now, so the\n // flag is the only sound test for \"could not be read\".\n assertReadable(rec, record_id);\n\n // Resolve the keepers' public keys BEFORE the roll lands. Rolling first and\n // re-wrapping afterwards meant that one bad peer key (changed fingerprint,\n // a deleted account, a network blip) left every user who was NOT revoked\n // holding an ACL grant and no key wrap, permanently. Failing here instead\n // leaves the record exactly as it was.\n let peers: Record<string, { pubRaw: Uint8Array; fpr: string } | null> = {};\n if (keep.length) {\n peers = await getPeerPublicKeys.call(this, keep);\n let missing = keep.filter(id => !peers[id]);\n if (missing.length) {\n throw new SkapiError(\n `Cannot revoke on record \"${record_id}\": these users keep access but their encryption keys could not be read, ` +\n `so re-sharing after the key roll would fail and lock them out: ${missing.join(', ')}.`,\n { code: 'ENCRYPTION_RECIPIENT_HAS_NO_KEY' }\n );\n }\n }\n\n s.roll.add(rec.record_id || record_id);\n\n // State the table explicitly so the write path does not read the record\n // back just to learn its access group.\n await this.postRecord(rec.data, {\n record_id: rec.record_id || record_id,\n table: { name: rec.table.name, access_group: 'private' }\n });\n\n if (keep.length) {\n await addRecipients.call(this, rec.record_id || record_id, keep);\n }\n}\n\n/**\n * Refuse to write back a record whose current payload could not be read.\n *\n * Both the grant and the revoke path re-post the record's own data to carry a\n * changed recipient map or a rolled key. If the read that produced that data\n * failed (an offloaded spill that 404s), `rec.data` is null, and re-posting it\n * would write a null OVER the record: a sharing change that destroys the\n * payload. The DEK cache makes this reachable even when loadForRewrap never\n * touched the network, which is exactly how it slipped through the first time.\n */\nfunction assertReadable(rec: any, record_id: string): void {\n if (rec?.encrypted?.status === 'failed') {\n throw new SkapiError(\n `Cannot change sharing on record \"${record_id}\": its current data could not be read ` +\n `(${rec.encrypted.reason}), so re-writing the record would destroy it.`,\n { code: 'ENCRYPTION_DATA_UNAVAILABLE' }\n );\n }\n}\n\n/** Write a changed recipient map back, reusing the record's own ciphertext. */\nasync function writeRecipients(this: any, s: EncState, record_id: string, entry: DekEntry, recipients: Record<string, Wrap>): Promise<void> {\n let res = await this.getRecords({ record_id }, { limit: 1 });\n let rec = res?.list?.[0];\n if (!rec) {\n throw new SkapiError(`Record \"${record_id}\" not found.`, { code: 'NOT_EXISTS' });\n }\n assertReadable(rec, record_id);\n\n entry.recipients = recipients;\n s.dek.set(record_id, entry);\n\n // Re-post the plaintext: maybeEncrypt reuses the cached DEK and the updated\n // recipient map, and re-seals with a fresh IV. The whole ciphertext is\n // re-uploaded, which is the cost of `data` being a single attribute.\n await this.postRecord(rec.data, { record_id });\n}\n\n/** Pin a peer's key fingerprint after verifying it out of band. */\nexport async function pinPeerKey(this: any, params: { user_id: string; fingerprint: string }): Promise<void> {\n let s = encState.call(this);\n if (!s || s.status !== 'unlocked') {\n throw new SkapiError('Encryption is locked.', { code: 'ENCRYPTION_LOCKED' });\n }\n s.pins[params.user_id] = params.fingerprint;\n s.peerPub.delete(params.user_id);\n await persistPins.call(this, s);\n}\n\nasync function persistPins(this: any, s: EncState): Promise<void> {\n if (!s.mk || !s.keyringRecordId) {\n return;\n }\n let res = await this.getRecords({ record_id: s.keyringRecordId }, { limit: 1 });\n let keyring = res?.list?.[0];\n if (!keyring) {\n return;\n }\n let sealed = await sealGcm(s.mk, encodeUtf8(JSON.stringify(s.pins)), encodeUtf8(`${ENC_V}|pins|${s.scope}|${s.user_id}`));\n await this.postRecord(\n Object.assign({}, keyring.data, {\n pins: { iv: b64uFromBytes(sealed.iv), ct: b64uFromBytes(sealed.ct) },\n updated: Date.now()\n }),\n { record_id: s.keyringRecordId }\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Recovery\n * ------------------------------------------------------------------ */\n\n/**\n * Collect a freshly minted recovery code, ONCE.\n *\n * Call this immediately after a login or signup that may have enrolled the\n * user. It returns the code and forgets it. There is deliberately no way to\n * fetch it again later: if this SDK could hand it back on demand, it would be\n * holding the key, and the provider could too. Show it, make the user confirm\n * they saved it, and move on.\n */\nexport function takeRecoveryCode(this: any): string | null {\n let s = encState.call(this);\n if (!s || !s.pendingRecoveryCode) {\n return null;\n }\n let code = s.pendingRecoveryCode;\n s.pendingRecoveryCode = '';\n return code;\n}\n\n/**\n * Unlock with a recovery code, and repair the keyring for the current password.\n *\n * This is the answer to a forgotten password. The sequencing matters and is not\n * obvious: forgotPassword/resetPassword are UNAUTHENTICATED (they build a\n * throwaway cognitoUser), so there is no session during a reset and the keyring\n * cannot be touched then. Recovery therefore happens AFTER the reset, on the\n * next login:\n *\n * reset password -> log in with the new password -> status is 'locked'\n * -> unlockWithRecoveryCode({ code, password: theNewPassword })\n *\n * Passing `password` is what makes it self-healing: the master key is re-wrapped\n * under the new password so every later login works normally. Omit it and the\n * session unlocks for now but the next login is locked again.\n *\n * A used code is retired and a replacement is returned, because a code that has\n * been typed into a device has been in a clipboard and possibly a screenshot.\n */\nexport async function unlockWithRecoveryCode(\n this: any,\n params: { code: string; password?: string }\n): Promise<{ status: string; repaired: boolean; recoveryCode: string | null }> {\n await this.__connection;\n\n let s = encState.call(this);\n if (!s) {\n throw new SkapiError('Encryption is not enabled for this instance.', { code: 'INVALID_REQUEST' });\n }\n if (!this.user?.user_id) {\n throw new SkapiError('User login is required. Reset the password and log in first, then use the recovery code.', { code: 'INVALID_REQUEST' });\n }\n if (!params?.code || typeof params.code !== 'string') {\n throw new SkapiError('\"code\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n s.scope = scopeOf.call(this);\n let user_id = this.user.user_id;\n\n let keyring = await readKeyring.call(this, s);\n if (!keyring) {\n throw new SkapiError('This account has no encryption keyring, so there is nothing to recover.', { code: 'NOT_EXISTS' });\n }\n\n let mkBytes = await openWithRecoveryCode(s.scope, user_id, keyring.data?.wraps || [], params.code);\n if (!mkBytes) {\n throw new SkapiError(\n 'That recovery code did not open the keyring. Check it against the copy you saved when encryption was set up.',\n { code: 'ENCRYPTION_BAD_RECOVERY_CODE' }\n );\n }\n\n let mk = await importAesGcm(mkBytes);\n await adoptKeyring.call(this, s, keyring, mk);\n\n // Rewrite the wraps: a new password wrap if we were given the password\n // (replacing the stale ones outright, since nobody can open them any more),\n // and a fresh recovery wrap replacing the one just used.\n let repaired = false;\n let nextCode: string | null = null;\n let wraps: any[] = (keyring.data?.wraps || []).slice();\n\n if (params.password) {\n wraps = wraps.filter((w: any) => w.p !== 'password');\n wraps.push(await mintPasswordWrap(s, s.scope, user_id, params.password, mkBytes));\n repaired = true;\n }\n\n if (s.cfg.recovery === 'code') {\n let minted = await mintRecoveryWrap(s.scope, user_id, mkBytes);\n wraps = wraps.filter((w: any) => w.p !== 'recovery');\n wraps.push(minted.wrap);\n nextCode = minted.code;\n }\n\n zeroize(mkBytes);\n\n await this.postRecord(\n Object.assign({}, keyring.data, { wraps, updated: Date.now() }),\n { record_id: keyring.record_id }\n );\n\n if (s.cfg.persistDevice) {\n await saveDevice.call(this, s).catch(() => { });\n }\n\n return { status: s.status, repaired, recoveryCode: nextCode };\n}\n\n/**\n * Retire the current recovery code and issue a new one.\n *\n * Requires an UNLOCKED session, which is the whole access-control story: the\n * only way to mint a code is to already be able to decrypt. There is therefore\n * no path here that helps someone who is locked out, and no path that lets the\n * provider mint one.\n */\nexport async function regenerateRecoveryCode(this: any): Promise<{ recoveryCode: string }> {\n await this.__connection;\n\n let s = encState.call(this);\n if (!s) {\n throw new SkapiError('Encryption is not enabled for this instance.', { code: 'INVALID_REQUEST' });\n }\n if (s.status !== 'unlocked' || !s.mk) {\n throw new SkapiError(\n 'Encryption must be unlocked to issue a recovery code. Only someone who can already decrypt can create one.',\n { code: 'ENCRYPTION_LOCKED' }\n );\n }\n if (s.cfg.recovery !== 'code') {\n throw new SkapiError('Recovery codes are disabled for this instance (\"recovery\" is \"none\").', { code: 'INVALID_REQUEST' });\n }\n\n let res = await this.getRecords({ record_id: s.keyringRecordId }, { limit: 1 });\n let keyring = res?.list?.[0];\n if (!keyring) {\n throw new SkapiError('The encryption keyring could not be read.', { code: 'ENCRYPTION_KEYRING_CORRUPT' });\n }\n\n // MK is held as a NON-EXTRACTABLE CryptoKey, so its raw bytes cannot be read\n // back out of it, and minting a new wrap needs those bytes. They are kept\n // for exactly this purpose in `self`: the master key sealed under itself.\n // That is security-neutral (opening it already requires holding MK) and it\n // means the bytes only ever materialize for the moment they are needed,\n // rather than sitting in memory for the whole session.\n let self = keyring.data?.self;\n if (!self || !self.ct) {\n throw new SkapiError(\n 'This keyring predates recovery-code rotation and cannot issue a new code. ' +\n 'Use unlockWithRecoveryCode() with the existing code, which issues a replacement.',\n { code: 'ENCRYPTION_KEYRING_CORRUPT' }\n );\n }\n\n let mkBytes = await openGcm(s.mk, b64uToBytes(self.iv), b64uToBytes(self.ct), selfAad(s.scope, s.user_id));\n let minted = await mintRecoveryWrap(s.scope, s.user_id, mkBytes);\n zeroize(mkBytes);\n\n let wraps = (keyring.data.wraps || []).filter((w: any) => w.p !== 'recovery').concat([minted.wrap]);\n await this.postRecord(\n Object.assign({}, keyring.data, { wraps, updated: Date.now() }),\n { record_id: s.keyringRecordId }\n );\n\n return { recoveryCode: minted.code };\n}\n\n/* ------------------------------------------------------------------ *\n * BINARY FILES\n *\n * A private record's attachments are sealed under a key derived from that\n * record's data key, so anyone who can read the record can open its files and\n * nobody else can, with no extra key distribution.\n *\n * Encrypted-ness is recorded IN THE S3 KEY, in the form-key segment:\n *\n * .../bin/<ts>/<size>/<formKey>__skenc__<plainSizeB62>/<filename>\n *\n * not only inside the file. Three things depend on that. A reader must know\n * before it fetches; `record.bin[].size` must report the PLAINTEXT length\n * without a round trip; and both dashboards `delete f.getFile` before cloning a\n * record into their pager, so anything carried only on the closure is invisible\n * to them. The key survives move_folder_s3 byte-for-byte, so it also survives\n * an access-group change.\n * ------------------------------------------------------------------ */\n\nconst FILE_MARKER = '__skenc__';\n\nconst B62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\nfunction toB62(n: number): string {\n if (n === 0) {\n return '0';\n }\n let out = '';\n while (n > 0) {\n out = B62[n % 62] + out;\n n = Math.floor(n / 62);\n }\n return out;\n}\nfunction fromB62(s: string): number {\n let n = 0;\n for (let c of s) {\n let v = B62.indexOf(c);\n if (v < 0) {\n return NaN;\n }\n n = n * 62 + v;\n }\n return n;\n}\n\n/** Split a form-key segment into its real key and the plaintext size, if marked. */\nexport function parseFileMarker(formKey: string): { key: string; plainSize: number } | null {\n if (typeof formKey !== 'string') {\n return null;\n }\n let at = formKey.lastIndexOf(FILE_MARKER);\n if (at < 0) {\n return null;\n }\n let size = fromB62(formKey.slice(at + FILE_MARKER.length));\n if (!Number.isFinite(size)) {\n return null;\n }\n return { key: formKey.slice(0, at), plainSize: size };\n}\n\n/**\n * Identify an encrypted attachment from its url alone.\n *\n * Path shape (after the host):\n * auth|publ / service / owner / uploader / records / recordId / group / bin / ts / size / formKey / filename\n */\nexport function encryptedFileFromUrl(url: string): { recordId: string; recordOwner: string; filename: string; plainSize: number } | null {\n try {\n let seg = String(url).split('?')[0].split('/').slice(3);\n if (seg.length < 12 || seg[4] !== 'records' || seg[7] !== 'bin') {\n return null;\n }\n let marked = parseFileMarker(seg[10]);\n if (!marked) {\n return null;\n }\n return {\n recordId: seg[5],\n recordOwner: seg[3],\n filename: seg[seg.length - 1],\n plainSize: marked.plainSize\n };\n }\n catch (err) {\n return null;\n }\n}\n\nfunction fileCtx(this: any, recordId: string, recordOwner: string) {\n return { service: this.service, owner: this.owner, recordOwner, recordId };\n}\n\n/**\n * Seal one attachment before upload. Returns the original untouched whenever\n * the record is not encrypted, so the off path is unchanged.\n */\nexport async function maybeEncryptFile(\n this: any,\n recordId: string,\n formKey: string,\n file: File\n): Promise<{ key: string; file: File; encrypted: boolean }> {\n let s = encState.call(this);\n if (!s || !recordId) {\n return { key: formKey, file, encrypted: false };\n }\n\n let entry = s.dek.get(recordId);\n if (!entry) {\n // The record is not encrypted (or this session cannot read it, in which\n // case maybeEncrypt already refused the write that got us here).\n return { key: formKey, file, encrypted: false };\n }\n\n if (parseFileMarker(formKey)) {\n throw new SkapiError(`\"${FILE_MARKER}\" is reserved in an upload form key.`, { code: 'INVALID_PARAMETER' });\n }\n\n let plain = new Uint8Array(await file.arrayBuffer());\n let meta = { n: file.name, t: file.type || '', lm: file.lastModified || 0 };\n let sealed = await encryptFileBytes(entry.bytes, plain, fileCtx.call(this, recordId, entry.own), meta);\n zeroize(plain);\n\n return {\n key: `${formKey}${FILE_MARKER}${toB62(file.size)}`,\n // Deliberately octet-stream: the real content type is authenticated\n // inside the container. Leaving \"application/pdf\" on ciphertext invites\n // a browser or a CDN to try to interpret it.\n file: new File([sealed], file.name, { type: 'application/octet-stream' }),\n encrypted: true\n };\n}\n\n/** Open a downloaded attachment. */\nexport async function decryptFileBlob(this: any, url: string, blob: Blob): Promise<Blob> {\n let s = encState.call(this);\n let info = encryptedFileFromUrl(url);\n if (!s || !info) {\n return blob;\n }\n\n let entry = s.dek.get(info.recordId);\n if (!entry) {\n throw new SkapiError(\n `Cannot open this file: the data key for record \"${info.recordId}\" is not available. ` +\n `Read the record first, and make sure encryption is unlocked.`,\n { code: 'ENCRYPTION_LOCKED' }\n );\n }\n\n let bytes = new Uint8Array(await blob.arrayBuffer());\n if (!isEncryptedFile(bytes)) {\n // Marked in the key but not actually a container. Do NOT hand the raw\n // bytes back as if they were the file: that is how ciphertext ends up\n // saved to disk under a plaintext name.\n throw new SkapiError(\n 'This file is marked as encrypted but its contents are not an encrypted container.',\n { code: 'ENCRYPTION_FILE_CORRUPT' }\n );\n }\n\n let opened = await decryptFileBytes(entry.bytes, bytes, fileCtx.call(this, info.recordId, info.recordOwner));\n let type = (opened.meta && opened.meta.t) || 'application/octet-stream';\n return new Blob([opened.bytes], { type });\n}\n\n/** Stored size of an attachment once sealed, for declaring it before upload. */\nexport function sealedFileSize(plainLen: number, meta: { n?: string; t?: string; lm?: number }): number {\n return encryptedFileSize(plainLen, encodeUtf8(JSON.stringify(meta)).length);\n}\n","import SkapiError from '../main/error';\nimport { ensureKeyring, clearEncryptionState, encState, rewrapForPasswordChange, pruneKeyringWraps } from './encryption';\nimport {\n CognitoUserAttribute,\n CognitoUser,\n AuthenticationDetails,\n CognitoUserSession,\n CognitoIdToken,\n CognitoAccessToken,\n CognitoRefreshToken\n} from 'amazon-cognito-identity-js';\nimport {\n Form,\n UserProfile,\n FetchOptions,\n DatabaseResponse,\n UserAttributes,\n UserPublic\n} from '../Types';\nimport validator from '../utils/validator';\nimport { request } from '../utils/network';\nimport { MD5, extractFormData, fromBase62, parseUserAttributes } from '../utils/utils';\n\nlet cognitoUser: CognitoUser | null = null;\n\nfunction map_ticket_obj(t): {\n ticket_id?: string;\n consume_id?: string;\n user_id?: string;\n is_test?: boolean;\n timestamp?: number;\n condition?: any;\n action?: any;\n count?: number;\n time_to_live?: number;\n description?: string;\n limit_per_user?: number;\n} {\n let mapper = {\n \"tkid\": 'ticket_id',\n \"cond\": 'condition',\n \"stmp\": 'timestamp',\n \"actn\": 'action',\n \"cnt\": 'count',\n \"ttl\": 'time_to_live',\n 'plch': 'placeholder',\n 'hash': 'hash',\n 'desc': 'description',\n 'pmc': 'limit_per_user'\n }\n let new_obj = {};\n for (let k in t) {\n if (k === 'tkid') {\n let tkid = t[k].split('#');\n if (tkid.length === 1) {\n new_obj['ticket_id'] = tkid[0];\n continue;\n }\n new_obj['ticket_id'] = tkid[1];\n new_obj['consume_id'] = tkid[2];\n new_obj['user_id'] = tkid[3];\n\n // last 4 characters are random chars\n let rand = tkid[2].slice(-4);\n new_obj[\"is_test\"] = rand === \":CHK\";\n\n if (!t.stmp) {\n let timestampStr = tkid[2].slice(0, -4);\n\n // check if timestampStr is a number string\n if (/^[0-9]+$/.test(timestampStr)) {\n new_obj['timestamp'] = parseInt(timestampStr, 10);\n }\n else {\n new_obj['timestamp'] = fromBase62(tkid[2].slice(0, -4));\n }\n }\n }\n else if (mapper[k]) {\n new_obj[mapper[k]] = t[k];\n }\n else {\n new_obj[k] = t[k];\n }\n }\n return new_obj;\n}\n\nexport async function consumeTicket(params: {\n ticket_id: string;\n method: string; // GET | POST\n auth?: boolean;\n data?: {\n [key: string]: any;\n }\n}): Promise<any> {\n if (!params.ticket_id) {\n throw new SkapiError('Ticket ID is required.', { code: 'INVALID_PARAMETER' });\n }\n if (!params.method) {\n throw new SkapiError('Method is required. Should be either \"GET\" or \"POST\"', { code: 'INVALID_PARAMETER' });\n }\n let ticket_id = params.ticket_id;\n\n await this.__connection;\n let resp = await request.bind(this)(`https://${this.service.slice(0, 4)}.${this.customApiDomain}/auth/consume/${this.service}/${this.owner}/${ticket_id}`, params?.data || {}, { method: params.method, auth: !!params?.auth });\n return map_ticket_obj(resp);\n}\n\nexport async function getTickets(params: {\n ticket_id?: string;\n}, fetchOptions?: FetchOptions): Promise<DatabaseResponse<any[]>> {\n await this.__connection;\n let tickets = await request.bind(this)('ticket', Object.assign({ exec: 'list' }, params || {}), { auth: true, fetchOptions });\n tickets.list = tickets.list.map(map_ticket_obj);\n return tickets;\n}\n\nexport async function getConsumedTickets(params: {\n ticket_id?: string;\n}, fetchOptions?: FetchOptions): Promise<DatabaseResponse<any[]>> {\n await this.__connection;\n let tickets = await request.bind(this)('ticket', Object.assign({ exec: 'consumed' }, params || {}), { auth: true, fetchOptions });\n tickets.list = tickets.list.map(map_ticket_obj);\n return tickets;\n}\n\nexport async function registerTicket(\n params: {\n ticket_id: string;\n description: string;\n count?: number;\n time_to_live?: number;\n placeholder?: { [key: string]: string };\n limit_per_user?: number;\n condition?: {\n return200?: boolean; // When true, returns 200 when regardless condition mismatch\n method?: 'GET' | 'POST'; // Defaults to 'GET' method when not given\n headers?: {\n key: string;\n value: string | string[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n }[],\n ip?: {\n value: string | string[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n },\n user_agent?: {\n value: string | string[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n },\n data?: {\n key?: string;\n value: any | any[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n setValueWhenMatch?: any | any[];\n }[],\n params?: {\n key?: string;\n value: string | string[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n setValueWhenMatch?: any | any[];\n }[],\n user?: {\n key: string;\n value: string | string[];\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n }[],\n record_access?: string; // record id user should have access to\n request?: {\n url: string;\n method: 'GET' | 'POST';\n headers?: {\n [key: string]: string;\n };\n data?: Record<string, any>;\n params?: Record<string, any>;\n match: {\n key: string; // key[to][match]\n operator: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!=';\n value: any | any[];\n }[];\n }\n };\n action?: {\n access_group: number; // group number to give access to the user\n record_access?: string; // record id to give access to the user\n request?: {\n url: string;\n method: 'GET' | 'POST'; // Defaults to 'GET' method when not given\n headers?: {\n [key: string]: string;\n };\n data?: Record<string, any>;\n params?: Record<string, any>;\n }\n };\n }\n): Promise<string> {\n return request.bind(this)('register-ticket', Object.assign({ exec: 'reg' }, params), { auth: true });\n}\n\nexport async function unregisterTicket(\n params: {\n ticket_id: string;\n }\n): Promise<string> {\n return request.bind(this)('register-ticket', Object.assign({ exec: 'unreg' }, params), { auth: true });\n}\n\n// Refresh a token that is merely ABOUT to expire, not only one that already has.\n//\n// Without a margin, a token with seconds left is handed out as valid — and a token\n// is not always used at the moment it is fetched. A queued request carries it to a\n// server that runs it minutes later, and a background job (indexing a large file)\n// replays that same stored token for the whole run. Those are the calls that die of\n// old age, holding a credential this client could trivially have refreshed first.\n//\n// An hour, because that is the scale of the work a token gets handed to, and it\n// costs at most one extra refresh per token: the replacement is good for a day.\nconst TOKEN_REFRESH_SKEW_SECONDS = 60 * 60;\n\nexport async function getJwtToken() {\n await this.__connection;\n // if (this.bearerToken) {\n // return this.bearerToken;\n // }\n if (this.session) {\n const currentTime = Math.floor(Date.now() / 1000);\n const idToken = this.session.getIdToken();\n const idTokenExp = idToken.getExpiration();\n\n if (idTokenExp < currentTime + TOKEN_REFRESH_SKEW_SECONDS) {\n this.log('request:requesting new token', null);\n try {\n await authentication.bind(this)().getSession({ refreshToken: true });\n this.log('request:received new tokens', {\n exp: this.session?.idToken?.payload?.exp,\n currentTime,\n expiresIn: idTokenExp - currentTime,\n token: this.session?.accessToken?.jwtToken,\n refreshToken: this.session?.refreshToken?.token\n });\n }\n catch (err) {\n this.log('request:new token error', err);\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n }\n else {\n this.log('request:tokens', {\n exp: this.session.idToken.payload.exp,\n currentTime,\n expiresIn: idTokenExp - currentTime,\n token: this.session.accessToken.jwtToken,\n refreshToken: this.session.refreshToken.token\n });\n }\n // this.bearerToken = this.session?.idToken?.jwtToken;\n return this.session?.idToken?.jwtToken;\n }\n else {\n this.log('request:no session', null);\n _out.bind(this)();\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n}\n\nfunction refreshSession(session, cognitoUser) {\n return new Promise((res, rej) => {\n cognitoUser.refreshSession(session.getRefreshToken(), (refreshErr, refreshedSession) => {\n this.log('getSession:refreshSessionCallback', { refreshErr, refreshedSession });\n\n if (refreshErr) {\n _out.bind(this)();\n rej(refreshErr);\n }\n else if (refreshedSession.isValid()) {\n res(refreshedSession);\n }\n else {\n _out.bind(this)();\n rej(new SkapiError('Invalid session.', { code: 'INVALID_REQUEST' }));\n }\n });\n });\n}\n\nexport function authentication() {\n if (!this.userPool) throw new SkapiError('User pool is missing', { code: 'INVALID_REQUEST' });\n\n const getUserProfile = (): UserProfile => {\n // get users updated attribute\n let attr = cognitoUser.getSignInUserSession().getIdToken().payload || null;\n\n // parse attribute structure: [ { Name, Value }, ... ]\n let user = parseUserAttributes(attr);\n this.log('normalized user attribute', user);\n this.__user = user;\n return user;\n };\n\n const getSession = async (option?: { skipUserUpdateEventTrigger?: boolean; refreshToken?: boolean; }): Promise<CognitoUserSession> =>\n new Promise((res, rej) => {\n // fetch session, updates user attributes\n this.log('getSession:option', option);\n let { refreshToken = false, skipUserUpdateEventTrigger = false } = option || {};\n if (refreshToken && skipUserUpdateEventTrigger) {\n skipUserUpdateEventTrigger = false;\n }\n\n // if (!this.bearerToken) {\n cognitoUser = this.userPool.getCurrentUser();\n // }\n if (!cognitoUser) {\n this.log('getSession:cognitoUser', cognitoUser);\n // no user session. wasn't logged in.\n _out.bind(this)();\n rej(null);\n return;\n }\n\n let respond = (s: any) => {\n let sessionAttribute = s.getIdToken().payload;\n this.log('getSession:respond:sessionAttribute', sessionAttribute);\n\n if (sessionAttribute['custom:service'] !== this.service) {\n this.log('getSession:respond', 'invalid service, signing out');\n _out.bind(this)();\n throw new SkapiError('Invalid session.', { code: 'INVALID_REQUEST' });\n }\n\n this.session = s;\n getUserProfile();\n if (!skipUserUpdateEventTrigger) {\n this._runOnUserUpdateListeners(this.user);\n }\n return this.session;\n }\n\n cognitoUser.getSession((err: any, session: CognitoUserSession) => {\n this.log('getSession:getSessionCallback', { err, session });\n if (!session) {\n _out.bind(this)();\n rej(new SkapiError('Current session does not exist.', { code: 'INVALID_REQUEST' }));\n return;\n }\n\n if (err) {\n refreshSession.bind(this)(session, cognitoUser).then(r => res(respond(r))).catch(rej);\n return;\n }\n\n const currentTime = Math.floor(Date.now() / 1000);\n const idToken = session.getIdToken();\n const idTokenExp = idToken.getExpiration();\n const isExpired = idTokenExp < currentTime;\n this.log('getSession:currentTime', currentTime);\n this.log('getSession:idTokenExp', idTokenExp);\n this.log('getSession:isExpired', isExpired);\n // if(this.bearerToken) {\n this.log('getSession:existingBearerToken', this.bearerToken);\n this.bearerToken = idToken.getJwtToken();\n // }\n // try refresh when invalid token\n // when on updateProfile, it will always refreshToken\n if (isExpired || refreshToken || !session.isValid()) {\n refreshSession.bind(this)(session, cognitoUser).then(r => res(respond(r))).catch(rej);\n }\n else {\n try {\n res(respond(session));\n }\n catch (err) {\n rej(err);\n }\n }\n });\n });\n\n const createCognitoUser = (un: string, raw?: boolean) => {\n let username = raw ? un : un.includes(this.service + '-') ? un : this.service + '-' + MD5.hash(un);\n\n return {\n cognitoUser: new CognitoUser({\n Username: username,\n Pool: this.userPool\n }),\n cognitoUsername: username\n };\n };\n\n const authenticateUser = (email: string, password: string, raw: boolean = false, is_openid: boolean = false): Promise<UserProfile> => {\n return new Promise((res, rej) => {\n this.__request_signup_confirmation = null;\n this.__disabledAccount = null;\n\n let initUser = createCognitoUser(email, raw);\n let username = initUser.cognitoUsername;\n let authenticationDetails = new AuthenticationDetails({\n Username: username,\n Password: password\n });\n\n initUser.cognitoUser.authenticateUser(authenticationDetails, {\n newPasswordRequired: (userAttributes, requiredAttributes) => {\n this.__disabledAccount = null;\n this.__request_signup_confirmation = username;\n if (userAttributes['custom:signup_ticket'] === 'PASS' || userAttributes['custom:signup_ticket'] === 'MEMBER' || userAttributes['custom:signup_ticket'] === 'OIDPASS') {\n // auto confirm - (setting password from admin created account)\n initUser.cognitoUser.completeNewPasswordChallenge(password, {}, {\n onSuccess: _ => {\n cognitoUser = initUser.cognitoUser;\n getSession().then(async session => {\n if (encState.call(this)) {\n try {\n await ensureKeyring.bind(this)(password);\n } catch (err) {\n this.log('encryption:ensureKeyring:failed', err);\n }\n }\n res(this.user);\n });\n },\n onFailure: (err: any) => {\n rej(new SkapiError(err.message || 'Failed to authenticate user.', { code: err.code }));\n }\n });\n }\n else {\n // legacy method... will be deprecated\n rej(new SkapiError(\"User's signup confirmation is required.\", { code: 'SIGNUP_CONFIRMATION_NEEDED' }));\n }\n },\n onSuccess: _ => getSession({ skipUserUpdateEventTrigger: true }).then(async _ => {\n this.__disabledAccount = null;\n // Login is the one moment the plaintext password exists on\n // the client, so it is the only place a password-derived key\n // can be built. Must never reject the login: a failure here\n // leaves the session locked and unlockEncryption() can retry.\n if (encState.call(this)) {\n try {\n await ensureKeyring.bind(this)(password);\n } catch (err) {\n this.log('encryption:ensureKeyring:failed', err);\n }\n }\n this._runOnLoginListeners(this.user);\n this._runOnUserUpdateListeners(this.user);\n res(this.user);\n }),\n onFailure: (err: any) => {\n let error = [];\n let { parsed, code } = cognitoErrorParser(err);\n let cognitoMessage = typeof err?.message === 'string' ? err.message : '';\n\n if (code === \"NotAuthorizedException\") {\n if (cognitoMessage.includes(\"User is disabled.\")) {\n this.__disabledAccount = username;\n error = ['This account is disabled.', 'USER_IS_DISABLED'];\n }\n\n else {\n if (is_openid) {\n error = ['The account already exists.', 'ACCOUNT_EXISTS'];\n }\n else {\n error = ['Incorrect username or password.', 'INCORRECT_USERNAME_OR_PASSWORD'];\n }\n }\n }\n else if (code === \"UserNotFoundException\") {\n error = ['Incorrect username or password.', 'INCORRECT_USERNAME_OR_PASSWORD'];\n }\n else if (code === \"UserNotConfirmedException\") {\n this.__request_signup_confirmation = username;\n error = [\"User's signup confirmation is required.\", 'SIGNUP_CONFIRMATION_NEEDED'];\n }\n else if (code === \"TooManyRequestsException\" || code === \"LimitExceededException\") {\n error = ['Too many attempts. Please try again later.', 'REQUEST_EXCEED'];\n }\n\n if (parsed.code === 'SIGNUP_CONFIRMATION_NEEDED') {\n this.__request_signup_confirmation = username;\n }\n\n if (error.length) {\n let errCode = error[1];\n let errMsg = error[0];\n\n // \"#INVALID_REQUEST: The account has been blacklisted.\"\n // \"#NOT_EXISTS: The account does not exist.\"\n // \"#SIGNUP_CONFIRMATION_NEEDED\": The account signup needs to be confirmed.\"\n // \"#ACCOUNT_EXISTS\": The account already exists.\"\n\n rej(new SkapiError(errMsg, { code: errCode, cause: err }));\n }\n else {\n rej(parsed);\n }\n\n return;\n }\n });\n });\n };\n\n const signup = (username: string, password: string, attributes: CognitoUserAttribute[]) => {\n return new Promise((res, rej) => {\n this.userPool.signUp(username, password, attributes, null, (err, result) => {\n if (err) {\n let { parsed, code } = cognitoErrorParser(err);\n let error = [];\n if (code === 'UsernameExistsException') {\n error = ['The account already exists.', 'EXISTS'];\n }\n else if (code === 'InvalidPasswordException') {\n error = ['Invalid password. Password must be at least 6 characters.', 'INVALID_PARAMETER'];\n }\n else if (code === 'InvalidParameterException') {\n error = [parsed.message || 'Invalid parameter.', 'INVALID_PARAMETER'];\n }\n else if (code === 'TooManyRequestsException' || code === 'LimitExceededException') {\n error = ['Too many attempts. Please try again later.', 'REQUEST_EXCEED'];\n }\n else if (code === 'CodeDeliveryFailureException') {\n error = ['Failed to deliver verification code.', 'CODE_DELIVERY_FAILURE'];\n }\n else if (code === 'UserLambdaValidationException') {\n error = [parsed.message || 'Signup validation failed.', 'INVALID_REQUEST'];\n }\n\n if (error.length) {\n rej(new SkapiError(error[0], { code: error[1], cause: err }));\n } else {\n rej(parsed);\n }\n\n return;\n }\n res(result);\n return;\n });\n })\n }\n\n return {\n getSession,\n authenticateUser,\n createCognitoUser,\n signup\n };\n}\nfunction cognitoErrorParser(err) {\n let original_code = typeof err?.code === 'string' && err.code.trim() ? err.code.trim() : 'ERROR';\n\n let raw_message =\n typeof err?.message === 'string'\n ? err.message\n : (typeof err === 'string' ? err : 'An error occurred.');\n\n let err_msg = (raw_message || 'An error occurred.').trim();\n if (!err_msg) {\n err_msg = 'An error occurred.';\n }\n\n // format: random text, #ERROR_CODE: Error message.\n let custom = err_msg.match(/#([A-Za-z0-9_]+)\\s*:\\s*([\\s\\S]+)/);\n let err_code = custom?.[1]?.trim() || original_code;\n let err_msg_custom = custom?.[2]?.trim() || err_msg;\n\n return {\n parsed: new SkapiError(err_msg_custom, { code: err_code, cause: err }),\n code: original_code,\n }\n}\nexport async function getProfile(options?: { refreshToken: boolean; }): Promise<UserProfile | null> {\n await this.__authConnection;\n let refreshToken = options?.refreshToken || false;\n if (!refreshToken) {\n return this.user;\n }\n try {\n // Always trigger live session refresh if refreshToken is true\n await authentication.bind(this)().getSession(Object.assign({ skipUserUpdateEventTrigger: !refreshToken, refreshToken }, options));\n return this.user;\n } catch (err) {\n return null;\n }\n}\n\nexport async function openIdLogin(params: {\n token: string;\n id: string;\n merge?: boolean | string[];\n template?: {\n /** message_id of the template to use for the welcome e-mail (sent the first time this OpenID user account is created). */\n welcome?: string;\n };\n}): Promise<{ userProfile: UserProfile; openid: { [attribute: string]: string } }> {\n await this.__connection;\n\n params = validator.Params(params, {\n token: 'string',\n id: 'string',\n merge: v => {\n if (v === undefined) return false;\n if (typeof v === 'string') {\n return [v]\n }\n if (Array.isArray(v)) {\n for (let item of v) {\n if (typeof item !== 'string') {\n throw new SkapiError('\"merge\" array items should be type: <string>.', { code: 'INVALID_PARAMETER' });\n }\n }\n }\n if (typeof v !== 'boolean' && !Array.isArray(v)) {\n throw new SkapiError('\"merge\" should be type: <boolean | string[]>.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n template: (v: { welcome?: string }) => {\n if (typeof v !== 'object' || v === null) {\n throw new SkapiError('\"template\" should be type: <object>.', { code: 'INVALID_PARAMETER' });\n }\n if (v.welcome !== undefined) {\n if (typeof v.welcome !== 'string' || !v.welcome) {\n throw new SkapiError('\"template.welcome\" should be a non-empty <string> (template message_id).', { code: 'INVALID_PARAMETER' });\n }\n }\n return v;\n }\n });\n\n let payload: any = { token: params.token, id: params.id, merge: params.merge };\n if ((params as any).template?.welcome) {\n payload.template_welcome = (params as any).template.welcome;\n }\n\n let oplog = await request.bind(this)(\"openid-logger\", payload);\n let logger = oplog.logger.split('#');\n let username = this.service + '-' + logger[0];\n let password = logger[1];\n\n return { userProfile: await authentication.bind(this)().authenticateUser(username, password, true, true), openid: oplog.openid };\n}\n\n// Get user info from base64 encoded token\nfunction decodeBase64Utf8(base64: string): string {\n const root = typeof globalThis !== 'undefined' ? (globalThis as any) : undefined;\n\n if (root?.Buffer) {\n return root.Buffer.from(base64, 'base64').toString('utf8');\n }\n\n if (typeof atob === 'function') {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder().decode(bytes);\n }\n\n return binary;\n }\n\n throw new Error('No base64 decoder available in this environment');\n}\n\nfunction getUserFromToken(accessToken) {\n // JWT has 3 parts: header.payload.signature\n const parts = accessToken.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format');\n }\n\n // Decode the payload (second part) - use base64url decoding\n const payload = parts[1];\n // Replace base64url chars with standard base64 chars\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const decoded = decodeBase64Utf8(base64);\n const userData = JSON.parse(decoded);\n return userData;\n}\n\nexport async function loginWithToken(params: {\n idToken: string;\n accessToken?: string;\n refreshToken?: string;\n}): Promise<UserProfile> {\n await this.__authConnection;\n this.log('loginWithToken:params', params);\n params = validator.Params(params, {\n idToken: 'string',\n accessToken: 'string',\n refreshToken: 'string'\n }, ['idToken']);\n\n // Store the bearer token for authenticated requests\n const idTokenPayload = getUserFromToken(params.idToken);\n this.log('loginWithToken:idTokenPayload', idTokenPayload);\n // Validate the token belongs to this service\n if (idTokenPayload['custom:service'] !== this.service) {\n throw new SkapiError('Token does not belong to this service.', { code: 'INVALID_REQUEST' });\n }\n\n // Check if token is expired\n const currentTime = Math.floor(Date.now() / 1000);\n if (idTokenPayload.exp && idTokenPayload.exp < currentTime) {\n throw new SkapiError('Token has expired.', { code: 'INVALID_REQUEST' });\n }\n\n // this.bearerToken = params.idToken;\n // Parse user attributes from the token payload\n this.__user = parseUserAttributes(idTokenPayload);\n\n this.session = null;\n\n if (params.accessToken && params.refreshToken) {\n try {\n this.session = new CognitoUserSession({\n IdToken: new CognitoIdToken({ IdToken: params.idToken }),\n AccessToken: new CognitoAccessToken({ AccessToken: params.accessToken }),\n RefreshToken: new CognitoRefreshToken({ RefreshToken: params.refreshToken })\n });\n\n this.log('loginWithToken:session', this.session);\n this.log('loginWithToken:CognitoUser', CognitoUser);\n this.log('loginWithToken:userPool', this.userPool);\n // Restore cognitoUser in memory for Node.js/server context\n if (CognitoUser && this.userPool) {\n this.log('loginWithToken:cognito:username', idTokenPayload['cognito:username']);\n let up = {\n Username: idTokenPayload['cognito:username'],\n Pool: this.userPool\n }\n this.log('loginWithToken:cognitoUserParams', up);\n cognitoUser = new CognitoUser(up);\n cognitoUser.setSignInUserSession(this.session);\n this.log('loginWithToken:cognitoUserRestored', {\n cognitoUserType: typeof cognitoUser,\n cognitoUserKeys: Object.keys(cognitoUser || {}),\n cognitoUser\n });\n }\n }\n catch (err: any) {\n // Enhanced error logging: log all property names, symbols, and descriptors\n this.log('loginWithToken:err', err);\n try {\n this.log('loginWithToken:err:stringified', JSON.stringify(err));\n } catch (e) {\n this.log('loginWithToken:err:stringifyFail', String(err));\n }\n try {\n const keys = Object.keys(err || {});\n const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(err || {}) : [];\n const descriptors = Object.getOwnPropertyDescriptors ? Object.getOwnPropertyDescriptors(err || {}) : {};\n this.log('loginWithToken:createSessionError:allKeys', { keys, symbols, descriptors });\n } catch (e) {\n this.log('loginWithToken:createSessionError:allKeysFail', String(e));\n }\n }\n }\n\n this._runOnLoginListeners(this.user);\n this._runOnUserUpdateListeners(this.user);\n\n return this.user;\n}\n\nexport async function checkAdmin() {\n await this.__connection;\n if (this.__user?.service === this.service) {\n // logged in\n return this.__user?.owner === this.host;\n } else {\n // not logged\n await logout.bind(this)();\n }\n\n return false;\n}\n\nexport async function _out(global: boolean = false) {\n let toReturn = null;\n\n if (cognitoUser) {\n if (global) {\n toReturn = new Promise((res, rej) => {\n cognitoUser.globalSignOut({\n onSuccess: (result: any) => {\n this.log('globalSignOut:success', result);\n res(result);\n },\n onFailure: (err: any) => {\n this.log('globalSignOut:error', err);\n rej(err);\n }\n });\n });\n }\n else {\n cognitoUser.signOut();\n }\n }\n\n clearEncryptionState.bind(this)();\n\n let to_be_erased = {\n 'session': null,\n '__startKeyHistory': {},\n '__cached_requests': {},\n '__user': null\n };\n\n if (toReturn) {\n toReturn = await toReturn;\n }\n\n for (let k in to_be_erased) {\n this[k] = to_be_erased[k];\n }\n\n this._runOnUserUpdateListeners(null);\n this._runOnLoginListeners(null);\n\n return toReturn;\n}\n\nexport async function logout(params?: Form<{ global: boolean; }>): Promise<'SUCCESS: The user has been logged out.'> {\n await this.__connection;\n\n let { data } = extractFormData(params);\n\n await _out.bind(this)(data?.global);\n return 'SUCCESS: The user has been logged out.';\n}\n\nexport async function resendSignupConfirmation(): Promise<'SUCCESS: Signup confirmation e-mail has been sent.'> {\n if (!this.__request_signup_confirmation) {\n throw new SkapiError('Least one login attempt is required.', { code: 'INVALID_REQUEST' });\n }\n\n let resend = await request.bind(this)(\"confirm-signup\", {\n username: this.__request_signup_confirmation,\n });\n\n return resend; // 'SUCCESS: Signup confirmation e-mail has been sent.'\n}\n\nexport async function recoverAccount(\n /** Redirect url on confirmation success. */\n redirect: boolean | string = false\n): Promise<\"SUCCESS: Recovery e-mail has been sent.\"> {\n\n if (typeof redirect === 'string') {\n redirect = validator.Url(redirect);\n }\n\n else if (typeof redirect !== 'boolean') {\n throw new SkapiError('Argument should be type: <boolean | string>.', { code: 'INVALID_REQUEST' });\n }\n\n if (!this.__disabledAccount) {\n throw new SkapiError('Least one signin attempt of disabled account is required.', { code: 'INVALID_REQUEST' });\n }\n\n await request.bind(this)(\"recover-account\", { username: this.__disabledAccount, redirect });\n return 'SUCCESS: Recovery e-mail has been sent.';\n}\n\nexport async function login(\n form: Form<{\n /** if given, username will be used instead of email. */\n username?: string;\n /** E-Mail for signin. 64 character max. */\n email: string;\n /** Password for signin. Should be at least 6 characters. */\n password: string;\n }>): Promise<UserProfile> {\n \n let params:any = validator.Params(form, {\n username: 'string',\n email: 'string',\n password: 'string'\n }, ['password']);\n\n await this.__authConnection;\n\n if (params.email) {\n // incase user uses email instead of username\n try {\n validator.Email(params.email);\n } catch (err) {\n params.username = params.email;\n delete params.email;\n }\n }\n\n if (!params.username && !params.email) {\n throw new SkapiError('Least one of \"username\" or \"email\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n const resolved = await authentication.bind(this)().authenticateUser(params.username || params.email, params.password);\n\n return resolved;\n // INVALID_REQUEST: the account has been blacklisted.\n // NOT_EXISTS: the account does not exist.\n}\n\nexport async function signup(\n form: Form<UserAttributes & { password: String; username?: string; }>,\n option?: {\n signup_confirmation?: boolean | string;\n email_subscription?: boolean;\n login?: boolean;\n /**\n * Per-call e-mail template overrides.\n * Each value is the `message_id` of a template that the service owner\n * has previously uploaded via the Mail dashboard.\n */\n template?: {\n /** message_id of the template to use for the signup confirmation e-mail. */\n signup_confirmation?: string;\n /** message_id of the template to use for the welcome e-mail (sent on the user's first confirmed login). */\n welcome?: string;\n };\n }): Promise<UserProfile | \"SUCCESS: The account has been created. User's signup confirmation is required.\" | 'SUCCESS: The account has been created.'> {\n\n await this.__authConnection;\n\n let paramRestrictions = {\n username: 'string',\n password: (v: string) => validator.Password(v),\n\n email: (v: string) => validator.Email(v),\n name: 'string',\n address: (v: any) => {\n if (!v) return '';\n\n if (typeof v === 'string') {\n return v;\n }\n\n if (typeof v === 'object') {\n return JSON.stringify(v);\n }\n\n return undefined;\n },\n gender: 'string',\n birthdate: (v: string) => v ? validator.Birthdate(v) : \"\",\n phone_number: (v: string) => v ? validator.PhoneNumber(v) : \"\",\n\n email_public: ['boolean', () => false],\n address_public: ['boolean', () => false],\n gender_public: ['boolean', () => false],\n birthdate_public: ['boolean', () => false],\n phone_number_public: ['boolean', () => false],\n access_group: 'number', // v=>{if(v > 0 && v < 100) return v else throw SkapiError(...)}\n misc: 'string',\n\n picture: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n profile: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n family_name: 'string',\n given_name: 'string',\n middle_name: 'string',\n nickname: 'string',\n website: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n };\n\n let params = validator.Params(form || {}, paramRestrictions, ['email', 'password']);\n\n // always logout before creating an account (for users)\n await logout.bind(this)();\n\n option = validator.Params(option || {}, {\n email_subscription: (v: boolean) => {\n if (typeof v !== 'boolean') {\n throw new SkapiError('\"option.email_subscription\" should be type: <boolean>.', { code: 'INVALID_PARAMETER' });\n }\n if (!option?.signup_confirmation) {\n // requires to be url or true\n throw new SkapiError('\"option.signup_confirmation\" is required for email subscription.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n signup_confirmation: (v: string | boolean) => {\n let value = v;\n if (typeof v === 'string') {\n value = validator.Url(v);\n }\n else if (typeof v === 'boolean') {\n value = v;\n }\n else {\n throw new SkapiError('\"option.signup_confirmation\" should be type: <string | boolean>.', { code: 'INVALID_PARAMETER' });\n }\n\n if (value && !params.email) {\n throw new SkapiError('\"email\" is required for signup confirmation.', { code: 'INVALID_PARAMETER' });\n }\n\n return value;\n },\n login: (v: boolean) => {\n if (typeof v === 'boolean') {\n if (option.signup_confirmation && v) {\n throw new SkapiError('\"login\" is not allowed when \"option.signup_confirmation\" is true.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n }\n throw new SkapiError('\"option.login\" should be type: boolean.', { code: 'INVALID_PARAMETER' });\n },\n template: (v: { signup_confirmation?: string; welcome?: string }) => {\n if (typeof v !== 'object' || v === null) {\n throw new SkapiError('\"option.template\" should be type: <object>.', { code: 'INVALID_PARAMETER' });\n }\n if (v.signup_confirmation !== undefined) {\n if (typeof v.signup_confirmation !== 'string' || !v.signup_confirmation) {\n throw new SkapiError('\"option.template.signup_confirmation\" should be a non-empty <string> (template message_id).', { code: 'INVALID_PARAMETER' });\n }\n if (!option?.signup_confirmation) {\n throw new SkapiError('\"option.signup_confirmation\" is required when \"option.template.signup_confirmation\" is set.', { code: 'INVALID_PARAMETER' });\n }\n }\n if (v.welcome !== undefined) {\n if (typeof v.welcome !== 'string' || !v.welcome) {\n throw new SkapiError('\"option.template.welcome\" should be a non-empty <string> (template message_id).', { code: 'INVALID_PARAMETER' });\n }\n }\n return v;\n }\n });\n\n let logUser = option?.login || false;\n\n params.signup_confirmation = option?.signup_confirmation || false;;\n params.email_subscription = option?.email_subscription || false;\n\n if (params.email_public && !params.signup_confirmation) {\n throw new SkapiError('\"option.signup_confirmation\" should be true if \"email_public\" is set to true.', { code: 'INVALID_PARAMETER' });\n }\n\n // cognito signup process below\n\n params.service = this.service;\n params.owner = this.owner;\n\n // user creating account\n let newUser = authentication.bind(this)().createCognitoUser(params.username || params.email);\n\n for (let k of ['email_public',\n 'address_public',\n 'gender_public',\n 'birthdate_public',\n 'phone_number_public']) {\n params[k] = params[k] ? '1' : '0';\n }\n\n if (params.access_group) {\n params.access_group = params.access_group.toString();\n }\n\n let signup_key = (await request.bind(this)('signupkey', {\n username: newUser.cognitoUsername,\n signup_confirmation: typeof params.signup_confirmation === 'boolean' ? JSON.stringify(params.signup_confirmation) : params.signup_confirmation,\n email_subscription: params.email_subscription,\n template_confirmation: option?.template?.signup_confirmation || '',\n template_welcome: option?.template?.welcome || '',\n })).split(':');\n\n let signup_ticket = signup_key.slice(1).join(':');\n\n let attributeList = [\n new CognitoUserAttribute({\n Name: 'custom:signup',\n Value: signup_key[0]\n }),\n new CognitoUserAttribute({\n Name: 'locale',\n Value: signup_ticket.split('#')[1]\n }),\n new CognitoUserAttribute({\n Name: 'custom:signup_ticket',\n Value: signup_ticket\n })\n ];\n\n for (let k in paramRestrictions) {\n let customParams = [\n 'email_public',\n 'address_public',\n 'gender_public',\n 'birthdate_public',\n 'phone_number_public',\n 'misc',\n 'service',\n 'owner'\n ];\n if (params[k] === \"\") {\n continue;\n }\n\n if (k === 'username' || k === 'password' || k === 'access_group') {\n continue;\n }\n\n if (customParams.includes(k)) {\n attributeList.push(new CognitoUserAttribute({\n Name: 'custom:' + k,\n Value: params[k]\n }));\n }\n else {\n attributeList.push(new CognitoUserAttribute({\n Name: k,\n Value: params[k]\n }));\n }\n }\n\n await authentication.bind(this)().signup(newUser.cognitoUsername, params.password, attributeList);\n\n if (params.signup_confirmation) {\n cognitoUser = newUser.cognitoUser;\n this.__request_signup_confirmation = newUser.cognitoUsername;\n return \"SUCCESS: The account has been created. User's signup confirmation is required.\";\n }\n else if (logUser) {\n // log user in\n return login.bind(this)({ email: params.username || params.email, password: params.password });\n }\n\n return 'SUCCESS: The account has been created.';\n}\n\nexport async function disableAccount(): Promise<'SUCCESS: account has been disabled.'> {\n await this.__connection;\n let result = await request.bind(this)('remove-account', { disable: this.__user.user_id }, { auth: true });\n await logout.bind(this)();\n return result;\n}\n\nexport async function resetPassword(form: Form<{\n email: string;\n code: string | number;\n new_password: string;\n}>): Promise<\"SUCCESS: New password has been set.\"> {\n\n await this.__connection;\n\n let params = validator.Params(form, {\n email: (v: string) => validator.Email(v),\n code: ['number', 'string'],\n new_password: (v: string) => validator.Password(v)\n }, ['email', 'code', 'new_password']);\n\n let code = params.code, new_password = params.new_password;\n\n if (typeof code === 'number') {\n code = code.toString();\n }\n\n return new Promise(async (res, rej) => {\n let cognitoUser = authentication.bind(this)().createCognitoUser(params.email).cognitoUser;\n\n cognitoUser.confirmPassword(code, new_password, {\n onSuccess: result => {\n res(\"SUCCESS: New password has been set.\");\n },\n onFailure: (err: any) => {\n rej(new SkapiError(err?.message || 'Failed to reset password.', { code: err?.code || 'ERROR', cause: err }));\n }\n });\n });\n}\n\nasync function verifyAttribute(attribute: string, form: Form<{ code: string; }>, options?: { template?: { verification?: string } }): Promise<string> {\n await this.__connection;\n let code: string;\n\n if (!cognitoUser) {\n throw new SkapiError('The user has to be logged in.', { code: 'INVALID_REQUEST' });\n }\n\n if (attribute === 'email' || attribute === 'phone_number') {\n if (!this.__user.hasOwnProperty(attribute)) {\n throw new SkapiError(`No ${attribute === 'email' ? 'e-mail' : 'phone number'} to verify`, { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user?.[`${attribute}_verified`]) {\n return `SUCCESS: \"${attribute}\" is verified.`;\n }\n\n code = (form ? validator.Params(form, {\n code: 'string'\n }) : {}).code || '';\n }\n else {\n return;\n }\n\n // Optional per-call template override for the verification e-mail.\n let clientMetadata: { [k: string]: string } | undefined;\n const verificationMid = options?.template?.verification;\n if (verificationMid !== undefined) {\n if (typeof verificationMid !== 'string' || !verificationMid) {\n throw new SkapiError('\"template.verification\" should be a non-empty <string> (template message_id).', { code: 'INVALID_PARAMETER' });\n }\n clientMetadata = { template_verification: verificationMid };\n }\n\n return new Promise((res, rej) => {\n let callback: any = {\n onSuccess: (result: any) => {\n if (code) {\n authentication.bind(this)().getSession({ refreshToken: true }).then(\n () => {\n if (this.__user) {\n this.__user[attribute + '_verified'] = true;\n }\n res(`SUCCESS: \"${attribute}\" is verified.`);\n }\n ).catch(err => {\n rej(err);\n });\n }\n\n else {\n res('SUCCESS: Verification code has been sent.');\n }\n },\n onFailure: (err: Record<string, any>) => {\n rej(\n new SkapiError(\n err.message || 'Failed to request verification code.',\n {\n code: err?.code\n }\n )\n );\n }\n };\n\n if (code) {\n cognitoUser?.verifyAttribute(attribute, code, callback);\n }\n else {\n callback.inputVerificationCode = null;\n cognitoUser?.getAttributeVerificationCode(attribute, callback, clientMetadata);\n }\n });\n}\n\nexport function verifyPhoneNumber(form?: Form<{ code: string; }>, options?: { template?: { verification?: string } }): Promise<string> {\n // 'SUCCESS: Verification code has been sent.' | 'SUCCESS: \"phone_number\" is verified.'\n return verifyAttribute.bind(this)('phone_number', form, options);\n}\n\nexport function verifyEmail(form?: Form<{ code: string; }>, options?: { template?: { verification?: string } }): Promise<string> {\n // 'SUCCESS: Verification code has been sent.' | 'SUCCESS: \"email\" is verified.'\n return verifyAttribute.bind(this)('email', form, options);\n}\n\nexport async function forgotPassword(\n form: Form<{\n /** Signin E-Mail. */\n email: string;\n }>,\n options?: {\n template?: {\n /** message_id of the template to use for the password-reset verification e-mail. */\n verification?: string;\n };\n }): Promise<\"SUCCESS: Verification code has been sent.\"> {\n\n await this.__connection;\n\n let params = validator.Params(form, {\n email: (v: string) => validator.Email(v)\n }, ['email']);\n\n let clientMetadata: { [k: string]: string } | undefined;\n const verificationMid = options?.template?.verification;\n if (verificationMid !== undefined) {\n if (typeof verificationMid !== 'string' || !verificationMid) {\n throw new SkapiError('\"template.verification\" should be a non-empty <string> (template message_id).', { code: 'INVALID_PARAMETER' });\n }\n clientMetadata = { template_verification: verificationMid };\n }\n\n return new Promise(async (res, rej) => {\n let cognitoUser = authentication.bind(this)().createCognitoUser(params.email).cognitoUser;\n cognitoUser.forgotPassword({\n onSuccess: result => {\n res(\"SUCCESS: Verification code has been sent.\");\n },\n onFailure: (err: any) => {\n // create SkapiError from err\n /*\n UserNotFoundException\tUser does not exist in the user pool\n InvalidParameterException\tInvalid parameter (e.g., missing required attribute)\n NotAuthorizedException\tUser is not authorized (e.g., user is disabled)\n LimitExceededException\tAttempt limit exceeded, try again later\n TooManyRequestsException\tToo many requests made to the API\n CodeDeliveryFailureException\tFailed to deliver the verification code (email/SMS issue)\n UnexpectedLambdaException\tUnexpected exception with Lambda trigger\n UserLambdaValidationException\tUser validation exception from Lambda trigger\n InvalidLambdaResponseException\tInvalid response from Lambda trigger\n InvalidSmsRoleAccessPolicyException\tInvalid SMS role access policy\n InvalidSmsRoleTrustRelationshipException\tInvalid SMS role trust relationship\n InvalidEmailRoleAccessPolicyException\tInvalid email role access policy\n ResourceNotFoundException\tResource not found (user pool doesn't exist)\n InternalErrorException\tInternal server error\n ForbiddenException\tWAF blocked the request\n */\n\n let { parsed, code } = cognitoErrorParser(err);\n\n let mappedCode = {\n UserNotFoundException: 'NOT_EXISTS',\n InvalidParameterException: 'INVALID_PARAMETER',\n NotAuthorizedException: 'INVALID_REQUEST',\n LimitExceededException: 'REQUEST_EXCEED',\n TooManyRequestsException: 'REQUEST_EXCEED',\n CodeDeliveryFailureException: 'CODE_DELIVERY_FAILURE'\n }[code] || parsed.code || code || 'ERROR';\n\n rej(new SkapiError(parsed.message, { code: mappedCode, cause: err }));\n }\n }, clientMetadata);\n });\n}\n\nexport async function changePassword(params: {\n new_password: string;\n current_password: string;\n}): Promise<'SUCCESS: Password has been changed.'> {\n await this.__connection;\n if (!this.session) {\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n\n let p = validator.Params(params, {\n 'current_password': 'string',\n 'new_password': 'string'\n });\n\n if (!p?.current_password) {\n throw new SkapiError('\"current_password\" is required to change password.', { code: 'INVALID_PARAMETER' });\n }\n\n if (!p?.new_password) {\n throw new SkapiError('\"new_password\" is required to change password.', { code: 'INVALID_PARAMETER' });\n }\n\n validator.Password(p.current_password);\n validator.Password(p.new_password);\n\n // Re-wrap the encryption master key for the new password BEFORE Cognito\n // changes it. Order is load-bearing: the keyring must never be left holding\n // only a wrap under a password that no longer exists. Both wraps are valid\n // in between, and unlock tries each in turn, so a crash here is survivable.\n if (encState.call(this)) {\n await rewrapForPasswordChange.bind(this)(p.current_password, p.new_password);\n }\n\n return new Promise((res, rej) => {\n cognitoUser.changePassword(\n p.current_password,\n p.new_password,\n (err: any, result: any) => {\n if (err) {\n if (err?.code === \"InvalidParameterException\") {\n rej(new SkapiError('Invalid password parameter.', { code: 'INVALID_PARAMETER' }));\n }\n else if (err?.code === \"NotAuthorizedException\") {\n rej(new SkapiError('Incorrect password.', { code: 'INVALID_REQUEST' }));\n }\n else if (err?.code === \"TooManyRequestsException\" || err?.code === \"LimitExceededException\") {\n rej(new SkapiError('Too many attempts. Please try again later.', { code: 'REQUEST_EXCEED' }));\n }\n else {\n let { parsed, code } = cognitoErrorParser(err);\n rej(parsed);\n }\n return;\n }\n\n // Now that the old password is gone, drop its wrap. Best\n // effort: a failure leaves a stale wrap that can still be\n // opened only by someone who already knows the old password.\n if (encState.call(this)) {\n pruneKeyringWraps.bind(this)().catch(e => this.log('encryption:prune:failed', e));\n }\n\n res('SUCCESS: Password has been changed.');\n });\n });\n}\n\nexport async function updateProfile(form: Form<UserAttributes>): Promise<UserProfile> {\n await this.__connection;\n if (!this.session) {\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n\n let params = validator.Params(form || {}, {\n user_id: (v: string) => validator.UserId(v),\n email: (v: string) => validator.Email(v),\n address: (v: any) => {\n if (!v) return '';\n\n if (typeof v === 'string') {\n return v;\n }\n\n if (typeof v === 'object') {\n return JSON.stringify(v);\n }\n\n return undefined;\n },\n name: 'string',\n gender: 'string',\n birthdate: (v: string) => v ? validator.Birthdate(v) : \"\",\n phone_number: (v: string) => v ? validator.PhoneNumber(v) : \"\",\n email_public: 'boolean',\n phone_number_public: 'boolean',\n address_public: 'boolean',\n gender_public: 'boolean',\n birthdate_public: 'boolean',\n misc: 'string',\n\n picture: (v: string) => v ? validator.Url(v) : \"\",\n profile: (v: string) => v ? validator.Url(v) : \"\",\n family_name: 'string',\n given_name: 'string',\n middle_name: 'string',\n nickname: 'string',\n website: (v: string) => v ? validator.Url(v) : \"\",\n });\n\n if (params && typeof params === 'object' && !Object.keys(params).length) {\n return this.user;\n }\n\n // set alternative signin email\n if (params.email) {\n params['preferred_username'] = this.service + '-' + MD5.hash(params.email);\n }\n\n let collision = [\n ['email_public', 'email_verified', \"User's e-mail should be verified to set\"],\n ['phone_number_public', 'phone_number_verified', \"User's phone number should be verified to set\"]\n ];\n\n if (this.__user) {\n for (let c of collision) {\n if (params[c[0]] && !this.__user[c[1]]) {\n throw new SkapiError(`${c[2]} \"${c[0]}\" to true.`, { code: 'INVALID_REQUEST' });\n }\n }\n }\n\n // delete unchanged values, convert key names to cognito attributes\n let toRemove = [];\n for (let k in params) {\n if (params[k] === this.user[k]) {\n toRemove.push(k);\n continue;\n }\n\n let customAttr = [\n 'email_public',\n 'phone_number_public',\n 'address_public',\n 'gender_public',\n 'birthdate_public',\n 'misc'\n ];\n\n if (customAttr.includes(k)) {\n let parseValue = params[k];\n\n if (typeof parseValue === 'boolean') {\n parseValue = parseValue ? '1' : '0';\n }\n\n params['custom:' + k] = parseValue;\n toRemove.push(k);\n }\n }\n\n for (let k of toRemove) {\n delete params[k];\n }\n\n if (params.user_id) {\n let user_id = params.user_id;\n if (user_id === this.user.user_id) {\n delete params.user_id;\n }\n else {\n return request.bind(this)('admin-edit-profile', { attributes: params }, { auth: true });\n }\n }\n\n if (params && typeof params === 'object' && Object.keys(params).length) {\n // format params to cognito attribute\n let toSet: Array<CognitoUserAttribute> = [];\n for (let key in params) {\n toSet.push(new CognitoUserAttribute({\n Name: key,\n Value: params[key]\n }));\n }\n\n await new Promise((res, rej) => {\n cognitoUser?.updateAttributes(\n toSet,\n (err: any, result: any) => {\n if (err) {\n rej(\n [\n err?.code || err?.name,\n err?.message || `Failed to update user settings.`\n ]\n );\n }\n res(result);\n });\n });\n\n await authentication.bind(this)().getSession({ refreshToken: true });\n return this.user;\n }\n\n return this.user;\n}\n\nexport async function getUsers(\n params?: {\n searchFor: string;\n value: string | number | boolean | string[];\n condition?: '>' | '>=' | '=' | '<' | '<=' | 'gt' | 'gte' | 'eq' | 'lt' | 'lte';\n range?: string | number | boolean;\n },\n fetchOptions?: FetchOptions): Promise<DatabaseResponse<UserPublic>> {\n\n params = extractFormData(params).data as any;\n\n if (!params) {\n // set default value\n params = {\n searchFor: 'timestamp',\n condition: '>',\n value: 0\n };\n\n if (!fetchOptions) {\n fetchOptions = {};\n }\n\n fetchOptions.ascending = false;\n }\n\n await this.__connection;\n\n const searchForTypes = {\n 'user_id': (v: string) => {\n if (Array.isArray(v)) {\n return v.map(id => validator.UserId(id));\n }\n return validator.UserId(v)\n },\n 'email': 'string',\n 'phone_number': 'string',\n 'locale': (v: string) => {\n if (typeof v !== 'string' || typeof v === 'string' && v.length > 5) {\n throw new SkapiError('Value of \"locale\" should be a country code.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n 'name': 'string',\n 'address': 'string',\n 'gender': 'string',\n 'birthdate': (v: string) => validator.Birthdate(v),\n 'subscribers': 'number',\n 'timestamp': 'number',\n 'access_group': 'number',\n 'approved': 'string'\n };\n\n let required = ['searchFor', 'value'];\n\n params = validator.Params(params, {\n searchFor: [\n 'user_id',\n 'name',\n 'email',\n 'phone_number',\n 'address',\n 'gender',\n 'birthdate',\n 'locale',\n 'subscribers',\n 'timestamp',\n 'access_group',\n 'approved'\n ],\n condition: ['>', '>=', '=', '<', '<=', 'gt', 'gte', 'eq', 'lt', 'lte', () => '='],\n value: (v: any) => {\n let checker = searchForTypes[params.searchFor];\n if (typeof checker === 'function') {\n return checker(v);\n }\n\n else if (typeof v !== checker) {\n throw new SkapiError(`Value does not match the type of \"${params.searchFor}\" index.`, { code: 'INVALID_PARAMETER' });\n }\n\n return v;\n },\n range: (v: any) => {\n let checker = searchForTypes[params.searchFor];\n if (typeof checker === 'function') {\n return checker(v);\n }\n\n else if (typeof v !== checker) {\n throw new SkapiError(`Range does not match the type of \"${params.searchFor}\" index.`, { code: 'INVALID_PARAMETER' });\n }\n\n return v;\n }\n }, required);\n\n if (params?.condition && params?.condition !== '=' && params.hasOwnProperty('range')) {\n throw new SkapiError('Conditions does not apply on range search.', { code: 'INVALID_PARAMETER' });\n }\n\n if (params.searchFor === 'user_id' && (params.condition !== '=' || params.range)) {\n throw new SkapiError(`Conditions are not allowed on \"${params.searchFor}\"`, { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof params?.value === 'string' && !params?.value) {\n throw new SkapiError('Value should not be an empty string.', { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof params?.searchFor === 'string' && !params?.searchFor) {\n throw new SkapiError('\"searchFor\" should not be an empty string.', { code: 'INVALID_PARAMETER' });\n }\n\n return request.bind(this)('get-users', params, { auth: true, fetchOptions });\n}\n\n/**\n * Not official. Bleeding edge.<br>\n * Retrieves, reverts e-mail to last verified email.<br>\n * @returns Last verified e-mail address, or updated userProfile when params.revert is true.\n */\nexport async function lastVerifiedEmail(params?: {\n /** Reverts to last verified e-mail when true. */\n revert: boolean;\n}): Promise<string | UserProfile> {\n await this.__connection;\n let res = await request.bind(this)('last-verified-email', params, { auth: true });\n if (res.includes('SUCCESS')) {\n await authentication.bind(this)().getSession({ refreshToken: true });\n return this.user;\n }\n return res;\n}\n\n/**\n * Not official. Bleeding edge.<br>\n * Requests username(e-mail) change.<br>\n * skapi server will send username change confirmation e-mail to user.<br>\n * Username will not be changed when the user did not confirm.<br>\n * Confirmation e-mail is valid within 24 hours.\n */\nexport async function requestUsernameChange(params: {\n /** Redirect URL when user clicks on the link. */\n redirect?: string;\n /** username(e-mail) user wish to change to. */\n username: string;\n}): Promise<'SUCCESS: confirmation e-mail has been sent.'> {\n await this.__connection;\n\n params = validator.Params(params, {\n username: validator.Email,\n redirect: validator.Url\n }, ['username']);\n\n return await request.bind(this)('request-username-change', params, { auth: true });\n}","\nimport SkapiError from '../main/error';\nimport { encState, maybeEncryptFile } from '../methods/encryption';\nimport { Form, FetchOptions, DatabaseResponse, ProgressCallback } from '../Types';\nimport validator from './validator';\nimport { MD5, generateRandom, extractFormData, isBrowserRuntime } from './utils';\n// import { authentication, getJwtToken } from '../methods/user';\nimport { getJwtToken } from '../methods/user';\nimport Qpass from \"qpass\";\n\nlet requestQueue = null;\nconst hasSubmitEvent = typeof SubmitEvent !== 'undefined';\nconst hasHTMLFormElement = typeof HTMLFormElement !== 'undefined';\nconst isBrowser = isBrowserRuntime();\n// Global counters for round-robin\nlet request_counter = 0;\n\nfunction getRetryDelayMs(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n if (Number.isFinite(seconds)) {\n return Math.max(0, seconds * 1000);\n }\n\n const dateMs = Date.parse(retryAfter);\n if (!Number.isNaN(dateMs)) {\n return Math.max(0, dateMs - Date.now());\n }\n\n return null;\n}\n\nfunction toPercent(loaded: number, total: number): number {\n return total > 0 ? (loaded / total) * 100 : 0;\n}\n\nlet selectGateway = (params: { auth: boolean, type: string, endpoints: {[key:string]: string}[], stable?: boolean }) => {\n const { auth, type, endpoints, stable } = params;\n\n const admin = endpoints[0];\n // {\n // \"admin_public\": \"https://nty2bxrol1.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"admin_private\": \"https://4250a1g3bd.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"admin_public_2\": \"https://of8ur90ix1.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"admin_private_2\": \"https://gge4qiyqv2.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"get_users_private\": \"https://eztrfvyq49.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"service_public\": \"https://pg695jr002.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"extra_public\": \"https://8zpb401kr3.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"extra_private\": \"https://o5vqmktoa4.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"extra_public_2\": \"https://u3c0pt5v7a.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"extra_private_2\": \"https://dr6glk4kz8.execute-api.eu-west-1.amazonaws.com/api/\",\n // \"userpool_id\": \"eu-west-1_vq4rt05un\",\n // \"userpool_client\": \"76uku0vqmkko2os1s8sh8dmpar\"\n // }\n const record = endpoints[1];\n // {\n // \"record_public\": \"https://9zxjxkrczi.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"record_private\": \"https://luvgxcgpwd.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"record_public_2\": \"https://ekhpyuchg6.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"record_private_2\": \"https://nprhgj1xkj.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"post_public\": \"https://cbzajunw33.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"post_private\": \"https://j51bbrnqb7.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"get_public\": \"https://nmnczc41wg.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"get_private\": \"https://0zpwltd5yh.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"del_private\": \"https://w7grra2h6k.execute-api.ap-northeast-1.amazonaws.com/api/\",\n // \"websocket_private\": \"wss://t47k8wdn19.execute-api.ap-northeast-1.amazonaws.com/api\"\n // }\n\n request_counter++;\n\n if (type === 'admin') {\n const gateways_admin_round_robin = Object.entries(admin)\n .filter(([k, v]) => k.includes(auth ? '_private' : '_public') && k !== 'get_users_private' && k !== 'service_public' && typeof v === 'string')\n .map(([, v]) => v);\n\n if (!gateways_admin_round_robin.length) {\n throw new SkapiError('No available admin gateways.', { code: 'INVALID_REQUEST' });\n }\n\n return gateways_admin_round_robin[request_counter % gateways_admin_round_robin.length];\n }\n if (type === 'record') {\n const gateways_record_round_robin = Object.entries(record)\n .filter(([k, v]) => k.includes(auth ? 'record_private' : 'record_public') && typeof v === 'string')\n .map(([, v]) => v);\n\n if (!gateways_record_round_robin.length) {\n throw new SkapiError('No available record gateways.', { code: 'INVALID_REQUEST' });\n }\n\n // A response the BROWSER is meant to cache has to come back from the same\n // host every time: the http cache is keyed by the whole url, so letting\n // the round robin alternate between record_private and record_private_2\n // gives the same file two cache entries holding two different signed\n // urls, and the file is downloaded once for each. Pinning costs this one\n // request its turn in the rotation and nothing else.\n if (stable) {\n return gateways_record_round_robin[0];\n }\n\n return gateways_record_round_robin[request_counter % gateways_record_round_robin.length];\n }\n\n throw new SkapiError('Invalid gateway type.', { code: 'INVALID_REQUEST' });\n}\n\nasync function getEndpoint(dest: string, auth: boolean, stableGateway?: boolean) {\n const endpoints = await Promise.all([\n this.admin_endpoint,\n this.record_endpoint\n ]);\n\n const admin = endpoints[0];\n const record = endpoints[1];\n\n let params = dest.split('?');\n let query = params.length > 1 ? '?' + params[1] : '';\n dest = params[0];\n\n switch (dest) {\n case 'get-users': ////\n return admin.get_users_private + dest + query;\n case 'service': ////\n return admin.service_public + dest + query;\n case 'get-newsletters':\n case 'get-public-newsletters':\n case 'subscribe-newsletter':\n case 'subscribe-public-newsletter':\n case 'signupkey':\n case 'admin-newsletter-request':\n case 'admin-signup':\n case 'confirm-signup':\n case 'openid-logger':\n case 'block-account':\n case 'admin-edit-profile':\n case 'remove-account':\n case 'post-secure':\n case 'recover-account':\n case 'mock':\n case 'grant-access':\n case 'last-verified-email':\n case 'ticket':\n case 'register-ticket':\n case 'get-newsletter-subscription':\n case 'request-username-change':\n case 'send-inquiry':\n case 'register-newsletter-group':\n case 'newsletter-group-endpoint':\n case 'invitation-list':\n case 'csr':\n case 'csr-poll':\n case 'csr-cancel':\n return selectGateway.bind(this)({ auth, type: 'admin', endpoints }) + dest + query;\n\n // Records\n case 'post-record': ////\n // Dedicated gateway api for post-record\n return (auth ? record.post_private : record.post_public) + dest + query;\n\n case 'get-records': ////\n // Dedicated gateway api for get-record\n return (auth ? record.get_private : record.get_public) + dest + query;\n\n case 'del-files': //\n case 'del-records': //\n // Dedicated gateway api for del-records and del-files\n return record.del_private + dest + query;\n case 'store-subscription':\n case 'get-vapid-public-key':\n case 'push-notification':\n case 'delete-subscription':\n case 'subscription':\n case 'get-subscription':\n case 'get-table':\n case 'get-tag':\n case 'get-uniqueid':\n case 'get-index':\n case 'get-signed-url':\n case 'extract-file-text':\n case 'grant-private-access':\n case 'request-private-access-key':\n case 'get-ws-group':\n case 'check-schema':\n case 'get-feed':\n // From viviplayground\n case 'castspell':\n case 'dopamine':\n case 'getspell':\n return selectGateway.bind(this)({ auth, type: 'record', endpoints, stable: stableGateway }) + dest + query;\n\n default:\n return validator.Url(dest) + query;\n }\n}\n\nconst __pendingRequest: Record<string, Promise<any>> = {};\n\nexport function terminatePendingRequests() {\n if (requestQueue) {\n requestQueue.terminate();\n requestQueue = null;\n }\n}\n\nexport async function request(\n url: string,\n data: Form<any> = null,\n options?: {\n fetchOptions?: FetchOptions;\n auth?: boolean;\n method?: string;\n bypassAwaitConnection?: boolean;\n responseType?: 'json' | 'blob' | 'text' | 'arrayBuffer' | 'formData' | 'document';\n contentType?: string;\n tokenHeaders?: {\n accessToken?: boolean | string;\n idToken?: boolean | string;\n };\n // Always resolve to the SAME gateway host instead of taking the next one\n // in the round robin. Only for a response the browser is meant to cache:\n // the http cache is keyed by the full url, so an alternating host would\n // silently halve the hit rate and duplicate whatever the response points\n // at. See selectGateway.\n stableGateway?: boolean;\n // Send `Cache-Control: no-cache`, so the browser revalidates this exact\n // url and OVERWRITES its stored response instead of adding a second entry\n // beside it. Pair with stableGateway when replacing a cached response.\n revalidate?: boolean;\n },\n _etc?: {\n ignoreService: boolean;\n }\n): Promise<any> {\n this.log('request', { url, data, options, _etc: _etc || {} });\n\n options = options || {};\n\n let {\n auth = false,\n method = 'post',\n bypassAwaitConnection = false,\n } = options;\n\n method = method.toUpperCase();\n\n let __connection = null;\n let service = data?.service || this.service;\n let owner = data?.owner || this.owner;\n let token = null; // idToken\n let endpoint = await getEndpoint.bind(this)(url, !!auth, !!options.stableGateway);\n\n if (!bypassAwaitConnection) {\n __connection = await this.__connection;\n if (!__connection) {\n throw new SkapiError('Invalid connection. The service could have been disabled, or has a restricted CORS.', { code: 'INVALID_REQUEST' });\n }\n }\n\n const wantsIdTokenHeader = options?.tokenHeaders?.idToken === true;\n\n if (auth || wantsIdTokenHeader) {\n token = await getJwtToken.bind(this)();\n }\n\n let fetchOptions = {}; // record fetch options\n let { fetchMore = false, progress } = options?.fetchOptions || {};\n\n if (options?.fetchOptions && Object.keys(options.fetchOptions).length) {\n for (let k of ['limit', 'startKey', 'ascending']) {\n if (options.fetchOptions.hasOwnProperty(k)) {\n if (k === 'startKey' && options.fetchOptions[k] === null) {\n continue;\n }\n fetchOptions[k] = options.fetchOptions[k];\n }\n }\n\n fetchOptions = validator.Params(\n fetchOptions,\n {\n limit: v => {\n if (typeof v !== 'number') {\n throw new SkapiError('Fetch limit should be a number.', { code: 'INVALID_REQUEST' });\n }\n if (v > 1000) {\n throw new SkapiError('Fetch limit should be below 1000.', { code: 'INVALID_REQUEST' });\n }\n return v;\n },\n startKey: v => v,\n ascending: 'boolean'\n }\n );\n }\n\n let required = _etc?.ignoreService ? {} : { service, owner };\n Object.assign(required, fetchOptions);\n\n data = extractFormData(data).data;\n\n if (!data) {\n // set data to required parameter\n data = required;\n }\n else if (data && typeof data === 'object') {\n // add required to data\n data = Object.assign(required, data);\n }\n\n let requestFingerprint = `${method}:${auth ? 'auth' : 'public'}:${url}`;\n\n let hashedParams = (() => {\n if (data && typeof data === 'object' && Object.keys(data).length && !(isBrowser && data instanceof FormData)) {\n // hash request parameters\n function sortObject(obj: Record<string, any>): Record<string, any> {\n if (typeof obj === 'object' && obj !== null) {\n return Object.keys(obj)\n .sort()\n .reduce((res, key) => {\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n // If the value is an object, sort it recursively\n res[key] = sortObject(obj[key]);\n } else {\n res[key] = obj[key];\n }\n return res;\n }, {});\n }\n return obj;\n };\n\n return MD5.hash(requestFingerprint + '/' + JSON.stringify(sortObject(data)));\n }\n\n return MD5.hash(requestFingerprint + '/' + service);\n })();\n\n let { requestKey, requestKeyWithStartKey } = load_startKey_keys.bind(this)({\n params: data,\n url,\n fetchMore,\n hashedParams\n }); // returns requrestKey | cached data\n\n if (!requestKey || requestKey && typeof requestKey === 'object') {\n // cached data can be falsy data or object\n return requestKey;\n }\n\n this.log('requestKey', requestKeyWithStartKey);\n\n // prevent duplicate request\n if (typeof requestKeyWithStartKey === 'string' && __pendingRequest[requestKeyWithStartKey] instanceof Promise) {\n this.log('request:returning pending', requestKeyWithStartKey);\n return __pendingRequest[requestKeyWithStartKey as string];\n }\n\n // new request\n let headers: Record<string, any> = {\n 'Accept': '*/*'\n };\n\n const hasCustomContentType = Object.prototype.hasOwnProperty.call(options, 'contentType') && options.contentType !== undefined;\n if (hasCustomContentType) {\n const configuredContentType = options.contentType === null ? 'application/x-www-form-urlencoded' : options.contentType;\n if (configuredContentType) {\n headers['Content-Type'] = configuredContentType;\n }\n }\n else if (isBrowser && !(data instanceof FormData)) {\n headers['Content-Type'] = 'application/json';\n }\n else {\n headers['Content-Type'] = 'application/json';\n }\n\n if (token) {\n headers.Authorization = token;\n }\n\n if (options?.tokenHeaders) {\n const resolveTokenValue = (configuredValue: boolean | string | undefined, fallbackValue: string | null) => {\n if (typeof configuredValue === 'string') {\n return configuredValue;\n }\n\n if (configuredValue === true) {\n return fallbackValue;\n }\n\n return null;\n };\n\n const accessToken = resolveTokenValue(options.tokenHeaders.accessToken, this.session?.accessToken?.jwtToken || null);\n const idToken = resolveTokenValue(options.tokenHeaders.idToken, this.bearerToken || this.session?.idToken?.jwtToken || token || null);\n\n if (accessToken) {\n headers['X-Access-Token'] = accessToken;\n }\n\n if (idToken) {\n headers['X-Id-Token'] = idToken;\n }\n }\n\n let meta = {\n public_identifier: this.__public_identifier,\n service,\n owner\n };\n\n headers['Content-Meta'] = JSON.stringify(meta);\n\n if (options.revalidate) {\n // Forces the browser to go to the origin for THIS url and to REPLACE what\n // it has stored under it. A cache-busting query parameter cannot do that:\n // it is a different url, so it creates a second entry and leaves the stale\n // one answering every later call until it expires on its own.\n headers['Cache-Control'] = 'no-cache';\n headers['Pragma'] = 'no-cache';\n }\n\n // if (headers['Content-Type'] !== 'application/json') {\n // // add service and owner to headers if content type is not json\n // headers['Content-Meta'] = JSON.stringify(meta);\n // }\n\n let opt: RequestInit & { responseType?: string | null, headers: Record<string, any>; } = { headers }; // request options\n if (options?.responseType) {\n opt.responseType = options.responseType;\n }\n\n if (method === 'GET') {\n if (data) {\n let query = [];\n if (isBrowser && data instanceof FormData) {\n query = Array.from(data.entries()).map(([k, value]) => {\n const stringValue = typeof value === 'string' ? value : value.name;\n return encodeURIComponent(k) + '=' + encodeURIComponent(stringValue);\n });\n }\n else {\n query = Object.keys(data)\n .map(k => {\n let value = data[k];\n if (typeof value !== 'string') {\n value = JSON.stringify(value);\n }\n return encodeURIComponent(k) + '=' + encodeURIComponent(value);\n });\n }\n\n if (query.length) {\n const separator = endpoint.includes('?')\n ? (endpoint.endsWith('?') || endpoint.endsWith('&') ? '' : '&')\n : '?';\n endpoint += separator + query.join('&');\n }\n }\n opt.body = null;\n }\n else {\n if (isBrowser && data instanceof FormData) {\n opt.body = data;\n }\n else if (headers['Content-Type'] === 'application/x-www-form-urlencoded' && data && typeof data === 'object') {\n const encoded = new URLSearchParams();\n for (let key of Object.keys(data)) {\n const value = data[key];\n encoded.append(key, typeof value === 'string' ? value : JSON.stringify(value));\n }\n opt.body = encoded.toString();\n }\n else if (typeof data === 'string') {\n opt.body = data;\n }\n else {\n opt.body = data ? JSON.stringify(data) : null;\n }\n }\n\n opt.method = method;\n\n if (requestQueue === null) {\n let config = {\n batchSize: this.requestBatchSize,\n breakWhenError: false,\n onProgress: (progress) => {\n // for(let key in __pendingRequest) {\n // delete __pendingRequest[key];\n // }\n this.onBatchProcess.forEach((cb) => cb(progress));\n }\n };\n\n requestQueue = new Qpass(config);\n }\n\n this.log('request-opt', opt);\n\n return new Promise((res, rej) => {\n requestQueue.add([async () => {\n let promise = _fetch.bind(this)(endpoint, opt, progress);\n __pendingRequest[requestKeyWithStartKey as string] = promise;\n\n try {\n let result = update_startKey_keys.bind(this)({\n hashedParam: requestKey,\n requestKeyWithStartKey,\n url,\n fetched: await promise\n });\n delete __pendingRequest[requestKeyWithStartKey];\n this.log('request:end', result);\n res(result);\n return result;\n }\n catch (err) {\n delete __pendingRequest[requestKeyWithStartKey];\n this.log('request:err', err);\n rej(err);\n throw err;\n }\n }]);\n });\n}\n\nfunction load_startKey_keys(option: {\n params: Record<string, any>;\n url: string;\n fetchMore: boolean;\n hashedParams: string;\n}): { requestKeyWithStartKey: string, requestKey: string | DatabaseResponse<any> } {\n let { params = {}, url, fetchMore = false, hashedParams } = option || {};\n\n if (params.startKey) {\n if (\n !(typeof params.startKey === 'object' && Object.keys(params.startKey).length) &&\n params.startKey !== 'start' && params.startKey !== 'end'\n ) {\n throw new SkapiError(`\"${params.startKey}\" is invalid startKey key.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (params.startKey === 'start') {\n // deletes referenced object key\n fetchMore = false;\n delete params.startKey;\n }\n }\n\n if (!fetchMore) {\n // init cache, init startKey\n\n if (this.__cached_requests?.[url]?.[hashedParams]) {\n // delete cached data start\n delete this.__cached_requests[url][hashedParams];\n }\n\n if (this.__startKeyHistory?.[url]?.[hashedParams]) {\n if (Array.isArray(this.__startKeyHistory[url][hashedParams]) && this.__startKeyHistory[url][hashedParams].length) {\n // delete cache of all startkeys\n for (let p of this.__startKeyHistory[url][hashedParams]) {\n let hashedParams_cached = hashedParams + MD5.hash(p);\n if (this.__cached_requests?.[url] && this.__cached_requests?.[url]?.[hashedParams_cached]) {\n delete this.__cached_requests[url][hashedParams_cached];\n }\n }\n }\n\n // delete start key lists\n delete this.__startKeyHistory[url][hashedParams];\n }\n\n return { requestKeyWithStartKey: hashedParams, requestKey: hashedParams };\n }\n\n if (!Array.isArray(this.__startKeyHistory?.[url]?.[hashedParams])) {\n // startkey does not exists\n return { requestKeyWithStartKey: hashedParams, requestKey: hashedParams };\n }\n\n // hashed params exists\n let list_of_startKeys = this.__startKeyHistory[url][hashedParams]; // [\"{<startKey key>}\", ...'end']\n let last_startKey_key = list_of_startKeys[list_of_startKeys.length - 1];\n let requestKeyWithStartKey = hashedParams;\n\n if (last_startKey_key) {\n // use last start key\n // requestKeyWithStartKey += MD5.hash(last_startKey_key);\n\n if (last_startKey_key === 'end') { // cached startKeys are stringified\n return {\n requestKey: {\n list: [],\n startKey: 'end',\n endOfList: true,\n startKeyHistory: list_of_startKeys\n },\n requestKeyWithStartKey\n }\n }\n\n // else {\n requestKeyWithStartKey += MD5.hash(last_startKey_key);\n params.startKey = JSON.parse(last_startKey_key);\n // }\n }\n\n if (this.__cached_requests?.[url]?.[requestKeyWithStartKey]) {\n // return data if there is cache\n return { requestKey: this.__cached_requests[url][requestKeyWithStartKey], requestKeyWithStartKey };\n }\n\n // return hashedParams;\n return { requestKeyWithStartKey, requestKey: hashedParams };\n}\n\n/**\n * Replace the data of any record that came back through the decryption layer\n * with null, so a form-action response can be persisted without writing\n * plaintext to disk. Identified by the `encrypted` marker normalizeRecord adds,\n * which is present only on records that actually went through it.\n */\nfunction stripDecrypted(response: any): any {\n const scrub = (r: any) => (r && typeof r === 'object' && r.encrypted)\n ? Object.assign({}, r, { data: null })\n : r;\n\n if (Array.isArray(response)) {\n return response.map(scrub);\n }\n if (response && typeof response === 'object') {\n if (Array.isArray(response.list)) {\n return Object.assign({}, response, { list: response.list.map(scrub) });\n }\n return scrub(response);\n }\n return response;\n}\n\nfunction _fetch(url: string, opt: any, progress?: ProgressCallback) {\n return new Promise(\n (res, rej) => {\n let xhr = new XMLHttpRequest();\n\n // 0: UNSENT - The request is not initialized.\n // 1: OPENED - The request has been set up.\n // 2: HEADERS_RECEIVED - The request has sent, and the headers and status are available.\n // 3: LOADING - The response's body is being received.\n // 4: DONE - The data transfer has been completed or an error has occurred during the \n\n // xhr.onreadystatechange = function () {\n // if (xhr.readyState === 4) { //if complete\n // if (xhr.status >= 200 || xhr.status <= 299) { //check if \"OK\" (200)\n // //success\n // } else {\n // rej(xhr.status); //otherwise, some other code was returned\n // }\n // }\n // };\n\n xhr.open(opt.method || 'GET', url);\n\n for (var k in opt.headers || {}) {\n xhr.setRequestHeader(k, opt.headers[k]);\n }\n\n if (opt.responseType) {\n xhr.responseType = opt.responseType;\n }\n\n xhr.onload = () => {\n if (xhr.status < 400) {\n // Status codes in the 2xx range mean success\n if (opt.responseType == 'json' || opt.responseType == 'blob') {\n res(xhr.response);\n }\n else {\n let result = xhr.responseText;\n try {\n result = JSON.parse(result);\n }\n catch (err) { }\n res(result);\n }\n }\n\n else if (xhr.status === 429) {\n // too many requests\n let retryAfter = xhr.getResponseHeader('Retry-After');\n let retryDelayMs = getRetryDelayMs(retryAfter);\n if (retryDelayMs !== null) {\n setTimeout(() => {\n _fetch(url, opt, progress).then(res, rej);\n }, retryDelayMs);\n }\n else {\n rej('Too many requests');\n }\n }\n\n else {\n // Status codes outside the 2xx range indicate errors\n let status = xhr.status;\n let errCode = [\n 'INVALID_CORS',\n 'INVALID_REQUEST',\n 'SERVICE_DISABLED',\n 'INVALID_PARAMETER',\n 'ERROR',\n 'EXISTS',\n 'NOT_EXISTS'\n ];\n\n let result: any = opt.responseType == 'blob' ? xhr.response : xhr.responseText;\n try {\n result = JSON.parse(result);\n }\n catch (err) { }\n \n if (typeof result === 'string') {\n let errMsg = result.split(':');\n let code = errMsg.splice(0, 1)[0].trim();\n let msg = errMsg.join(':').trim();\n rej(new SkapiError(msg || result, { code: (errCode.includes(code) ? code : 'ERROR') }));\n }\n\n else if (typeof result === 'object' && result?.message) {\n let code = (result?.code || (status ? status.toString() : null) || 'ERROR');\n let message = result.message;\n let cause = result?.cause;\n if (typeof message === 'string') {\n message = message.trim();\n }\n rej(new SkapiError(message, { cause, code }));\n }\n\n else {\n rej(result);\n }\n }\n };\n\n xhr.onerror = () => rej('Network error');\n xhr.onabort = () => rej('Aborted');\n xhr.ontimeout = () => rej('Timeout');\n\n if (typeof progress === 'function') {\n xhr.onprogress = (p: ProgressEvent) => {\n progress(\n {\n status: 'download',\n progress: toPercent(p.loaded, p.total),\n loaded: p.loaded,\n total: p.total,\n abort: () => xhr.abort()\n }\n );\n };\n if (xhr.upload) {\n xhr.upload.onprogress = (p: ProgressEvent) => {\n progress(\n {\n status: 'upload',\n progress: toPercent(p.loaded, p.total),\n loaded: p.loaded,\n total: p.total,\n abort: () => xhr.abort()\n }\n );\n };\n }\n }\n\n xhr.send(opt.body);\n }\n );\n}\n\nfunction update_startKey_keys(option: Record<string, any>) {\n let { hashedParam, requestKeyWithStartKey, url, fetched } = option;\n\n if (!fetched?.startKey) {\n // no startkey no caching\n return fetched;\n }\n\n // has start key\n // startkey is key for next fetch\n\n // this.__startKeyHistory[url] = {\n // [hashedParam]: ['{<startKey key>}', ...'end'],\n // ...\n // }\n\n // this.__cached_requests[url][hashsedParams + md5(JSON.stringify(startKey))] = {\n // data\n // ...\n // }\n\n if (!this.__startKeyHistory.hasOwnProperty(url)) {\n // create url key to store startKey key list if it doesnt exists\n this.__startKeyHistory[url] = {};\n }\n\n if (!this.__startKeyHistory[url].hasOwnProperty(hashedParam)) {\n this.__startKeyHistory[url][hashedParam] = [];\n }\n\n let startKey_string = fetched.startKey === 'end' ? 'end' : JSON.stringify(fetched.startKey);\n if (!this.__startKeyHistory[url][hashedParam].includes(startKey_string)) {\n this.__startKeyHistory[url][hashedParam].push(startKey_string);\n }\n\n // let hashedParamWithStartKey = hashedParam + MD5.hash(startKey_string);\n\n if (!this.__cached_requests?.[url]) {\n this.__cached_requests[url] = {};\n }\n // this.__cached_requests[url][hashedParamWithStartKey] = fetched;\n this.__cached_requests[url][requestKeyWithStartKey] = fetched;\n\n return Object.assign({ startKeyHistory: this.__startKeyHistory[url][hashedParam] }, fetched);\n}\n\nexport async function uploadFiles(\n fileList: FormData | HTMLFormElement | SubmitEvent,\n params: {\n record_id: string; // Record ID of a record to upload files to.\n progress?: ProgressCallback;\n }\n): Promise<{ completed: File[]; failed: File[]; bin_endpoints: string[] }> {\n await this.__connection;\n let { record_id, service = this.service, progress } = (params as { [key: string]: any })\n\n if (!record_id) {\n throw new SkapiError('\"record_id\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n if (hasSubmitEvent && fileList instanceof SubmitEvent) {\n fileList = (fileList.target as HTMLFormElement);\n }\n\n if (hasHTMLFormElement && fileList instanceof HTMLFormElement) {\n fileList = new FormData(fileList);\n }\n\n if (!isBrowser || !(fileList instanceof FormData)) {\n throw new SkapiError('\"fileList\" should be a FormData or HTMLFormElement.', { code: 'INVALID_PARAMETER' });\n }\n\n let reserved_key = generateRandom();\n\n let getSignedParams: Record<string, any> = {\n reserved_key,\n service,\n request: 'post'\n };\n\n if (params?.record_id) {\n getSignedParams.id = params.record_id;\n }\n\n let xhr;\n\n let fetchProgress = (\n url: string,\n body: FormData,\n progressCallback: (p: ProgressEvent) => void\n ) => {\n return new Promise((res, rej) => {\n xhr = new XMLHttpRequest();\n xhr.open('POST', url);\n xhr.onload = () => {\n let result = xhr.responseText;\n try {\n result = JSON.parse(result);\n }\n catch (err) { }\n if (xhr.status >= 200 && xhr.status < 300) {\n res(result);\n }\n else if (xhr.status === 429) {\n // too many requests\n let retryAfter = xhr.getResponseHeader('Retry-After');\n let retryDelayMs = getRetryDelayMs(retryAfter);\n if (retryDelayMs !== null) {\n setTimeout(() => {\n fetchProgress(url, body, progressCallback).then(res, rej);\n }, retryDelayMs);\n }\n else {\n rej('Too many requests');\n }\n }\n else {\n rej(result);\n }\n };\n xhr.onerror = () => rej('Network error');\n xhr.onabort = () => rej('Aborted');\n xhr.ontimeout = () => rej('Timeout');\n\n // xhr.addEventListener('error', rej);\n if (xhr.upload && typeof progressCallback === 'function') {\n xhr.upload.onprogress = progressCallback;\n }\n\n xhr.send(body);\n });\n };\n\n function toBase62(num: number) {\n const base62Chars = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n if (num === 0) return base62Chars[0];\n let result = '';\n while (num > 0) {\n result = base62Chars[num % 62] + result;\n num = Math.floor(num / 62);\n }\n return result;\n }\n\n let completed = [];\n let failed = [];\n let bin_endpoints = [];\n\n for (let [key, f] of (fileList as any).entries()) {\n if (!(f instanceof File)) {\n continue;\n }\n\n // Seal the bytes before they leave, when the record they attach to is\n // encrypted. Returns the file untouched otherwise, so the off path is\n // unchanged. `uploadKey` carries the __skenc__ marker and the PLAINTEXT\n // size; `sizeKey` must declare the CIPHERTEXT size, because that is what\n // the object actually weighs and what the backend bills.\n let sealed = await maybeEncryptFile.bind(this)(record_id, key, f);\n let uploadFile = sealed.file;\n let uploadKey = sealed.key;\n\n let signedParams = Object.assign({\n key: uploadKey + '/' + uploadFile.name,\n sizeKey: toBase62(uploadFile.size),\n contentType: uploadFile.type || null\n }, getSignedParams);\n\n let { fields = null, url, cdn } = await request.bind(this)('get-signed-url', signedParams, { auth: !!this.__user });\n bin_endpoints.push(cdn);\n \n let form = new FormData();\n for (let name in fields) {\n form.append(name, fields[name]);\n }\n\n form.append('file', uploadFile);\n\n try {\n await fetchProgress(\n url,\n form,\n typeof progress === 'function' ? (p: ProgressEvent) => progress(\n {\n status: 'upload',\n progress: toPercent(p.loaded, p.total),\n currentFile: f,\n completed,\n failed,\n loaded: p.loaded,\n total: p.total,\n abort: () => xhr.abort()\n }\n ) : null\n );\n completed.push(f);\n } catch (err) {\n failed.push(f);\n }\n }\n\n return { completed, failed, bin_endpoints };\n}\n\nconst pendPromise: Record<string, Promise<any> | null> = {};\n\nexport function formHandler(options?: { preventMultipleCalls: boolean; }) {\n let { preventMultipleCalls = false } = options || {};\n\n // wraps methods that requires form handling\n return function (target: object, propertyKey: string, descriptor: any) {\n const fn = descriptor.value;\n\n descriptor.value = function (...arg: any[]) {\n let form: Form<any> = arg[0];\n let storeResponseKey = true;\n let formEl = null;\n let actionDestination = '';\n let fileBase64String = {};\n let refreshPage = false;\n if (hasSubmitEvent && form instanceof SubmitEvent) {\n form.preventDefault();\n\n let currentUrl = window.location.href;\n formEl = form.target as HTMLFormElement;\n let href = new URL(formEl.action);\n actionDestination = href.href;\n\n // find {placeholder} in actionDestination url string and replace it with form data value\n // can be also used as image previewer\n let placeholders = actionDestination ? actionDestination.match(/(?<=\\{).*?(?=\\})/g) : '';\n if (placeholders) {\n for (let p of placeholders) {\n if (!p) {\n continue;\n }\n\n let inputElement = formEl.querySelector(`[name=\"${p}\"]`);\n\n // check if input element exists\n if (!inputElement) {\n continue;\n }\n\n // check if input element is a file input\n if (inputElement.type === 'file') {\n for (let i = 0; i <= inputElement.files.length - 1; i++) {\n if (!inputElement.files[i])\n continue;\n\n if (!fileBase64String[p]) {\n fileBase64String[p] = [];\n }\n\n fileBase64String[p].push(new Promise((res, rej) => {\n let reader = new FileReader();\n reader.onload = function () {\n res(reader.result);\n };\n reader.readAsDataURL(inputElement.files[i]);\n reader.onerror = rej;\n }));\n }\n }\n else {\n actionDestination = actionDestination.replace(`{${p}}`, inputElement.value);\n }\n }\n }\n\n if (formEl.getAttribute('action') === null) {\n storeResponseKey = false;\n }\n else {\n refreshPage = href.href === currentUrl;\n }\n }\n\n const handleResponse = async (response: any) => {\n if (actionDestination) {\n for (let k in fileBase64String) {\n if (fileBase64String[k].length) {\n actionDestination = actionDestination.replace(`{${k}}`, (await Promise.all(fileBase64String[k])).join(','));\n }\n }\n }\n\n if (formEl) {\n if (storeResponseKey) {\n // Never write a decrypted record to sessionStorage. When\n // client-side encryption is on, `response` here holds the\n // PLAINTEXT that maybeDecrypt just produced (or the\n // plaintext echo postRecord restores), so serializing it\n // would put the very data that was encrypted for the\n // database straight onto disk in the clear.\n let storable = encState.call(this) ? stripDecrypted(response) : response;\n window.sessionStorage.setItem(`${this.service}:${MD5.hash(actionDestination)}`, JSON.stringify(storable));\n if (refreshPage) {\n window.location.replace(actionDestination);\n }\n else {\n window.location.href = actionDestination;\n }\n }\n }\n\n return response;\n };\n\n let response: any;\n let handleError = (err: any) => {\n if (err instanceof SkapiError) {\n err.name = propertyKey + '()';\n }\n\n else {\n err = err instanceof Error ? err : new SkapiError(err, { name: propertyKey + '()' });\n }\n\n throw err;\n };\n\n const executeMethod = async () => {\n try {\n // execute\n response = fn.bind(this)(...arg);\n\n if (response instanceof Promise) {\n // handle promise\n let resolved = await response;\n return handleResponse(resolved);\n }\n\n return handleResponse(response);\n }\n catch (err) {\n throw handleError(err);\n }\n };\n\n if (preventMultipleCalls) {\n let pendingKey = `${propertyKey}:${this?.__public_identifier || ''}:${this?.service || ''}:${this?.owner || ''}`;\n\n if (!pendPromise?.[pendingKey]) {\n pendPromise[pendingKey] = executeMethod().finally(() => {\n delete pendPromise[pendingKey];\n });\n }\n\n return pendPromise[pendingKey];\n }\n\n return executeMethod();\n }\n }\n}\n\nexport async function getFormResponse(): Promise<any> {\n await this.__connection;\n let responseKey = `${this.service}:${MD5.hash(window.location.href.split('?')[0])}`;\n let stored = window.sessionStorage.getItem(responseKey);\n window.sessionStorage.removeItem(responseKey);\n\n if (stored !== null) {\n try {\n stored = JSON.parse(stored);\n } catch (err) { }\n\n return stored;\n }\n\n return null;\n};","import validator from '../utils/validator';\nimport { SkapiError } from '../Main';\n\n// 256 to match the platform (validate_table_name -> validate_key_segment, max_len=256). This was\n// 128, an SDK-only cap half the platform's, so a legal table name was refused before it left the\n// client. Like a tag, the name is escaped on the wire and the server measures the escaped form, so\n// validateStringByPolicy re-checks the length after escaping.\nconst MAX_TABLE_NAME_LENGTH = 256;\n// The backend allows 256 (validate_tag_value -> validate_key_segment, max_len=256). This was 64,\n// an SDK-only cap four times stricter than the platform, so a perfectly legal 100-character tag was\n// refused before it ever left the client. The backend measures the ENCODED form, and so do we: the\n// length is re-checked after / ! * # are escaped (each grows to 3 characters), which is the only way\n// a raw length can be compared against a limit the server applies to the escaped string.\nconst MAX_TAG_LENGTH = 256;\n// 256 to match the platform (validate_index_name -> validate_key_segment, max_len=256). Same\n// SDK-only under-cap as the table name, and same escaped-length re-check.\nconst MAX_INDEX_NAME_LENGTH = 256;\n// Already correct at 256 (validate_index_string_value, max_len=256). Note this one is NOT escaped:\n// the platform allows / ! * # in an index VALUE, unlike a name or a tag.\nconst MAX_INDEX_STRING_VALUE_LENGTH = 256;\nconst SENTINEL_CHAR = '\\u{10FFFF}';\nconst CONTROL_OR_SENTINEL_REGEX = /[\\u0000-\\u001F\\u007F]|\\u{10FFFF}/u;\n\nconst DELIMITER_ENCODING_MAP: Record<string, string> = {\n '/': '%2F',\n '!': '%21',\n '*': '%2A',\n '#': '%23',\n};\n\nconst DELIMITER_DECODING_MAP: Record<string, string> = {\n '%2F': '/',\n '%21': '!',\n '%2A': '*',\n '%23': '#',\n};\n\nfunction encodeReservedDelimiters(value: string) {\n // Escape '%' first so literal sequences like \"%2F\" remain distinguishable\n // from a real '/' after normalization.\n const escapedPercent = value.replace(/%/g, '%25');\n return escapedPercent.replace(/[\\/!*#]/g, (char) => DELIMITER_ENCODING_MAP[char] || char);\n}\n\nexport function decodeReservedDelimiters(value: string) {\n if (typeof value !== 'string') {\n return value as any;\n }\n\n // Reverse delimiter encoding first, then unescape '%25' so '%252F'\n // round-trips back to literal '%2F' instead of '/'.\n const delimitersDecoded = value.replace(/%(2F|21|2A|23)/gi, (match) => {\n const key = match.toUpperCase();\n return DELIMITER_DECODING_MAP[key] || match;\n });\n\n return delimitersDecoded.replace(/%25/gi, '%');\n}\n\nexport function validateStringByPolicy(\n value: any,\n fieldName: string,\n options: {\n onlyAlphanumeric?: boolean;\n allowEmpty?: boolean;\n maxLength?: number;\n blockKeyDelimiters?: boolean;\n disallowLeadingDollar?: boolean;\n } = {}\n) {\n const {\n allowEmpty = false,\n maxLength,\n blockKeyDelimiters = false,\n disallowLeadingDollar = false,\n onlyAlphanumeric = false\n } = options;\n\n if (typeof value !== 'string') {\n throw new SkapiError(`\"${fieldName}\" should be type: <string>.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (onlyAlphanumeric && /[^a-zA-Z0-9]/.test(value)) {\n throw new SkapiError(`\"${fieldName}\" should only contain alphanumeric characters.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (!allowEmpty && value.length === 0) {\n throw new SkapiError(`\"${fieldName}\" is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (maxLength && value.length > maxLength) {\n throw new SkapiError(`\"${fieldName}\" should be <= ${maxLength} characters.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (CONTROL_OR_SENTINEL_REGEX.test(value) || value.includes(SENTINEL_CHAR)) {\n throw new SkapiError(`\"${fieldName}\" cannot include control characters or unsupported sentinel characters.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (blockKeyDelimiters) {\n // Escape UNCONDITIONALLY. This used to run only when the value already contained a raw\n // delimiter, which made the round trip lossy: decodeReservedDelimiters has no such gate, so a\n // value carrying a percent-sequence but no raw delimiter went out untouched and came back\n // decoded. A tag written as \"a%2Fb\" read back as \"a/b\", and \"100%25off\" read back as\n // \"100%off\". A decoder cannot tell an escape it produced from one the caller typed, so the\n // only way to keep the two distinguishable is for the encoder to always run and always\n // escape '%' first. That is what the '%' -> '%25' pass in encodeReservedDelimiters is for;\n // under the old gate it was unreachable unless a delimiter happened to share the string.\n value = encodeReservedDelimiters(value);\n\n // Escaping expands the string (each of / ! * # becomes 3 characters, and a literal % becomes\n // %25), and the server measures what it receives. Re-check, so a value that only overflows\n // once escaped is refused here with a clear message instead of as an opaque server error.\n if (maxLength && value.length > maxLength) {\n throw new SkapiError(\n `\"${fieldName}\" should be <= ${maxLength} characters. \"/\", \"!\", \"*\", \"#\" and \"%\" count as 3 characters each.`,\n { code: 'INVALID_PARAMETER' }\n );\n }\n }\n\n if (disallowLeadingDollar && value.startsWith('$')) {\n throw new SkapiError(`\"${fieldName}\" cannot start with \"$\".`, { code: 'INVALID_PARAMETER' });\n }\n\n return value;\n}\n\n// \"allowEmpty\" exists for the QUERY side. A write must name a real table/tag/index, but a query uses\n// these same fields as filters, where an empty string paired with a condition is the established\n// \"scan everything\" idiom (skapi-mcp builds exactly that: table ' ' with condition '>').\ntype KeySegmentOptions = { allowEmpty?: boolean };\n\nexport function validateTableName(value: any, fieldName = 'table.name', options: KeySegmentOptions = {}) {\n return validateStringByPolicy(value, fieldName, {\n allowEmpty: options.allowEmpty === true,\n maxLength: MAX_TABLE_NAME_LENGTH,\n blockKeyDelimiters: true,\n });\n}\n\nexport function validateTag(value: any, fieldName = 'tag', options: KeySegmentOptions = {}) {\n return validateStringByPolicy(value, fieldName, {\n allowEmpty: options.allowEmpty === true,\n maxLength: MAX_TAG_LENGTH,\n blockKeyDelimiters: true,\n });\n}\n\nexport function validateCustomIndexName(value: any, fieldName = 'index.name', options: KeySegmentOptions = {}) {\n return validateStringByPolicy(value, fieldName, {\n allowEmpty: options.allowEmpty === true,\n maxLength: MAX_INDEX_NAME_LENGTH,\n blockKeyDelimiters: true,\n disallowLeadingDollar: true,\n });\n}\n\nexport function validateIndexStringValue(value: any, fieldName = 'index.value') {\n return validateStringByPolicy(value, fieldName, {\n allowEmpty: true,\n maxLength: MAX_INDEX_STRING_VALUE_LENGTH,\n });\n}\n\n// A \"nest\" query is one whose index.name ends in '.', addressing the children of a compound index.\n// There, index.value is NOT a value: the backend concatenates it onto the parent name to rebuild a\n// child index NAME segment. Names are escaped on write, so this has to be escaped too. Left raw, a\n// compound index like \"Band.Rock/Pop.year\" (stored as \"Band.Rock%2FPop.year\") could never be found\n// by the nest query meant to find it, because '%' sorts below '/' so the key falls outside the\n// range, and the reverse index used by the '<=' ends-with form mirrors the ESCAPED name.\nexport function isNestIndexName(name: any) {\n return typeof name === 'string' && name.slice(-1) === '.';\n}\n\nexport function validateNestIndexSegment(value: any, fieldName: string) {\n return validateStringByPolicy(value, fieldName, {\n allowEmpty: true,\n maxLength: MAX_INDEX_STRING_VALUE_LENGTH,\n blockKeyDelimiters: true,\n });\n}\n\nexport function recordIdOrUniqueId(query) {\n if (!query.record_id && !query.unique_id) {\n return null;\n }\n\n let outputObj: any = {};\n if (query?.service) {\n outputObj.service = query.service;\n }\n if (query?.owner) {\n outputObj.owner = query.owner;\n }\n if (query?.record_id) {\n outputObj.record_id = validateStringByPolicy(query.record_id, 'record_id', {\n allowEmpty: false,\n onlyAlphanumeric: true,\n });\n }\n else if (query?.unique_id) {\n outputObj.unique_id = query.unique_id;\n }\n\n return outputObj;\n}\n\nexport function accessGroup(v) {\n if (v === undefined) {\n return 0;\n }\n\n if (typeof v === 'number') {\n if (v > 99 || v < 0) {\n throw new SkapiError('\"table.access_group\" value should be within a range of 0 ~ 99.', { code: 'INVALID_REQUEST' });\n }\n }\n\n else if (typeof v === 'string') {\n v = {\n private: 'private',\n public: 0,\n authorized: 1,\n admin: 99\n }[v]\n\n if (v === undefined) {\n throw new SkapiError('\"table.access_group\" is invalid.', { code: 'INVALID_PARAMETER' });\n }\n }\n\n else {\n throw new SkapiError('\"table.access_group\" should be type: <number | string>.', { code: 'INVALID_PARAMETER' });\n }\n\n if (!this.__user && v) {\n throw new SkapiError('Unsigned users have no access to records with access group.', { code: 'INVALID_REQUEST' });\n }\n\n return v;\n}\n\nconst __index_number_range = 4503599627370496; // +/-\nexport function indexValue(v) {\n if (typeof v === 'number') {\n if (v > __index_number_range || v < -__index_number_range) {\n throw new SkapiError(`Number value should be within range -${__index_number_range} ~ +${__index_number_range}`, { code: 'INVALID_PARAMETER' });\n }\n return v;\n }\n\n if (typeof v === 'boolean') {\n return v;\n }\n\n if (typeof v === 'string') {\n return validateIndexStringValue(v, 'index.value');\n }\n\n throw new SkapiError(`\"index.value\" should be type: <number | boolean | string>.`, { code: 'INVALID_PARAMETER' });\n}\n\nexport function indexRange(v, query) {\n if (!query.index || !('value' in query.index)) {\n throw new SkapiError('\"index.value\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n if (query.index.name === '$record_id') {\n throw new SkapiError(`Cannot do \"index.range\" on ${query.index.name}`, { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof query.index.value !== typeof v) {\n throw new SkapiError('\"index.range\" type should match the type of \"index.value\".', { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof v === 'string') {\n // Same treatment as index.value: on a nest query the range bound is a child NAME segment.\n if (isNestIndexName(query.index.name)) {\n return validateNestIndexSegment(v, 'index.range');\n }\n return validateIndexStringValue(v, 'index.range');\n }\n\n return v;\n}\n","import {\n RecordData,\n Form,\n FetchOptions,\n DatabaseResponse,\n GetRecordQuery,\n Condition,\n PostRecordConfig,\n ProgressCallback,\n BinaryFile,\n FileInfo,\n DelRecordQuery,\n Table,\n Index,\n Tag,\n UniqueId\n} from '../Types';\nimport SkapiError from '../main/error';\nimport { encState, isEnvelope, maybeEncrypt, maybeDecrypt, addRecipients, dropRecipientsAndRoll, encryptedFileFromUrl, decryptFileBlob, parseFileMarker, bindRecordDek } from './encryption';\nimport { extractFormData, fromBase62, isBrowserRuntime } from '../utils/utils';\nimport validator from '../utils/validator';\nimport { request, uploadFiles } from '../utils/network';\nimport { checkAdmin } from './user';\nimport { authentication } from './user';\nimport { accessGroup, decodeReservedDelimiters, indexValue, recordIdOrUniqueId, validateCustomIndexName, validateTableName, validateTag, validateStringByPolicy, indexRange, isNestIndexName, validateNestIndexSegment } from './param_restrictions';\n\nconst pendingPrivateAccessKeyRequest: Record<string, Promise<string>> = {};\n\n/**\n * How long a private record file stays available locally: ONE WEEK.\n *\n * A private file cannot be served from the plain CDN url, so every read went out\n * over the network. The `?t=<idToken>` form it used could not help either: that\n * token rotates, so the url changed and the browser cache never matched. Reading\n * the same private image twice therefore downloaded it twice.\n *\n * These two numbers do different jobs:\n * - EXPIRES is how long the signed URL works. Short, so a leaked url dies fast.\n * - BROWSER_CACHE is how long the FILE stays usable locally.\n *\n * They used to be a week and twenty minutes, which reads as \"short url, long\n * local copy\" and is in fact a scheduled outage: get_signed_url stamped the mint\n * response with the week, so from minute 21 the browser answered every later mint\n * from its own store with a credential that was already dead, for the remaining\n * six days. That is what killed chat image previews on phones (which drop image\n * bodies and refetch) while desktops, still holding the bytes, never noticed.\n *\n * The server now refuses to grant a cache a url cannot back\n * (get_signed_url resolve_browser_cache caps at `expires` minus headroom), so the\n * real lever on local availability is EXPIRES, not BROWSER_CACHE. An hour buys\n * 55 minutes of reuse and is still short enough that a leaked url is not a\n * standing grant. Asking for the week is kept deliberately: it says what this\n * client would reuse if the url were stable by construction, and lets the server\n * be the one that decides.\n */\nconst PRIVATE_FILE_BROWSER_CACHE_SECONDS = 7 * 24 * 60 * 60;\nconst PRIVATE_FILE_URL_EXPIRES_SECONDS = 60 * 60;\n\n/**\n * Cache generation for the mint url, and the repair's window stamp.\n *\n * Mirrors bunnyquery/engine's previewMintCacheToken, which cannot be imported\n * here (the chat engine depends on this package, not the other way round). BUMP\n * THE GENERATION to abandon every mint response browsers are holding: generation\n * 2 retires the week-long entries written before 2026-08-11, which the server cap\n * cannot reach because they are already on the user's device.\n *\n * A query parameter, not a request header. `Cache-Control: no-cache` is not\n * CORS-safelisted and the record gateway's preflight does not allow it, so a mint\n * carrying it is refused by the browser before it is sent: the repair below never\n * ran at all, in any browser.\n */\nconst MINT_CACHE_GENERATION = 2;\n\nfunction mintCacheToken(expiresSeconds: number, refresh?: boolean): string {\n if (!refresh) return String(MINT_CACHE_GENERATION);\n // Same derivation as the chat client: one stamp per window, so a repair is one\n // extra cache entry per window rather than one per file per attempt, and the\n // window always closes before the url it carries can expire.\n let windowMs = Math.max(60, expiresSeconds - 5 * 60) * 1000;\n return MINT_CACHE_GENERATION + '.' + Math.floor(Date.now() / windowMs);\n}\n\n/**\n * Whether a signed url for this record file may be browser-cached.\n *\n * Reaching ANOTHER user's restricted file relies on a granted private access key,\n * which getFile appends as `&p=` to the token url. The mint request has no way to\n * carry that key, so those files must keep taking the token path: they stay\n * uncached rather than being handed a presign the caller is not entitled to.\n *\n * `splitPath` is the record file path:\n * auth|publ/service/owner/uploader/records/record/access_group/bin/ts/size/key/name\n */\nfunction canBrowserCacheRecordFile(splitPath: string[]): boolean {\n if (!this.user?.user_id) return false;\n let access_group = splitPath[6] === '**' ? '**' : parseInt(splitPath[6]);\n let user_access_group = this.user?.access_group ?? -1;\n if (this.user.user_id !== splitPath[3] && (access_group === '**' || user_access_group < access_group)) {\n return false;\n }\n return true;\n}\n\n// Read a getFile('blob') result to text across browser + node runtimes. Blob.text()\n// is used when present; otherwise FileReader (the same polyfilled reader getFile\n// uses for its base64 path) reads it.\n/**\n * Decode the stored form of a record's `data`, or return the value unchanged when there\n * is nothing to decode. Reference equality is the signal: `parseStoredData(v) !== v`\n * means it was decoded.\n *\n * Every payload is stored as its JSON text behind '!J%'. The other two forms are legacy\n * and read-only: '!D%{}' / '!L%[]' were written for an empty dict and an empty list, and\n * { __json__: text } was this codec's first form, live in five regions since 2026-08-22.\n * Text that carries the prefix but does not parse is an ordinary user value that merely\n * starts with it, so it comes back verbatim.\n *\n * The S3-offload marker is deliberately NOT handled here: resolving it needs the record's\n * bin urls and a network fetch, which only normalizeRecord can do.\n */\nexport function parseStoredData(r: any): any {\n if (typeof r === 'string') {\n if (r.startsWith('!J%')) {\n try {\n return JSON.parse(r.substring(3));\n }\n catch (err) {\n return r;\n }\n }\n if (r === '!D%{}') return {};\n if (r === '!L%[]') return [];\n return r;\n }\n\n if (r && typeof r === 'object' && !Array.isArray(r) &&\n typeof r.__json__ === 'string' && Object.keys(r).length === 1) {\n try {\n return JSON.parse(r.__json__);\n }\n catch (err) { }\n }\n\n return r;\n}\n\nasync function blobToText(blob: any): Promise<string> {\n if (typeof blob === 'string') {\n return blob;\n }\n if (blob && typeof blob.text === 'function') {\n return await blob.text();\n }\n return await new Promise<string>((resolve, reject) => {\n try {\n let fr = new FileReader();\n fr.onload = () => resolve(fr.result as string);\n fr.onerror = () => reject(fr.error || new Error('Failed to read blob'));\n fr.readAsText(blob);\n }\n catch (err) {\n reject(err);\n }\n });\n}\n\nexport async function normalizeRecord(record: Record<string, any>, _called_from?, _skipDataFetch = false, _skipDecrypt = false): Promise<RecordData> {\n // if (record?.rec) {\n // if (_called_from !== 'called from postRecord') {\n // let recPost = window.sessionStorage.getItem(`${this.service}:post:${record.rec}`);\n // if (recPost) {\n // try {\n // record = JSON.parse(recPost);\n // }\n // catch (err) { }\n // window.sessionStorage.removeItem(`${this.service}:post:${record.rec}`);\n // }\n // }\n // }\n const output: Record<string, any> = {\n user_id: '',\n record_id: '',\n updated: 0,\n uploaded: 0,\n readonly: false,\n table: {\n name: '',\n access_group: 0,\n subscription: {\n is_subscription_record: false,\n upload_to_feed: false,\n notify_subscribers: false,\n feed_referencing_records: false,\n notify_referencing_records: false\n }\n },\n referenced_count: 0,\n source: {\n referencing_limit: null,\n prevent_multiple_referencing: false,\n can_remove_referencing_records: false,\n only_granted_can_reference: false,\n },\n ip: '',\n bin: {}\n };\n let is_anonymous = false;\n // Raw CDN urls of any offloaded-\"data\" file (a __data__/__json__.json entry\n // in the record's bin). Collected while processing \"bin\" (which runs before\n // \"data\") and used by the \"data\" handler to fetch the payload back.\n let dataFileUrls: string[] = [];\n function access_group_set(v) {\n let access_group = v == '**' ? 'private' : parseInt(v);\n access_group = access_group == 0 ? 'public' : access_group == 1 ? 'authorized' : access_group == 99 ? 'admin' : access_group;\n return access_group;\n }\n const keys = {\n 'ip': (r: string) => {\n // Stored as \"<ip>[R]#<unique_id>\". Only the FIRST '#' is the delimiter —\n // the unique_id itself may contain '#' (e.g. a \"src::<path>\" id built\n // from a file path), so rejoin everything after it instead of taking\n // split[1], which silently truncated at the first '#' in the id.\n let split_ip = r.split('#');\n let ip = split_ip[0];\n if (split_ip.length > 1) {\n output.unique_id = split_ip.slice(1).join('#');\n }\n if (ip.slice(-1) === 'R') {\n output.readonly = true;\n ip = ip.slice(0, -1);\n }\n else {\n output.readonly = false;\n }\n // check if the format of the ip is 0-0-0-0, if it is, convert it to 0.0.0.0\n\n if (/^\\d{1,3}-\\d{1,3}-\\d{1,3}-\\d{1,3}$/.test(ip)) {\n ip = ip.split('-').join('.');\n is_anonymous = true;\n }\n\n output.ip = ip;\n },\n 'rec': (r: string) => {\n if (!r) return;\n output.record_id = r;\n let base62timestamp = r.substring(0, r.length - 9); // id: [base62 timestamp][random 5 char][suid 4 char]\n let uploaded = fromBase62(base62timestamp);\n output.uploaded = uploaded;\n },\n 'usr': (r: string) => {\n output.user_id = r;\n },\n 'tbl': (r: string) => {\n if (!r) return;\n // table/service/group(** | group)/[subscription(user id)/group(00 - 99)]/[tag]\n if (!output.table.name) {\n let rSplit = r.split('/');\n output.table.name = decodeReservedDelimiters(rSplit[0]);\n output.table.access_group = access_group_set(rSplit[2]);\n if (rSplit?.[3]) {\n output.table.subscription.is_subscription_record = true;\n }\n }\n },\n 'usr_tbl': (r: string) => {\n // user-id/table/service/group(** | group)[/subscription(user id)/group(00 - 99)][/tag]\n let rSplit = r.split('/');\n if (!output.user_id) {\n output.user_id = rSplit[0];\n }\n if (!output.table.name) {\n output.table.name = decodeReservedDelimiters(rSplit[1]);\n output.table.access_group = access_group_set(rSplit[3]);\n if (rSplit?.[4]) {\n output.table.subscription.is_subscription_record = true;\n }\n }\n },\n 'idx': (r: string) => {\n if (!r) return;\n let rSplit = r.split('!');\n let name = decodeReservedDelimiters(rSplit.splice(0, 1)[0]);\n // The VALUE is raw both directions and must NOT be decoded. The platform allows / ! * #\n // in an index value (validate_index_string_value passes no forbidden_chars), so the write\n // path sends it untouched; decoding on the way back turned a value written as \"a%2Fb\"\n // into \"a/b\". Escaping it instead is not an option: index values are compared\n // lexicographically for gt/lt/range queries, and \"%2F\" sorts nowhere near \"/\", so\n // escaping would silently change the result of every range query. Raw end to end is the\n // only lossless choice. A raw '!' inside the value is already safe, because the split\n // above takes only the first segment as the name and rejoins the remainder.\n let value = normalizeTypedString('!' + rSplit.join('!'));\n output.index = {\n name,\n value\n };\n },\n 'ref': (r: string) => {\n if (!r) return;\n output.reference = r.split('/')[0];\n },\n 'tags': (r: string[]) => {\n output.tags = Array.isArray(r) ? r.map((tag) => decodeReservedDelimiters(tag)) : r;\n },\n 'upd': (r: number) => {\n output.updated = r;\n },\n 'acpt_mrf': (r: boolean) => {\n output.source.prevent_multiple_referencing = !r;\n },\n 'ref_limt': (r: number) => {\n output.source.referencing_limit = r;\n },\n 'rfd': (r: number) => {\n output.referenced_count = r;\n },\n 'bin': async (r: string[]) => {\n let binObj: Record<string, any[]> = {};\n let _ref = output?.reference || null;\n if (Array.isArray(r)) {\n const parsedBin = await Promise.all(r.map(async (url) => {\n try {\n let path = url.split('/').slice(3).join('/');\n let splitPath = path.split('/');\n\n // Expected path format:\n // auth|publ/serviceid/ownerid/uploaderid/records/recordid/access_group/bin/timestamp/size/form_key/filename\n if (splitPath.length < 12) {\n return null;\n }\n\n // NOT decoded. Nothing ever percent-encodes these segments on the way out:\n // uploadFiles sends the key as `key + '/' + f.name` verbatim\n // (utils/network.ts), get_signed_url returns that raw string as the cdn url,\n // and the S3 notification stores unquote_plus of the event key, which is the\n // raw name again. So decodeURIComponent here had no matching encode and could\n // only corrupt: a file named \"100%off.pdf\" threw URIError, which the catch\n // below swallowed as null, silently dropping the file from record.bin\n // entirely; \"50%20off.pdf\" came back renamed to \"50 off.pdf\" while its own\n // .path still held the real name. getFile(url, { dataType: 'info' }) already\n // reads this segment raw, so this also makes the two agree.\n let filename = splitPath[splitPath.length - 1];\n let pathKey = splitPath[10];\n\n // Offloaded record \"data\" lives at .../bin/<ts>/<size>/__data__/__json__.json.\n // It is not a user binary: keep it out of the bin output and\n // hand its raw url to the \"data\" handler to fetch back.\n if (pathKey === '__data__' && filename === '__json__.json') {\n return { isDataFile: true, rawUrl: url };\n }\n\n // A sealed attachment: strip the marker so `path` and\n // the form key read naturally, and report the PLAINTEXT\n // size, which is the honest answer to \"how big is this\n // file\" and needs no round trip because the marker\n // carries it.\n let marked = parseFileMarker(pathKey);\n let size = splitPath[9];\n let uploaded = splitPath[8];\n let access_group = access_group_set(splitPath[6]);\n let url_endpoint = url;\n\n // A private file is read through a SIGNED url whose mint is\n // browser-cached for a week, so the same url keeps coming\n // back and the file downloads once instead of on every read.\n // Null when the file needs a granted private access key,\n // which the mint cannot carry: those keep the token url.\n let privateCache = access_group !== 'public' && canBrowserCacheRecordFile.call(this, splitPath)\n ? {\n expires: PRIVATE_FILE_URL_EXPIRES_SECONDS,\n browserCache: PRIVATE_FILE_BROWSER_CACHE_SECONDS,\n }\n : null;\n\n if (access_group !== 'public') {\n try {\n // Deliberately NOT the cached presign, even for a\n // file that could use one. `url` is the record's\n // public face: it is fed back into remove_bin and\n // deleteFiles, which rebuild the endpoint from this\n // string's host and require a cloudfront one\n // (post_record raises \"Invalid binary endpoint.\" on\n // an s3 host, and del_files accepts it and then\n // deletes nothing). It is also what the MCP server\n // hands to a model and what a dashboard renders, so\n // a presign here would leak the bucket and key and\n // rot wherever it was stored. Caching happens in\n // getFile below, where the url never escapes.\n url_endpoint = (await getFile.bind(this)(url, { dataType: 'endpoint', _ref }) as string);\n }\n catch (err) {\n console.error('Error getting signed url for private file:', err);\n // Keep the original CDN URL when signed endpoint resolution is unavailable.\n url_endpoint = url;\n }\n }\n\n let obj: Record<string, any> = {\n access_group,\n filename,\n url: url_endpoint,\n path,\n size: marked ? marked.plainSize : fromBase62(size),\n uploaded: fromBase62(uploaded),\n getFile: (dataType: 'base64' | 'download' | 'endpoint' | 'blob' | 'text' | 'info', progress?: ProgressCallback) => {\n let base = {\n dataType: dataType || 'download',\n progress,\n _ref,\n };\n let tokenPath = () => getFile.bind(this)(\n url_endpoint,\n Object.assign({}, base, { _update: obj }),\n );\n\n if (!privateCache) return tokenPath();\n\n // Mint from the RAW cdn url, not url_endpoint: the\n // latter already carries '?t=<token>', which getFile\n // would re-append to, and which is not the string\n // the record stores in its bin list.\n //\n // No `_update` here on purpose. _update writes the\n // resolved url back onto obj.url, and a presign\n // there is exactly what breaks remove_bin and\n // deleteFiles (see the resolution above).\n return getFile.bind(this)(url, Object.assign({}, base, privateCache))\n .catch(() => {\n // A file that reads fine today must not\n // become unreadable because the mint\n // refuses it. The mint enforces checks the\n // cdn edge does not (record existence, bin\n // membership, subscription access), and a\n // backend without browser_cache support\n // answers differently again. Any of those\n // falls back to the url that already works.\n return tokenPath();\n });\n }\n };\n\n if (marked) {\n // Set on the plain data, not only on the closure:\n // both dashboards `delete f.getFile` before cloning a\n // record into their pager, so a flag carried only on\n // the closure would be invisible to them, and they\n // render `url` straight into an <a href>.\n obj.encrypted = true;\n obj.stored_size = fromBase62(size);\n }\n\n // The bin is keyed by the caller's form key, so the\n // marker must not leak into it.\n return { pathKey: marked ? marked.key : pathKey, obj };\n }\n catch {\n return null;\n }\n }));\n\n for (let parsed of parsedBin) {\n if (!parsed) {\n continue;\n }\n\n if ((parsed as any).isDataFile) {\n // Kept out of the user-facing bin; the url was already\n // collected by the synchronous pre-scan above.\n continue;\n }\n\n if (binObj[parsed.pathKey]) {\n binObj[parsed.pathKey].push(parsed.obj);\n continue;\n }\n\n binObj[parsed.pathKey] = [parsed.obj];\n }\n }\n output.bin = binObj;\n },\n 'prv_acs': (r: { [key: string]: string }) => {\n for (let k in r) {\n let subscription_config = ['notify_subscribers', 'upload_to_feed', 'feed_referencing_records', 'notify_referencing_records'];\n if (subscription_config.includes(k)) {\n output.table.subscription[k] = r[k];\n }\n else if (k === 'referencing_index_restrictions' && Array.isArray(r[k])) {\n // The index NAME inside a restriction is escaped on write by\n // validateCustomIndexName, because the backend rejects a raw / ! * # in an index\n // name. It was the one escaped-on-write field with no decode on read, so a\n // restriction written for \"category/sub\" came back as \"category%2Fsub\" while\n // record.index.name for that same string came back decoded. Re-saving the record\n // then escaped it a second time (\"category%252Fsub\"), and the backend compares\n // the restriction name against the incoming index name, so referencing that\n // record started failing with \"Index value does not match the reference index\n // restriction\". The sibling value/range stay raw, matching the idx handler:\n // index VALUES are never escaped.\n output.source[k] = (r[k] as any[]).map((restriction: any) => {\n if (restriction && typeof restriction === 'object' && typeof restriction.name === 'string') {\n return Object.assign({}, restriction, { name: decodeReservedDelimiters(restriction.name) });\n }\n return restriction;\n });\n }\n else {\n output.source[k] = r[k];\n }\n }\n },\n 'data': async (r: any) => {\n // Captured BEFORE any await. The handlers that populate these\n // ('ip', 'rec', 'usr', 'tbl', 'usr_tbl') are synchronous and precede\n // 'data' in this object literal, so they have all run by the time\n // this body starts; after the first await, another record's\n // normalize could otherwise be interleaved.\n const encCtx = {\n access_group: output.table.access_group,\n table_name: output.table.name,\n user_id: output.user_id,\n record_id: output.record_id,\n unique_id: output.unique_id\n };\n\n // Open an encryption envelope, if this is one. Total: it never\n // throws, so one undecryptable record cannot fail a whole page.\n // Flags a payload the SDK could not read. Only meaningful while\n // encryption is on: with it off there is no grant/revoke crypto to\n // mislead, and adding the field would change the off path.\n const markUnavailable = () => {\n if (encState.call(this)) {\n output.encrypted = { status: 'failed', reason: 'DATA_UNAVAILABLE' };\n }\n };\n\n const finishData = async (v: any) => {\n if (_skipDecrypt) {\n return v;\n }\n // Runs even with encryption OFF, but only far enough to notice\n // an envelope: without this an instance that has the flag\n // disabled hands the raw ciphertext object to the app as if it\n // were the record's data. maybeDecrypt returns `v` untouched\n // for anything that is not an envelope, so the off path is\n // still a single cheap shape test.\n if (!encState.call(this) && !isEnvelope(v)) {\n return v;\n }\n let res = await maybeDecrypt.bind(this)(v, encCtx);\n if (res.flag) {\n output.encrypted = res.flag;\n }\n return res.value;\n };\n\n // The stored form, decoded (see parseStoredData). finishData runs OUTSIDE any\n // catch so a decryption failure surfaces exactly as it does for a natively\n // stored envelope at the bottom of this handler.\n const decoded = parseStoredData(r);\n if (decoded !== r) {\n output.data = await finishData(decoded);\n return;\n }\n\n // Offloaded data: stored as { __data__: \"<ts>/<size>/__data__/__json__.json\" },\n // the JSON itself living in the record's bin as that same file. Fetch\n // it back (all records in a getRecords batch resolve concurrently via\n // the Promise.all over normalizeRecord) and replace it in the data key.\n // The value must be exactly one key whose string ends with the\n // reserved suffix AND a matching bin file must exist; otherwise it is\n // an ordinary user value that merely looks like a marker, so fall\n // through and return it verbatim.\n if (\n r && typeof r === 'object' && !Array.isArray(r) &&\n typeof r.__data__ === 'string' && Object.keys(r).length === 1 &&\n r.__data__.endsWith('/__data__/__json__.json')\n ) {\n let markerPath = r.__data__;\n let rawUrl = dataFileUrls.find(u => u.endsWith(markerPath)) || null;\n if (!rawUrl && !_skipDataFetch) {\n // A marker whose bin file is missing entirely. Same\n // reasoning as the fetch failure below: the payload is\n // unreadable, so it must not read as an ordinary value.\n markUnavailable();\n }\n if (rawUrl) {\n if (_skipDataFetch) {\n // postRecord/bulkPostRecords already hold the posted value\n // and restore it, so skip re-downloading what was just sent.\n output.data = r;\n return;\n }\n\n try {\n // Fetch as a blob, not 'text': getFile('text') routes the\n // body through request()'s response post-processing, which\n // both JSON.parses it (a second parse here would corrupt a\n // JSON-shaped string) and, if the decoded object has a\n // truthy top-level `startKey`, mangles it as a paginated\n // response. A blob passes through untouched, so we decode\n // and JSON.parse the raw body exactly once — the exact\n // inverse of the server's json.dumps for every value type.\n let blob = await getFile.bind(this)(rawUrl, { dataType: 'blob', _ref: output.reference || null });\n let text = await blobToText(blob);\n // Parsed ONCE, and never run through the __json__ decode above. The\n // offloaded file always holds the original payload (post_record\n // offloads decode_record_data(...) precisely so it does), which means\n // a file whose contents ARE { __json__: \"...\" } is a caller who really\n // stored that shape. Decoding again here would unwrap their data.\n output.data = await finishData(JSON.parse(text));\n }\n catch (err) {\n console.error('Failed to fetch offloaded record data:', err);\n output.data = null;\n // The payload could not be read, so whether it was\n // encrypted is UNKNOWABLE. Say so. Leaving no flag made\n // this indistinguishable from a record whose data is\n // genuinely null, and encryption.ts read that absence as\n // \"plaintext record\": a grant then created an ACL row\n // with no key wrap, and a revoke silently skipped the\n // key roll while reporting success.\n markUnavailable();\n }\n return;\n }\n }\n\n output.data = await finishData(r);\n }\n };\n\n if (record.record_id) {\n // bypass already normalized records\n return record as RecordData;\n }\n\n // Pre-scan the raw bin synchronously so the async \"data\" handler can resolve\n // the offloaded-data file url immediately. The handler loop below starts every\n // handler before awaiting any of them (collect-then-Promise.all), so the \"data\"\n // handler's synchronous lookup cannot rely on the \"bin\" handler having run yet.\n if (Array.isArray(record.bin)) {\n for (let url of record.bin) {\n try {\n if (typeof url !== 'string') continue;\n let sp = url.split('/').slice(3);\n // Raw, matching the \"bin\" handler: these segments are never percent-encoded, and\n // decoding threw URIError on any filename holding a bare '%'.\n if (sp.length >= 12 && sp[10] === '__data__' && sp[sp.length - 1] === '__json__.json') {\n dataFileUrls.push(url);\n }\n }\n catch { }\n }\n }\n\n let toWait = []\n for (let k in keys) {\n if (record.hasOwnProperty(k)) {\n let exec = keys[k](record[k]);\n if (exec instanceof Promise) {\n toWait.push(exec);\n }\n }\n }\n\n if (is_anonymous) {\n output.user_id = 'anonymous:' + output.user_id;\n }\n await Promise.all(toWait);\n return output as RecordData;\n}\n\nfunction normalizeTypedString(v: string) {\n let value = v.substring(3);\n let type = v.substring(0, 3);\n\n switch (type) {\n case \"!S%\":\n // !S%string\n return value;\n case \"!N%\":\n // !N%0\n let splitDec = value.split('.');\n let calcNumb = Number(splitDec[0]) - 4503599627370496;\n if (splitDec.length === 1) {\n return calcNumb;\n }\n return parseFloat(calcNumb.toString() + '.' + splitDec[1]);\n case \"!B%\":\n // !B%1\n return value === '1';\n case \"!L%\":\n case \"!D%\":\n // Read-only: an index value is a scalar (str | int | bool | float) on both the\n // write and the query schema, so to_typed_string no longer has a dict or list\n // branch and neither prefix can be produced for an index. Kept for any index\n // written by an older version.\n try {\n return JSON.parse(value);\n } catch (err) {\n throw new SkapiError('Value parse error.', { code: 'PARSE_ERROR' });\n }\n default:\n return v;\n }\n}\n\nexport async function deleteFiles(params: {\n endpoints: string | string[], // file endpoints\n}): Promise<RecordData[]> {\n let { endpoints } = params;\n\n if (typeof endpoints === 'string') {\n endpoints = [endpoints];\n }\n\n if (!Array.isArray(endpoints)) {\n throw new SkapiError('\"endpoints\" should be type: array | string.', { code: 'INVALID_PARAMETER' });\n }\n\n let updatedRec = await request.bind(this)('del-files', {\n endpoints,\n storage: 'records'\n }, { auth: true, method: 'post' });\n\n let to_process = [];\n for (let i in updatedRec) {\n to_process.push(normalizeRecord.bind(this)(updatedRec[i]));\n }\n\n return Promise.all(to_process);\n}\n\nexport async function getFile(\n url: string, // cdn endpoint url https://xxxx.cloudfront.net/path/file\n config?: {\n dataType?: 'base64' | 'download' | 'endpoint' | 'blob' | 'text' | 'info'; // default 'download'\n expires?: number; // uses url that expires in given seconds. this option does not use the cdn (slow). can be used for private files. (does not work on public files).\n // Seconds the browser may reuse the signed url minted for `expires`.\n //\n // Without it, every call mints a brand new SigV4 url, so the browser\n // cache can never be hit and the file downloads again every time even\n // though nothing changed. With it, the MINT REQUEST is answered from the\n // browser cache and the same url comes back, so the already-downloaded\n // body stays addressable. The url's own lifetime is still `expires`: what\n // keeps the file available past that is the cached body, not the url.\n //\n // Only meaningful together with `expires`, and capped at 1 week\n // server-side. Private record files in `record.bin` set it to a week for\n // you; this is for files you fetch by url yourself.\n browserCache?: number;\n // Bypass the cached mint above and force a fresh signed url. Use it when\n // the file may have changed, or after a load failed because the cached\n // url had expired and the body was no longer in the cache.\n refresh?: boolean;\n progress?: ProgressCallback;\n _ref?: string;\n _update?: any;\n }\n): Promise<Blob | string | void | FileInfo> {\n if (typeof url !== 'string') {\n throw new SkapiError('\"url\" should be type: string.', { code: 'INVALID_PARAMETER' });\n }\n\n // `url` is reassigned below (query string, then the minted signed url). The\n // retry at the end has to start over from what the caller actually passed.\n const requestedUrl = url;\n\n let splitQuery = url.split('?');\n let baseUrl = splitQuery.shift() || '';\n let queryString = splitQuery.length ? '?' + splitQuery.join('?') : '';\n\n let validatedBaseUrl = validator.Url(baseUrl);\n url = validatedBaseUrl + queryString;\n\n let isValidEndpoint = false;\n let splitUrl = validatedBaseUrl.split('/');\n let host = splitUrl[2];\n let splitHost = host.split('.');\n let subdomain = null;\n\n if (splitHost.length === 3 && splitHost[1] === 'skapi') {\n subdomain = splitHost[0];\n isValidEndpoint = true;\n }\n\n let target_key = splitUrl.slice(3);\n let needAuth = false;\n if (!isValidEndpoint) {\n if (target_key[0] === 'auth' || target_key[0] === 'publ') {\n try {\n validator.UserId(target_key[2]);\n validator.UserId(target_key[3]);\n needAuth = target_key[0] == 'auth';\n isValidEndpoint = true;\n }\n catch {\n throw new SkapiError('Invalid file url.', { code: 'INVALID_PARAMETER' });\n }\n }\n }\n\n let service = subdomain ? null : target_key[1];\n\n config = validator.Params<NonNullable<typeof config>>(config, {\n expires: ['number', () => 0],\n browserCache: ['number', () => 0],\n refresh: ['boolean', () => false],\n dataType: ['base64', 'blob', 'endpoint', 'text', 'info', () => 'download'],\n progress: ['function', 'undefined', null],\n _ref: [null, 'string'],\n _update: v => v\n });\n\n\n if (config?.dataType === 'info') {\n // auth(publ)/service-id/owner-id/user-id/records/rec-id/**/file(bin)/sizetag/filename\n return {\n url,\n filename: target_key[target_key.length - 1],\n fileKey: target_key[target_key.length - 2],\n access_group: target_key[6] === '**' ? 'private' : target_key[6] === '01' ? 'authorized' : target_key[6] === '00' ? 'public' : parseInt(target_key[6]),\n uploader: target_key[3],\n record_id: target_key[4] === 'records' ? target_key[5] : 'N/A',\n filesize: fromBase62(target_key[9]),\n uploaded: fromBase62(target_key[8]),\n }\n }\n\n let filename = url.split('/').slice(-1)[0];\n\n // if ((config?.dataType === 'blob' || config?.dataType === 'base64') && needAuth) {\n // // when downloading blob, use signed url\n // config.expires = 60;\n // }\n\n let expires = config.expires;\n if (expires) {\n if (!isValidEndpoint) {\n throw new SkapiError('Expires option can only be used on skapi cdn endpoints.', { code: 'INVALID_PARAMETER' });\n }\n\n if (expires < 0) {\n throw new SkapiError('\"config.expires\" should be > 0. (seconds)', { code: 'INVALID_PARAMETER' });\n }\n\n let params: Record<string, any> = {\n request: subdomain ? 'get-host' : 'get',\n id: subdomain || target_key[5],\n // The RAW url the caller passed, minus any query string, NOT the\n // validator-normalized one. The server authorizes this by testing\n // `key in record.bin`, an exact string compare against urls stored\n // fully decoded (s3_notification unquote_plus). validator.Url runs\n // `new URL().href`, which percent-encodes: a private file called\n // \"my photo.jpg\" or \"한글.jpg\" arrived as \"my%20photo.jpg\" /\n // \"%ED%95%9C%EA%B8%80.jpg\", matched nothing, and the mint failed with\n // \"File does not exists.\" The query is dropped because a stored bin\n // url never has one, and a '?t=' token would never match either.\n key: requestedUrl.split('?')[0],\n expires\n }\n\n if (service) {\n params.service = service\n }\n\n // A cacheable mint has to be a GET: a POST response is not stored by any\n // browser cache, so the same signed url could never come back without a\n // round trip and the file would re-download every time.\n let browserCache = config.browserCache;\n let mintOptions: Record<string, any> = { auth: true };\n\n if (browserCache) {\n if (browserCache < 0) {\n throw new SkapiError('\"config.browserCache\" should be > 0. (seconds)', { code: 'INVALID_PARAMETER' });\n }\n\n mintOptions.method = 'get';\n // One host for every mint of this file. The gateway is otherwise\n // picked round robin, and the browser caches by full url, so\n // alternating hosts would hold two entries with two different signed\n // urls and download the file once for each.\n mintOptions.stableGateway = true;\n params.browser_cache = browserCache;\n\n // Partitions the browser cache per user. A cache is keyed by url\n // alone and shared by everyone using that browser profile, so\n // without this a second user signing in would be served the first\n // user's signed urls. The backend rejects a uid that is not the\n // caller, so a stale value fails loudly instead of silently.\n let uid = this.session?.idToken?.payload?.sub || this.user?.user_id;\n if (uid) {\n params.uid = uid;\n }\n\n // Cache generation, plus a window stamp when this is a repair. NOT\n // `revalidate`: that sends Cache-Control: no-cache as a REQUEST\n // header, which the gateway's CORS preflight does not allow, so the\n // browser refused to send the repair at all and the read fell back to\n // the token path every time. The objection to the old `nocache=<ts>`\n // form was that a per-call timestamp made a new cache key on every\n // attempt and left the poisoned entry answering ordinary reads; a\n // generation plus a window fixes both halves of that.\n params.nocache = mintCacheToken(expires, config.refresh);\n }\n\n url = (await request.bind(this)('get-signed-url', params,\n mintOptions\n )).url;\n }\n\n else if (needAuth) {\n let currTime = Math.floor(Date.now() / 1000);\n\n if (!this.bearerToken && (!this.session?.idToken?.payload?.exp || this.session.idToken.payload.exp < currTime)) {\n this.log('getFile:requesting new token', null);\n try {\n await authentication.bind(this)().getSession({ refreshToken: true });\n this.log('getFile:received new tokens', {\n exp: this.session?.idToken?.payload?.exp,\n currTime,\n expiresIn: this.session?.idToken?.payload?.exp - currTime,\n token: this.session?.accessToken?.jwtToken,\n refreshToken: this.session?.refreshToken?.token\n });\n }\n catch (err) {\n this.log('getFile:new token error', err);\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n }\n\n let token = this.bearerToken || this.session?.idToken?.jwtToken; // idToken\n\n if (!token || !this.user?.user_id) {\n throw new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n }\n\n url += `${url.includes('?') ? '&' : '?'}t=${encodeURIComponent(token)}`;\n\n let access_group = target_key[6] === '**' ? '**' : parseInt(target_key[6]);\n let user_access_group = this.user?.access_group ?? -1;\n\n if (this.user.user_id !== target_key[3] && (access_group === '**' || user_access_group < access_group)) {\n let record_id = target_key[5];\n if (this.__private_access_key[record_id] && typeof this.__private_access_key[record_id] === 'string') {\n url += `&p=${encodeURIComponent(this.__private_access_key[record_id])}`;\n }\n else if (this.owner !== this.host) {\n try {\n let p = await this.requestPrivateRecordAccessKey({ record_id, reference_id: config?._ref });\n url += `&p=${encodeURIComponent(p)}`;\n } catch (err) { }\n }\n }\n }\n\n // An encrypted attachment cannot be served straight to the browser: every\n // dataType that yields BYTES has to fetch, decrypt, and only then produce\n // its result. 'download' is the dangerous one, because it is the DEFAULT and\n // today it never touches JS at all: left alone it would save ciphertext to\n // disk under the plaintext filename with no error.\n let encInfo = encState.call(this) ? encryptedFileFromUrl(url) : null;\n if (encInfo && config?.dataType !== 'endpoint' && config?.dataType !== 'info') {\n let raw = await request.bind(this)(\n url, null,\n { method: 'get', contentType: null, responseType: 'blob', fetchOptions: { progress: config?.progress } },\n { ignoreService: true }\n );\n let opened = await decryptFileBlob.bind(this)(url, raw);\n\n if (config?.dataType === 'blob') {\n return opened as any;\n }\n if (config?.dataType === 'text') {\n // Fetched as a BLOB above and decoded here. Never responseType\n // 'text': that decodes the body as text before any key is consulted,\n // which mangles arbitrary ciphertext bytes irrecoverably.\n return await blobToText(opened) as any;\n }\n if (config?.dataType === 'base64') {\n return await new Promise((res, rej) => {\n const reader = new FileReader();\n reader.onloadend = () => res(reader.result as string);\n reader.onerror = () => rej(reader.error);\n reader.readAsDataURL(opened);\n }) as any;\n }\n\n // 'download': hand the browser the DECRYPTED bytes via an object url.\n let objUrl = URL.createObjectURL(opened);\n let a = document.createElement('a');\n a.href = objUrl;\n document.body.appendChild(a);\n a.setAttribute('download', filename);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(objUrl), 60000);\n return null;\n }\n\n if (config?.dataType === 'endpoint') {\n if (config._update) {\n // updates the url in the record (when called from the record bin object)\n config._update.url = url;\n }\n return url;\n }\n\n if (config?.dataType === 'download') {\n let a = document.createElement('a');\n // Set the href attribute to the file URL\n a.href = url;\n document.body.appendChild(a);\n a.setAttribute('download', filename);\n a.target = '_blank';\n a.click();\n document.body.removeChild(a);\n return null;\n }\n\n let blob: Promise<Blob | string> = new Promise(async (res, rej) => {\n try {\n let b = await request.bind(this)(\n url,\n null,\n { method: 'get', contentType: null, responseType: config?.dataType === 'text' ? 'text' : 'blob', fetchOptions: { progress: config?.progress } },\n { ignoreService: true }\n );\n if (config?.dataType === 'base64') {\n const reader = new FileReader();\n reader.onloadend = () => res((reader.result as string));\n reader.readAsDataURL(b);\n }\n else {\n res(b);\n }\n } catch (err) {\n // The expected failure of a cached mint: the browser answered from\n // its cache with a url whose signature has since expired, and the\n // file it points at is no longer in the cache either, so the fetch\n // 403s on a url the caller never chose. Re-mint once, bypassing the\n // cache. Only when we actually used the cache, and never twice.\n if (config?.browserCache && !config?.refresh) {\n try {\n res(await getFile.bind(this)(\n requestedUrl,\n Object.assign({}, config, { refresh: true }),\n ) as Blob | string);\n return;\n }\n catch (retryErr) {\n rej(retryErr);\n return;\n }\n }\n rej(err);\n }\n });\n\n return blob;\n}\n\n/**\n * Scope key for the unique_id -> record_id cache.\n *\n * Every database call may target a service OTHER than the instance's own: callers pass\n * `service`/`owner` per call (the MCP server keeps one Skapi instance per user and names\n * a different project on each call), falling back to the instance's own pair. So the\n * cache must be keyed by the service the call is actually for. Keying it by `this.service`\n * is just as wrong as not keying it at all, because `this.service` is frequently not the\n * service being written to.\n */\nfunction cacheScope(service?: string, owner?: string): string {\n return `${service || this.service}/${owner || this.owner}`;\n}\n\nfunction getScopedUniqueId(scope: string, unique_id: string): string | undefined {\n let bucket = this.__my_unique_ids[scope];\n return bucket ? bucket[unique_id] : undefined;\n}\n\nfunction setScopedUniqueId(scope: string, unique_id: string, record_id: string): void {\n if (!this.__my_unique_ids[scope]) {\n this.__my_unique_ids[scope] = {};\n }\n this.__my_unique_ids[scope][unique_id] = record_id;\n}\n\nfunction deleteScopedUniqueId(scope: string, unique_id: string): void {\n if (this.__my_unique_ids[scope]) {\n delete this.__my_unique_ids[scope][unique_id];\n }\n}\n\nasync function getQuery(query, isDel = false) {\n query = extractFormData(query, { ignoreEmpty: true }).data || {};\n\n // Captured before any mutation of `query`: the caller may name the target project,\n // and the cache lookup below must be confined to it.\n let scope = cacheScope.bind(this)(query?.service, query?.owner);\n\n let is_reference_fetch = '';\n let rec_or_uniq = recordIdOrUniqueId(query);\n\n if (rec_or_uniq) {\n query = rec_or_uniq;\n is_reference_fetch = query.record_id || query.unique_id;\n\n if (typeof is_reference_fetch === 'string') {\n if (typeof this.__private_access_key?.[is_reference_fetch] === 'string') {\n query.private_key = this.__private_access_key?.[is_reference_fetch] || undefined;\n }\n let cached = getScopedUniqueId.bind(this)(scope, is_reference_fetch);\n if (cached) {\n if (isDel) {\n deleteScopedUniqueId.bind(this)(scope, is_reference_fetch);\n }\n else {\n query.record_id = cached;\n // delete query.unique_id;\n }\n }\n }\n }\n else {\n let isAdmin = await checkAdmin.bind(this)();\n let ref: any = query?.reference;\n let ref_user_is_me = false;\n\n if (typeof ref === 'object' && Object.keys(ref).length) {\n if (ref?.record_id || ref?.unique_id) {\n // if (ref.unique_id && this.__my_unique_ids[ref.unique_id]) {\n // ref.record_id = this.__my_unique_ids[ref.unique_id];\n // delete ref.unique_id;\n // }\n\n is_reference_fetch = ref.record_id || ref.unique_id;\n\n if (is_reference_fetch && typeof this.__private_access_key?.[is_reference_fetch] === 'string') {\n query.private_key = this.__private_access_key?.[is_reference_fetch] || undefined;\n }\n\n query.reference = is_reference_fetch;\n }\n else if (ref?.user_id) {\n ref_user_is_me = ref.user_id === this.user?.user_id;\n query.reference = ref.user_id;\n }\n }\n\n if (typeof query?.table === 'string') {\n query.table = {\n name: query.table,\n access_group: 0\n };\n }\n\n if (query.index) {\n if (query.index.hasOwnProperty('range') && query.index.hasOwnProperty('condition')) {\n delete query.index.range;\n }\n }\n\n const buildStruct = (query) => {\n return {\n table: {\n name: v => validateTableName(v, 'table.name'),\n access_group: accessGroup.bind(this),\n subscription: (v: any) => validator.UserId(v, 'User ID in \"subscription\"')\n },\n reference: 'string',\n index: {\n name: ['$updated', '$uploaded', '$referenced_count', '$user_id', (v: string) => {\n return validateCustomIndexName(v, 'index.name');\n }],\n value: (v: number | boolean | string) => {\n const indexTypes = {\n '$updated': 'number',\n '$uploaded': 'number',\n '$referenced_count': 'number',\n '$user_id': validator.UserId\n };\n\n if (indexTypes.hasOwnProperty(query.index.name)) {\n let tp = indexTypes[query.index.name];\n\n if (typeof tp === 'function') {\n return tp(v);\n }\n\n if (tp !== typeof v) {\n throw new SkapiError(`\"index.value\" should be type: ${tp}.`, { code: 'INVALID_PARAMETER' });\n }\n\n return v;\n }\n\n if (typeof v === 'string' && !v) {\n return \"\";\n }\n\n // On a nest query (name ending in '.') this is a child index NAME segment,\n // not a value, and the backend concatenates it onto the parent name. Names\n // are escaped on write, so a raw \"Rock/Pop\" here searched a range that the\n // stored \"Rock%2FPop\" falls outside of, and the caller could only find their\n // own record by typing the internal escaped form.\n if (typeof v === 'string' && isNestIndexName(query.index.name)) {\n return validateNestIndexSegment(v, 'index.value');\n }\n\n return indexValue(v);\n },\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq'],\n range: (v: number | boolean | string) => indexRange(v, query)\n },\n tag: (v: string) => {\n if (v === null || v === undefined) {\n return v;\n }\n if (typeof v === 'string') {\n return validateTag(v, 'tag');\n }\n else {\n throw new SkapiError('\"tag\" should be type: string.', { code: 'INVALID_PARAMETER' });\n }\n },\n private_key: 'string'\n }\n }\n\n query = validator.Params(query || {}, buildStruct(query), ref_user_is_me || isAdmin ? [] : ['table'], { ignoreEmpty: true });\n }\n return {\n query,\n is_reference_fetch\n }\n}\n\nexport async function getRecords(query: GetRecordQuery & { private_key?: string; }, fetchOptions?: FetchOptions): Promise<DatabaseResponse<RecordData>> {\n await this.__connection;\n\n let q = await getQuery.bind(this)(query);\n let is_reference_fetch = q.is_reference_fetch;\n\n // TODO: THINK ABOUT HOW TO HANDLE PRIVATE KEY FOR REFERENCE FETCH.\n // if (is_reference_fetch && typeof this.__private_access_key[is_reference_fetch] === 'string') {\n // q.query.private_key = this.__private_access_key[is_reference_fetch] || undefined;\n // }\n\n let result = await request.bind(this)(\n 'get-records',\n q.query,\n {\n fetchOptions,\n auth: !!this.__user,\n method: !!this.__user ? 'post' : 'get'\n }\n );\n\n if (is_reference_fetch && result?.reference_private_key && typeof result.reference_private_key === 'string') {\n this.__private_access_key[is_reference_fetch] = result.reference_private_key;\n }\n\n let to_process = [];\n for (let i in result.list) {\n to_process.push(normalizeRecord.bind(this)(result.list[i]));\n }\n\n result.list = await Promise.all(to_process);\n return result;\n}\n\nfunction setupPostRecordConfig(config: PostRecordConfig & { data?: any; }) {\n let is_reference_post = \"\";\n let files = [];\n // The config names the project this record is posted to (`service`/`owner` are\n // stripped further down, after the caller has read them). Both cache lookups below\n // are confined to it, so a unique_id known in one project can never resolve to that\n // project's record_id while posting into another.\n let scope = cacheScope.bind(this)((config as any)?.service, (config as any)?.owner);\n let _config = validator.Params(config || {}, {\n record_id: (v) => {\n // \"record_id\" may actually be a unique_id. If we already know the\n // unique_id -> record_id mapping locally, resolve it here; otherwise\n // pass the value through and let the backend resolve it. Do NOT force\n // alphanumeric, since unique_ids (e.g. \"src::folder/file.pdf\") contain\n // characters a real record_id never would.\n let cached = typeof v === 'string' ? getScopedUniqueId.bind(this)(scope, v) : undefined;\n if (cached) {\n return cached;\n }\n return validateStringByPolicy(v, 'record_id', {\n allowEmpty: false,\n });\n },\n unique_id: ['string', null],\n readonly: 'boolean',\n table: {\n name: v => validateTableName(v, 'table.name'),\n subscription: [null, {\n is_subscription_record: 'boolean',\n upload_to_feed: 'boolean',\n notify_subscribers: 'boolean',\n feed_referencing_records: 'boolean',\n notify_referencing_records: 'boolean',\n }],\n access_group: accessGroup.bind(this),\n },\n source: {\n referencing_limit: (v: number) => {\n if (v === null) {\n return null;\n }\n\n else if (typeof v === 'number') {\n if (0 > v) {\n throw new SkapiError(`\"reference_limit\" should be >= 0`, { code: 'INVALID_PARAMETER' });\n }\n\n if (v > 4503599627370546) {\n throw new SkapiError(`\"reference_limit\" should be <= 4503599627370546`, { code: 'INVALID_PARAMETER' });\n }\n\n return v;\n }\n\n throw new SkapiError(`\"reference_limit\" should be type: <number | null>`, { code: 'INVALID_PARAMETER' });\n },\n prevent_multiple_referencing: 'boolean',\n can_remove_referencing_records: 'boolean',\n only_granted_can_reference: 'boolean',\n allow_granted_to_grant_others: 'boolean',\n referencing_index_restrictions: v => {\n if (v === undefined) {\n return undefined;\n }\n\n if (!v) {\n return null;\n }\n\n if (Array.isArray(v) && !v.length) {\n return null;\n }\n\n let p = {\n name: v => validateCustomIndexName(v, '\"name\" in \"index_restrictions\"'),\n value: v => indexValue(v),\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq', '!=', 'ne', () => null],\n range: val => {\n if (val !== null && typeof v.value !== typeof val) {\n throw new SkapiError('Index restriction \"range\" type should match the type of \"value\".', { code: 'INVALID_PARAMETER' });\n }\n if (!v.hasOwnProperty('value')) {\n throw new SkapiError('Index restriction \"value\" is required.', { code: 'INVALID_PARAMETER' });\n }\n return val;\n }\n }\n\n if (!Array.isArray(v)) {\n v = [v];\n }\n\n let qq = v.map(vv => validator.Params(vv, p, ['name']));\n if (qq.length) {\n for (let q of qq) {\n if (q.condition && q.hasOwnProperty('range')) {\n delete q.range;\n }\n }\n }\n return qq;\n },\n },\n reference: v => {\n if (v === null) {\n return { record_id: null };\n }\n if (!v) {\n return undefined;\n }\n if (typeof v === 'string') {\n is_reference_post = v;\n // Scoped: an unscoped hit here is what silently redirected a\n // \"src::<file>\" reference to a same-named file's record in a\n // different project, which the backend then rejected as missing.\n let cached = getScopedUniqueId.bind(this)(scope, v);\n if (cached) {\n return cached;\n }\n return v;\n }\n\n if (typeof v !== 'object') {\n throw new SkapiError('\"reference\" should be type: <string | object>.', { code: 'INVALID_PARAMETER' });\n }\n\n return validator.Params(v, {\n unique_id: 'string',\n record_id: v => {\n if (v === null || v === undefined) {\n return v;\n }\n is_reference_post = v;\n if (typeof this.__private_access_key?.[v] === 'string') {\n config.reference_private_key = this.__private_access_key[v] || undefined;\n }\n return validateStringByPolicy(v, 'reference.record_id', {\n allowEmpty: false,\n onlyAlphanumeric: true,\n });\n }\n });\n },\n index: [null, {\n name: v => validateCustomIndexName(v, 'index.name'),\n value: v => indexValue(v)\n }],\n tags: (v: string | string[]) => {\n if (v === null || v === undefined) {\n return v;\n }\n if (typeof v === 'string') {\n v = v.split(',').map(t => t.trim());\n }\n if (!Array.isArray(v)) {\n throw new SkapiError('\"tag\" should be type: <string | string[]>.', { code: 'INVALID_PARAMETER' });\n }\n return v.map(t => validateTag(t, 'tag'));\n },\n remove_bin: (v: string[] | BinaryFile[] | null) => {\n if (!v) {\n return null;\n }\n\n let arr = []\n if (Array.isArray(v)) {\n for (let i of v) {\n if (typeof i === 'string') {\n // Strip the \"?t=<token>\" getFile appends, but do NOT decode: the stored bin\n // url holds the filename raw, so decoding produced a url that matches\n // nothing. The backend's DELETE on a string set ignores a non-matching\n // element, so removing a file named \"a%2Fb.pdf\" silently did nothing.\n arr.push(i.split('?')[0]);\n }\n else if (i.url && i.size && i.filename) {\n let hostUrl = i.url.split('/').slice(0, 3).join('/');\n let url = hostUrl + '/' + i.path;\n arr.push(url);\n }\n else {\n throw new SkapiError(`\"remove_bin\" should be type: <string[] | BinaryFile[] | null>`, { code: 'INVALID_PARAMETER' });\n }\n }\n }\n else {\n throw new SkapiError(`\"remove_bin\" should be type: <string[] | BinaryFile[] | null>`, { code: 'INVALID_PARAMETER' });\n }\n\n return arr;\n },\n progress: 'function',\n data: v => v\n }, [], {\n precall: (pc) => {\n const data = pc?.data || {};\n\n if (!data?.record_id && !data.table) {\n throw new SkapiError('\"table.name\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof data.table === 'string') {\n data.table = {\n name: data.table,\n access_group: 0\n };\n }\n\n if (pc.files) {\n files = pc.files;\n }\n }\n });\n\n let progress = config.progress || null;\n\n // callbacks should be removed after cocochex\n delete _config.progress;\n\n if (!this.__user) {\n const hasEnabledSubscriptionOptions = !!(\n _config.table?.subscription?.is_subscription_record\n || _config.table?.subscription?.upload_to_feed\n || _config.table?.subscription?.notify_subscribers\n || _config.table?.subscription?.feed_referencing_records\n || _config.table?.subscription?.notify_referencing_records\n );\n\n if (_config.record_id) {\n throw new SkapiError('Public users cannot update existing records.', { code: 'INVALID_REQUEST' });\n }\n if (_config.table.access_group !== 'public' && _config.table.access_group !== 0) {\n throw new SkapiError('Public users can only post records to public tables.', { code: 'INVALID_REQUEST' });\n }\n if (hasEnabledSubscriptionOptions) {\n throw new SkapiError('Public users cannot post subscription records.', { code: 'INVALID_REQUEST' });\n }\n if (_config.remove_bin) {\n throw new SkapiError('Public users cannot remove files from records.', { code: 'INVALID_REQUEST' });\n }\n if (_config.unique_id) {\n throw new SkapiError('Public users cannot set unique_id for records.', { code: 'INVALID_REQUEST' });\n }\n }\n return { config: _config, progress, is_reference_post, files };\n}\n\nexport async function bulkPostRecords(params) {\n await this.__connection;\n\n if (!Array.isArray(params) || !params.length) {\n throw new SkapiError('\"params\" should be a non-empty array.', { code: 'INVALID_PARAMETER' });\n }\n\n let reference_posts = [];\n let service = undefined;\n let owner = undefined;\n let progress = null;\n\n // Plaintext restored onto the returned records, by index. Populated only\n // when encryption actually ran for that element.\n let bulkPlain: { [idx: number]: any } = {};\n\n let validatedBulk = await Promise.all(params.map(async (config, idx) => {\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n throw new SkapiError(`\"params[${idx}]\" should be type: <object>.`, { code: 'INVALID_PARAMETER' });\n }\n\n let mangled = setupPostRecordConfig.bind(this)(config) as {config: PostRecordConfig & { service?: string; owner?: string; }; is_reference_post?: string;};\n let _config = mangled.config;\n\n // Same hook as postRecord. Without it a bulk write of a private record\n // would send plaintext, which is the one failure this feature cannot\n // have. Keyed off the RAW element config, which is what names the\n // target access group.\n if (encState.call(this)) {\n let elemHasData = Object.prototype.hasOwnProperty.call(_config, 'data');\n let encRes = await maybeEncrypt.bind(this)((_config as any).data, config, elemHasData);\n if (encRes.encrypted) {\n (_config as any).data = encRes.send;\n bulkPlain[idx] = encRes.plain;\n }\n }\n if (mangled.is_reference_post) {\n reference_posts.push(mangled.is_reference_post);\n }\n if (typeof _config.progress === 'function' && progress === null) {\n progress = _config.progress;\n }\n\n if (_config.service !== undefined) {\n if (service === undefined) {\n service = _config.service;\n }\n else if (service !== _config.service) {\n throw new SkapiError('All bulk params should share the same \"service\" value.', { code: 'INVALID_PARAMETER' });\n }\n }\n\n if (_config.owner !== undefined) {\n if (owner === undefined) {\n owner = _config.owner;\n }\n else if (owner !== _config.owner) {\n throw new SkapiError('All bulk params should share the same \"owner\" value.', { code: 'INVALID_PARAMETER' });\n }\n }\n\n delete _config.progress;\n delete _config.service;\n delete _config.owner;\n\n return _config;\n }));\n\n let postData = {\n _is_bulk_: validatedBulk,\n service: \"\",\n owner: \"\"\n };\n\n if (service !== undefined) {\n postData.service = service;\n }\n\n if (owner !== undefined) {\n postData.owner = owner;\n }\n\n let options = { auth: !!this.__user, method: 'post' };\n let fetchOptions = {};\n\n // if (typeof progress === 'function') {\n // fetchOptions.progress = progress;\n // }\n\n if (Object.keys(fetchOptions).length) {\n Object.assign(options, { fetchOptions });\n }\n\n let recList = await request.bind(this)('post-record', postData, options);\n let records = await Promise.all(recList.map((rec, i) =>\n // Skip decryption for elements we just encrypted: we already hold the\n // plaintext and restore it below, so re-opening the envelope would be\n // pure waste.\n normalizeRecord.bind(this)(rec, 'called from postRecord', false, bulkPlain.hasOwnProperty(i))\n ));\n\n for (let i = 0; i < records.length; i++) {\n if (bulkPlain.hasOwnProperty(i) && records[i] && !records[i].error) {\n records[i].data = bulkPlain[i];\n records[i].encrypted = { status: 'encrypted' };\n }\n }\n\n // Bulk posts all share one service/owner (enforced above), so one scope covers the\n // whole batch. Falls back to the instance's own pair when the caller named neither.\n let scope = cacheScope.bind(this)(service, owner);\n\n for (let i = 0; i < recList.length; i++) {\n let rec = recList[i];\n let record = records[i];\n\n // if (rec?.rec) {\n // window.sessionStorage.setItem(`${this.service}:post:${rec.rec}`, JSON.stringify(rec));\n // }\n\n // The backend reports a per-element rejection as an error OBJECT INSIDE the\n // returned array rather than by throwing, e.g. {error:{code:\"NOT_EXISTS\",\n // message:'Reference \"VQs5...\" does not exists.'}}. normalizeRecord does not\n // know the `error` key, so it dropped it and handed back a fully-shaped EMPTY\n // record: callers saw an ordinary array of records, counted the rejections as\n // saves, and the one thing that explained the failure was gone. Carry it across\n // so a caller can report WHY a record did not save. An empty record_id remains\n // the reliable \"not saved\" signal; this only adds the reason.\n if (rec && typeof rec === 'object' && rec.error && record && !record.record_id) {\n record.error = rec.error;\n }\n\n if (typeof rec?.reference_private_key === 'string') {\n for (let ref of reference_posts) {\n this.__private_access_key[ref] = rec.reference_private_key;\n }\n }\n\n if (record?.unique_id) {\n setScopedUniqueId.bind(this)(scope, record.unique_id, record.record_id);\n }\n }\n\n // if (Object.keys(this.__my_unique_ids).length) {\n // window.sessionStorage.setItem(`${this.service}:uniqueids`, JSON.stringify(this.__my_unique_ids));\n // }\n\n return records;\n}\n\nexport async function postRecord(\n form: Form<Record<string, any>> | null | undefined,\n config: PostRecordConfig,\n files?: { name: string, file: File }[],\n): Promise<RecordData> {\n await this.__connection;\n\n if (!config) {\n throw new SkapiError('\"config\" argument is required.', { code: 'INVALID_PARAMETER' });\n }\n\n let postConf = setupPostRecordConfig.bind(this)(config);\n let _config = postConf.config;\n let progress = postConf.progress;\n let is_reference_post = postConf.is_reference_post;\n\n let options: { [key: string]: any } = { auth: !!this.__user, method: 'post' };\n\n let to_bin: { name: string, file: File }[] = [];\n let extractedForm = extractFormData(form);\n if (files && Array.isArray(files) && files.length) {\n // { name: string, file: File }[]\n to_bin = to_bin.concat(files);\n }\n if (extractedForm.files && Array.isArray(extractedForm.files) && extractedForm.files.length) {\n // { name: string, file: File }[]\n to_bin = to_bin.concat(extractedForm.files);\n }\n\n // Encrypt the payload when this write lands on access_group 'private' and\n // the feature is on. `config` (the RAW caller config, not the validated\n // copy) is what decides, because it is what states the target access group.\n // UNDEFINED and NULL are different payloads, and conflating them is how a\n // metadata-only update destroys a record:\n //\n // undefined -> no `data` key on the wire, server KEEPS what is stored\n // null -> `data: null`, server stores a real JSON null (\"!J%null\")\n // any value -> stored as is\n //\n // extractFormData already preserves that distinction (undefined stays\n // undefined, null stays null), so it only has to be respected here.\n // `config.data` wins over the form argument, which is the precedence the\n // pre-encryption code had by virtue of `_config` being the Object.assign\n // source.\n let rawPayload = (config as any)?.data !== undefined\n ? (config as any).data\n : extractedForm.data;\n let hasData = rawPayload !== undefined;\n\n let encRes = await maybeEncrypt.bind(this)(rawPayload, config, hasData);\n\n let postData = null;\n // `_config` LAST would let a `data` key that survived validation\n // (setupPostRecordConfig's schema passes it through verbatim) overwrite the\n // envelope with the caller's plaintext. Strip it from the config copy and\n // set the payload explicitly afterwards.\n postData = Object.assign({}, _config);\n delete (postData as any).data;\n if (!encRes.omit) {\n (postData as any).data = encRes.send;\n }\n\n let fetchOptions: { [key: string]: any } = {};\n\n if (typeof progress === 'function') {\n fetchOptions.progress = progress;\n }\n\n if (Object.keys(fetchOptions).length) {\n Object.assign(options, { fetchOptions });\n }\n let rec = await request.bind(this)('post-record', postData, options);\n\n // The server has just minted the record_id. Bind the data key to it BEFORE\n // the attachments upload, or a create-with-files would find no key and send\n // the files in the clear.\n if (encRes.encrypted && rec?.rec) {\n bindRecordDek.bind(this)(rec.rec, encRes.dek);\n }\n\n if (isBrowserRuntime() && to_bin.length) {\n let bin_formData = new FormData();\n for (let f of to_bin) {\n bin_formData.append(f.name, f.file, f.file.name);\n }\n let uploadFileParams = {\n record_id: rec.rec,\n progress\n }\n if (_config.hasOwnProperty('service')) {\n uploadFileParams['service'] = _config.service;\n }\n let { bin_endpoints } = await uploadFiles.bind(this)(bin_formData, uploadFileParams);\n if (!rec.bin) {\n rec.bin = bin_endpoints;\n }\n else {\n rec.bin.push(...bin_endpoints);\n }\n }\n\n if (is_reference_post && typeof rec?.reference_private_key === 'string') {\n this.__private_access_key[is_reference_post] = rec.reference_private_key;\n }\n\n // window.sessionStorage.setItem(`${this.service}:post:${rec.rec}`, JSON.stringify(rec));\n\n // If the server offloaded the \"data\" payload to storage (too large for the\n // record item), the response carries a { __data__: <path> } marker. Skip the\n // re-download and return exactly what was posted.\n let dataOffloaded = !!rec && rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data) && typeof rec.data.__data__ === 'string' && rec.data.__data__.endsWith('/__data__/__json__.json');\n let record = await normalizeRecord.bind(this)(rec, 'called from postRecord', true, encRes.encrypted);\n if (dataOffloaded) {\n record.data = extractedForm.data;\n }\n if (encRes.encrypted) {\n // The server echoed the envelope; hand the caller back what they gave\n // us rather than making them re-read the record to see their own data.\n record.data = encRes.plain;\n record.encrypted = { status: 'encrypted', recipients: Object.keys(encRes.send.k || {}) };\n }\n if (record.unique_id) {\n let scope = cacheScope.bind(this)((_config as any)?.service, (_config as any)?.owner);\n setScopedUniqueId.bind(this)(scope, record.unique_id, record.record_id);\n if (isBrowserRuntime()) {\n // Debounce + guard the persistence. Previously every postRecord\n // re-stringified the entire, ever-growing map synchronously, so a\n // bulk upload (e.g. 10k files, each writing a src:: unique_id) did\n // O(n^2) JSON work and could throw QuotaExceededError mid-batch,\n // failing the upload. Coalesce writes to at most one per idle tick\n // and swallow storage errors so persistence never breaks an upload.\n if (this.__uniqueIdsPersistTimer !== null) {\n clearTimeout(this.__uniqueIdsPersistTimer);\n }\n this.__uniqueIdsPersistTimer = setTimeout(() => {\n this.__uniqueIdsPersistTimer = null;\n try {\n // Persist ONLY the scope just written, under a key that names both\n // service and owner. Writing the whole map under a service-only key\n // is what let one project's entries be restored into another.\n window.sessionStorage.setItem(`${scope}:uniqueids`, JSON.stringify(this.__my_unique_ids[scope] || {}));\n } catch (e) {\n // sessionStorage full/unavailable: keep the in-memory map,\n // just skip persistence for this session.\n }\n }, 500);\n }\n }\n\n return record;\n}\n\nexport async function getTables(\n /** If null fetch all list of tables. */\n query: {\n table: string;\n /** Condition operator of table name. */\n condition?: Condition;\n },\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<Table>> {\n let res = await request.bind(this)('get-table', validator.Params(query || {}, {\n // Escaped, because storage holds the escaped form: a lookup for a table literally named\n // \"a/b\" has to go out as \"a%2Fb\" or it matches nothing. The response is decoded below, so\n // leaving the query raw made this one call the only place where the caller had to know\n // about the wire format. Empty is allowed: table '' or ' ' with a condition is the\n // \"list everything\" idiom.\n table: (v: string) => validateTableName(v, 'table', { allowEmpty: true }),\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq', '!=', 'ne']\n }), Object.assign({ auth: !!this.__user }, { fetchOptions }));\n\n let convert = {\n 'cnt_rec': 'number_of_records',\n 'tbl': 'table',\n 'srvc': 'service',\n 'grp_': 'number_of_records_in_access_group_'\n };\n\n if (Array.isArray(res?.list)) {\n for (let t of res.list) {\n for (let k in convert) {\n if(k === 'grp_') {\n for (let gk in t) {\n if (gk.startsWith('grp_')) {\n let access_group = gk.substring(4);\n if(access_group === 'pv') {\n access_group = 'private';\n }\n else if(access_group === '00') {\n access_group = 'public';\n }\n else if(access_group === '01') {\n access_group = 'authorized';\n }\n else if(access_group === '99') {\n access_group = 'admin';\n }\n t[`number_of_records_in_access_group_${access_group}`] = t[gk];\n delete t[gk];\n }\n }\n }\n if (t.hasOwnProperty(k)) {\n t[convert[k]] = t[k];\n delete t[k];\n }\n }\n\n if (typeof t.table === 'string') {\n t.table = decodeReservedDelimiters(t.table);\n }\n }\n }\n\n return res;\n}\n\nexport async function getIndexes(\n query: {\n /** Table name */\n table: string;\n /** Index name. When period is at the end of name, querys nested index keys. */\n index?: string;\n /** Queries order by */\n order?: {\n /** Key name to order by. */\n by: 'average_number' | 'total_number' | 'number_count' | 'average_bool' | 'total_bool' | 'bool_count' | 'string_count' | 'index_name';\n /** Value to query. */\n value?: number | boolean | string;\n condition?: Condition;\n };\n },\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<Index>> {\n if (!query?.table) {\n throw new SkapiError('\"table\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n let p:any = validator.Params(\n query || {},\n {\n // Escaped for the same reason as getTables: storage holds the escaped form.\n table: (v: string) => validateTableName(v, 'table', { allowEmpty: true }),\n index: (v: string) => validateCustomIndexName(v, 'index.name'),\n order: {\n by: [\n 'average_number',\n 'total_number',\n 'number_count',\n 'average_bool',\n 'total_bool',\n 'bool_count',\n 'string_count',\n 'index_name',\n 'number_of_records'\n ],\n value: (v: any) => {\n // When ordering by 'index_name', order.value is NOT a value: the backend\n // concatenates it onto the index name to build the composite key\n // (get_index: idx = index + order.value), so it is a name fragment and needs the\n // same escaping the name itself got. Sent raw, it searched for \"svc/t/Band.Mem/bers\"\n // while storage held \"svc/t/Band.Mem%2Fbers\", returning an empty list with no\n // error, and the getIndexes response hands back the decoded spelling that fails.\n // For every other \"by\" the value is a numeric threshold and must be left alone.\n if (query?.order?.by === 'index_name' && typeof v === 'string') {\n return validateStringByPolicy(v, 'order.value', {\n allowEmpty: true,\n maxLength: 256,\n blockKeyDelimiters: true\n });\n }\n if (typeof v !== 'string' && typeof v !== 'number' && typeof v !== 'boolean') {\n throw new SkapiError('\"order.value\" should be type: <string | number | boolean>.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq', '!=', 'ne']\n }\n },\n ['table']\n );\n\n if (p.hasOwnProperty('order')) {\n if (!p.order?.by) {\n throw new SkapiError('\"order.by\" is required.', { code: 'INVALID_PARAMETER' });\n }\n\n if (p.order.hasOwnProperty('condition') && !p.order.hasOwnProperty('value')) {\n throw new SkapiError('\"value\" is required for \"condition\".', { code: 'INVALID_PARAMETER' });\n }\n\n if (p.hasOwnProperty('index')) {\n if (p.index.substring(p.index.length - 1) !== '.') {\n throw new SkapiError('\"index\" should be a parent index name of the compound index when using \"order.by\"', { code: 'INVALID_PARAMETER' });\n }\n }\n }\n\n let res = await request.bind(this)(\n 'get-index',\n p,\n Object.assign(\n { auth: !!this.__user },\n { fetchOptions }\n )\n );\n\n let convert = {\n 'cnt_bool': 'boolean_count',\n 'cnt_numb': 'number_count',\n 'totl_numb': 'total_number',\n 'totl_bool': 'total_bool',\n 'avrg_numb': 'average_number',\n 'avrg_bool': 'average_bool',\n 'cnt_str': 'string_count'\n };\n\n if (Array.isArray(res?.list)) {\n res.list = res.list.map((i: Record<string, any>) => {\n let iSplit = i.idx.split('/');\n let resolved: Record<string, any> = {\n table: decodeReservedDelimiters(iSplit[1]),\n index: decodeReservedDelimiters(iSplit[2]),\n number_of_records: i.cnt_rec\n };\n\n for (let k in convert) {\n if (Object.prototype.hasOwnProperty.call(i, k)) {\n resolved[convert[k]] = i[k];\n }\n }\n\n return resolved;\n });\n }\n\n return res;\n}\n\nexport async function getTags(\n query?: {\n /** Table name */\n table: string;\n /** Tag name */\n tag?: string;\n /** String query condition for tag name. */\n condition?: Condition;\n },\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<Tag>> {\n\n let res = await request.bind(this)(\n 'get-tag',\n validator.Params(query || {},\n {\n // Both escaped: the stored tag key is \"<tag>/<table>\", both segments in escaped\n // form, and the response is decoded below.\n table: (v: string) => validateTableName(v, 'table', { allowEmpty: true }),\n tag: (v: string) => validateTag(v, 'tag', { allowEmpty: true }),\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq', '!=', 'ne']\n }\n ),\n Object.assign({ auth: !!this.__user }, { fetchOptions })\n );\n\n if (Array.isArray(res?.list)) {\n res.list = res.list.map(item => {\n let tSplit = item.tag.split('/');\n return {\n table: decodeReservedDelimiters(tSplit[1]),\n tag: decodeReservedDelimiters(tSplit[0]),\n number_of_records: item.cnt_rec\n };\n });\n }\n\n return res;\n}\n\nexport async function getUniqueId(\n query?: Form<{\n /** Unique ID */\n unique_id?: string;\n /** String query condition for tag name. */\n condition?: Condition;\n }>,\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<UniqueId>> {\n\n let res = await request.bind(this)(\n 'get-uniqueid',\n validator.Params(query || {},\n {\n unique_id: 'string',\n condition: ['gt', 'gte', 'lt', 'lte', '>', '>=', '<', '<=', '=', 'eq', '!=', 'ne']\n }\n ),\n Object.assign({ auth: !!this.__user }, { fetchOptions })\n );\n\n if (Array.isArray(res?.list)) {\n for (let i in res.list) {\n let item = res.list[i];\n res.list[i] = {\n unique_id: item.unq,\n record_id: item.rec\n };\n }\n }\n\n return res;\n}\n\n\n/**\n * Build the encryption context for a RAW record (short keys), for the paths\n * that deliberately do not run normalizeRecord.\n *\n * deleteRecords is the one caller: it must not normalize (that would resolve\n * every private bin file through getFile, firing a private-access-key request\n * per record during a delete, and embedding a live token in a payload callers\n * forward onward), but it still has to hand back plaintext rather than an\n * envelope.\n */\nfunction rawRecordEncContext(rec: any): { access_group: any; table_name: string; user_id: string; record_id: string; unique_id: string } | null {\n if (!rec || typeof rec !== 'object') {\n return null;\n }\n\n let user_id = '';\n let table_name = '';\n let group: any = 0;\n\n if (typeof rec.usr_tbl === 'string') {\n // user-id/table/service/group[/subscription][/tag]\n let p = rec.usr_tbl.split('/');\n user_id = p[0] || '';\n table_name = decodeReservedDelimiters(p[1] || '');\n group = p[3];\n }\n else if (typeof rec.tbl === 'string') {\n // table/service/group[/subscription][/tag]\n let p = rec.tbl.split('/');\n table_name = decodeReservedDelimiters(p[0] || '');\n group = p[2];\n user_id = rec.usr || '';\n }\n else {\n return null;\n }\n\n let unique_id = '';\n if (typeof rec.ip === 'string') {\n let hashAt = rec.ip.indexOf('#');\n if (hashAt >= 0) {\n unique_id = rec.ip.slice(hashAt + 1);\n }\n }\n\n return {\n access_group: group === '**' ? 'private' : parseInt(group),\n table_name,\n user_id,\n record_id: rec.rec || '',\n unique_id\n };\n}\n\nexport async function deleteRecords(query: DelRecordQuery & { private_key?: string; }, fetchOptions?: FetchOptions): Promise<string | DatabaseResponse<RecordData>> {\n await this.__connection;\n\n let q = await getQuery.bind(this)(query, true);\n let is_reference_fetch = q.is_reference_fetch;\n let result = await request.bind(this)('del-records', q.query, { auth: true, fetchOptions });\n if (is_reference_fetch && typeof result?.reference_private_key === 'string') {\n this.__private_access_key[is_reference_fetch] = result.reference_private_key;\n }\n\n // Deleting by query returns the records it deleted, and they arrive RAW: short keys\n // (rec / usr_tbl / idx) and every stored encoding untouched, so `data` is the\n // '!J%<json>' text the server wrote. Decode just that, in place.\n //\n // NOT normalizeRecord, deliberately. Its `bin` handler resolves every non-public file\n // through getFile(url, 'endpoint'), which appends the caller's id token to the url and,\n // for another user's private record, fires requestPrivateRecordAccessKey once per\n // record. On a delete that means a burst of requests racing the asynchronous file\n // deletion, and a live token embedded in bin[].url of a payload callers forward\n // onward. Its Promise.all would also reject the whole call if one record failed to\n // normalize, after the delete had already been committed server side.\n //\n // The offload marker is left as-is for the same reason it is not decoded here: the\n // payload lives in a file this delete is removing.\n if (Array.isArray(result?.list)) {\n for (let rec of result.list) {\n if (rec && typeof rec === 'object' && 'data' in rec) {\n rec.data = parseStoredData(rec.data);\n\n // Decrypt what the caller is entitled to. Without this the\n // owner deleting their own record gets a raw envelope back\n // instead of their data, and a MASTER deleting someone else's\n // gets the ciphertext handed to them as if it were the payload.\n // maybeDecrypt is total, so a record nobody present can open\n // becomes data:null with a reason rather than failing the\n // delete, which has already committed server side.\n if (encState.call(this) && isEnvelope(rec.data)) {\n let ctx = rawRecordEncContext(rec);\n if (ctx) {\n let opened = await maybeDecrypt.bind(this)(rec.data, ctx);\n rec.data = opened.value;\n if (opened.flag) {\n rec.encrypted = opened.flag;\n }\n }\n else {\n // Shape we cannot place. Never hand back ciphertext\n // dressed as data.\n rec.data = null;\n rec.encrypted = { status: 'failed', reason: 'BINDING_MISMATCH' };\n }\n }\n }\n }\n }\n\n return result?.message || result;\n}\n\nexport async function grantPrivateRecordAccess(params: {\n record_id: string;\n user_id: string | string[];\n}) {\n // Wrap the record's data key for each grantee BEFORE the backend grant, so\n // a crypto failure means nothing was granted at all. Without this the ACL\n // would say \"shared\" while the grantee got an envelope they cannot open.\n if (encState.call(this)) {\n let ids = typeof params.user_id === 'string' ? [params.user_id] : params.user_id;\n if (Array.isArray(ids) && ids.length) {\n await addRecipients.bind(this)(params.record_id, ids);\n }\n }\n\n return recordAccess.bind(this)({\n record_id: params.record_id,\n user_id: params.user_id,\n execute: 'add'\n });\n}\n\nexport async function removePrivateRecordAccess(params: {\n record_id: string;\n user_id: string | string[];\n}) {\n let result = await recordAccess.bind(this)({\n record_id: params.record_id,\n user_id: params.user_id || null,\n execute: 'remove'\n });\n\n // Roll the data key AFTER the ACL change. Dropping the wrap alone would\n // leave the revoked user able to open any ciphertext they already hold, so\n // the record is re-encrypted under a fresh key. This is forward-only: it\n // cannot un-read what they already read.\n if (encState.call(this)) {\n let ids = typeof params.user_id === 'string' ? [params.user_id] : params.user_id;\n await dropRecipientsAndRoll.bind(this)(params.record_id, Array.isArray(ids) && ids.length ? ids : null);\n }\n\n return result;\n}\n\nexport async function listPrivateRecordAccess(p: {\n record_id?: string;\n user_id?: string | string[];\n}, fetchOptions?: FetchOptions): Promise<DatabaseResponse<{ record_id: string; user_id: string; }>> {\n let params = {\n record_id: p.record_id || undefined,\n user_id: p.user_id || undefined,\n execute: 'list'\n };\n\n if (!params.record_id && !params.user_id) {\n throw new SkapiError(`Either record_id or user_id must be provided.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (params.user_id) {\n if (typeof params.user_id === 'string') {\n validator.UserId(params.user_id);\n params.user_id = [params.user_id];\n }\n else if (Array.isArray(params.user_id)) {\n for (let u of params.user_id) {\n validator.UserId(u);\n }\n }\n else {\n throw new SkapiError(`user_id should be type: <string | string[]>`, { code: 'INVALID_PARAMETER' });\n }\n }\n\n let mapper = (i: Record<string, any>) => {\n if (i.rec_usr) {\n i.record_id = i.rec_usr.split('/')[0];\n i.user_id = i.rec_usr.split('/')[1];\n }\n else if (i.usr_rec) {\n i.user_id = i.usr_rec.split('/')[0];\n i.record_id = i.usr_rec.split('/')[1];\n }\n return i;\n };\n\n let list = await request.bind(this)(\n 'grant-private-access',\n params,\n { auth: true, fetchOptions }\n );\n\n list.list = list.list.map(mapper);\n\n return list;\n}\n\nexport function requestPrivateRecordAccessKey(params: { record_id: string, reference_id?: string }): Promise<string> {\n let record_id: string | string[] = params.record_id;\n let reference_id = params.reference_id || undefined;\n if (!record_id) {\n throw new SkapiError(`Record ID is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof record_id !== 'string') {\n throw new SkapiError(`Record ID should be type: <string | string[]>`, { code: 'INVALID_PARAMETER' });\n }\n\n if (reference_id && typeof reference_id !== 'string') {\n throw new SkapiError(`Reference ID should be type: <string>`, { code: 'INVALID_PARAMETER' });\n }\n\n if (typeof this.__private_access_key[record_id] === 'string') {\n return Promise.resolve(this.__private_access_key[record_id]);\n }\n\n if (pendingPrivateAccessKeyRequest[record_id]) {\n return pendingPrivateAccessKeyRequest[record_id];\n }\n\n let res = request\n .bind(this)(\n 'request-private-access-key',\n { record_id, reference_id },\n { auth: true }\n )\n .then((r: any) => {\n let privateKey = typeof r === 'string' ? r : r?.private_key;\n if (typeof privateKey !== 'string') {\n throw new SkapiError('Invalid private access key response.', { code: 'ERROR' });\n }\n\n this.__private_access_key[record_id] = privateKey;\n return privateKey;\n })\n .finally(() => {\n delete pendingPrivateAccessKeyRequest[record_id];\n });\n\n pendingPrivateAccessKeyRequest[record_id] = res;\n\n return res;\n}\n\nfunction recordAccess(params: {\n record_id: string;\n user_id: string | string[];\n execute: 'add' | 'remove';\n}): Promise<any> {\n let execute = params.execute;\n let req = validator.Params(params,\n {\n record_id: 'string',\n user_id: (v: string | string[]) => {\n if (!v) {\n throw new SkapiError(`User ID is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n let id = v;\n if (typeof id === 'string') {\n id = [id];\n }\n\n if (id.length > 100) {\n throw new SkapiError(`Cannot process more than 100 users at once.`, { code: 'INVALID_REQUEST' });\n }\n\n for (let i of id) {\n validator.UserId(i, 'User ID in \"user_id\"');\n }\n\n return id;\n },\n execute: ['add', 'remove']\n },\n [\n 'execute',\n 'record_id',\n 'user_id'\n ]\n );\n\n if (!req.user_id) {\n req.user_id = null;\n }\n\n return request.bind(this)(\n 'grant-private-access',\n req,\n { auth: true }\n );\n}\n\n","import { SkapiError } from \"../Main\";\nimport { RTCResolved, RTCEvent, RTCConnectorParams, RTCReceiverParams, WebSocketMessage, RTCConnector } from \"../Types\";\nimport { extractFormData } from \"../utils/utils\";\nimport validator from \"../utils/validator\";\n\nexport const __peerConnection: { [sender: string]: RTCPeerConnection } = {};\nexport const __dataChannel: { [sender: string]: { [label: string]: RTCDataChannel } } = {};\nexport const __caller_ringing: { [recipient: string]: (v: any) => void } = {};\nexport const __receiver_ringing: { [caller: string]: string } = {};\nexport const __rtcEvents: { [sender: string]: (v: any) => void } = {};\n\nlet __rtcCandidatesBuffer: { [sender: string]: any[] } = {};\nlet __rtcSdpOfferBuffer: { [sender: string]: any[] } = {};\n\nfunction setBuffer(buffer: { [recipient: string]: any[] }, recipient: string, item: any) {\n if (!buffer[recipient]) {\n buffer[recipient] = [];\n }\n buffer[recipient].push(item);\n}\n\nasync function processBuffer(buffer: { [recipient: string]: any[] }, recipient: string, fn: (item: any) => any): Promise<any[]> {\n let proceed = [];\n if (buffer[recipient]) {\n for (let v of buffer[recipient]) {\n if (v) {\n let process = fn(v);\n if (process instanceof Promise) {\n process = await process;\n }\n proceed.push(process);\n }\n };\n delete buffer[recipient];\n }\n return proceed;\n}\n\nexport async function answerSdpOffer(offer: any, recipient: string) {\n if (!this?.session?.accessToken?.jwtToken) {\n throw new SkapiError('Access token is required.', { code: 'INVALID_PARAMETER' });\n }\n\n let socket: WebSocket = await this.__socket;\n async function sendAnswer(offer, recipient, socket) {\n this.log('answerSdpOffer from', recipient);\n await __peerConnection[recipient].setRemoteDescription(new RTCSessionDescription(offer));\n const answer = await __peerConnection[recipient].createAnswer();\n await __peerConnection[recipient].setLocalDescription(answer);\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: recipient,\n content: { sdpanswer: answer },\n token: this.session.accessToken.jwtToken\n }));\n }\n\n if (__peerConnection?.[recipient]) {\n if (!offer) {\n await processBuffer(__rtcSdpOfferBuffer, recipient, (offer) => sendAnswer.bind(this)(offer, recipient, socket)); // process all buffered sdp offers\n }\n else {\n await processBuffer(__rtcSdpOfferBuffer, recipient, (offer) => sendAnswer.bind(this)(offer, recipient, socket)); // process all buffered sdp offers first\n await sendAnswer.bind(this)(offer, recipient, socket);\n }\n }\n else {\n if (offer) {\n setBuffer(__rtcSdpOfferBuffer, recipient, offer);\n }\n }\n}\n\nexport async function receiveIceCandidate(candidate: any, recipient: string) {\n this.log('receiveIceCandidate', candidate);\n if (__peerConnection?.[recipient] && __peerConnection[recipient]?.remoteDescription && __peerConnection[recipient]?.remoteDescription?.type) {\n if (!candidate) {\n return processBuffer(__rtcCandidatesBuffer, recipient, (candidate) => __peerConnection[recipient].addIceCandidate(candidate)); // process all buffered candidates\n }\n await processBuffer(__rtcCandidatesBuffer, recipient, (candidate) => __peerConnection[recipient].addIceCandidate(candidate)); // process all buffered candidates\n await __peerConnection[recipient].addIceCandidate(candidate);\n }\n else {\n setBuffer(__rtcCandidatesBuffer, recipient, candidate);\n }\n}\n\nexport async function closeRTC(params: { cid?: string; close_all?: boolean }): Promise<void> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebRTC is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n validator.Params(params, {\n cid: v => {\n if (typeof v !== 'string') {\n throw new SkapiError(`\"cid\" should be type: <string>.`, { code: 'INVALID_PARAMETER' });\n }\n if (v && v.slice(0, 4) !== 'cid:') {\n throw new SkapiError(`\"cid\" should be a valid connection id.`, { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n close: 'boolean'\n });\n let socket: WebSocket = await this.__socket;\n let { cid, close_all = false } = params || {};\n\n if (!close_all && !cid) {\n throw new SkapiError(`\"cid\" is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n let close = (cid: string) => {\n if (!cid) {\n throw new SkapiError(`\"cid\" is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n delete __rtcSdpOfferBuffer[cid];\n delete __rtcCandidatesBuffer[cid];\n\n // Close all associated data channels\n if (__dataChannel[cid]) {\n Object.values(__dataChannel[cid]).forEach(channel => {\n if (channel.readyState !== 'closed') {\n channel.close();\n }\n });\n }\n\n delete __dataChannel[cid];\n\n if (__peerConnection?.[cid]) {\n if (__peerConnection[cid].connectionState !== 'closed') {\n __peerConnection[cid].close();\n\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: cid,\n content: { hungup: this.user.user_id },\n token: this.session.accessToken.jwtToken\n }));\n }\n\n let msg = {\n type: 'connectionstatechange',\n target: __peerConnection[cid],\n timestamp: new Date().toISOString(),\n state: __peerConnection[cid].connectionState,\n iceState: __peerConnection[cid].iceConnectionState,\n signalingState: __peerConnection[cid].signalingState\n }\n\n if (__rtcEvents[cid]) {\n __rtcEvents[cid](msg);\n }\n\n this.log('closeRTC', msg);\n }\n\n delete __rtcEvents[cid];\n delete __receiver_ringing[cid];\n delete __caller_ringing[cid];\n delete __peerConnection[cid];\n }\n\n if (close_all) {\n for (let key in __peerConnection) {\n close(key);\n }\n }\n else {\n close(cid);\n }\n\n this.log('Cleaning up media stream...');\n if (this.__mediaStream) {\n this.__mediaStream.getTracks().forEach((track) => {\n track.stop(); // Stops the track (audio or video)\n });\n this.__mediaStream = null; // Clear the reference to the MediaStream\n }\n}\n\nasync function createMediaStream(media: MediaStream | MediaStreamConstraints): Promise<MediaStream> {\n if (media instanceof MediaStream) {\n return media;\n }\n\n if (!media.video && !media.audio) {\n // make dummy media stream\n // Create a dummy MediaStream\n const dummyStream = new MediaStream();\n\n // Create a dummy video track (using a canvas)\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const dummyVideoStream = canvas.captureStream();\n const dummyVideoTrack = dummyVideoStream.getVideoTracks()[0];\n\n // Add the dummy video track to the MediaStream\n dummyStream.addTrack(dummyVideoTrack);\n\n // Assign the dummy MediaStream to this.__mediaStream\n return dummyStream;\n }\n\n return window.navigator.mediaDevices.getUserMedia(media);\n}\n\nexport async function connectRTC(\n params: RTCConnectorParams,\n callback: (e: RTCEvent) => void\n): Promise<RTCConnector> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebRTC is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n if (typeof callback !== 'function') {\n throw new SkapiError(`Callback is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (!this?.session?.accessToken?.jwtToken) {\n throw new SkapiError('Access token is required.', { code: 'INVALID_PARAMETER' });\n }\n\n params = validator.Params(params, {\n cid: v => {\n if (typeof v !== 'string') {\n throw new SkapiError(`\"cid\" should be type: <string>.`, { code: 'INVALID_PARAMETER' });\n }\n if (v && v.slice(0, 4) !== 'cid:') {\n throw new SkapiError(`\"cid\" should be a valid connection id.`, { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n ice: ['string', () => 'stun:stun.skapi.com:3468'],\n media: v => v,\n channels: ['text-chat', 'file-transfer', 'video-chat', 'voice-chat', 'gaming', {\n // negotiated: 'boolean',\n // id: 'number',\n ordered: 'boolean',\n maxPacketLifeTime: 'number',\n maxRetransmits: 'number',\n protocol: 'string'\n }, () => {\n return [{ ordered: true, maxPacketLifeTime: 10, protocol: 'default' }]\n }]\n }, ['cid']);\n\n let { cid, ice } = params;\n\n if (!(params?.media instanceof MediaStream)) {\n if (params?.media?.video || params?.media?.audio) {\n // check if it is localhost or https\n if (window.location.hostname !== 'localhost' && window.location.protocol !== 'https:') {\n throw new SkapiError(`Media stream is only supported on either localhost or https.`, { code: 'INVALID_REQUEST' });\n }\n }\n }\n\n let socket: WebSocket = this.__socket ? await this.__socket : this.__socket;\n\n if (!socket) {\n throw new SkapiError(`No realtime connection. Execute connectRealtime() before this method.`, { code: 'INVALID_REQUEST' });\n }\n\n if (socket.readyState !== 1) {\n throw new SkapiError('Realtime connection is not ready.', { code: 'INVALID_REQUEST' });\n }\n\n // Call STUN server to get IP address\n const configuration = {\n iceServers: [\n { urls: ice }\n ]\n };\n\n if (!__peerConnection?.[cid]) {\n __peerConnection[cid] = new RTCPeerConnection(configuration);\n }\n\n // add media stream\n if (params?.media) {\n this.__mediaStream = await createMediaStream(params.media);\n this.__mediaStream.getTracks().forEach(track => {\n __peerConnection[cid].addTrack(track, this.__mediaStream);\n });\n }\n\n __rtcEvents[cid] = callback;\n\n if (!__dataChannel[cid]) {\n __dataChannel[cid] = {};\n }\n\n for (let i = 0; i < params.channels.length; i++) {\n let options = params.channels[i];\n\n if (typeof options === 'string') {\n switch (options) {\n case 'text-chat':\n options = { ordered: true, maxRetransmits: 10, protocol: 'text-chat' };\n break;\n case 'file-transfer':\n options = { ordered: false, maxPacketLifeTime: 3000, protocol: 'file-transfer' };\n break;\n case 'video-chat':\n options = { ordered: true, maxRetransmits: 10, protocol: 'video-chat' };\n break;\n case 'voice-chat':\n options = { ordered: true, maxRetransmits: 10, protocol: 'voice-chat' };\n break;\n case 'gaming':\n options = { ordered: false, maxPacketLifeTime: 100, protocol: 'gaming' };\n break;\n default:\n options = { ordered: true, maxRetransmits: 10, protocol: 'default' };\n break;\n }\n }\n\n let protocol = options.protocol || 'default';\n if (Object.keys(__dataChannel[cid]).includes(protocol)) {\n throw new SkapiError(`Data channel with the protocol \"${protocol}\" already exists.`, { code: 'INVALID_REQUEST' });\n }\n\n let dataChannel = __peerConnection[cid].createDataChannel(protocol, options);\n __dataChannel[cid][protocol] = dataChannel;\n }\n\n for (let key in __dataChannel[cid]) {\n let dataChannel = __dataChannel[cid][key];\n handleDataChannel.bind(this)(cid, dataChannel);\n }\n\n peerConnectionHandler.bind(this)(cid, ['onnegotiationneeded']);\n await sendOffer.bind(this)(cid);\n\n return {\n hangup: () => __caller_ringing[cid] && __caller_ringing[cid](false),\n connection: new Promise(resolve => {\n __caller_ringing[cid] = ((proceed: boolean) => {\n this.log('receiver picked up the call', cid);\n // proceed\n if (!proceed) {\n closeRTC.bind(this)({ cid: cid });\n return null;\n }\n\n __peerConnection[cid].onnegotiationneeded = () => {\n this.log('onnegotiationneeded', `sending offer to \"${cid}\".`);\n sendOffer.bind(this)(cid);\n if (__rtcEvents[cid])\n __rtcEvents[cid]({\n type: 'negotiationneeded',\n target: __peerConnection[cid],\n timestamp: new Date().toISOString(),\n signalingState: __peerConnection[cid].signalingState,\n connectionState: __peerConnection[cid].iceConnectionState,\n gatheringState: __peerConnection[cid].iceGatheringState\n });\n };\n\n resolve({\n target: __peerConnection[cid],\n channels: __dataChannel[cid],\n hangup: () => closeRTC.bind(this)({ cid: cid }),\n media: this.__mediaStream\n });\n }).bind(this);\n })\n }\n}\n\nexport function respondRTC(msg: WebSocketMessage): (params: RTCReceiverParams, callback: (e: RTCEvent) => void) => Promise<RTCResolved> {\n return async (params: RTCReceiverParams, callback: (e: RTCEvent) => void): Promise<RTCResolved> => {\n params = params || {};\n params = extractFormData(params).data;\n\n let sender = msg.sender_cid;\n let socket: WebSocket = await this.__socket;\n\n if (!__receiver_ringing[sender]) {\n return null;\n }\n\n if (typeof callback !== 'function') {\n throw new SkapiError(`Callback is required.`, { code: 'INVALID_PARAMETER' });\n }\n\n if (!(params?.media instanceof MediaStream)) {\n if (params?.media?.video || params?.media?.audio) {\n // check if it is localhost or https\n if (window.location.hostname !== 'localhost' && window.location.protocol !== 'https:') {\n throw new SkapiError(`Media stream is only supported on either localhost or https.`, { code: 'INVALID_REQUEST' });\n }\n }\n }\n\n let { ice = 'stun:stun.skapi.com:3468' } = params;\n\n if (!__peerConnection?.[sender]) {\n __peerConnection[sender] = new RTCPeerConnection({\n iceServers: [\n { urls: ice }\n ]\n });\n }\n\n if (params?.media) {\n this.__mediaStream = await createMediaStream(params.media);\n this.__mediaStream.getTracks().forEach(track => {\n __peerConnection[sender].addTrack(track, this.__mediaStream);\n });\n }\n\n delete __receiver_ringing[sender];\n\n __rtcEvents[sender] = callback;\n\n if (!__dataChannel[sender]) {\n __dataChannel[sender] = {};\n }\n\n __peerConnection[sender].ondatachannel = (event) => {\n this.log('ondatachannel', `received data channel \"${event.channel.label}\".`);\n const dataChannel = event.channel;\n __dataChannel[sender][dataChannel.label] = dataChannel;\n handleDataChannel.bind(this)(sender, dataChannel);\n }\n\n peerConnectionHandler.bind(this)(sender, ['onnegotiationneeded']);\n await answerSdpOffer.bind(this)(null, sender);\n await receiveIceCandidate.bind(this)(null, sender);\n\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: sender,\n content: { pickup: this.user.user_id },\n token: this.session.accessToken.jwtToken\n }));\n\n return {\n target: __peerConnection[sender],\n channels: __dataChannel[sender],\n hangup: () => closeRTC.bind(this)({ cid: sender }),\n media: this.__mediaStream\n }\n }\n}\n\nasync function sendOffer(recipient) {\n if (!this?.session?.accessToken?.jwtToken) {\n throw new SkapiError('Access token is required.', { code: 'INVALID_PARAMETER' });\n }\n this.log('sendOffer', recipient);\n let socket: WebSocket = await this.__socket;\n\n const offer = await __peerConnection[recipient].createOffer();\n await __peerConnection[recipient].setLocalDescription(offer);\n\n let sdpoffer = __peerConnection[recipient].localDescription;\n this.log('rtcSdpOffer to', sdpoffer);\n\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: recipient,\n content: { sdpoffer },\n token: this.session.accessToken.jwtToken\n }));\n}\n\nasync function sendIceCandidate(event, recipient) {\n if (!this?.session?.accessToken?.jwtToken) {\n throw new SkapiError('Access token is required.', { code: 'INVALID_PARAMETER' });\n }\n this.log('sendIceCandidate to', recipient);\n\n let socket: WebSocket = await this.__socket;\n\n if (!event.candidate) {\n this.log('candidate-end', 'all ice candidates have been sent');\n return;\n }\n\n let callback = __rtcEvents[recipient] || (() => { });\n\n // Collect ICE candidates and send them to the remote peer\n let candidate = event.candidate;\n this.log('ice gathering state set to', __peerConnection[recipient].iceGatheringState);\n\n callback({\n type: 'icecandidate',\n target: __peerConnection[recipient],\n timestamp: new Date().toISOString(),\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment,\n protocol: event.candidate.protocol,\n gatheringState: __peerConnection[recipient].iceGatheringState,\n connectionState: __peerConnection[recipient].iceConnectionState\n });\n\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: recipient,\n content: { candidate },\n token: this.session.accessToken.jwtToken\n }));\n}\n\nfunction peerConnectionHandler(key: string, skipKey: string[]) {\n let skip = new Set(skipKey);\n let cb = __rtcEvents[key] || ((v: any) => { });\n let peer = __peerConnection[key];\n\n const handlers = {\n ontrack: (event: any) => {\n cb({\n type: 'track',\n target: peer,\n timeStamp: event.timeStamp,\n streams: event.streams,\n track: event.track,\n });\n },\n onicecandidate: (event: RTCPeerConnectionIceEvent) => {\n sendIceCandidate.bind(this)(event, key);\n if (event.candidate) {\n cb({\n type: 'icecandidate',\n target: peer,\n timestamp: new Date().toISOString(),\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment,\n protocol: event.candidate.protocol,\n gatheringState: peer.iceGatheringState,\n connectionState: peer.iceConnectionState\n });\n } else {\n cb({ type: 'icecandidateend', target: peer, timestamp: new Date().toISOString() });\n }\n },\n onicecandidateerror: (event: any) => {\n cb({\n type: 'icecandidateerror',\n target: peer,\n timestamp: new Date().toISOString(),\n errorCode: event.errorCode,\n errorText: event.errorText,\n url: event.url,\n hostCandidate: event.hostCandidate,\n gatheringState: peer.iceGatheringState,\n connectionState: peer.iceConnectionState\n });\n },\n oniceconnectionstatechange: () => {\n cb({\n type: 'iceconnectionstatechange',\n target: peer,\n timestamp: new Date().toISOString(),\n state: peer.iceConnectionState,\n gatheringState: peer.iceGatheringState,\n signalingState: peer.signalingState\n });\n },\n onicegatheringstatechange: () => {\n cb({\n type: 'icegatheringstatechange',\n target: peer,\n timestamp: new Date().toISOString(),\n state: peer.iceGatheringState,\n connectionState: peer.iceConnectionState,\n signalingState: peer.signalingState\n });\n },\n onsignalingstatechange: () => {\n cb({\n type: 'signalingstatechange',\n target: peer,\n timestamp: new Date().toISOString(),\n state: peer.signalingState,\n connectionState: peer.iceConnectionState,\n gatheringState: peer.iceGatheringState\n });\n },\n onnegotiationneeded: () => {\n sendOffer.bind(this)(key);\n cb({\n type: 'negotiationneeded',\n target: peer,\n timestamp: new Date().toISOString(),\n signalingState: peer.signalingState,\n connectionState: peer.iceConnectionState,\n gatheringState: peer.iceGatheringState\n });\n },\n onconnectionstatechange: () => {\n cb({\n type: 'connectionstatechange',\n target: peer,\n timestamp: new Date().toISOString(),\n state: peer.connectionState,\n iceState: peer.iceConnectionState,\n signalingState: peer.signalingState\n });\n\n let state = peer.connectionState;\n // Clean up on disconnection\n if (state === 'disconnected' || state === 'failed' || state === 'closed') {\n // Close all associated data channels\n closeRTC.bind(this)({ cid: key });\n }\n }\n };\n\n for (const [event, handler] of Object.entries(handlers)) {\n if (!skip.has(event)) {\n peer[event] = handler;\n }\n }\n}\n\nfunction handleDataChannel(key: string, dataChannel: RTCDataChannel, skipKey?: string[]) {\n let skip = new Set(skipKey);\n let cb = __rtcEvents[key] || ((v: any) => { });\n\n const events = {\n onmessage: (event) => {\n let msg = {\n type: event.type,\n target: dataChannel,\n timeStamp: event.timeStamp,\n data: event.data,\n lastEventId: event.lastEventId,\n origin: event.origin,\n readyState: dataChannel.readyState,\n bufferedAmount: dataChannel.bufferedAmount\n };\n this.log(`${dataChannel.label}: message`, event.data);\n cb(msg);\n },\n onerror: (event) => {\n let err = {\n type: event.type,\n target: dataChannel,\n timeStamp: event.timeStamp,\n error: event.error.message,\n errorCode: event.error.errorDetail,\n readyState: dataChannel.readyState,\n label: dataChannel.label\n };\n this.log(`${dataChannel.label}: error`, event.error.message);\n cb(err);\n },\n onclose: (event) => {\n let closed = {\n type: event.type,\n target: dataChannel,\n timeStamp: event.timeStamp,\n readyState: dataChannel.readyState,\n label: dataChannel.label,\n id: dataChannel.id\n };\n this.log(`${dataChannel.label}: closed`, null);\n cb(closed);\n\n if (__dataChannel[key]) {\n delete __dataChannel[key][dataChannel.label];\n if (Object.keys(__dataChannel[key]).length === 0) {\n closeRTC.bind(this)({ cid: key });\n }\n }\n },\n onbufferedamountlow: (event) => {\n let buffer = {\n target: dataChannel,\n bufferedAmount: dataChannel.bufferedAmount,\n bufferedAmountLowThreshold: dataChannel.bufferedAmountLowThreshold,\n type: event.type,\n timeStamp: event.timeStamp\n };\n this.log(`${dataChannel.label}: bufferedamountlow`, dataChannel.bufferedAmount);\n cb(buffer);\n },\n onopen: (event) => {\n this.log('dataChannel', `data channel: \"${dataChannel.label}\" is open and ready to send messages.`);\n let msg = {\n type: event.type,\n target: dataChannel,\n timeStamp: event.timeStamp,\n readyState: dataChannel.readyState,\n label: dataChannel.label,\n id: dataChannel.id,\n ordered: dataChannel.ordered,\n maxRetransmits: dataChannel.maxRetransmits,\n protocol: dataChannel.protocol\n };\n cb(msg);\n }\n };\n\n for (const [event, handler] of Object.entries(events)) {\n if (!skip.has(event)) {\n dataChannel[event] = handler;\n }\n }\n}\n\n\n","\nimport SkapiError from '../main/error';\nimport validator from '../utils/validator';\nimport { extractFormData } from '../utils/utils';\nimport { request } from '../utils/network';\nimport { DatabaseResponse, FetchOptions, RealtimeCallback, WebSocketMessage } from '../Types';\nimport { answerSdpOffer, receiveIceCandidate, __peerConnection, __receiver_ringing, closeRTC, respondRTC, __caller_ringing, __rtcEvents } from './webrtc';\nimport { getJwtToken } from './user';\n\n// let __roomList: {\n// [realTimeGroup: string]: {\n// [sender_id: string]: string[]; // connection id, (single person can have multiple connection id)\n// }\n// } = {};\n\nlet __current_socket_room: string;\nlet __keepAliveInterval = null;\nlet closedByIntention = true;\nlet reconnectAttempts = 0;\n\nasync function prepareWebsocket() {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebSocket is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n\n // Connect to the WebSocket server\n await this.getProfile();\n\n if (!this.session) {\n throw new SkapiError(`No access.`, { code: 'INVALID_REQUEST' });\n }\n\n let r = await this.record_endpoint;\n\n return new WebSocket(\n r.websocket_private + '?token=' + this.session.accessToken.jwtToken\n );\n}\n\n\nlet visibilitychange = null;\n\nexport async function closeRealtime(): Promise<void> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebSocket is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n closedByIntention = true;\n let socket: WebSocket = this.__socket ? await this.__socket : this.__socket;\n closeRTC.bind(this)({ close_all: true });\n\n if (__current_socket_room) {\n joinRealtime.bind(this)({ group: null });\n }\n\n // __roomList = {};\n reconnectAttempts = 0;\n\n if (__keepAliveInterval) {\n __keepAliveInterval.terminate();\n __keepAliveInterval = null;\n }\n\n try {\n if (socket) {\n socket.close();\n }\n }\n catch (e) { }\n\n window.removeEventListener('visibilitychange', visibilitychange);\n this.__socket = null;\n return null;\n}\n\nexport async function connectRealtime(cb: RealtimeCallback, delay = 50, reconnect?: string): Promise<WebSocket> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebSocket is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n if (typeof cb !== 'function') {\n throw new SkapiError(`Callback must be a function.`, { code: 'INVALID_REQUEST' });\n }\n\n if (reconnect === 'reconnect') {\n if (this.__socket instanceof Promise) {\n let socket = await this.__socket;\n if (socket.readyState !== WebSocket.CLOSED && socket.readyState !== WebSocket.CLOSING) {\n return this.__socket;\n }\n }\n }\n\n else if (closedByIntention) {\n // if the connection was closed intentionally, and it's not a reconnect attempt\n visibilitychange = () => {\n if (!document.hidden && !closedByIntention) {\n connectRealtime.bind(this)(cb, 0, 'reconnect');\n }\n }\n\n if (this.__socket instanceof Promise) {\n return this.__socket;\n }\n }\n\n if (__keepAliveInterval) {\n __keepAliveInterval.terminate();\n __keepAliveInterval = null;\n }\n\n this.__socket = new Promise(async (resolve) => {\n await getJwtToken.bind(this)();\n\n setTimeout(async () => {\n let socket: WebSocket = await prepareWebsocket.bind(this)();\n\n socket.onopen = () => {\n closedByIntention = false;\n reconnectAttempts = 0;\n\n if (reconnect !== 'reconnect') {\n window.addEventListener('visibilitychange', visibilitychange);\n }\n\n this.log('realtime onopen', 'Connected to WebSocket server.');\n cb({ type: 'success', message: 'Connected to WebSocket server.' });\n\n if (__current_socket_room) {\n socket.send(JSON.stringify({\n action: 'joinRoom',\n rid: __current_socket_room,\n token: this.session.accessToken.jwtToken\n }));\n }\n\n // // keep alive\n\n // Define worker script as a string\n const workerScript = /*js*/`\n let interval = 15000; // Set interval time 15 seconds\n\n function runInterval() {\n postMessage({ type: \"ping\" });\n setTimeout(runInterval, interval); // Use setTimeout instead of setInterval\n }\n\n runInterval(); // Start interval\n `;\n\n // Create a Blob URL for the worker\n const blob = new Blob([workerScript], { type: \"application/javascript\" });\n __keepAliveInterval = new Worker(URL.createObjectURL(blob));\n\n // Listen for messages from the worker\n __keepAliveInterval.onmessage = (event) => {\n if (socket.readyState === 1) {\n socket.send(JSON.stringify({\n action: 'keepAlive'\n }));\n }\n };\n\n resolve(socket);\n };\n\n socket.onmessage = async (event) => {\n let data = ''\n\n try {\n data = JSON.parse(decodeURI(event.data));\n this.log('socket onmessage', data);\n }\n catch (e) {\n return;\n }\n\n let type;\n switch (true) {\n case !!data?.['#message']:\n type = 'message';\n break;\n case !!data?.['#private']:\n type = 'private';\n break;\n case !!data?.['#notice']:\n type = 'notice';\n break;\n case !!data?.['#rtc']:\n type = 'rtc';\n break;\n case !!data?.['#error']:\n type = 'error';\n break;\n }\n\n if (!type) {\n return;\n }\n\n let msg: WebSocketMessage = {\n type,\n message: data?.['#rtc'] || data?.['#message'] || data?.['#private'] || data?.['#notice'] || data?.['#error'] || null,\n sender: data?.['#user_id'] || null,\n sender_cid: !!data?.['#scid'] ? \"cid:\" + data['#scid'] : null,\n sender_rid: data?.['#srid'] || null,\n code: data?.['#code'] || null\n };\n\n if (type === 'notice') {\n // if (__current_socket_room && (msg.code === 'USER_LEFT' || msg.code === 'USER_DISCONNECTED')) {\n // let user_id = msg.sender;\n // if (__roomList?.[__current_socket_room]?.[user_id]) {\n // __roomList[__current_socket_room][user_id] = __roomList[__current_socket_room][user_id].filter(v => v !== msg.sender_cid);\n // }\n\n // if (__roomList?.[__current_socket_room]?.[user_id] && __roomList[__current_socket_room][user_id].length === 0) {\n // delete __roomList[__current_socket_room][user_id];\n // }\n\n // if (__roomList?.[__current_socket_room]?.[user_id]) {\n // // user is still in the group don't call the callback\n // return\n // }\n // }\n // else if (__current_socket_room && msg.code === 'USER_JOINED') {\n // let user_id = msg.sender;\n // if (!__roomList?.[__current_socket_room]) {\n // __roomList[__current_socket_room] = {};\n // }\n // if (!__roomList[__current_socket_room][user_id]) {\n // __roomList[__current_socket_room][user_id] = [msg.sender_cid];\n // }\n // else {\n // if (!__roomList[__current_socket_room][user_id].includes(msg.sender_cid)) {\n // __roomList[__current_socket_room][user_id].push(msg.sender_cid);\n // }\n // return;\n // }\n // }\n cb(msg);\n }\n else if (type === 'rtc') {\n // rtc signaling\n if (msg.sender !== this.user.user_id) {\n let rtc = msg.message;\n if (rtc.hungup) {\n // otherside has hung up the call\n if (__caller_ringing[msg.sender_cid]) {\n __caller_ringing[msg.sender_cid](false);\n delete __caller_ringing[msg.sender_cid];\n }\n if (__receiver_ringing[msg.sender_cid]) {\n delete __receiver_ringing[msg.sender_cid];\n }\n if (__peerConnection?.[msg.sender_cid]) {\n closeRTC.bind(this)({ cid: msg.sender_cid });\n }\n msg.type = 'rtc:closed';\n cb(msg);\n return;\n }\n if (rtc.candidate) {\n receiveIceCandidate.bind(this)(rtc.candidate, msg.sender_cid);\n }\n if (rtc.sdpoffer) {\n answerSdpOffer.bind(this)(rtc.sdpoffer, msg.sender_cid);\n if (!__receiver_ringing[msg.sender_cid]) {\n __receiver_ringing[msg.sender_cid] = msg.sender_cid;\n delete msg.message;\n\n msg.connectRTC = respondRTC.bind(this)(msg);\n msg.type = 'rtc:incoming';\n msg.hangup = (() => {\n if (__peerConnection[msg.sender_cid]) {\n closeRTC.bind(this)({ cid: msg.sender_cid });\n }\n else if (__receiver_ringing[msg.sender_cid]) {\n delete __receiver_ringing[msg.sender_cid];\n socket.send(JSON.stringify({\n action: 'rtc',\n uid: msg.sender_cid,\n content: { hungup: this.user.user_id },\n token: this.session.accessToken.jwtToken\n }));\n }\n }).bind(this);\n\n cb(msg);\n }\n }\n if (rtc.pickup) {\n // receiver has answered the call\n if (__caller_ringing[msg.sender_cid]) {\n __caller_ringing[msg.sender_cid](true);\n delete __caller_ringing[msg.sender_cid];\n }\n }\n if (rtc.sdpanswer) {\n if (__peerConnection[msg.sender_cid]) {\n // receive answer from the receiver\n if (__peerConnection[msg.sender_cid].signalingState === 'have-local-offer') {\n await __peerConnection[msg.sender_cid].setRemoteDescription(new RTCSessionDescription(rtc.sdpanswer));\n }\n else {\n throw new SkapiError(`Invalid signaling state.`, { code: 'INVALID_REQUEST' });\n }\n }\n }\n }\n }\n else {\n cb(msg);\n }\n };\n\n socket.onclose = () => {\n if (closedByIntention) {\n this.log('realtime onclose', 'WebSocket connection closed.');\n cb({ type: 'close', message: 'WebSocket connection closed.' });\n }\n else {\n this.log('realtime onclose', 'WebSocket unexpected close.');\n cb({ type: 'error', message: 'Skapi: WebSocket unexpected close.' });\n\n reconnectAttempts++;\n if (reconnectAttempts < 3) {\n this.log('realtime onclose', 'Reconnecting to WebSocket server...' + reconnectAttempts);\n cb({ type: 'reconnect', message: 'Reconnecting to WebSocket server...' + reconnectAttempts });\n connectRealtime.bind(this)(cb, 3000, 'reconnect');\n }\n else {\n this.log('realtime onclose', 'Max reconnection attempts reached.');\n cb({ type: 'error', message: 'Skapi: Max reconnection attempts reached.' });\n }\n }\n };\n\n socket.onerror = () => {\n this.log('realtime onerror', 'WebSocket connection error.');\n cb({ type: 'error', message: 'Skapi: WebSocket connection error.' });\n };\n }, delay);\n });\n}\n\n\nexport async function postRealtime(message: any, recipient: string, notification?: { config?: { always: boolean; }; title: string; body: string; }): Promise<{ type: 'success', message: 'Message sent.' }> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebSocket is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n let socket: WebSocket = this.__socket ? await this.__socket : this.__socket;\n\n if (!socket) {\n throw new SkapiError(`No realtime connection. Execute connectRealtime() before this method.`, { code: 'INVALID_REQUEST' });\n }\n\n if (!recipient) {\n throw new SkapiError(`No recipient.`, { code: 'INVALID_REQUEST' });\n }\n\n await getJwtToken.bind(this)();\n\n message = extractFormData(message).data;\n\n let notificationStr = '';\n if (notification) {\n notification = validator.Params(\n notification,\n {\n config: {\n always: 'boolean'\n },\n title: 'string',\n body: 'string'\n },\n ['title', 'body']\n );\n // stringify notification and check if size exceeds 3kb\n notificationStr = JSON.stringify({ title: notification.title, body: notification.body });\n let notificationSize = new Blob([notificationStr]).size;\n if (notificationSize > 3072) {\n throw new SkapiError(`Notification size exceeds 3kb.`, { code: 'INVALID_PARAMETER' });\n }\n }\n\n if (socket.readyState === 1) {\n try {\n validator.UserId(recipient);\n socket.send(JSON.stringify({\n action: 'sendMessage',\n uid: recipient,\n content: message,\n notification: notificationStr,\n notificationConfig: notification?.config || {},\n // token: this.session.accessToken.jwtToken\n token: `IdT:${this.service}:${this.owner}:` + (this.bearerToken || this.session?.idToken?.jwtToken || 'null')\n }));\n\n } catch (err) {\n this.log('postRealtime:err', { err });\n if (__current_socket_room !== recipient) {\n throw new SkapiError(`User has not joined to the recipient group. Run joinRealtime({ group: \"${recipient}\" })`, { code: 'INVALID_REQUEST' });\n }\n\n socket.send(JSON.stringify({\n action: 'broadcast',\n rid: recipient,\n content: message,\n notification: notificationStr,\n notificationConfig: notification?.config || {},\n // token: this.session.accessToken.jwtToken,\n token: `IdT:${this.service}:${this.owner}:` + (this.bearerToken || this.session?.idToken?.jwtToken || 'null')\n }));\n }\n\n return { type: 'success', message: 'Message sent.' };\n }\n\n throw new SkapiError('Realtime connection is not open. Try reconnecting with connectRealtime().', { code: 'INVALID_REQUEST' });\n}\n\nexport async function joinRealtime(params: { group?: string | null }): Promise<{ type: 'success', message: string }> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('WebSocket is not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n let socket: WebSocket = this.__socket ? await this.__socket : this.__socket;\n\n if (!socket) {\n throw new SkapiError(`No realtime connection. Execute connectRealtime() before this method.`, { code: 'INVALID_REQUEST' });\n }\n\n await getJwtToken.bind(this)();\n params = extractFormData(params, { nullIfEmpty: true }).data;\n\n let { group = null } = params;\n if (!group && !__current_socket_room) {\n return { type: 'success', message: 'Left realtime message group.' }\n }\n\n if (group !== null && typeof group !== 'string') {\n throw new SkapiError(`\"group\" must be a string | null.`, { code: 'INVALID_PARAMETER' });\n }\n\n socket.send(JSON.stringify({\n action: 'joinRoom',\n rid: group,\n token: this.session.accessToken.jwtToken\n }));\n\n __current_socket_room = group;\n\n return { type: 'success', message: group ? `Joined realtime message group: \"${group}\".` : 'Left realtime message group.' }\n}\n\nexport async function getRealtimeUsers(params: { group: string, user_id?: string }, fetchOptions?: FetchOptions): Promise<DatabaseResponse<{ user_id: string; cid: string }[]>> {\n params = validator.Params(\n params,\n {\n user_id: (v: string) => validator.UserId(v, 'User ID in \"user_id\"'),\n group: ['string', () => {\n if (!__current_socket_room) {\n throw new SkapiError(`No group has been joined. Otherwise \"group\" is required.`, { code: 'INVALID_REQUEST' });\n }\n return __current_socket_room;\n }]\n }\n );\n\n let res = await request.bind(this)(\n 'get-ws-group',\n params,\n {\n fetchOptions,\n auth: true,\n method: 'post'\n }\n );\n\n res.list = res.list.map((v: any) => {\n let user_id = v.uid.split('#')[1];\n // if (!params.user_id) {\n // if (!__roomList[params.group]) {\n // __roomList[params.group] = {};\n // }\n // if (!__roomList[params.group][user_id]) {\n // __roomList[params.group][user_id] = [v.cid];\n // }\n // else if (!__roomList[params.group][user_id].includes(v.cid)) {\n // __roomList[params.group][user_id].push(v.cid);\n // }\n // }\n\n return {\n user_id,\n cid: \"cid:\" + v.cid\n }\n });\n\n return res;\n}\n\nexport async function getRealtimeGroups(\n params?: {\n /** Index name to search. */\n searchFor: 'group' | 'number_of_users';\n /** Index value to search. */\n value?: string | number;\n /** Search condition. */\n condition?: '>' | '>=' | '=' | '<' | '<=' | '!=' | 'gt' | 'gte' | 'eq' | 'lt' | 'lte' | 'ne';\n /** Range of search. */\n range?: string | number;\n } | null,\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<{ group: string; number_of_users: number; }>> {\n await this.__connection;\n\n if (!params) {\n params = { searchFor: 'group', value: ' ', condition: '>' };\n }\n\n params = validator.Params(\n params,\n {\n searchFor: ['group', 'number_of_users', () => 'group'],\n value: ['string', 'number', () => {\n if (params?.searchFor && params?.searchFor === 'number_of_users') {\n return 0;\n }\n\n return ' ';\n }],\n condition: ['>', '>=', '=', '<', '<=', '!=', 'gt', 'gte', 'eq', 'lt', 'lte', 'ne'],\n range: ['string', 'number']\n }\n );\n\n if (!params.condition) {\n if (params.value === ' ' || !params.value) {\n params.condition = '>';\n }\n else {\n params.condition = '=';\n }\n }\n\n if (params.range && params.condition) {\n delete params.condition;\n }\n\n if (params.searchFor === 'number_of_users' && typeof params.value !== 'number') {\n throw new SkapiError(`\"value\" must be a number.`, { code: 'INVALID_PARAMETER' });\n }\n if (params.searchFor === 'group' && typeof params.value !== 'string') {\n throw new SkapiError(`\"value\" must be a string.`, { code: 'INVALID_PARAMETER' });\n }\n if (params.hasOwnProperty('range') && typeof params.range !== typeof params.value) {\n throw new SkapiError(`\"range\" must be a ${typeof params.value}.`, { code: 'INVALID_PARAMETER' });\n }\n\n let res = await request.bind(this)(\n 'get-ws-group',\n params,\n {\n fetchOptions,\n auth: true,\n method: 'post'\n }\n )\n\n res.list = res.list.map((v: any) => {\n return {\n group: v.rid.split('#')[1],\n number_of_users: v.cnt\n }\n });\n\n return res;\n}","import {\n\tForm,\n\tFetchOptions,\n\tProgressCallback,\n\tDatabaseResponse,\n\tRequestHistory,\n} from '../Types';\nimport SkapiError from '../main/error';\nimport validator from '../utils/validator';\nimport { request } from '../utils/network';\nimport { extractFormData, generateRandom } from '../utils/utils';\nimport Qpass from \"qpass\";\n\nconst hasFormData = typeof FormData !== 'undefined';\nconst hasHTMLFormElement = typeof HTMLFormElement !== 'undefined';\nconst hasSubmitEvent = typeof SubmitEvent !== 'undefined';\n\nlet queuePromiseList: {\n\t[polling_name: string]: Qpass\n} = {};\n\nlet queueJobId: {\n\t[full_id: string]: string;\n} = {};\n\n/**\n * Live polls, keyed by the full request id, so a caller can stop one it already\n * started. Without this the setInterval below is unreachable from outside: it is a\n * closure local and is only ever cleared when the request settles, so a request that\n * never settles polls forever — and because polls run through Qpass with batchSize 1,\n * it also blocks every poll queued behind it on the same queue.\n */\nlet activePolls: {\n\t[full_id: string]: {\n\t\tstop: (() => void) | null;\n\t\taborted: boolean;\n\t\tqueue?: string;\n\t};\n} = {};\n\n/**\n * Value a stopped poll resolves with. Deliberately a RESOLVE, not a reject: callers\n * await these promises in many places without a rejection handler, and turning a stop\n * into a rejection would surface as an error state in their UI (and, where a `.catch`\n * already exists for real failures, would run the failure path).\n */\nfunction stoppedResult(id: string) {\n\treturn Object.freeze({ id, status: 'stopped' });\n}\n\n/**\n * True if a poll result came from stopPolling rather than the server. Consumers that\n * cannot import from this package can duck-type the same check (`res.status === 'stopped'`).\n */\nexport function isPollStopped(res: any): boolean {\n\treturn !!res && typeof res === 'object' && (res as any).status === 'stopped';\n}\n\nfunction pollClientSecretResponse(\n\tthis: any,\n\t{\n\t\tid,\n\t\tauth,\n\t\tservice,\n\t\towner,\n\t\tlatency = 1000,\n\t\tqueue,\n\t\tonResponse,\n\t\tonError\n\t}: {\n\t\tid: string;\n\t\tauth: boolean;\n\t\tservice?: any;\n\t\towner?: any;\n\t\tlatency?: number;\n\t\tqueue?: string;\n\t\tonResponse?: (res: any) => void;\n\t\tonError?: (err: any) => void;\n\t},\n):any | void {\n\tif (typeof latency !== 'number') {\n\t\tthrow new SkapiError('\"latency\" should be a number.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\n\tif (latency < 0) {\n\t\tthrow new SkapiError('\"latency\" should be a non-negative number.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\n\tif (queue && !queuePromiseList?.[queue]) {\n\t\tqueuePromiseList[queue] = new Qpass({\n\t\t\tbreakWhenError: false,\n\t\t\tbatchSize: 1\n\t\t});\n\t}\n\n\t// One registry entry per poll invocation. `stop` is filled in as soon as there is\n\t// something to stop; a stop that arrives while the job is still WAITING in the Qpass\n\t// queue sets `aborted` instead, which the job checks when it eventually starts.\n\tlet entry: { stop: (() => void) | null; aborted: boolean; queue?: string } = {\n\t\tstop: null,\n\t\taborted: false,\n\t\tqueue,\n\t};\n\tactivePolls[id] = entry;\n\tlet release = () => {\n\t\tif (activePolls[id] === entry) delete activePolls[id];\n\t};\n\n\tlet prom = () => new Promise<any>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tif (entry.aborted) {\n\t\t\t// Stopped before this job ever got a turn.\n\t\t\trelease();\n\t\t\tresolve(stoppedResult(id));\n\t\t\treturn;\n\t\t}\n\t\tlet interval = setInterval(async () => {\n\t\t\ttry {\n\t\t\t\tlet result = await request.bind(this)(\n\t\t\t\t\t'csr-poll',\n\t\t\t\t\t{\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tservice,\n\t\t\t\t\t\towner,\n\t\t\t\t\t},\n\t\t\t\t\t{ auth },\n\t\t\t\t);\n\n\t\t\t\tif (result.status === 'running' || result.status === 'pending') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (onResponse)\n\t\t\t\t\tonResponse(result);\n\t\t\t\tclearInterval(interval);\n\t\t\t\trelease();\n\t\t\t\tresolve(result);\n\t\t\t} catch (e) {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (onError)\n\t\t\t\t\tonError(e);\n\t\t\t\tclearInterval(interval);\n\t\t\t\trelease();\n\t\t\t\treject(e);\n\t\t\t}\n\t\t}, latency);\n\t\tentry.stop = () => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearInterval(interval);\n\t\t\trelease();\n\t\t\t// onResponse/onError are deliberately NOT called: a stop is not a result,\n\t\t\t// and firing them would make callers render a reply that never arrived.\n\t\t\tresolve(stoppedResult(id));\n\t\t};\n\t});\n\n\t// Exposed on the returned promise so a caller holding it can stop this exact poll\n\t// without having to reconstruct the full request id.\n\tlet publicStop = () => {\n\t\tlet e = activePolls[id];\n\t\tif (!e) return; // already settled\n\t\tif (e.stop) e.stop();\n\t\telse {\n\t\t\te.aborted = true;\n\t\t\tdelete activePolls[id];\n\t\t}\n\t};\n\n\tif (queue) {\n\t\tlet outer = new Promise<any>((resolve, reject) => {\n\t\t\tlet outerSettled = false;\n\t\t\tlet jobId = queuePromiseList[queue].add([async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlet result = await prom();\n\t\t\t\t\tif (!outerSettled) {\n\t\t\t\t\t\touterSettled = true;\n\t\t\t\t\t\tresolve(result);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (!outerSettled) {\n\t\t\t\t\t\touterSettled = true;\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t}\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}])[0];\n\t\t\tqueueJobId[id] = jobId;\n\t\t\t// Stopping a job that has not started yet must ALSO drop it from the queue,\n\t\t\t// or its batchSize-1 slot stays occupied and everything behind it stalls —\n\t\t\t// and must settle this outer promise, or the caller awaits forever.\n\t\t\tentry.stop = () => {\n\t\t\t\tif (outerSettled) return;\n\t\t\t\tentry.aborted = true;\n\t\t\t\ttry {\n\t\t\t\t\tif (queuePromiseList[queue]) {\n\t\t\t\t\t\tqueuePromiseList[queue].remove(queueJobId[id]);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) { /* already started or already removed */ }\n\t\t\t\tdelete queueJobId[id];\n\t\t\t\trelease();\n\t\t\t\touterSettled = true;\n\t\t\t\tresolve(stoppedResult(id));\n\t\t\t};\n\t\t});\n\t\treturn Object.assign(outer, { stop: publicStop });\n\t}\n\telse {\n\t\treturn Object.assign(prom(), { stop: publicStop });\n\t}\n}\n\n/**\n * Stop live polls. Returns how many were stopped.\n *\n * Matched by full request id when `id` is given, otherwise by queue. Note the two poll\n * call sites pass DIFFERENT queue namespaces — the dispatch path passes the caller's\n * queue string, the history path passes the server-side qid — so a queue match only\n * reaches the polls that were started with that same string. Prefer stopping by id.\n */\nexport function stopClientSecretPolling(\n\tthis: any,\n\tparams: {\n\t\turl?: string;\n\t\tmethod?: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\tid?: string;\n\t\tqueue?: string;\n\t\tservice?: string;\n\t\towner?: string;\n\t},\n): number {\n\tlet stopped = 0;\n\tlet ids: string[] = [];\n\n\tif (params?.id) {\n\t\tif (params.url && params.method) {\n\t\t\tlet service = params.service || this.service;\n\t\t\tids.push(\n\t\t\t\t`[${params.method.toUpperCase()}]${params.url.toLowerCase()}#${service}:${params.id}`,\n\t\t\t);\n\t\t}\n\t\t// Also accept an already-full id, so callers holding the registry key work.\n\t\tids.push(params.id);\n\t} else if (params?.queue) {\n\t\tfor (let key in activePolls) {\n\t\t\tif (activePolls[key]?.queue === params.queue) ids.push(key);\n\t\t}\n\t} else {\n\t\tfor (let key in activePolls) ids.push(key);\n\t}\n\n\tfor (let key of ids) {\n\t\tlet entry = activePolls[key];\n\t\tif (!entry) continue;\n\t\tif (entry.stop) {\n\t\t\tentry.stop();\n\t\t} else {\n\t\t\t// Queued but not started, and no stop published yet: mark it so the job\n\t\t\t// short-circuits the moment it gets a turn.\n\t\t\tentry.aborted = true;\n\t\t\tdelete activePolls[key];\n\t\t}\n\t\tstopped += 1;\n\t}\n\n\treturn stopped;\n}\n\nexport function clientSecretRequestQueueCount(\n\tparams: { service?: string; owner?: string; queue: string },\n\tfetchOptions?: FetchOptions\n): Promise<\n\t{\n\t\tqueue_name: string;\n\t\tin_queue: number; // number of requests in the queue that are waiting to be processed.\n\t}\n> {\n\tif (!params.queue) {\n\t\tthrow new SkapiError('\"queue\" is required.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\n\tlet p = {\n\t\tservice: params.service || this.service,\n\t\towner: params.owner || this.owner,\n\t\tqueue: params.queue + ':',\n\t}\n\n\treturn request.bind(this)('csr-poll', p, { auth: true });\n};\n\nexport async function clientSecretRequest(params: {\n\turl: string;\n\tclientSecretName: string;\n\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\theaders?: { [key: string]: string };\n\tdata?: { [key: string]: any };\n\tparams?: { [key: string]: string };\n\tpoll?: number; // enable polling with specified latency in ms.\n\tqueue?: string; // optional queue name to distinguish requests with same url and method. Only effective when polling is enabled. Requests with the same url, method and queue will be handled sequentially on the server side.\n\texpires?: number; // optional history expiration time in seconds after it's resolved.\n\tonResponse?: (res: any) => void; // response callback that works on both polling request and regular.\n\tonError?: (err: any) => void; // error callback that works on both pollubg request error and regular.\n}): Promise<any | void | {\n\tid: string; // request id: \"stamp:entropy\"\n\tstatus: \"pending\";\n\tqueue_name: string;\n\tin_queue: number;\n\tpoll?: (arg?: { latency?: number }) => Promise<any>;\n}> {\n\tlet hasSecret = false;\n\n\tif (typeof params.poll === 'number' && params.poll < 0) {\n\t\tthrow new SkapiError('\"poll\" should be a non-negative number.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\tlet onResponse = params?.onResponse;\n\tlet onError = params?.onError;\n\tlet latency = typeof params.poll === 'number' ? params.poll : params.poll ? 1000 : 0;\n\tdelete params.poll;\n\n\tif (latency && !params.queue) {\n\t\t// create random queue id\n\t\tparams.queue = (this.__user?.user_id || \"anonymous\") + \"-\" + generateRandom();\n\t}\n\n\tlet checkClientSecretPlaceholder = (v: any) => {\n\t\tfor (let k in v) {\n\t\t\tif (typeof v[k] === 'string' && v[k].includes('$CLIENT_SECRET')) {\n\t\t\t\thasSecret = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\tparams = validator.Params(\n\t\tparams,\n\t\t{\n\t\t\turl: (v: string) => {\n\t\t\t\tif (!v || typeof v !== 'string') {\n\t\t\t\t\tthrow new SkapiError('\"url\" should be type: <string>.', {\n\t\t\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tvalidator.Url(v);\n\t\t\t\tif (v.includes('$CLIENT_SECRET')) {\n\t\t\t\t\thasSecret = true;\n\t\t\t\t}\n\t\t\t\treturn v;\n\t\t\t},\n\t\t\tclientSecretName: 'string',\n\t\t\tmethod: (v: string) => {\n\t\t\t\tif (v && typeof v !== 'string') {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'\"method\" should be either \"GET\" or \"POST\" or \"DELETE\" or \"PUT\".',\n\t\t\t\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tlet lo = v.toLowerCase();\n\t\t\t\tif (\n\t\t\t\t\tlo !== 'get' &&\n\t\t\t\t\tlo !== 'post' &&\n\t\t\t\t\tlo !== 'delete' &&\n\t\t\t\t\tlo !== 'put'\n\t\t\t\t) {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'\"method\" should be either \"GET\" or \"POST\" or \"DELETE\" or \"PUT\".',\n\t\t\t\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn lo;\n\t\t\t},\n\t\t\theaders: (v: any) => {\n\t\t\t\tif (v && typeof v !== 'object') {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'\"headers\" should be type: <object>.',\n\t\t\t\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcheckClientSecretPlaceholder(v);\n\t\t\t\treturn v;\n\t\t\t},\n\t\t\tdata: (v: any) => {\n\t\t\t\tif (v && typeof v !== 'object') {\n\t\t\t\t\tthrow new SkapiError('\"data\" should be type: <object>.', {\n\t\t\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcheckClientSecretPlaceholder(v);\n\t\t\t\treturn v;\n\t\t\t},\n\t\t\tparams: (v: any) => {\n\t\t\t\tif (v && typeof v !== 'object') {\n\t\t\t\t\tthrow new SkapiError('\"params\" should be type: <object>.', {\n\t\t\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcheckClientSecretPlaceholder(v);\n\t\t\t\treturn v;\n\t\t\t},\n\t\t\texpires: 'number',\n\t\t\tqueue: 'string',\n\t\t},\n\t\t['clientSecretName', 'method', 'url'],\n\t);\n\n\tif (!hasSecret) {\n\t\tthrow new SkapiError(\n\t\t\t`At least one parameter value should include \"$CLIENT_SECRET\" in ${params.method.toLowerCase() === 'post' ? '\"data\"' : '\"params\"'} or \"headers\".`,\n\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t);\n\t}\n\n\tawait this.__connection;\n\tlet auth = !!this.__user;\n\n\tlet req_prom = () => {\n\t\treturn request\n\t\t\t.bind(this)('csr', params, {\n\t\t\t\tauth,\n\t\t\t\ttokenHeaders: {\n\t\t\t\t\taccessToken: !!auth,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.then((res) => {\n\t\t\t\tif (res.status === 'running' || res.status === 'pending') {\n\t\t\t\t\tlet url = `[${params.method.toUpperCase()}]${params.url.toLowerCase()}`;\n\t\t\t\t\tlet serviceId = params.service || this.service;\n\t\t\t\t\tlet ownerId = params.owner || this.owner;\n\t\t\t\t\tlet fullId = `${url}#${serviceId}:${res.id}`;\n\t\t\t\t\tObject.assign(res, {\n\t\t\t\t\t\t// NOT async: an async arrow returns a NEW native promise wrapping the\n\t\t\t\t\t\t// result, which discards the `stop` handle pollClientSecretResponse\n\t\t\t\t\t\t// attaches to the promise it returns. The caller would then hold an\n\t\t\t\t\t\t// unstoppable poll. pollClientSecretResponse already returns a\n\t\t\t\t\t\t// promise, so awaiting this is unchanged.\n\t\t\t\t\t\tpoll: (arg?: { latency?: number }) => pollClientSecretResponse.call(this, {\n\t\t\t\t\t\t\tid: fullId,\n\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\tservice: serviceId,\n\t\t\t\t\t\t\towner: ownerId,\n\t\t\t\t\t\t\tlatency: arg?.latency || 1000,\n\t\t\t\t\t\t\tqueue: params?.queue,\n\t\t\t\t\t\t\tonResponse,\n\t\t\t\t\t\t\tonError\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (onResponse) return onResponse(res);\n\t\t\t\treturn res;\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tif (onError) return onError(err);\n\t\t\t\tthrow err;\n\t\t\t});\n\t};\n\n\tif (params?.queue) {\n\t\tlet base_queue = 'base:' + params.queue;\n\n\t\tif (!queuePromiseList?.[base_queue]) {\n\t\t\tqueuePromiseList[base_queue] = new Qpass({\n\t\t\t\tbreakWhenError: false,\n\t\t\t\tbatchSize: 1\n\t\t\t});\n\t\t}\n\n\t\treturn new Promise<any>((resolve, reject) => {\n\t\t\tqueuePromiseList[base_queue].add([async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlet result = await req_prom();\n\n\t\t\t\t\tif (latency > 0) {\n\t\t\t\t\t\tlet polling = result.poll({latency});\n\t\t\t\t\t\tresolve(polling);\n\t\t\t\t\t\treturn polling;\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(result);\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (err) {\n\t\t\t\t\treject(err);\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}]);\n\t\t});\n\t}\n\telse {\n\t\treturn req_prom();\n\t}\n}\n\nexport async function clientSecretRequestHistory(\n\tparams: {\n\t\turl: string;\n\t\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\tqueue?: string;\n\t\tstatus?: 'pending' | 'running' | 'resolved' | 'failed';\n\t\t/** Compact listing: each item carries label/marker STUBS (request_text,\n\t\t * response_text, response_complete_marker) INSTEAD of the full\n\t\t * request_body/response_body, which never leave the server. Enough to\n\t\t * list, label and color rows; re-fetch without `compact` (or poll the\n\t\t * item) when a full body is actually needed. */\n\t\tcompact?: boolean;\n\t\t/** Only rows belonging to exactly `queue`. Without it the queue lookup\n\t\t * is a PREFIX range, so queue \"u1\" also matches \"u1-bg\". The filter is\n\t\t * applied server-side after the range read, so a page may come back\n\t\t * short (or empty) while more matches remain — keep paging by\n\t\t * startKey/endOfList as usual. */\n\t\tqueue_exact?: boolean;\n\t\t/** Drop one queue's rows from the listing — e.g. fetch a chat surface\n\t\t * WITHOUT its background queue. Same short-page caveat as\n\t\t * `queue_exact`. */\n\t\tqueue_exclude?: string;\n\t},\n\tfetchOptions?: FetchOptions,\n): Promise<\n\tDatabaseResponse<RequestHistory[]>\n> {\n\tawait this.__connection;\n\n\t// Capture before validator strips unknown fields\n\tlet service = (params as any).service || this.service;\n\tlet owner = (params as any).owner || this.owner;\n\n\tparams = validator.Params(\n\t\tparams,\n\t\t{\n\t\t\turl: 'string',\n\t\t\tmethod: ['GET', 'POST', 'DELETE', 'PUT'],\n\t\t\tqueue: 'string',\n\t\t\tstatus: ['pending', 'running', 'resolved', 'failed'],\n\t\t\t// Listing modifiers (see the polling lambda): `compact` returns\n\t\t\t// label/marker STUBS instead of full request/response bodies;\n\t\t\t// `queue_exact` post-filters the qid prefix range to the named\n\t\t\t// queue (without it, queue \"u1\" also matches \"u1-bg\");\n\t\t\t// `queue_exclude` drops one queue's rows from an id-prefix listing\n\t\t\t// (how a chat fetches its surface WITHOUT the bg-indexing queue).\n\t\t\tcompact: 'boolean',\n\t\t\tqueue_exact: 'boolean',\n\t\t\tqueue_exclude: 'string',\n\t\t},\n\t\t['url', 'method'],\n\t);\n\n\tlet auth = !!this.__user;\n\tlet id = `[${params.method.toUpperCase()}]${params.url.toLowerCase()}#${service}:`;\n\n\tlet his_req: any = { id, queue: params?.queue, status: params?.status, service, owner };\n\tif (params?.compact) his_req.compact = true;\n\tif (params?.queue_exact) his_req.queue_exact = true;\n\tif (params?.queue_exclude) his_req.queue_exclude = params.queue_exclude;\n\n\tObject.keys(his_req).forEach((k) => {\n\t\tif (!his_req[k]) {\n\t\t\tdelete his_req[k];\n\t\t}\n\t});\n\n\tif (his_req.queue) {\n\t\t// A QUEUE name carries no provider: the background-indexing queue is\n\t\t// \"<userId>-bg\" for BOTH the Claude chat and the ChatGPT chat of the\n\t\t// same project. Dropping the id (which begins\n\t\t// \"[POST]<provider url>#<service>:\") therefore made every queue listing\n\t\t// span both platforms — the other platform's indexing passes and\n\t\t// attachment-send turns surfaced in a chat they do not belong to, where\n\t\t// nothing could ever confirm or cover them. The id cannot stay as `id`\n\t\t// (that selects a different query path server-side), so it is sent as a\n\t\t// FILTER instead. Requires the updated polling lambda; older backends\n\t\t// reject unknown keys, so this ships after that deploy.\n\t\this_req.id_prefix = his_req.id;\n\t\tdelete his_req.id;\n\t}\n\n\tlet res = await request.bind(this)(\n\t\t'csr-poll',\n\t\this_req,\n\t\t{ auth, fetchOptions },\n\t);\n\n\tres.list = res.list.map((item: any) => {\n\t\tlet result = {\n\t\t\tid: item.id,\n\t\t\tstatus_code: item.rslv?.status_code || null,\n\t\t\tresponse_body: item.rslv?.body || item.rslv?.truncated || null,\n\t\t\terror: item?.err,\n\t\t\t// `stmp` is stamped once when the request is created and never rewritten;\n\t\t\t// `utmp` moves on every status change. So `created` is the request time and\n\t\t\t// `updated` is the time of the latest response/status change.\n\t\t\tcreated: item?.stmp,\n\t\t\tupdated: item?.utmp,\n\t\t\trequest_body: item?.reqbdy,\n\t\t\texpires: item?.expt,\n\t\t\tstatus: item.stts,\n\t\t\tqueue_name: item?.qid,\n\t\t\t// Compact-listing stubs (only present when `compact` was requested):\n\t\t\t// the label line of the request, the head of the response, whether\n\t\t\t// the reply carried the indexing completion marker, and the flag\n\t\t\t// itself so consumers know bodies were deliberately omitted.\n\t\t\trequest_text: item?.reqtxt,\n\t\t\tresponse_text: item?.rslvtxt,\n\t\t\tresponse_complete_marker: item?.rslvmk != null ? !!item.rslvmk : undefined,\n\t\t\tcompact: item?.cmpct ? true : undefined,\n\t\t};\n\t\tfor (let k in result) {\n\t\t\tif (result[k] === undefined) {\n\t\t\t\tdelete result[k];\n\t\t\t}\n\t\t}\n\t\tif (result.status === 'running' || result.status === 'pending') {\n\t\t\tresult.poll = (arg?: {\n\t\t\t\tlatency?: number;\n\t\t\t\tonResponse?: (res: any) => void;\n\t\t\t\tonError?: (err: any) => void;\n\t\t\t}) => pollClientSecretResponse.call(this, {\n\t\t\t\tid: id + result.id,\n\t\t\t\tauth,\n\t\t\t\tservice: service,\n\t\t\t\towner: owner,\n\t\t\t\tlatency: arg?.latency || 1000,\n\t\t\t\tqueue: item?.qid,\n\t\t\t\tonResponse: arg?.onResponse,\n\t\t\t\tonError: arg?.onError\n\t\t\t})\n\t\t}\n\t\treturn result;\n\t});\n\n\treturn res;\n}\n\nexport async function cancelClientSecretRequest(params: {\n\turl: string;\n\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\tid: string;\n\tqueue?: string;\n}): Promise<{ removed: boolean; message: string }> {\n\tawait this.__connection;\n\n\tparams = validator.Params(\n\t\tparams,\n\t\t{\n\t\t\turl: 'string',\n\t\t\tmethod: ['GET', 'POST', 'DELETE', 'PUT'],\n\t\t\tid: 'string',\n\t\t\tqueue: 'string'\n\t\t},\n\t\t['url', 'method', 'id'],\n\t);\n\n\tlet service = params?.service || this.service;\n\tlet owner = params?.owner || this.owner;\n\tlet auth = !!this.__user;\n\tlet base_id = `[${params.method.toUpperCase()}]${params.url.toLowerCase()}#${service}`;\n\tlet id = params.id\n\tlet fullId = `${base_id}:${id}`;\n\tlet queue = params?.queue;\n\n\tif (queue && queuePromiseList?.[queue]) {\n\t\tqueuePromiseList[queue].remove(queueJobId[fullId]);\n\t\tdelete queueJobId[fullId];\n\t}\n\n\treturn request.bind(this)('csr-cancel', { id: fullId, service, owner }, { auth });\n}\n\nexport async function sendInquiry(\n\tdata: Form<{\n\t\tname: string;\n\t\temail: string;\n\t\tsubject: string;\n\t\tmessage: string;\n\t}>,\n): Promise<'SUCCESS: Inquiry has been sent.'> {\n\tawait this.__connection;\n\n\tlet params = {\n\t\tname: 'string',\n\t\temail: (v) => {\n\t\t\tvalidator.Email(v);\n\t\t\treturn v;\n\t\t},\n\t\tsubject: 'string',\n\t\tmessage: 'string',\n\t};\n\n\tdata = validator.Params(data, params, [\n\t\t'name',\n\t\t'email',\n\t\t'subject',\n\t\t'message',\n\t]);\n\n\tawait request.bind(this)('send-inquiry', data);\n\n\treturn 'SUCCESS: Inquiry has been sent.';\n}\n\nexport async function secureRequest<\n\tRequestParams = {\n\t\t/** Request url */\n\t\turl: string;\n\t\t/** Request data */\n\t\tdata?: any;\n\t\t/** requests are sync when true */\n\t\tsync?: boolean;\n\t},\n\tResponse = { response: any; statusCode: number; url: string },\n>(\n\tparams: RequestParams[] | Form<RequestParams>,\n\turl?: string,\n): Promise<Response | Response[]> {\n\tawait this.__connection;\n\n\tif (\n\t\t(hasFormData && params instanceof FormData) ||\n\t\t(hasHTMLFormElement && params instanceof HTMLFormElement) ||\n\t\t(hasSubmitEvent && params instanceof SubmitEvent)\n\t) {\n\t\tif (!url) {\n\t\t\tthrow new SkapiError(\n\t\t\t\t'Url string as a second argument is required when form is passed.',\n\t\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t\t);\n\t\t}\n\n\t\tlet formData = extractFormData(params);\n\n\t\tparams = {\n\t\t\turl,\n\t\t\tdata: formData.data,\n\t\t\tsync: true,\n\t\t} as Form<RequestParams>;\n\t}\n\n\tlet paramsStruct = {\n\t\turl: (v: string) => {\n\t\t\treturn validator.Url(v);\n\t\t},\n\t\tdata: (v) => v,\n\t\tsync: ['boolean', () => true],\n\t};\n\n\tif (Array.isArray(params)) {\n\t\tfor (let r of params) {\n\t\t\tr = validator.Params(r, paramsStruct);\n\t\t}\n\t} else {\n\t\tparams = validator.Params(params, paramsStruct);\n\t}\n\n\treturn request.bind(this)('post-secure', params, { auth: true });\n}\n\nexport async function mock(\n\tdata: Form<\n\t\t{ [key: string]: any } & {\n\t\t\traise?:\n\t\t\t| 'ERR_INVALID_REQUEST'\n\t\t\t| 'ERR_INVALID_PARAMETER'\n\t\t\t| 'SOMETHING_WENT_WRONG'\n\t\t\t| 'ERR_EXISTS'\n\t\t\t| 'ERR_NOT_EXISTS';\n\t\t}\n\t>,\n\toptions?: {\n\t\tauth?: boolean;\n\t\tmethod?: string;\n\t\tresponseType?:\n\t\t| 'blob'\n\t\t| 'json'\n\t\t| 'text'\n\t\t| 'arrayBuffer'\n\t\t| 'formData'\n\t\t| 'document';\n\t\tcontentType?: string;\n\t\ttokenHeaders?: {\n\t\t\taccessToken?: boolean | string;\n\t\t\tidToken?: boolean | string;\n\t\t};\n\t\tprogress?: ProgressCallback;\n\t},\n): Promise<{ [key: string]: any }> {\n\tawait this.__connection;\n\tlet {\n\t\tauth = false,\n\t\tmethod = 'POST',\n\t\tbypassAwaitConnection = false,\n\t\tresponseType,\n\t\tcontentType,\n\t\ttokenHeaders,\n\t\tprogress,\n\t} = (options as any) || {};\n\n\toptions = Object.assign(\n\t\t{\n\t\t\tauth,\n\t\t\tmethod,\n\t\t\tbypassAwaitConnection,\n\t\t\tresponseType,\n\t\t\tcontentType,\n\t\t\ttokenHeaders,\n\t\t},\n\t\t{\n\t\t\tfetchOptions: { progress },\n\t\t},\n\t);\n\n\tif (\n\t\ttypeof data !== 'object' &&\n\t\t(contentType === 'application/json' || contentType === undefined)\n\t) {\n\t\tthrow new SkapiError('\"data\" should be type: <object>.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\n\treturn request.bind(this)('mock', data, options);\n}\n\n/**\n * Relays a request to a destination of your choosing, from the server rather\n * than the browser, and streams the destination's response back as it arrives.\n *\n * Unlike {@link secureRequest}, the body is relayed VERBATIM: an html form\n * reaches the destination as multipart/form-data, files included. The form's own\n * enctype and method attributes are not used; the method comes from\n * options.method. The destination url and the headers\n * to send with it travel in the Content-Meta header, so nothing has to be mixed\n * into the body. Your service api key is added server side, where the browser\n * cannot read it; when the project has no key set the header is still sent, with\n * the value \"none\", so a backend can treat a missing header as \"not from skapi\".\n *\n * The destination's status code and response headers come back to the caller,\n * apart from hop-by-hop headers, set-cookie, and access-control-* (skapi writes\n * those from the project's cors setting, and a duplicate would make the browser\n * reject the response). Headers in `options.headers` go OUTBOUND only and have\n * no bearing on what the browser is allowed to read.\n *\n * ```js\n * // buffered\n * const res = await skapi.forwardRequest(formElement, {\n * url: 'https://api.example.com/v1/report',\n * headers: { Accept: 'application/json' }\n * });\n *\n * // streaming: onStream fires per chunk, the promise resolves with the whole body\n * await skapi.forwardRequest(formElement, {\n * url: 'https://api.example.com/v1/chat',\n * onStream: (chunk) => { output.textContent += chunk; }\n * });\n * ```\n *\n * This method deliberately bypasses the shared request pipeline: that pipeline\n * flattens forms into JSON, forces its own Content-Type, and reads responses\n * through XMLHttpRequest, which cannot surface bytes before the response is\n * complete.\n */\nexport async function forwardRequest(\n\tform: any,\n\toptions: {\n\t\t/** Destination url. Must be http(s) and resolve to a public address. */\n\t\turl: string;\n\t\t/** Destination method. Defaults to POST. */\n\t\tmethod?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD';\n\t\t/** Headers to send TO the destination. */\n\t\theaders?: { [key: string]: string };\n\t\t/** Header name to carry the service api key. Defaults to \"x-api-key\". */\n\t\tapiKeyHeader?: string;\n\t\t/** Scheme prefix for the api key, e.g. \"Bearer\". */\n\t\tapiKeyScheme?: string;\n\t\t/** Called with each chunk of text as it arrives. Presence of this enables streaming. */\n\t\tonStream?: (chunk: string) => void;\n\t\t/** Stops the client receiving the response. The request already sent to\n\t\t * the destination is NOT cancelled and runs to completion. */\n\t\tsignal?: AbortSignal;\n\t\t/** How to resolve the promise. Defaults to 'json' when the destination says json, else 'text'. */\n\t\tresponseType?: 'json' | 'text' | 'response';\n\t},\n): Promise<any> {\n\tawait this.__connection;\n\n\tif (!options?.url || typeof options.url !== 'string') {\n\t\tthrow new SkapiError('\"url\" is required in the second argument.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\tvalidator.Url(options.url);\n\n\tconst admin = await this.admin_endpoint;\n\tconst endpoint = admin?.forward_request;\n\tif (!endpoint) {\n\t\t// An older cached endpoint json simply has no entry for this: say so,\n\t\t// rather than failing later with an opaque network error.\n\t\tthrow new SkapiError('forwardRequest is not available on this service region yet.', {\n\t\t\tcode: 'NOT_EXISTS',\n\t\t});\n\t}\n\n\t// The body is relayed as-is. A form element or submit event becomes native\n\t// FormData (multipart, boundary chosen by the browser, files preserved);\n\t// anything else is sent as json.\n\tlet body: any = null;\n\tlet contentType: string | null = null;\n\tconst el =\n\t\thasSubmitEvent && form instanceof SubmitEvent\n\t\t\t? (form.target as HTMLFormElement)\n\t\t\t: hasHTMLFormElement && form instanceof HTMLFormElement\n\t\t\t\t? form\n\t\t\t\t: null;\n\n\tif (el) {\n\t\tbody = new FormData(el);\n\t} else if (hasFormData && form instanceof FormData) {\n\t\tbody = form;\n\t} else if (form !== null && form !== undefined) {\n\t\tbody = JSON.stringify(form);\n\t\tcontentType = 'application/json';\n\t}\n\n\tconst meta = {\n\t\tpublic_identifier: this.__public_identifier,\n\t\tservice: this.service,\n\t\towner: this.owner,\n\t\tforward: {\n\t\t\turl: options.url,\n\t\t\tmethod: options.method || 'POST',\n\t\t\theaders: options.headers || {},\n\t\t\tapiKeyHeader: options.apiKeyHeader,\n\t\t\tapiKeyScheme: options.apiKeyScheme,\n\t\t},\n\t};\n\n\t// A header value is a byte string: fetch() refuses any character above U+00FF,\n\t// so a destination url or a header value carrying non-ascii text (a Korean\n\t// query string, an accented note) would throw a bare TypeError from fetch and\n\t// never leave the browser. Escaping those to \\uXXXX keeps this pure ascii and\n\t// still valid JSON, so the forwarder's JSON.parse sees the original text.\n\tconst metaHeader = JSON.stringify(meta).replace(\n\t\t/[\\u007f-\\uffff]/g,\n\t\t(c) => '\\\\u' + c.charCodeAt(0).toString(16).padStart(4, '0'),\n\t);\n\t// Measured on the ESCAPED string, since that is what goes on the wire.\n\tif (metaHeader.length > 4096) {\n\t\t// Header budget is shared with the tokens below; a destination that needs\n\t\t// more than this wants the payload in the body instead.\n\t\tthrow new SkapiError('Destination url and headers are too large for Content-Meta.', {\n\t\t\tcode: 'INVALID_PARAMETER',\n\t\t});\n\t}\n\n\tconst idToken = this.bearerToken || this.session?.idToken?.jwtToken || null;\n\tif (!idToken) {\n\t\tthrow new SkapiError('User login is required.', { code: 'INVALID_REQUEST' });\n\t}\n\n\tconst headers: { [key: string]: string } = {\n\t\t'Content-Meta': metaHeader,\n\t\tAuthorization: idToken,\n\t};\n\tif (contentType) headers['Content-Type'] = contentType;\n\t// FormData intentionally has no Content-Type set here: the browser must add\n\t// its own, including the multipart boundary.\n\n\tconst res = await fetch(endpoint, {\n\t\tmethod: 'POST',\n\t\theaders,\n\t\tbody,\n\t\tsignal: options.signal,\n\t});\n\n\tif (options.responseType === 'response') return res;\n\n\t// An error response throws whether or not onStream was supplied. Gating this\n\t// on `!options.onStream` meant a streaming caller had the forwarder's own\n\t// error body ({\"message\":\"Destination host is not routable.\",\"code\":...})\n\t// delivered to their callback as if it were backend output, and the promise\n\t// then RESOLVED with it. A failure must not look like content.\n\tif (!res.ok) {\n\t\tlet payload: any = await res.text();\n\t\ttry {\n\t\t\tpayload = JSON.parse(payload);\n\t\t} catch { }\n\t\tthrow new SkapiError(\n\t\t\tpayload?.message || (typeof payload === 'string' ? payload : JSON.stringify(payload)),\n\t\t\t{ code: payload?.code || 'ERROR' },\n\t\t);\n\t}\n\n\tif (options.onStream && res.body) {\n\t\tconst reader = res.body.getReader();\n\t\tconst decoder = new TextDecoder();\n\t\tlet whole = '';\n\t\tfor (; ;) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tconst chunk = decoder.decode(value, { stream: true });\n\t\t\twhole += chunk;\n\t\t\ttry {\n\t\t\t\toptions.onStream(chunk);\n\t\t\t} catch (err) {\n\t\t\t\t// A throwing callback should not strand the reader.\n\t\t\t\tconsole.error(err);\n\t\t\t}\n\t\t}\n\t\treturn whole;\n\t}\n\n\tconst text = await res.text();\n\tif (options.responseType === 'text') return text;\n\ttry {\n\t\treturn JSON.parse(text);\n\t} catch {\n\t\treturn text;\n\t}\n}\n","import {\n DatabaseResponse,\n FetchOptions,\n Form,\n Newsletter,\n Subscription,\n RecordData\n} from '../Types';\nimport SkapiError from '../main/error';\nimport validator from '../utils/validator';\nimport { request } from '../utils/network';\nimport { checkAdmin } from './user';\nimport { normalizeRecord } from './database';\nimport { extractFormData } from '../utils/utils';\n\nexport async function getFeed(params?: { access_group?: number; }, fetchOptions?: FetchOptions): Promise<DatabaseResponse<RecordData>> {\n await this.__connection;\n\n params = validator.Params(\n params || {},\n {\n access_group: v => {\n if(v === 'authorized') {\n v = 1;\n }\n if(v === 'public') {\n v = 0;\n }\n if (typeof v !== 'number') {\n throw new SkapiError('\"access_group\" should be type number.', { code: 'INVALID_PARAMETER' });\n }\n if (v < 0) {\n throw new SkapiError('\"access_group\" should be zero or a positive number.', { code: 'INVALID_PARAMETER' });\n }\n if(v > this.__user.access_group) {\n throw new SkapiError('User has no access.', { code: 'INVALID_REQUEST' });\n }\n return v;\n }\n }\n );\n let recs = await request.bind(this)('get-feed', params, { auth: true, fetchOptions });\n for (let i in recs.list) {\n recs.list[i] = await normalizeRecord.bind(this)(recs.list[i]);\n }\n return recs;\n}\n\nfunction cannotBeSelfId(v) {\n if (v === this.__user.user_id) {\n throw new SkapiError(`\"user_id\" cannot be the user's own ID.`, { code: 'INVALID_PARAMETER' });\n }\n return validator.UserId(v, '\"user_id\"');\n}\n\nexport async function getSubscriptions(\n params: {\n /** Subscribers user id. */\n subscriber?: string;\n /** User ID of the subscription. User id that subscriber has subscribed to. */\n subscription?: string;\n /** Fetch blocked subscription when True */\n blocked?: boolean;\n },\n fetchOptions?: FetchOptions,\n): Promise<DatabaseResponse<Subscription>> {\n params = extractFormData(params, { ignoreEmpty: true }).data as any;\n params = validator.Params(params, {\n subscriber: (v: string) => validator.UserId(v, 'User ID in \"subscriber\"'),\n subscription: cannotBeSelfId.bind(this),\n blocked: 'boolean'\n });\n\n if (!params.subscriber && !params.subscription) {\n throw new SkapiError('At least either \"subscriber\" or \"subscription\" should have a value.', { code: 'INVALID_PARAMETER' });\n }\n\n let response = await request.bind(this)('get-subscription', params, Object.assign({ auth: true }, { fetchOptions }));\n\n response.list = response.list.map(((s: Record<string, any>) => {\n let subscription: Record<string, any> = {};\n if(s.sub) {\n let subSplit = s.sub.split('#');\n subscription.subscriber = subSplit[2];\n subscription.subscription = subSplit[0];\n }\n else {\n subscription.subscriber = s.subscriber;\n subscription.subscription = s.subscription;\n }\n subscription.timestamp = s?.timestamp || s.stmp;\n subscription.blocked = s?.blocked || s.grp.substring(0, 1) === 'N';\n Object.assign(subscription, s.opt);\n return subscription;\n }));\n\n return response;\n}\n\nexport async function subscribe(params: { user_id: string; get_feed?: boolean; get_notified?: boolean; get_email?: boolean; }): Promise<Subscription> {\n await this.__connection;\n params = validator.Params(params, {\n user_id: cannotBeSelfId.bind(this),\n get_feed: ['boolean', ()=>false],\n get_notified: ['boolean', ()=>false],\n get_email: v => {\n if (v && !this.__user.email || !this.__user.email_verified) {\n throw new SkapiError('User has no verified email address.', { code: 'INVALID_REQUEST' });\n }\n return !!v;\n }\n }, ['user_id']);\n\n let s = await request.bind(this)('subscription', {\n subscribe: params.user_id,\n option: {\n get_feed: params.get_feed,\n get_notified: params.get_notified,\n get_email: params.get_email || false\n }\n }, { auth: true });\n\n let subscription:any = {};\n if(s.sub) {\n let subSplit = s.sub.split('#');\n subscription.subscriber = subSplit[2];\n subscription.subscription = subSplit[0];\n }\n else {\n subscription.subscriber = s.subscriber;\n subscription.subscription = s.subscription;\n }\n subscription.timestamp = s?.timestamp || s.stmp;\n subscription.blocked = s?.blocked || s.grp.substring(0, 1) === 'N';\n Object.assign(subscription, s.opt);\n return subscription;\n}\n\nexport async function unsubscribe(params: { user_id: string; }): Promise<'SUCCESS: The user has unsubscribed.'> {\n await this.__connection;\n let { user_id } = validator.Params(params, {\n user_id: cannotBeSelfId.bind(this),\n }, ['user_id']);\n\n return await request.bind(this)('subscription', {\n unsubscribe: user_id,\n }, { auth: true });\n}\n\nexport async function blockSubscriber(params: { user_id: string; }): Promise<'SUCCESS: Blocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'> {\n await this.__connection;\n let { user_id } = validator.Params(params, {\n user_id: cannotBeSelfId.bind(this),\n }, ['user_id']);\n return await request.bind(this)('subscription', { block: user_id }, { auth: true });\n}\n\nexport async function unblockSubscriber(params: { user_id: string; }): Promise<'SUCCESS: Unblocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'> {\n await this.__connection;\n let { user_id } = validator.Params(params, {\n user_id: cannotBeSelfId.bind(this),\n }, ['user_id']);\n return await request.bind(this)('subscription', { unblock: user_id }, { auth: true });\n}\n\n// requires auth\nexport async function getNewsletterSubscription(params: {group?: number | 'public' | 'authorized';},\nfetchOptions?: FetchOptions): Promise<{\n active: boolean;\n timestamp: number;\n group: number;\n subscribed_email: string;\n}[]> {\n await this.__connection;\n let isAdmin = await checkAdmin.bind(this)();\n\n params = validator.Params(\n params,\n {\n user_id: v => {\n if (v !== this.__user.user_id && !isAdmin) {\n throw new SkapiError(`No access.`, { code: 'INVALID_REQUEST' });\n }\n\n return v;\n },\n group: v => {\n if (v === 'public') {\n v = 0\n }\n if (v === 'authorized') {\n v = 1;\n }\n if (typeof v !== 'number') {\n throw new SkapiError('\"group\" should be type number | \"public\" | \"authorized\".', { code: 'INVALID_PARAMETER' })\n }\n return v;\n }\n }\n );\n\n let data = await request.bind(this)('get-newsletter-subscription', params, { auth: true, fetchOptions: fetchOptions || null });\n let list = data?.list || data;\n \n let result = [];\n if(!Array.isArray(list)) {\n list = [];\n }\n for (let sub of list) {\n let subt = sub['subt'].split('#');\n let active = true;\n\n if (subt[0].charAt(0) === '@') {\n active = false;\n subt[0] = subt[0].substring(1);\n }\n\n let group = parseInt(subt[0]);\n\n result.push({\n timestamp: sub['stmp'],\n group,\n subscribed_email: subt[1],\n active\n });\n }\n\n if(data?.list) {\n data.list = result;\n return data;\n }\n\n return result;\n}\n\n/**\n * Anyone who submits their E-Mail address will receive newsletters from you.<br>\n * The newsletters you send out will have unsubscribe link at the bottom.<br>\n * Both Signed and unsigned users can subscribe to your newsletter.<br>\n * Signed users can also subscribe to groups other than 0.\n * redirect is for newsletter subscribe confirmation link which it will only be sent to group 0 subscribers.\n * ```\n * let params = {\n * email: 'visitors@email.com'\n * };\n * \n * skapi.subscribeNewsletter(params);\n * ```\n */\nexport async function subscribeNewsletter(\n form: Form<{\n email?: string;\n group: number | 'public' | 'authorized' | 'admin' | string; \n redirect?: string;\n }>\n): Promise<string> {\n await this.__connection;\n\n let params = validator.Params(\n form || {},\n {\n email: (v: string) => {\n if(Array.isArray(v) && v.length > 0) {\n if(v.length === 1) {\n return validator.Email(v[0]);\n }\n else {\n return v.map(e => validator.Email(e));\n }\n }\n return validator.Email(v);\n },\n group: ['number', 'public', 'authorized', 'admin', (v: string) => {\n if (typeof v !== 'string' || v.length > 20 || !/^[a-zA-Z0-9]+$/.test(v)) {\n throw new SkapiError('\"group\" should be an alphanumeric string without spaces and less than 20 characters.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n }], \n redirect: (v: string) => validator.Url(v)\n },\n this.__user ? ['group'] : ['email', 'group']\n );\n\n return request.bind(this)(`subscribe-${this.__user ? '' : 'public-'}newsletter`, params, { auth: !!this.__user });\n}\n\n// /* depricate from the user api */\n// export async function adminNewsletterRequest(params) {\n// await this.__connection;\n// let response = await request.bind(this)('admin-newsletter-request', params, { auth: true });\n\n// return response\n// }\n\n// /* depricate from the user api */\n// export async function registerNewsletterGroup(\n// form: Form<{\n// group: string;\n// restriction: number;\n// }>\n// ): Promise<string> {\n// await this.__connection;\n\n// let params = validator.Params(\n// form || {},\n// {\n// group: (v: string) => {\n// if (typeof v !== 'string' || v.length > 20 || !/^[a-zA-Z0-9]+$/.test(v)) {\n// throw new SkapiError('\"group\" should be an alphanumeric string without spaces and less than 20 characters.', { code: 'INVALID_PARAMETER' });\n// }\n// return v;\n// },\n// restriction: (v: number) => {\n// if (typeof v !== 'number' || v < 0 || v > 99) {\n// throw new SkapiError('\"restriction\" should be a number between 0 and 99.', { code: 'INVALID_PARAMETER' });\n// }\n// return v;\n// }\n// },\n// ['group', 'restriction']\n// );\n\n// return request.bind(this)('register-newsletter-group', params, { auth: true });\n// }\n\n// /* depricate from the user api */\n// export async function newsletterGroupEndpoint(params) {\n// await this.__connection;\n// let response = await request.bind(this)('newsletter-group-endpoint', params, { auth: true });\n\n// return response\n// }\n\n/**\n * Only signed users can unsubscribe newsletter via api.\n * if form.group is null, unsubscribes from all groups.\n */\nexport async function unsubscribeNewsletter(\n params: { group: number | 'public' | 'authorized' | 'admin' | null; }\n): Promise<string> {\n await this.__connection;\n\n params = validator.Params(\n params,\n {\n group: ['number', 'public', 'authorized', 'admin']\n },\n ['group']\n );\n\n let param_send = Object.assign({\n action: 'unsubscribe'\n }, params);\n\n return request.bind(this)('subscribe-newsletter', param_send, { auth: true });\n}\n\nexport async function getNewsletters(\n params?: {\n /**\n * Search points.<br>\n * 'message_id' and 'subject' value should be string.<br>\n * Others numbers.\n */\n searchFor: 'message_id' | 'timestamp' | 'read' | 'complaint' | 'subject';\n value: string | number;\n group: 'public' | 'authorized' | number;\n range?: string | number;\n /**\n * Defaults to '='\n */\n condition?: '>' | '>=' | '=' | '<' | '<=' | 'gt' | 'gte' | 'eq' | 'lt' | 'lte';\n },\n fetchOptions?: FetchOptions\n): Promise<DatabaseResponse<Newsletter>> {\n let isAdmin = await checkAdmin.bind(this)();\n\n let searchType = {\n 'message_id': 'string',\n 'timestamp': 'number',\n 'read': 'number',\n 'complaint': 'number',\n 'subject': 'string',\n 'bounced': 'number'\n };\n\n if (!params) {\n fetchOptions = Object.assign({ ascending: false }, (fetchOptions || {}));\n }\n\n params = extractFormData(params).data as any;\n\n params = params || {\n searchFor: 'timestamp',\n value: Date.now(),\n condition: '<',\n group: 'public'\n };\n\n params = validator.Params(params, {\n searchFor: [\n \"message_id\",\n \"timestamp\",\n \"subject\",\n \"complaint\",\n \"read\",\n \"bounced\",\n ],\n value: (v: number | string) => {\n if (typeof v !== searchType[params.searchFor]) {\n throw new SkapiError(`\"value\" type does not match the type of \"${params.searchFor}\" index.`, { code: 'INVALID_PARAMETER' });\n }\n else if (typeof v === 'string' && !v) {\n throw new SkapiError('\"value\" should not be empty string.', { code: 'INVALID_PARAMETER' });\n }\n\n return v;\n },\n range: (v: number | string) => {\n if (!params.hasOwnProperty('value') || typeof v !== typeof params.value) {\n throw new SkapiError('\"range\" should match type of \"value\".', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n condition: ['>', '>=', '=', '<', '<=', 'gt', 'gte', 'eq', 'lt', 'lte', () => '='],\n group: (x: number | string) => {\n if (x === 'public') {\n return 0;\n }\n\n if (!this.session) {\n throw new SkapiError('User should be logged in.', { code: 'INVALID_REQUEST' });\n }\n\n if (x === 'authorized') {\n return 1;\n }\n\n if (typeof x === 'number') {\n if (!isAdmin && x > parseInt(this.user?.access_group || this.session?.idToken?.payload?.access_group)) {\n throw new SkapiError('User has no access.', { code: 'INVALID_REQUEST' });\n }\n\n return x;\n }\n\n throw new SkapiError('\"group\" should be type: number | \"public\" | \"authorized\".', { code: 'INVALID_PARAMETER' });\n }\n }, ['searchFor', 'value', 'group']);\n\n let endpointTarget = params.group === 0 ? 'get-public-newsletters' : 'get-newsletters';\n let mails = await request.bind(this)(\n endpointTarget,\n params,\n Object.assign({ method: 'get', auth: endpointTarget === 'get-public-newsletters' ? !!this.__user : true }, { fetchOptions })\n );\n\n let remap = {\n 'message_id': 'mid',\n 'timestamp': 'stmp',\n 'complaint': 'cmpl',\n 'read': 'read',\n 'subject': 'subj',\n 'bounced': 'bnce',\n 'url': 'url',\n 'delivered': 'delv'\n };\n let defaults = {\n 'message_id': '',\n 'timestamp': 0,\n 'complaint': 0,\n 'read': 0,\n 'subject': '',\n 'bounced': '',\n 'url': '',\n 'delivered': 0\n };\n\n mails.list = mails.list.map(m => {\n let remapped = {};\n for (let k in remap) {\n remapped[k] = m[remap[k]] || defaults[k];\n }\n remapped['bounced'] = String(remapped['bounced']);\n return remapped;\n });\n\n return mails;\n}","import validator from '../utils/validator';\nimport { request } from '../utils/network';\nimport { checkAdmin } from './user';\nimport { Form, UserAttributes, UserProfile, UserPublic, DatabaseResponse, FetchOptions } from '../Types';\nimport SkapiError from '../main/error';\nimport { parseUserAttributes, MD5 } from '../utils/utils';\n\nexport async function blockAccount(form: Form<{\n user_id: string;\n owner?: string;\n service?: string;\n}>): Promise<'SUCCESS: The user has been blocked.'> {\n let params = validator.Params(form, {\n user_id: (v: string) => {\n return validator.UserId(v, '\"user_id\"');\n },\n }, ['user_id']);\n\n if (params?.service && params?.owner) {\n params = { service: params?.service, owner: params?.owner, block: params.user_id };\n }\n else {\n params = { block: params.user_id };\n }\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('block-account', params, { auth: true });\n}\n\nexport async function unblockAccount(form: Form<{\n user_id: string;\n owner?: string;\n service?: string;\n}>): Promise<'SUCCESS: The user has been unblocked.'> {\n let params = validator.Params(form, {\n user_id: (v: string) => {\n return validator.UserId(v, '\"user_id\"');\n },\n }, ['user_id']);\n\n if (params?.service && params?.owner) {\n params = { service: params?.service, owner: params?.owner, unblock: params.user_id };\n } else {\n params = { unblock: params.user_id };\n }\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('block-account', params, { auth: true });\n}\n\nexport async function deleteAccount(form: Form<{\n user_id: string;\n owner?: string;\n service?: string;\n}>): Promise<'SUCCESS: Account has been deleted.'> {\n let params = validator.Params(form, {\n user_id: (v: string) => {\n return validator.UserId(v, '\"user_id\"');\n },\n }, ['user_id']);\n\n if (params?.service && params?.owner) {\n params = { service: params?.service, owner: params?.owner, delete: params.user_id };\n } else {\n params = { delete: params.user_id };\n }\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('remove-account', params, { auth: true });\n}\n\nexport async function inviteUser(\n form: Form<UserAttributes & { openid_id: string; access_group: number; } & { service?: string; owner?: string; }>,\n options?: {\n confirmation_url?: string;\n email_subscription?: boolean;\n template?: {\n url: string;\n subject: string;\n }\n }\n): Promise<'SUCCESS: Invitation has been sent. (User ID: xxx...)'> {\n let paramRestrictions = {\n email: (v: string) => validator.Email(v),\n password: (v: string) => validator.Password(v),\n\n name: 'string',\n username: 'string',\n gender: 'string',\n address: (v: any) => {\n if (!v) return '';\n\n if (typeof v === 'string') {\n return v;\n }\n\n if (typeof v === 'object') {\n return JSON.stringify(v);\n }\n\n return undefined;\n },\n birthdate: (v: string) => validator.Birthdate(v),\n phone_number: (v: string) => validator.PhoneNumber(v),\n picture: (v: string) => { if (v) return validator.Url(v); else return undefined },\n profile: (v: string) => { if (v) return validator.Url(v); else return undefined },\n website: (v: string) => { if (v) return validator.Url(v); else return undefined },\n nickname: 'string',\n misc: 'string',\n\n email_public: ['boolean', () => false],\n gender_public: ['boolean', () => false],\n address_public: ['boolean', () => false],\n birthdate_public: ['boolean', () => false],\n phone_number_public: ['boolean', () => false],\n openid_id: 'string',\n access_group: (v: number) => {\n // if string try to convert to number and if it's not a number, throw error\n try {\n if (typeof v === 'string') {\n v = v === 'admin' ? 99 : parseInt(v);\n }\n }\n catch (e) {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number>.', { code: 'INVALID_PARAMETER' });\n }\n if (typeof v !== 'number' || v < 1 || v > 100) {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number> of range 1~99', { code: 'INVALID_PARAMETER' });\n }\n return v;\n }\n };\n\n let params = validator.Params(form, paramRestrictions, ['email']);\n\n options = validator.Params(options, {\n confirmation_url: (v: string) => {\n let value = v;\n\n if (typeof v === 'string') {\n value = validator.Url(v);\n }\n else {\n throw new SkapiError('\"options.confirmation_url\" should be type: <string>.', { code: 'INVALID_PARAMETER' });\n }\n\n if (value && !params.email) {\n throw new SkapiError('\"email\" is required for signup confirmation.', { code: 'INVALID_PARAMETER' });\n }\n\n return value;\n },\n email_subscription: (v: boolean) => {\n if (typeof v !== 'boolean') {\n throw new SkapiError('\"options.email_subscription\" should be type: <boolean>.', { code: 'INVALID_PARAMETER' });\n }\n if (!options?.confirmation_url) {\n // requires to be url or true\n throw new SkapiError('\"options.confirmation_url\" is required for email subscription.', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n template: (v: { url: string; subject: string; }) => {\n if (typeof v !== 'object' || !v.url || !v.subject) {\n throw new SkapiError('\"options.template\" should be type: <object> with \"url\" and \"subject\".', { code: 'INVALID_PARAMETER' });\n }\n return {\n url: validator.Url(v.url),\n subject: v.subject,\n };\n },\n });\n\n params.signup_confirmation = options?.confirmation_url || true;\n params.email_subscription = options?.email_subscription || false;\n params.template = options?.template || {};\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('admin-signup', params, { auth: true });\n}\n\nexport async function createAccount(\n form: Form<\n UserAttributes & { access_group: number; password: string; } &\n { service?: string; owner?: string; }\n >,\n): Promise<UserProfile & { email_admin: string; username: string; }> {\n let paramRestrictions = {\n email: (v: string) => validator.Email(v),\n password: (v: string) => validator.Password(v),\n openid_id: 'string',\n name: 'string',\n username: 'string',\n gender: 'string',\n address: (v: any) => {\n if (!v) return '';\n\n if (typeof v === 'string') {\n return v;\n }\n\n if (typeof v === 'object') {\n return JSON.stringify(v);\n }\n\n return undefined;\n },\n birthdate: (v: string) => validator.Birthdate(v),\n phone_number: (v: string) => validator.PhoneNumber(v),\n picture: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n profile: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n website: (v: string) => { if (v) return validator.Url(v); else return \"\" },\n nickname: 'string',\n misc: 'string',\n\n email_public: ['boolean', () => false],\n gender_public: ['boolean', () => false],\n address_public: ['boolean', () => false],\n birthdate_public: ['boolean', () => false],\n phone_number_public: ['boolean', () => false],\n access_group: (v: number) => {\n // if string try to convert to number and if it's not a number, throw error\n try {\n if (typeof v === 'string') {\n v = parseInt(v);\n }\n }\n catch (e) {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number>.', { code: 'INVALID_PARAMETER' });\n }\n if (typeof v !== 'number' || v < 1 || v > 100) {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number> of range 1~99', { code: 'INVALID_PARAMETER' });\n }\n return v;\n },\n };\n\n let required = [\n 'email',\n 'password'\n ];\n\n let params = validator.Params(form, paramRestrictions, required);\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('admin-signup', params, { auth: true });\n}\n\nexport async function grantAccess(params: Form<{\n user_id: string;\n access_group: number;\n service?: string;\n owner?: string;\n}>): Promise<'SUCCESS: Access has been granted to the user.'> {\n params = validator.Params(params, {\n user_id: (v: string) => {\n return validator.UserId(v, '\"user_id\"');\n },\n access_group: (v: number) => {\n // if string try to convert to number and if it's not a number, throw error\n try {\n if (typeof v === 'string') {\n v = parseInt(v);\n }\n }\n catch (e) {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number>.', { code: 'INVALID_PARAMETER' });\n }\n if (typeof v === 'number' && v > 0 && v < 100) {\n return v;\n } else {\n throw new SkapiError('\"access_group\" is invalid. Should be type <number> of range 1~99', { code: 'INVALID_PARAMETER' });\n }\n }\n }, ['user_id', 'access_group']);\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('grant-access', params, { auth: true })\n}\n\nexport async function getInvitations(params?: Form<{\n service?: string;\n owner?: string;\n email?: string;\n}>, fetchOptions?: FetchOptions): Promise<DatabaseResponse<UserProfile>> {\n params = validator.Params(params, {\n email: 'string',\n });\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n let resp = await request.bind(this)('invitation-list', Object.assign({ mode: 'search' }, params), { fetchOptions, auth: true });\n resp.list = resp.list.map((v: any) => parseUserAttributes(v.user));\n return resp;\n}\n\nexport async function cancelInvitation(params: Form<{\n service?: string;\n owner?: string;\n email: string;\n}>): Promise<\"SUCCESS: Invitation has been canceled.\"> {\n params = validator.Params(params, {\n email: v => validator.Email(v),\n }, ['email']);\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('invitation-list', Object.assign({ mode: 'cancel' }, params), { auth: true });\n}\n\nexport async function resendInvitation(params: Form<{\n service?: string;\n owner?: string;\n email: string;\n}>): Promise<\"SUCCESS: Invitation has been re-sent. (User ID: xxx...)\"> {\n params = validator.Params(params, {\n email: v => validator.Email(v),\n }, ['email']);\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n return await request.bind(this)('invitation-list', Object.assign({ mode: 'resend' }, params), { auth: true });\n}\n\nexport async function updateUserAttributes(\n form: Form<UserAttributes & { user_id: string; }>,\n): Promise<'SUCCESS: User attributes updated.'> {\n let params: any = validator.Params(form, {\n user_id: (v: string) => validator.UserId(v, '\"user_id\"'),\n email: (v: string) => validator.Email(v),\n address: (v: any) => {\n if (!v) return '';\n\n if (typeof v === 'string') {\n return v;\n }\n\n if (typeof v === 'object') {\n return JSON.stringify(v);\n }\n\n return undefined;\n },\n name: 'string',\n gender: 'string',\n birthdate: (v: string) => v ? validator.Birthdate(v) : \"\",\n phone_number: (v: string) => v ? validator.PhoneNumber(v) : \"\",\n email_public: 'boolean',\n phone_number_public: 'boolean',\n address_public: 'boolean',\n gender_public: 'boolean',\n birthdate_public: 'boolean',\n misc: 'string',\n picture: (v: string) => v ? validator.Url(v) : \"\",\n profile: (v: string) => v ? validator.Url(v) : \"\",\n nickname: 'string',\n website: (v: string) => v ? validator.Url(v) : \"\",\n }, ['user_id']);\n\n // \"service\" and \"owner\" are auto-allowed by validator.Params. They target another\n // service and must be lifted to the top level of the request (like the sibling admin\n // methods), otherwise they route against the wrong service and get sent to Cognito as\n // invalid attribute names. this.service / this.owner are used when they are omitted.\n let service = params.service;\n let owner = params.owner;\n delete params.service;\n delete params.owner;\n\n // user_id is the only required field, but at least one attribute to update must be provided.\n if (Object.keys(params).filter(k => k !== 'user_id' && params[k] !== undefined).length === 0) {\n throw new SkapiError('At least one attribute to update is required.', { code: 'INVALID_PARAMETER' });\n }\n\n let isAdmin = await checkAdmin.bind(this)();\n\n if (!isAdmin) {\n if (!this.__user) {\n throw new SkapiError('User needs to login.', { code: 'INVALID_REQUEST' });\n }\n\n if (this.__user.access_group < 90) {\n throw new SkapiError('Invalid access.', { code: 'INVALID_REQUEST' });\n }\n }\n\n // when the e-mail is changed, update the alternative sign-in lookup key as well\n if (params.email) {\n params.preferred_username = (service || this.service) + '-' + MD5.hash(params.email);\n }\n\n let reqData: { attributes: any; service?: string; owner?: string; } = { attributes: params };\n if (service && owner) {\n reqData.service = service;\n reqData.owner = owner;\n }\n\n return await request.bind(this)('admin-edit-profile', reqData, { auth: true });\n}","import { SkapiError } from \"../Main\";\nimport { request } from \"../utils/network\";\nimport { extractFormData } from \"../utils/utils\";\n\nexport async function subscribeNotification(params: {\n endpoint: string;\n keys: {\n p256dh: string;\n auth: string;\n };\n}): Promise<\"SUCCESS: Subscribed to receive notifications.\"> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('Push Notifications are not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n await this.__connection;\n\n if (!params.endpoint) {\n throw new SkapiError(\"Missing parameter: endpoint\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n if (!params.keys || !params.keys.p256dh || !params.keys.auth) {\n throw new SkapiError(\"Missing parameter: keys.p256dh or keys.auth\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n\n await request.bind(this)(\n \"store-subscription\",\n { endpoint: params.endpoint, keys: params.keys },\n { auth: true }\n );\n\n return \"SUCCESS: Subscribed to receive notifications.\";\n}\n\nexport async function unsubscribeNotification(params: {\n endpoint: string;\n keys: {\n p256dh: string;\n auth: string;\n };\n}): Promise<\"SUCCESS: Unsubscribed from notifications.\"> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('Push Notifications are not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n await this.__connection;\n\n if (!params.endpoint) {\n throw new SkapiError(\"Missing parameter: endpoint\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n if (!params.keys || !params.keys.p256dh || !params.keys.auth) {\n throw new SkapiError(\"Missing parameter: keys.p256dh or keys.auth\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n\n await request.bind(this)(\n \"delete-subscription\",\n { endpoint: params.endpoint, keys: params.keys },\n { auth: true }\n );\n return \"SUCCESS: Unsubscribed from notifications.\";\n}\n\n\nexport async function vapidPublicKey() {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('Push Notifications are not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n await this.__connection;\n\n let vapid = await request.bind(this)(\"get-vapid-public-key\", null, {\n auth: true,\n });\n\n return { VAPIDPublicKey: vapid };\n}\n\nexport async function pushNotification(\n form: {\n title: string;\n body: string;\n },\n user_ids?: string | string[]): Promise<\"SUCCESS: Notification sent.\"> {\n if (typeof window === 'undefined' || (window as any)._runningInNodeJS) {\n throw new SkapiError('Push Notifications are not supported in Node.js environment.', { code: 'NOT_SUPPORTED' });\n }\n await this.__connection;\n\n let { title, body } = extractFormData(form || {}, { nullIfEmpty: true }).data;\n\n if (!title) {\n throw new SkapiError(\"Missing parameter: message title\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n if (!body) {\n throw new SkapiError(\"Missing parameter: message body\", {\n code: \"INVALID_PARAMETER\",\n });\n }\n\n const payload = { title, body };\n\n if (user_ids) {\n if (typeof user_ids === 'string') {\n user_ids = [user_ids];\n }\n payload['user_ids'] = user_ids;\n }\n else {\n payload['user_ids'] = 'all_users';\n }\n\n await request.bind(this)(\n \"push-notification\",\n payload,\n {\n auth: true,\n }\n );\n\n return \"SUCCESS: Notification sent.\";\n}\n","import { request } from '../utils/network';\nimport validator from '../utils/validator';\nimport {\n isBrowserRuntime,\n} from '../utils/utils';\nimport {\n DatabaseResponse,\n} from '../Types';\nexport async function spellcast(params: {\n spell: string,\n name: string,\n magic?: any\n}): Promise<string> {\n await this.__connection;\n params = validator.Params(params, {\n 'spell': 'string',\n 'name': 'string',\n 'magic': x=>x\n }, ['spell', 'name'])\n\n let response = await request.bind(this)('castspell', params);\n return `The spell \"${params.spell}\" has been cast.`;\n}\n\nexport async function getspell(params?: {\n search?: 'spell' | 'name',\n value?: string,\n}): Promise<DatabaseResponse<{\n spell: string;\n magic?: any;\n name: string;\n}>> {\n await this.__connection;\n params = validator.Params(params || {}, {\n 'search': ['spell', 'name', () => \"spell\"],\n 'value': 'string'\n });\n\n let response = await request.bind(this)('getspell', params);\n return response;\n}\n\nexport async function dopamine(params: {\n message: string,\n name: string\n}): Promise<string> {\n await this.__connection;\n params = validator.Params(params, {\n 'message': 'string',\n 'name': 'string'\n }, ['message', 'name'])\n\n let response = await request.bind(this)('dopamine', params, { auth: true });\n\n let message = response?.previous_message?.message;\n let name = response?.previous_message?.name;\n\n if (isBrowserRuntime()) {\n if (message && name)\n window.alert(`${name} said: ${message}`)\n\n window.location.href = response.video\n }\n else {\n if(message && name) {\n return `${name} said: ${message}\\nWatch the video here: ${response.video}`;\n }\n else {\n return `Your message has been uploaded for future generations to receive.\\nWatch the video here: ${response.video}`;\n }\n }\n}","import {\n\tDatabaseResponse,\n\tConnection,\n\tProgressCallback,\n\tGetRecordQuery,\n\tFetchOptions,\n\tRecordData,\n\tCondition,\n\tUserAttributes,\n\tUserProfile,\n\tNewsletter,\n\tForm,\n\tPostRecordConfig,\n\tUserPublic,\n\tFileInfo,\n\tRTCEvent,\n\tRealtimeCallback,\n\tRTCConnectorParams,\n\tRTCConnector,\n\tDelRecordQuery,\n\tConnectionInfo,\n\tTable,\n\tIndex,\n\tTag,\n\tUniqueId,\n\tSubscription,\n RequestHistory,\n} from '../Types';\nimport { CognitoUserPool } from 'amazon-cognito-identity-js';\nimport SkapiError from './error';\nimport validator from '../utils/validator';\nimport {\n\tgetRecords,\n\tpostRecord,\n\tdeleteRecords,\n\tgetTables,\n\tgetIndexes,\n\tgetTags,\n\tgetFile,\n\tgrantPrivateRecordAccess,\n\tremovePrivateRecordAccess,\n\tlistPrivateRecordAccess,\n\trequestPrivateRecordAccessKey,\n\tdeleteFiles,\n\tgetUniqueId,\n\tbulkPostRecords,\n} from '../methods/database';\nimport {\n\tconnectRealtime,\n\tjoinRealtime,\n\tpostRealtime,\n\tcloseRealtime,\n\tgetRealtimeUsers,\n\tgetRealtimeGroups,\n} from '../methods/realtime';\nimport { closeRTC, connectRTC } from '../methods/webrtc';\nimport {\n\tsecureRequest,\n\tforwardRequest,\n\tmock,\n\tclientSecretRequest,\n\tclientSecretRequestHistory,\n\tsendInquiry,\n\tcancelClientSecretRequest,\n\tclientSecretRequestQueueCount,\n\tstopClientSecretPolling,\n\tisPollStopped,\n} from '../methods/request';\nimport {\n\trequest,\n\tgetFormResponse,\n\tformHandler,\n\tuploadFiles,\n\tterminatePendingRequests,\n} from '../utils/network';\nimport {\n\tsubscribe,\n\tunsubscribe,\n\tblockSubscriber,\n\tunblockSubscriber,\n\tgetSubscriptions,\n\tsubscribeNewsletter,\n\tgetNewsletters,\n\tunsubscribeNewsletter,\n\tgetNewsletterSubscription,\n\tgetFeed,\n\t// adminNewsletterRequest,\n\t// registerNewsletterGroup,\n\t// newsletterGroupEndpoint,\n} from '../methods/subscription';\nimport {\n\tgetProfile,\n\tlogout,\n\trecoverAccount,\n\tresendSignupConfirmation,\n\tauthentication,\n\tlogin,\n\tsignup,\n\tdisableAccount,\n\tresetPassword,\n\tverifyEmail,\n\tverifyPhoneNumber,\n\tforgotPassword,\n\tchangePassword,\n\tupdateProfile,\n\tgetUsers,\n\tlastVerifiedEmail,\n\trequestUsernameChange,\n\tconsumeTicket,\n\tgetConsumedTickets,\n\tgetTickets,\n\tregisterTicket,\n\tunregisterTicket,\n\t_out,\n\topenIdLogin,\n\tloginWithToken,\n} from '../methods/user';\nimport {\n\textractFormData,\n\tfromBase62,\n\tgenerateRandom,\n\ttoBase62,\n\tMD5,\n\tisBrowserRuntime,\n\tisNodeRuntime,\n\tdecodeProjectId,\n\tformatServiceId,\n} from '../utils/utils';\nimport {\n\tblockAccount,\n\tunblockAccount,\n\tdeleteAccount,\n\tinviteUser,\n\tcreateAccount,\n\tgrantAccess,\n\tgetInvitations,\n\tcancelInvitation,\n\tresendInvitation,\n\tupdateUserAttributes\n} from '../methods/admin';\nimport {\n\tsubscribeNotification,\n\tvapidPublicKey,\n\tpushNotification,\n\tunsubscribeNotification,\n} from '../methods/notification';\nimport { spellcast, dopamine, getspell } from '../methods/vivian';\nimport {\n\tparseEncryptionOptions,\n\tinitEncryption,\n\tclearEncryptionState,\n\tgetEncryptionStatus,\n\tisWithheld,\n\tunlockEncryption,\n\tlockEncryption,\n\tstartDeviceUnlock,\n\tpinPeerKey,\n\ttakeRecoveryCode,\n\tunlockWithRecoveryCode,\n\tregenerateRecoveryCode,\n\tEncryptionConfig,\n} from '../methods/encryption';\n\ndeclare const __SKAPI_VERSION__: string;\n\ntype Options = {\n\tautoLogin: boolean;\n\trefetchServiceInfo?: boolean; // bypasses cached service info and always fetch new service info on load.\n\trequestBatchSize?: number; // default 30. number of requests to be handled in a batch\n\t// bearerToken?: string; // custom bearer token for authentication\n\t/**\n\t * Enable client-side encryption of `data` on records written to\n\t * access_group 'private'. Off by default. See EncryptionOptions.\n\t */\n\tencryption?: boolean | {\n\t\titerations?: number;\n\t\ttrustPolicy?: 'tofu' | 'strict';\n\t\tpersistDevice?: boolean;\n\t\tminPasswordLength?: number;\n\t\trecovery?: 'code' | 'none';\n\t\ttable?: string;\n\t};\n\teventListener?: {\n\t\tonLogin?: (user: UserProfile | null) => void;\n\t\tonUserUpdate?: (user: UserProfile | null) => void;\n\t\tonBatchProcess?: (process: {\n\t\t\tbatchToProcess: number;\n\t\t\titemsToProcess: number;\n\t\t\tcompleted: any[];\n\t\t}) => void;\n\t};\n};\n\nexport default class Skapi {\n\t// current version\n\tprivate __version = __SKAPI_VERSION__;\n\tservice: string;\n\towner: string;\n\t/**\n\t * The public project ID: the single two-segment token composed from service + owner\n\t * (the same value formatServiceId returns, and the form external tools accept).\n\t * Empty string when the service has no uuid owner (e.g. host-owned), since the\n\t * compound form cannot be built without one.\n\t */\n\tproject_id: string = '';\n\tsession: Record<string, any> | null = null;\n\tconnection: Connection | null = null;\n\t/**\n\t * unique_id -> record_id, bucketed by a \"<service>/<owner>\" scope key.\n\t *\n\t * The scope is mandatory. One Skapi instance routinely serves MANY services: the\n\t * MCP server keeps a single instance per user and names the target project on every\n\t * call, and the dashboard switches projects without reconstructing. A flat map let\n\t * the same unique_id from two projects collide on one key, so a post carrying\n\t * `reference: \"src::<file>\"` was silently rewritten to the OTHER project's\n\t * record_id and the backend rejected it as non-existent. Never key this by\n\t * unique_id alone, and never scope it by `this.service` when the call names its own.\n\t */\n\tprivate __my_unique_ids: { [serviceKey: string]: { [unique_id: string]: string } } = {};\n\tprivate __uniqueIdsPersistTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate userPool: CognitoUserPool | null = null;\n\tprivate __socket: Promise<WebSocket> | null = null;\n\tprivate __mediaStream: MediaStream = null;\n\n\tprivate host = 'skapi';\n\tprivate hostDomain = 'skapi.com';\n\tprivate target_cdn = 'd3e9syvbtso631';\n\tprivate customApiDomain = 'skapi.dev';\n\tprivate requestBatchSize = 30;\n\n\t// privates\n\tprivate __disabledAccount: string | null = null;\n\tprivate __cached_requests: {\n\t\t/** Cached url requests */\n\t\t[url: string]: {\n\t\t\t/** Array of data stored in hashed params key */\n\t\t\t[hashedParams: string]: DatabaseResponse<any>;\n\t\t};\n\t} = {};\n\n\tprivate __startKeyHistory: {\n\t\t/** List of startkeys */\n\t\t[url: string]: {\n\t\t\t[hashedParams: string]: string[];\n\t\t};\n\t} = {};\n\tprivate __request_signup_confirmation: string | null = null;\n\tprivate __private_access_key: {\n\t\t[record_id: string]: string;\n\t} = {};\n\n\t// true when session is stored successfully to session storage\n\t// this property prevents duplicate stores when window closes on some device\n\tprivate __class_properties_has_been_cached = false;\n\n\t/** Current logged in user object. null if not logged. */\n\tprivate __user: UserProfile | null = null;\n\n\tget user(): UserProfile | null {\n\t\tif (this.__user && Object.keys(this.__user).length) {\n\t\t\treturn JSON.parse(JSON.stringify(this.__user));\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tset user(value) {\n\t\t// setting user is bypassed\n\t}\n\n\tprivate _userProfileListeners: Function[] = [];\n\tprivate _onLoginListeners: Function[] = [];\n\n\tget onLogin(): Function[] {\n\t\treturn this._onLoginListeners;\n\t}\n\n\tset onLogin(listener: (user: UserProfile | null) => void) {\n\t\tif (typeof listener === 'function') {\n\t\t\tthis._onLoginListeners.push(listener);\n\t\t}\n\t}\n\n\tget onUserUpdate(): Function[] {\n\t\treturn this._userProfileListeners;\n\t}\n\n\tset onUserUpdate(listener: (user: UserProfile | null) => void) {\n\t\tif (typeof listener === 'function') {\n\t\t\tthis._userProfileListeners.push(listener);\n\t\t}\n\t}\n\n\tprivate _runOnUserUpdateListeners(user: UserProfile | null) {\n\t\tfor (let listener of this._userProfileListeners) {\n\t\t\tif (typeof listener === 'function') {\n\t\t\t\tlistener(user);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _runOnLoginListeners(user: UserProfile | null) {\n\t\tfor (let listener of this._onLoginListeners) {\n\t\t\tif (typeof listener === 'function') {\n\t\t\t\tlistener(user);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate admin_endpoint: Promise<Record<string, any>>;\n\tprivate record_endpoint: Promise<Record<string, any>>;\n\n\tprivate _onBatchProcessListeners: ((process: {\n\t\tbatchToProcess: number;\n\t\titemsToProcess: number;\n\t\tcompleted: any[];\n\t}) => void)[] = [];\n\n\tget onBatchProcess(): ((process: {\n\t\tbatchToProcess: number;\n\t\titemsToProcess: number;\n\t\tcompleted: any[];\n\t}) => void)[] {\n\t\treturn this._onBatchProcessListeners;\n\t}\n\n\tset onBatchProcess(\n\t\tlistener: (process: {\n\t\t\tbatchToProcess: number;\n\t\t\titemsToProcess: number;\n\t\t\tcompleted: any[];\n\t\t}) => void,\n\t) {\n\t\tif (typeof listener === 'function') {\n\t\t\tthis._onBatchProcessListeners.push(listener);\n\t\t}\n\t}\n\n\tvalidate = {\n\t\tuserId(val: string) {\n\t\t\ttry {\n\t\t\t\tvalidator.UserId(val);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\turl(val: string | string[]) {\n\t\t\ttry {\n\t\t\t\tvalidator.Url(val);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tphoneNumber(val: string) {\n\t\t\ttry {\n\t\t\t\tvalidator.PhoneNumber(val);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tbirthdate(val: string) {\n\t\t\ttry {\n\t\t\t\tvalidator.Birthdate(val);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\temail(val: string) {\n\t\t\ttry {\n\t\t\t\tvalidator.Email(val);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tparams(val: any, schema: Record<string, any>, required?: string[]) {\n\t\t\treturn validator.Params(val, schema, required);\n\t\t},\n\t};\n\n\tutil = {\n\t\tMD5,\n\t\tgenerateRandom,\n\t\ttoBase62,\n\t\tfromBase62,\n\t\tdecodeProjectId,\n\t\tformatServiceId,\n\t\textractFormData,\n\t\tterminatePendingRequests,\n\t\trequest: (\n\t\t\turl: string,\n\t\t\tdata?: Form<any>,\n\t\t\toptions?: {\n\t\t\t\tfetchOptions?: FetchOptions;\n\t\t\t\tauth?: boolean;\n\t\t\t\tmethod?: string;\n\t\t\t\tbypassAwaitConnection?: boolean;\n\t\t\t\tresponseType?:\n\t\t\t\t\t| 'json'\n\t\t\t\t\t| 'blob'\n\t\t\t\t\t| 'text'\n\t\t\t\t\t| 'arrayBuffer'\n\t\t\t\t\t| 'formData'\n\t\t\t\t\t| 'document';\n\t\t\t\tcontentType?: string;\n\t\t\t\ttokenHeaders?: {\n\t\t\t\t\taccessToken?: boolean | string;\n\t\t\t\t\tidToken?: boolean | string;\n\t\t\t\t};\n\t\t\t\t// Both matter only to a CACHEABLE request, and both were reachable\n\t\t\t\t// at runtime but missing from this type — so the callers that need\n\t\t\t\t// them (a browser-cached signed-url mint) could not ask for them\n\t\t\t\t// without a cast, and silently did without:\n\t\t\t\t//\n\t\t\t\t// stableGateway pins the record host. Without it the round robin\n\t\t\t\t// alternates between record_private and record_private_2, which is\n\t\t\t\t// two urls for one mint, two cache entries, two signed urls, and\n\t\t\t\t// the same file downloaded twice.\n\t\t\t\t//\n\t\t\t\t// revalidate sends Cache-Control: no-cache so the browser REPLACES\n\t\t\t\t// what it has stored under this exact url, which a cache-busting\n\t\t\t\t// query param cannot do (a different url leaves the stale entry\n\t\t\t\t// answering every ordinary call).\n\t\t\t\t//\n\t\t\t\t// USELESS CROSS-ORIGIN, and worse than useless: Cache-Control is\n\t\t\t\t// not a CORS-safelisted request header, and the record gateway's\n\t\t\t\t// preflight does not list it, so the browser REFUSES TO SEND a\n\t\t\t\t// request carrying it. Every mint that asked for this failed with\n\t\t\t\t// a network error rather than being revalidated. Bust the cache\n\t\t\t\t// with a `nocache` parameter instead (see getFile's\n\t\t\t\t// mintCacheToken), or add Cache-Control to the gateway's\n\t\t\t\t// Access-Control-Allow-Headers first.\n\t\t\t\tstableGateway?: boolean;\n\t\t\t\trevalidate?: boolean;\n\t\t\t},\n\t\t) => request.bind(this)(url, data, options, { ignoreService: true }),\n\t};\n\n\tprivate __connection: Promise<Connection>;\n\tprivate __authConnection: Promise<void>;\n\tprivate __network_logs = false;\n\t// Which per-region endpoint file this SDK boots from:\n\t// <cdn>/<short_region>/admin-<version>.json and record-<version>.json.\n\t// v2 adds forward_request (the streaming forwarder's Function URL), which v1\n\t// has no slot for.\n\t//\n\t// This version must not move ahead of what is published: the fetch below\n\t// rejects on a missing file and every call then throws \"Service does not\n\t// exist\". Publish with infra/cdn/publish_endpoints.py for EVERY region\n\t// first, and leave v1 in place while older clients are still in the wild.\n\tprivate __endpoint_version = 'v2';\n\tprivate __public_identifier = '';\n\tprivate bearerToken: string = '';\n\n\tprivate _alert(message: string) {\n\t\tif (isBrowserRuntime() && typeof window.alert === 'function') {\n\t\t\twindow.alert(message);\n\t\t}\n\t}\n\n\tconstructor(\n\t\tservice: string,\n\t\towner?: string | Options,\n\t\toptions?: Options | any,\n\t\t__etc?: any,\n\t) {\n\t\tif (!service || typeof service !== 'string') {\n\t\t\tthis._alert('Service ID is required.');\n\t\t\tthrow new SkapiError('Service ID is required.', {\n\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t});\n\t\t}\n\t\t// The docs' copy-paste placeholder was never replaced. Checked FIRST, before any\n\t\t// decoding or owner validation, so the user gets this message and not a puzzling\n\t\t// \"Owner ID is invalid\".\n\t\t//\n\t\t// Every spelling the docs have ever used is caught by normalizing away the angle\n\t\t// brackets, spacing and separators the placeholder is written with: '<Project ID>'\n\t\t// (current), 'project_id', and the older 'service_id' / 'SERVICE_ID'. Matching only\n\t\t// the exact literals meant a docs change to a new placeholder form silently\n\t\t// disabled this check, which is what happened when '<Project ID>' was adopted.\n\t\tconst placeholderForm = service.trim().toLowerCase().replace(/^<|>$/g, '').replace(/[\\s_\\-.]+/g, '');\n\t\tif (placeholderForm === 'serviceid' || placeholderForm === 'projectid') {\n\t\t\tthis._alert(`Replace \"${service}\" with your actual Project ID.`);\n\t\t\tthrow new SkapiError('Project ID is required.', {\n\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t});\n\t\t}\n\t\tlet idSplitLen = service.split('-').length;\n\t\tlet isV2 = idSplitLen === 2;\n\t\tlet isV1 = idSplitLen === 7;\n\t\tif (isV2 || isV1) {\n\t\t\ttry {\n\t\t\t\tlet decoded = decodeProjectId(service);\n\t\t\t\tif (options && typeof options === 'object') {\n\t\t\t\t\t__etc = options;\n\t\t\t\t}\n\n\t\t\t\tif (owner && typeof owner === 'object') {\n\t\t\t\t\toptions = owner;\n\t\t\t\t}\n\n\t\t\t\towner = decoded.owner;\n\t\t\t\tservice = decoded.service;\n\t\t\t} catch (err) {\n\t\t\t\tthis._alert('Service ID is invalid.');\n\t\t\t\tthrow new SkapiError('Service ID is invalid.', {\n\t\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// if (!window.sessionStorage) {\n\t\t// throw new SkapiError('Web browser API is not available.', { code: 'NOT_SUPPORTED' });\n\t\t// }\n\t\t// window.sessionStorage.setItem('__skapi_kiss', 'kiss');\n\t\t// if (window.sessionStorage.getItem('__skapi_kiss') !== 'kiss') {\n\t\t// window.alert('Session storage is disabled. Please enable session storage.');\n\t\t// throw new SkapiError('Session storage is disabled. Please enable session storage.', { code: 'SESSION_STORAGE_DISABLED' });\n\t\t// }\n\n\t\t// window.sessionStorage.removeItem('__skapi_kiss');\n\n\t\tif (!owner || typeof owner !== 'string') {\n\t\t\tthis._alert('Owner ID is invalid.');\n\t\t\tthrow new SkapiError('Owner ID is invalid.', {\n\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t});\n\t\t}\n\n\n\n\t\tif (owner !== this.host) {\n\t\t\ttry {\n\t\t\t\tvalidator.UserId(owner, '\"owner\"');\n\t\t\t} catch (err: any) {\n\t\t\t\tthis._alert('Owner ID is invalid.');\n\t\t\t\tthrow new SkapiError('Owner ID is invalid.', {\n\t\t\t\t\tcode: 'INVALID_PARAMETER',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.service = service;\n\t\tthis.owner = owner;\n\t\ttry {\n\t\t\tthis.project_id = formatServiceId(service, owner);\n\t\t} catch (err) {\n\t\t\t// Non-uuid owner (host-owned service): there is no public compound form.\n\t\t\tthis.project_id = '';\n\t\t}\n\n\t\tlet autoLogin = true;\n\t\tlet refetchServiceInfo = false;\n\t\tlet encryptionConfig: EncryptionConfig | null = null;\n\t\tif (options) {\n\t\t\tif (typeof options.refetchServiceInfo === 'boolean') {\n\t\t\t\trefetchServiceInfo = options.refetchServiceInfo;\n\t\t\t}\n\t\t\tif (typeof options.autoLogin === 'boolean') {\n\t\t\t\tautoLogin = options.autoLogin;\n\t\t\t}\n\t\t\tif (options.encryption) {\n\t\t\t\tencryptionConfig = parseEncryptionOptions(options.encryption);\n\t\t\t}\n\t\t\tif (typeof options.requestBatchSize === 'number') {\n\t\t\t\tif (options.requestBatchSize < 1) {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'\"requestBatchSize\" must be greater than 0.',\n\t\t\t\t\t\t{ code: 'INVALID_PARAMETER' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.requestBatchSize = options.requestBatchSize;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\toptions?.eventListener &&\n\t\t\ttypeof options.eventListener === 'object'\n\t\t) {\n\t\t\tif (\n\t\t\t\toptions.eventListener?.onLogin &&\n\t\t\t\ttypeof options.eventListener.onLogin === 'function'\n\t\t\t) {\n\t\t\t\tthis.onLogin = options.eventListener.onLogin;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\toptions.eventListener?.onUserUpdate &&\n\t\t\t\ttypeof options.eventListener.onUserUpdate === 'function'\n\t\t\t) {\n\t\t\t\tthis.onUserUpdate = options.eventListener.onUserUpdate;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\toptions.eventListener?.onBatchProcess &&\n\t\t\t\ttypeof options.eventListener.onBatchProcess === 'function'\n\t\t\t) {\n\t\t\t\tthis.onBatchProcess = options.eventListener.onBatchProcess;\n\t\t\t}\n\t\t}\n\n\t\t// get endpoints\n\n\t\tthis.target_cdn = __etc?.target_cdn || this.target_cdn;\n\t\tthis.hostDomain = __etc?.hostDomain || this.hostDomain;\n\t\tthis.customApiDomain = __etc?.customApiDomain || this.customApiDomain;\n\n\t\tthis.__network_logs = !!__etc?.network_logs;\n\n\t\tconst cdn_domain = `https://${this.target_cdn}.cloudfront.net`; // don't change this\n\t\tlet sreg = service.substring(0, 4);\n\n\t\tthis.admin_endpoint = fetch(\n\t\t\t`${cdn_domain}/${sreg}/admin-${this.__endpoint_version}.json`,\n\t\t)\n\t\t\t.then((response) => response.blob())\n\t\t\t.then(\n\t\t\t\t(blob) =>\n\t\t\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\t\treader.onloadend = () => resolve(reader.result);\n\t\t\t\t\t\treader.onerror = reject;\n\t\t\t\t\t\treader.readAsDataURL(blob);\n\t\t\t\t\t}),\n\t\t\t)\n\t\t\t.then((data) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn typeof data === 'string'\n\t\t\t\t\t\t? JSON.parse(atob(data.split(',')[1]))\n\t\t\t\t\t\t: null;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'Service does not exist. Create your service from skapi.com',\n\t\t\t\t\t\t{ code: 'NOT_EXISTS' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.record_endpoint = fetch(\n\t\t\t`${cdn_domain}/${sreg}/record-${this.__endpoint_version}.json`,\n\t\t)\n\t\t\t.then((response) => response.blob())\n\t\t\t.then(\n\t\t\t\t(blob) =>\n\t\t\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\t\treader.onloadend = () => resolve(reader.result);\n\t\t\t\t\t\treader.onerror = reject;\n\t\t\t\t\t\treader.readAsDataURL(blob);\n\t\t\t\t\t}),\n\t\t\t)\n\t\t\t.then((data) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn typeof data === 'string'\n\t\t\t\t\t\t? JSON.parse(atob(data.split(',')[1]))\n\t\t\t\t\t\t: null;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthrow new SkapiError(\n\t\t\t\t\t\t'Service does not exist. Create your service from skapi.com',\n\t\t\t\t\t\t{ code: 'NOT_EXISTS' },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\tconst hasWindow = isBrowserRuntime();\n\n\t\tif (hasWindow && !window.sessionStorage) {\n\t\t\tthis._alert('This browser is not supported.');\n\t\t\tthrow new Error(`This browser is not supported.`);\n\t\t}\n\n\t\tconst restore = hasWindow\n\t\t\t? JSON.parse(\n\t\t\t\t\twindow.sessionStorage.getItem(`${service}#${owner}`) ||\n\t\t\t\t\t\t'null',\n\t\t\t\t)\n\t\t\t: null;\n\n\t\tthis.log('constructor:restore', restore);\n\n\t\tif (restore?.connection) {\n\t\t\t// apply all data to class properties\n\t\t\tfor (let k in restore) {\n\t\t\t\tthis[k] = restore[k];\n\t\t\t}\n\n\t\t\tif (!restore.__public_identifier) {\n\t\t\t\tthis.__public_identifier = `${this.service}:${this.owner}:${generateRandom(16)}`;\n\t\t\t}\n\t\t}\n\n\t\t// AFTER the blanket restore above, which assigns every key of a\n\t\t// same-origin-writable sessionStorage blob onto `this`. Encryption state\n\t\t// lives in a module WeakMap precisely so it cannot be injected that way.\n\t\tinitEncryption.bind(this)(encryptionConfig);\n\n\t\tthis.__authConnection = (async (): Promise<void> => {\n\t\t\tconst admin_endpoint = await this.admin_endpoint;\n\t\t\tconst poolSetting = {\n\t\t\t\tUserPoolId: admin_endpoint.userpool_id,\n\t\t\t\tClientId: admin_endpoint.userpool_client,\n\t\t\t} as any;\n\t\t\tif (isNodeRuntime()) {\n\t\t\t\tpoolSetting.Storage = window.localStorage;\n\t\t\t}\n\t\t\tthis.userPool = new CognitoUserPool(poolSetting);\n\n\t\t\ttry {\n\t\t\t\tif (!this.user) {\n\t\t\t\t\t// if (autoLogin && typeof autoLogin === 'object') {\n\t\t\t\t\t// let { idToken = '', accessToken = '', refreshToken = '' } = autoLogin || {};\n\t\t\t\t\t// if (idToken) {\n\t\t\t\t\t// await this.loginWithToken({ idToken, accessToken, refreshToken });\n\t\t\t\t\t// }\n\t\t\t\t\t// }\n\t\t\t\t\tawait authentication.bind(this)().getSession({\n\t\t\t\t\t\tskipUserUpdateEventTrigger: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (this.user) {\n\t\t\t\t\tif (!restore?.connection && !autoLogin) {\n\t\t\t\t\t\t_out.bind(this)();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A token-restored session has no password, so the only\n\t\t\t\t\t\t// way to stay unlocked across a reload is the device\n\t\t\t\t\t\t// store.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// NOT awaited here, and that is load-bearing: the unlock\n\t\t\t\t\t\t// reads the keyring with getRecords, getRecords awaits\n\t\t\t\t\t\t// __connection, and __connection awaits THIS promise.\n\t\t\t\t\t\t// Awaiting it closed the cycle and hung every call on the\n\t\t\t\t\t\t// instance. Instead the attempt is kicked off and parked\n\t\t\t\t\t\t// on the encryption state, where the record read and\n\t\t\t\t\t\t// write hooks wait for it, so an app call issued during\n\t\t\t\t\t\t// bootstrap still sees an unlocked session.\n\t\t\t\t\t\tif (encryptionConfig) {\n\t\t\t\t\t\t\tstartDeviceUnlock.bind(this)();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// only run login listeners if user is logged in (auto login successful)\n\t\t\t\t\t\tthis._runOnLoginListeners(this.user);\n\t\t\t\t\t\tthis._runOnUserUpdateListeners(this.user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (err) {}\n\t\t})();\n\n\t\t// Restore only THIS instance's own scope, under a key that names both service\n\t\t// and owner. The pre-1.8.2 key (`<service>:uniqueids`) held a flat map that\n\t\t// could already have entries from several projects mixed together, so those\n\t\t// blobs are deliberately not read back: a poisoned cache is worse than none.\n\t\t// Other scopes are simply not preloaded, which costs one backend resolve.\n\t\tlet uniqueIdScope = `${this.service}/${this.owner}`;\n\t\tlet uniqueids = hasWindow\n\t\t\t? window.sessionStorage.getItem(`${uniqueIdScope}:uniqueids`)\n\t\t\t: null;\n\t\tif (uniqueids) {\n\t\t\ttry {\n\t\t\t\t// sessionStorage is same-origin writable and the key is guessable, so do not\n\t\t\t\t// trust the shape. The string \"null\" parses without throwing, and anything\n\t\t\t\t// that is not a plain object would poison every later lookup.\n\t\t\t\tlet parsed = JSON.parse(uniqueids);\n\t\t\t\tthis.__my_unique_ids = (parsed && typeof parsed === 'object' && !Array.isArray(parsed))\n\t\t\t\t\t? { [uniqueIdScope]: parsed }\n\t\t\t\t\t: {};\n\t\t\t} catch (err) {\n\t\t\t\tthis.__my_unique_ids = {};\n\t\t\t}\n\t\t}\n\n\t\t// connects to server\n\t\tthis.__connection = (async (): Promise<Connection> => {\n\t\t\tlet connection: Promise<Connection> = null;\n\t\t\tawait this.record_endpoint;\n\n\t\t\tif (!restore?.connection) {\n\t\t\t\t// await for first connection\n\t\t\t\tconnection = this._updateConnection({refresh: refetchServiceInfo});\n\t\t\t}\n\n\t\t\tconst storeClassProperties = () => {\n\t\t\t\tif (this.__class_properties_has_been_cached) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet exec = () => {\n\t\t\t\t\tlet data: Record<string, any> = {};\n\n\t\t\t\t\tconst to_be_cached = [\n\t\t\t\t\t\t'__startKeyHistory', // startKey key : {}\n\t\t\t\t\t\t'__disabledAccount', // disabled account : null\n\t\t\t\t\t\t'__cached_requests', // cached records : {}\n\t\t\t\t\t\t'__request_signup_confirmation', // for resend signup confirmation : null\n\t\t\t\t\t\t'__public_identifier', // public identifier : ''\n\t\t\t\t\t\t'connection', // service info : null\n\t\t\t\t\t];\n\n\t\t\t\t\tif (this.connection) {\n\t\t\t\t\t\tfor (let k of to_be_cached) {\n\t\t\t\t\t\t\tdata[k] = this[k];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Never persist the paging cache while record encryption\n\t\t\t\t\t\t// is on. On a cache hit request() returns the cached\n\t\t\t\t\t\t// response object BY REFERENCE (utils/network.ts:349),\n\t\t\t\t\t\t// and getRecords then assigns the DECRYPTED list onto\n\t\t\t\t\t\t// it, so __cached_requests ends up holding plaintext for\n\t\t\t\t\t\t// records that were encrypted precisely so they would\n\t\t\t\t\t\t// not be written to disk. Dropped as a PAIR with\n\t\t\t\t\t\t// __startKeyHistory: cursors without their cached pages\n\t\t\t\t\t\t// desync fetchMore after a restore.\n\t\t\t\t\t\tif (encryptionConfig) {\n\t\t\t\t\t\t\tdata.__cached_requests = {};\n\t\t\t\t\t\t\tdata.__startKeyHistory = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (hasWindow) {\n\t\t\t\t\t\t\tconst storageKey = `${service}#${owner}`;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\twindow.sessionStorage.setItem(\n\t\t\t\t\t\t\t\t\tstorageKey,\n\t\t\t\t\t\t\t\t\tJSON.stringify(data),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// QuotaExceededError: __cached_requests can hold\n\t\t\t\t\t\t\t\t// megabytes of paged history (indexing-pass bodies),\n\t\t\t\t\t\t\t\t// and this runs inside beforeunload/visibilitychange —\n\t\t\t\t\t\t\t\t// throwing here surfaced as an uncaught error on every\n\t\t\t\t\t\t\t\t// tab switch. The paging cache is an optimization\n\t\t\t\t\t\t\t\t// (losing it costs a refetch after reload, never\n\t\t\t\t\t\t\t\t// correctness), so retry WITHOUT the paging state —\n\t\t\t\t\t\t\t\t// dropped as a PAIR: cursors without their cached\n\t\t\t\t\t\t\t\t// pages would desync fetchMore after a restore.\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tconst slim = Object.assign({}, data, {\n\t\t\t\t\t\t\t\t\t\t__cached_requests: {},\n\t\t\t\t\t\t\t\t\t\t__startKeyHistory: {},\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\twindow.sessionStorage.setItem(\n\t\t\t\t\t\t\t\t\t\tstorageKey,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(slim),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} catch (err2) {\n\t\t\t\t\t\t\t\t\t// Still over quota (something else filled it):\n\t\t\t\t\t\t\t\t\t// remove any STALE snapshot rather than letting a\n\t\t\t\t\t\t\t\t\t// previous session's state restore against this\n\t\t\t\t\t\t\t\t\t// one's reality.\n\t\t\t\t\t\t\t\t\ttry { window.sessionStorage.removeItem(storageKey); } catch (_e) { /* nothing left to do */ }\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.__class_properties_has_been_cached = true;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\treturn connection instanceof Promise\n\t\t\t\t\t? connection.then(() => exec())\n\t\t\t\t\t: exec();\n\t\t\t};\n\n\t\t\t// attach event to save session on close\n\t\t\tif (hasWindow) {\n\t\t\t\twindow.addEventListener('beforeunload', () => {\n\t\t\t\t\tthis.closeRealtime();\n\t\t\t\t\tstoreClassProperties();\n\t\t\t\t});\n\t\t\t\t// for mobile\n\t\t\t\twindow.addEventListener('visibilitychange', () => {\n\t\t\t\t\tstoreClassProperties();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tawait connection;\n\t\t\tawait this.__authConnection;\n\t\t\treturn this.connection;\n\t\t})();\n\n\t\tthis.__connection.then((conn) => {\n\t\t\tif ((conn?.group || 0) < 3 || this.__network_logs) {\n\t\t\t\tthis.version();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Returns current connection metadata such as service name, client IP, user agent, locale, and SDK version.\n\t * @param params Request parameters. When `refresh` is true, the cached connection metadata is re-fetched before returning; otherwise the cached connection is returned.\n\t * @returns A promise that resolves to Promise<ConnectionInfo>.\n\t */\n\tasync getConnectionInfo(params?: { refresh?: boolean }): Promise<ConnectionInfo> {\n\t\tlet refresh = params?.refresh || false;\n\t\t\n\t\tif (refresh) {\n\t\t\tif(this.__connection instanceof Promise) {\n\t\t\t\tawait this.__connection;\n\t\t\t}\n\t\t\tthis.__connection = this._updateConnection({ refresh: true });\n\t\t}\n\t\tlet conn = await this.__connection;\n\t\t// get browser user-agent info\n\t\tlet ua =\n\t\t\tconn?.user_agent ||\n\t\t\t(isBrowserRuntime() &&\n\t\t\ttypeof window.navigator?.userAgent === 'string'\n\t\t\t\t? window.navigator.userAgent\n\t\t\t\t: `skapi-node/${(globalThis as any)?.process?.versions?.node || 'unknown'}`);\n\t\treturn {\n\t\t\tproject_id: this.project_id,\n\t\t\tuser_ip: conn.ip,\n\t\t\tuser_agent: ua,\n\t\t\tuser_location: conn.locale,\n\t\t\tservice_name: conn.service_name,\n\t\t\tversion: this.__version,\n\t\t\tservice_description: conn?.service_description || \"\",\n\t\t\tai_agent: conn?.ai_agent || \"\",\n\t\t\tconf: conn?.opt\n\t\t};\n\t}\n\n\tprivate async _updateConnection(params?: { refresh: Boolean }): Promise<Connection> {\n\t\tlet refresh = params?.refresh || false;\n\t\ttry {\n\t\t\tthis.connection = await request.bind(this)(\n\t\t\t\t'service',\n\t\t\t\t{\n\t\t\t\t\tservice: this.service,\n\t\t\t\t\towner: this.owner,\n\t\t\t\t\trefresh\n\t\t\t\t},\n\t\t\t\t{ bypassAwaitConnection: true, method: 'get' },\n\t\t\t);\n\t\t} catch (err: any) {\n\t\t\tthis.log('connection fail', err);\n\t\t\tthis._alert(\n\t\t\t\t'Service is not available: ' + (err.message || err.toString()),\n\t\t\t);\n\n\t\t\tthis.connection = null;\n\t\t\tthrow err;\n\t\t}\n\t\treturn this.connection;\n\t}\n\n\tprivate registerTicket = registerTicket.bind(this);\n\tprivate unregisterTicket = unregisterTicket.bind(this);\n\n\t/**\n\t * Returns the current SDK version and prints runtime version details in browser environments.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\tasync version(): Promise<string> {\n\t\tawait this.__connection;\n\n\t\tif (isBrowserRuntime()) {\n\t\t\tlet skapi = `%c\\r\\n $$\\\\ $$\\\\ \\r\\n $$ | \\\\__|\\r\\n $$$$$$$\\\\ $$ | $$\\\\ $$$$$$\\\\ $$$$$$\\\\ $$\\\\ \\r\\n$$ _____|$$ | $$ |\\\\____$$\\\\ $$ __$$\\\\ $$ |\\r\\n\\\\$$$$$$\\\\ $$$$$$ \\/ $$$$$$$ |$$ \\/ $$ |$$ |\\r\\n \\\\____$$\\\\ $$ _$$< $$ __$$ |$$ | $$ |$$ |\\r\\n$$$$$$$ |$$ | \\\\$$\\\\\\\\$$$$$$$ |$$$$$$$ |$$ |\\r\\n\\\\_______\\/ \\\\__| \\\\__|\\\\_______|$$ ____\\/ \\\\__|\\r\\n $$ | \\r\\n $$ | \\r\\n \\\\__| \\r\\n`;\n\t\t\tlet message = `Built with:\\n${skapi}Version: ${this.__version}\\n\\nFull Documentation: https://docs.skapi.com/skapi.md`;\n\t\t\tconsole.log(message, `font-family: monospace; color:blue;`);\n\t\t\tif (this.connection.group === 1) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`%cSKAPI: THE SERVICE IS IN TRIAL MODE.`,\n\t\t\t\t\t`font-family: monospace; color:red;`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn this.__version;\n\t}\n\n\tprivate log(n: string, v: any) {\n\t\tif (this.__network_logs) {\n\t\t\tif (v !== null && typeof v === 'object') {\n\t\t\t\ttry {\n\t\t\t\t\t// if it's not a browser runtime, print as a string to avoid [Object object] issue\n\t\t\t\t\tif (!isBrowserRuntime()) {\n\t\t\t\t\t\tv = JSON.stringify(v, null, 2);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv = JSON.parse(JSON.stringify(v));\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tv = String(v);\n\t\t\t\t}\n\t\t\t} else if (typeof v === 'string' && v.length > 100) {\n\t\t\t\tv = v.substring(0, 100) + '...';\n\t\t\t}\n\n\t\t\tconsole.log(`%c${n}:`, 'color: blue;', v);\n\t\t}\n\t}\n\n\t/**\n\t * Fetches feed records visible to the current user with optional access-group filtering and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<RecordData>>.\n\t */\n\t@formHandler()\n\tgetFeed(\n\t\tparams?: { access_group?: number },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<RecordData>> {\n\t\treturn getFeed.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Closes an active WebRTC connection by cid or closes all active RTC connections.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<void>.\n\t */\n\t@formHandler()\n\tcloseRTC(params: { cid?: string; close_all?: boolean }): Promise<void> {\n\t\treturn closeRTC.bind(this)(params);\n\t}\n\n\t/**\n\t * Creates or joins a WebRTC session and returns an RTC connector for streaming events and controls.\n\t * @param params Request parameters.\n\t * @param callback Callback invoked for events or updates.\n\t * @returns A promise that resolves to Promise<RTCConnector>.\n\t */\n\t@formHandler()\n\tconnectRTC(\n\t\tparams: RTCConnectorParams,\n\t\tcallback: (e: RTCEvent) => void,\n\t): Promise<RTCConnector> {\n\t\treturn connectRTC.bind(this)(params, callback);\n\t}\n\n\t/**\n\t * Opens a realtime WebSocket connection and registers a callback for incoming realtime messages.\n\t * The WebSocket is delivered through the callback (and stored on the instance); on the initial connection the returned promise resolves to undefined rather than the socket.\n\t * @param callback Callback invoked for events or updates.\n\t * @returns A promise that resolves to Promise<WebSocket | void>.\n\t */\n\tconnectRealtime(callback: RealtimeCallback): Promise<WebSocket | void> {\n\t\treturn connectRealtime.bind(this)(callback);\n\t}\n\n\t/**\n\t * Casts a spell (uploads the given spell/name). The server response is not surfaced; resolves to a fixed confirmation string.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\tspellcast(params: {\n\t\tspell: string;\n\t\tname: string;\n\t\tmagic?: any;\n\t}): Promise<string> {\n\t\treturn spellcast.bind(this)(params);\n\t}\n\n\t/**\n\t * Searches previously stored spell records by spell text or name. Defaults to 'spell' search if no search type is specified.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<{ spell: string; magic?: any; name: string; }>>.\n\t */\n\t@formHandler()\n\tgetspell(params?: { search?: 'spell' | 'name'; value?: string }): Promise<\n\t\tDatabaseResponse<{\n\t\t\tspell: string;\n\t\t\tname: string;\n\t\t\tmagic?: any;\n\t\t}>\n\t> {\n\t\treturn getspell.bind(this)(params);\n\t}\n\n\t/**\n\t * Uploads a dopamine message. In non-browser runtimes, resolves to a formatted string (including the video URL, and the previous message if one exists); in the browser it alerts and redirects, resolving to undefined.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string | void>.\n\t */\n\t@formHandler()\n\tdopamine(params: { message: string; name: string }): Promise<string | void> {\n\t\treturn dopamine.bind(this)(params);\n\t}\n\t/**\n\t * Queries unique ID records by unique_id or condition filters.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<UniqueId>>.\n\t */\n\t@formHandler()\n\tgetUniqueId(\n\t\tparams?: Form<{\n\t\t\t/** Unique ID */\n\t\t\tunique_id?: string;\n\t\t\t/** String query condition for the unique_id value. */\n\t\t\tcondition?: Condition | 'ne' | '!=';\n\t\t}>,\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<UniqueId>> {\n\t\treturn getUniqueId.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Resends an existing user invitation email to the target address.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Invitation has been re-sent. (User ID: xxx...)\">.\n\t */\n\t@formHandler()\n\tresendInvitation(\n\t\tparams: Form<{\n\t\t\temail: string;\n\t\t}>,\n\t): Promise<'SUCCESS: Invitation has been re-sent. (User ID: xxx...)'> {\n\t\treturn resendInvitation.bind(this)(params);\n\t}\n\n\t/**\n\t * Cancels a pending invitation for the target email address.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Invitation has been canceled.\">.\n\t */\n\t@formHandler()\n\tcancelInvitation(\n\t\tparams: Form<{\n\t\t\temail: string;\n\t\t}>,\n\t): Promise<'SUCCESS: Invitation has been canceled.'> {\n\t\treturn cancelInvitation.bind(this)(params);\n\t}\n\n\t/**\n\t * Lists invitation records with optional email filtering and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<UserProfile>>.\n\t */\n\t@formHandler()\n\tgetInvitations(\n\t\tparams?: Form<{\n\t\t\temail?: string;\n\t\t}>,\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<UserProfile>> {\n\t\treturn getInvitations.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Completes OpenID login and optionally merges the OpenID identity with an existing account.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<{ userProfile: UserProfile; openid: { [attribute: string]: string } }>.\n\t */\n\t@formHandler()\n\topenIdLogin(params: {\n\t\ttoken: string;\n\t\tid: string;\n\t\tmerge?: boolean | string[];\n\t\ttemplate?: {\n\t\t\t/** message_id of the template to use for the welcome e-mail (sent the first time this OpenID user account is created). */\n\t\t\twelcome?: string;\n\t\t};\n\t}): Promise<{\n\t\tuserProfile: UserProfile;\n\t\topenid: { [attribute: string]: string };\n\t}> {\n\t\treturn openIdLogin.bind(this)(params);\n\t}\n\n\t/**\n\t * Logs in a user with externally issued id/access/refresh tokens.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<UserProfile>.\n\t */\n\t@formHandler()\n\tloginWithToken(params: {\n\t\tidToken: string;\n\t\taccessToken?: string;\n\t\trefreshToken?: string;\n\t}): Promise<UserProfile> {\n\t\treturn loginWithToken.bind(this)(params);\n\t}\n\n\t// /**\n\t// * Creates or updates a newsletter group with its delivery restriction settings.\n\t// * @param params Request parameters.\n\t// * @returns A promise that resolves to Promise<\"SUCCESS: Your newsletter group has been registered.\">.\n\t// */\n\t// @formHandler()\n\t// registerNewsletterGroup(params: Form<{\n\t// group: string;\n\t// restriction: number;\n\t// }>): Promise<\"SUCCESS: Your newsletter group has been registered.\"> {\n\t// return registerNewsletterGroup.bind(this)(params) as Promise<\"SUCCESS: Your newsletter group has been registered.\">;\n\t// }\n\t/**\n\t * Sends a secure outbound request using a Skapi client secret key.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to the final API response, or to a status object when the request is queued.\n\t */\n\t@formHandler()\n\tclientSecretRequest(params: {\n\t\turl: string;\n\t\tclientSecretName: string;\n\t\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\theaders?: { [key: string]: string };\n\t\tdata?: { [key: string]: any };\n\t\tparams?: { [key: string]: string };\n\t\tpoll?: number; // Polling interval in milliseconds. When > 0 the promise resolves immediately with the initial status object and the final result is delivered via onResponse/onError. When omitted or 0, the status object is returned with a poll() method to start polling manually.\n\t\tqueue?: string; // Optional queue name. Requests sharing the same queue are processed sequentially.\n\t\texpires?: number; // Optional expiration time in seconds for the request record.\n\t\tonResponse?: (res: any) => void; // Called with the final API response once polling resolves, or immediately for non-queued responses.\n\t\tonError?: (err: any) => void; // Called when polling or the initial request fails.\n\t}): Promise<any | {\n\t\tid: string;\n\t\tstatus: 'running' | 'pending';\n\t\tqueue_name: string;\n\t\tin_queue: number;\n\t\tpoll?: (arg?: { latency?: number }) => Promise<any>;\n\t}> {\n\t\treturn clientSecretRequest.bind(this)(params);\n\t}\n\n\t/**\n\t * Retrieves the history of client secret requests for a given URL and method.\n\t *\n\t * Listing modifiers: `compact` returns lightweight label/marker stubs\n\t * (request_text, response_text, response_complete_marker) instead of the\n\t * full request/response bodies, which stay on the server; `queue_exact`\n\t * restricts a queue listing to exactly the named queue (the queue lookup is\n\t * otherwise a prefix range, so queue \"u1\" would also match \"u1-bg\");\n\t * `queue_exclude` drops one queue's rows from the listing. Both queue\n\t * filters are applied server-side after the range read, so a page can come\n\t * back short while more matches remain - keep paging by startKey/endOfList.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to a paginated list of request history items.\n\t */\n\t@formHandler()\n\tclientSecretRequestHistory(\n\t\tparams: {\n\t\t\turl: string;\n\t\t\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\t\tqueue?: string; // Optional queue name to filter results.\n\t\t\tstatus?: 'pending' | 'running' | 'resolved' | 'failed'; // Optional status filter.\n\t\t\tcompact?: boolean; // Return label/marker stubs instead of full request/response bodies.\n\t\t\tqueue_exact?: boolean; // Match the named queue exactly (a bare queue lookup is a prefix range: \"u1\" also matches \"u1-bg\").\n\t\t\tqueue_exclude?: string; // Drop this queue's rows from the listing.\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<RequestHistory[]>> {\n\t\treturn clientSecretRequestHistory.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Cancels a pending client secret request and removes it from the client-side queue if applicable.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to a result object with removed status and message.\n\t */\n\t@formHandler()\n\tcancelClientSecretRequest(params: {\n\t\turl: string;\n\t\tmethod: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\tid: string; // Request ID to cancel.\n\t\tqueue?: string; // Optional queue name the request belongs to, used to remove it from the client-side queue.\n\t}): Promise<{ removed: boolean; message: string }> {\n\t\treturn cancelClientSecretRequest.bind(this)(params);\n\t}\n\n\t/**\n\t * Stops live polling for client secret requests without cancelling the requests\n\t * themselves. The server-side work continues; only this client stops asking about it.\n\t *\n\t * Use it to drop polling traffic while the user is not looking at the results (a\n\t * hidden tab, a closed view), then simply poll again when they return. Polls run\n\t * one-at-a-time per queue, so a poll for a request that never settles otherwise\n\t * blocks every poll queued behind it.\n\t *\n\t * Pass `id` (with `url` and `method`) to stop one request, `queue` to stop a queue's\n\t * polls, or neither to stop all of them. A stopped poll resolves with\n\t * `{ id, status: 'stopped' }` rather than rejecting, and its `onResponse`/`onError`\n\t * callbacks are not called.\n\t *\n\t * @param params Which polls to stop.\n\t * @returns The number of polls stopped.\n\t */\n\tstopClientSecretPolling(params?: {\n\t\turl?: string;\n\t\tmethod?: 'GET' | 'POST' | 'DELETE' | 'PUT';\n\t\tid?: string; // Request ID (short form, paired with url+method, or an already-full id).\n\t\tqueue?: string; // Queue name the polls were started with.\n\t\tservice?: string;\n\t\towner?: string;\n\t}): number {\n\t\treturn stopClientSecretPolling.bind(this)(params || {});\n\t}\n\n\t/**\n\t * True if a poll result came from stopClientSecretPolling rather than the server.\n\t * @param res A resolved poll result.\n\t */\n\tisPollStopped(res: any): boolean {\n\t\treturn isPollStopped(res);\n\t}\n\n\t/**\n\t * Returns the number of requests currently waiting in a named client secret request queue.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to queue count information.\n\t */\n\tclientSecretRequestQueueCount(params: {\n\t\tqueue: string;\n\t\tservice?: string;\n\t\towner?: string;\n\t}): Promise<{ queue_name: string; in_queue: number }> {\n\t\treturn clientSecretRequestQueueCount.bind(this)(params);\n\t}\n\n\t/**\n\t * Consumes a one-time ticket and executes the ticketed request payload.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<any>.\n\t */\n\t@formHandler()\n\tconsumeTicket(params: {\n\t\tticket_id: string;\n\t\tmethod: string; // GET | POST\n\t\tauth?: boolean;\n\t\tdata?: {\n\t\t\t[key: string]: any;\n\t\t};\n\t}): Promise<any> {\n\t\treturn consumeTicket.bind(this)(params);\n\t}\n\n\t/**\n\t * Lists consumed tickets with optional filters and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<any>>.\n\t */\n\t@formHandler()\n\tgetConsumedTickets(\n\t\tparams: { ticket_id?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<any>> {\n\t\treturn getConsumedTickets.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Lists issued tickets with optional filters and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<any>>.\n\t */\n\t@formHandler()\n\tgetTickets(\n\t\tparams: { ticket_id?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<any>> {\n\t\treturn getTickets.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Closes the active realtime WebSocket connection.\n\t * @returns A promise that resolves to Promise<void>.\n\t */\n\tcloseRealtime(): Promise<void> {\n\t\treturn closeRealtime.bind(this)();\n\t}\n\n\t/**\n\t * Fetches currently connected users in a realtime group.\n\t * @param params Request parameters. When `group` is omitted, it defaults to the realtime group the user is currently joined to.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<{ user_id: string; cid: string }[]>>.\n\t */\n\t@formHandler()\n\tgetRealtimeUsers(\n\t\tparams?: { group?: string; user_id?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<{ user_id: string; cid: string }[]>> {\n\t\treturn getRealtimeUsers.bind(this)(params, fetchOptions);\n\t}\n\n\t/**\n\t * Sends an inquiry email payload to the service contact channel.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Inquiry has been sent.\">.\n\t */\n\t@formHandler()\n\tsendInquiry(\n\t\tparams: Form<{\n\t\t\tname: string;\n\t\t\temail: string;\n\t\t\tsubject: string;\n\t\t\tmessage: string;\n\t\t}>,\n\t): Promise<'SUCCESS: Inquiry has been sent.'> {\n\t\treturn sendInquiry.bind(this)(params);\n\t}\n\n\t/**\n\t * Blocks a user account by user_id.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: The user has been blocked.\">.\n\t */\n\t@formHandler()\n\tblockAccount(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: The user has been blocked.'> {\n\t\treturn blockAccount.bind(this)(params);\n\t}\n\n\t/**\n\t * Unblocks a previously blocked user account by user_id.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: The user has been unblocked.\">.\n\t */\n\t@formHandler()\n\tunblockAccount(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: The user has been unblocked.'> {\n\t\treturn unblockAccount.bind(this)(params);\n\t}\n\n\t/**\n\t * Deletes a user account by user_id.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Account has been deleted.\">.\n\t */\n\t@formHandler()\n\tdeleteAccount(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: Account has been deleted.'> {\n\t\treturn deleteAccount.bind(this)(params);\n\t}\n\n\t/**\n\t * Invites a user by email with optional attributes and invitation email options.\n\t * @param params Payload for the request.\n\t * @param options Optional behavior configuration.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Invitation has been sent. (User ID: xxx...)'>.\n\t */\n\t@formHandler()\n\tinviteUser(\n\t\tparams: UserAttributes & { openid_id?: string; access_group?: number },\n\t\toptions?: {\n\t\t\tconfirmation_url?: string;\n\t\t\temail_subscription?: boolean;\n\t\t\ttemplate?: {\n\t\t\t\turl: string;\n\t\t\t\tsubject: string;\n\t\t\t};\n\t\t},\n\t): Promise<'SUCCESS: Invitation has been sent. (User ID: xxx...)'> {\n\t\treturn inviteUser.bind(this)(params, options);\n\t}\n\n\t/**\n\t * Creates a user account directly from admin context.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<UserProfile & { email_admin: string; username: string; }>.\n\t */\n\t@formHandler()\n\tcreateAccount(\n\t\tparams: UserAttributes & { email: string; password: string; access_group?: number },\n\t): Promise<UserProfile & { email_admin: string; username: string }> {\n\t\treturn createAccount.bind(this)(params);\n\t}\n\n\t/**\n\t * Updates a user's access_group level.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Access has been granted to the user.'>.\n\t */\n\t@formHandler()\n\tgrantAccess(params: {\n\t\tuser_id: string;\n\t\taccess_group: number;\n\t}): Promise<'SUCCESS: Access has been granted to the user.'> {\n\t\treturn grantAccess.bind(this)(params);\n\t}\n\n\t/**\n\t * Updates another user's profile attributes from admin context.\n\t * Requires the target user's user_id plus at least one attribute to update.\n\t * @param params Target user_id and the attributes to update.\n\t * @returns A promise that resolves to Promise<'SUCCESS: User attributes updated.'>.\n\t */\n\t@formHandler()\n\tupdateUserAttributes(\n\t\tparams: UserAttributes & { user_id: string },\n\t): Promise<'SUCCESS: User attributes updated.'> {\n\t\treturn updateUserAttributes.bind(this)(params);\n\t}\n\n\t/**\n\t * Lists realtime groups with optional search conditions and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<{ group: string; number_of_users: number; }>>.\n\t */\n\t@formHandler()\n\tgetRealtimeGroups(\n\t\tparams?: {\n\t\t\t/** Index name to search. */\n\t\t\tsearchFor?: 'group' | 'number_of_users';\n\t\t\t/** Index value to search. */\n\t\t\tvalue?: string | number;\n\t\t\t/** Search condition. */\n\t\t\tcondition?:\n\t\t\t\t| '>'\n\t\t\t\t| '>='\n\t\t\t\t| '='\n\t\t\t\t| '<'\n\t\t\t\t| '<='\n\t\t\t\t| '!='\n\t\t\t\t| 'gt'\n\t\t\t\t| 'gte'\n\t\t\t\t| 'eq'\n\t\t\t\t| 'lt'\n\t\t\t\t| 'lte'\n\t\t\t\t| 'ne';\n\t\t\t/** Range of search. */\n\t\t\trange?: string | number;\n\t\t} | null,\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<{ group: string; number_of_users: number }>> {\n\t\treturn getRealtimeGroups.bind(this)(params, fetchOptions);\n\t}\n\t// /**\n\t// * Calls the newsletter group endpoint for administrative group operations.\n\t// * @param params Request parameters.\n\t// */\n\t// @formHandler()\n\t// newsletterGroupEndpoint(params) {\n\t// return newsletterGroupEndpoint.bind(this)(params);\n\t// }\n\t/**\n\t * Sends realtime data to a user or group with optional push notification metadata.\n\t * @param message Message payload to send.\n\t * @param recipient Recipient user or group target.\n\t * @param notification Optional notification payload.\n\t * @returns A promise that resolves to Promise<{ type: 'success', message: 'Message sent.' }>.\n\t */\n\t@formHandler()\n\tpostRealtime(\n\t\tmessage: any,\n\t\trecipient: string,\n\t\tnotification?: {\n\t\t\tconfig?: { always: boolean };\n\t\t\ttitle: string;\n\t\t\tbody: string;\n\t\t},\n\t): Promise<{ type: 'success'; message: 'Message sent.' }> {\n\t\treturn postRealtime.bind(this)(message, recipient, notification);\n\t}\n\n\t/**\n\t * Joins the current connection to a realtime group or leaves group membership when null.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<{ type: 'success', message: string }>.\n\t */\n\t@formHandler()\n\tjoinRealtime(params: {\n\t\tgroup?: string | null;\n\t}): Promise<{ type: 'success'; message: string }> {\n\t\treturn joinRealtime.bind(this)(params);\n\t}\n\n\t// /**\n\t// * Returns the active service connection object after initialization.\n\t// * @returns A promise that resolves to Promise<Connection>.\n\t// */\n\t// private _getConnection(): Promise<Connection> {\n\t// return this.__connection;\n\t// }\n\n\t/**\n\t * Retrieves the currently authenticated user profile, optionally refreshing token/session state.\n\t * @param options Optional behavior configuration.\n\t * @returns A promise that resolves to Promise<UserProfile | null>.\n\t */\n\t@formHandler()\n\tgetProfile(options?: {\n\t\trefreshToken?: boolean;\n\t}): Promise<UserProfile | null> {\n\t\treturn getProfile.bind(this)(options);\n\t}\n\t/**\n\t * Retrieves a file by URL with optional conversion mode, expiration, and progress handling.\n\t * @param url Target URL.\n\t * @param config Additional configuration options.\n\t * @returns A promise that resolves to Promise<Blob | string | void | FileInfo>.\n\t */\n\t@formHandler()\n\tgetFile(\n\t\turl: string, // cdn endpoint url https://xxxx.cloudfront.net/path/file\n\t\tconfig?: {\n\t\t\tdataType?:\n\t\t\t\t| 'base64'\n\t\t\t\t| 'download'\n\t\t\t\t| 'endpoint'\n\t\t\t\t| 'blob'\n\t\t\t\t| 'text'\n\t\t\t\t| 'info'; // default 'download'\n\t\t\texpires?: number; // uses url that expires. this option does not use the cdn (slow). can be used for private files. (does not work on public files).\n\t\t\t// Seconds the browser may reuse the url minted for `expires`. Without\n\t\t\t// it every call mints a new signed url, which is a new cache key, so\n\t\t\t// the file downloads again every time. See getFile in\n\t\t\t// methods/database.ts. Only meaningful together with `expires`.\n\t\t\tbrowserCache?: number;\n\t\t\t// Bypass the cached mint above and force a fresh signed url.\n\t\t\trefresh?: boolean;\n\t\t\tprogress?: ProgressCallback;\n\t\t},\n\t): Promise<Blob | string | void | FileInfo> {\n\t\treturn getFile.bind(this)(url, config);\n\t}\n\t/**\n\t * Executes authenticated secure API requests in single or batch mode.\n\t * @param params Request parameters.\n\t * @param url Target URL.\n\t * @returns A promise that resolves to Promise<Response | Response[]>.\n\t */\n\t@formHandler()\n\tsecureRequest<\n\t\tParams = {\n\t\t\t/** Request url */\n\t\t\turl: string;\n\t\t\t/** Request data */\n\t\t\tdata?: any;\n\t\t\t/** requests are sync when true */\n\t\t\tsync?: boolean;\n\t\t},\n\t\tResponse = { response: any; statusCode: number; url: string },\n\t>(\n\t\tparams: Params[] | Form<Params>,\n\t\turl?: string,\n\t): Promise<Response | Response[]> {\n\t\treturn secureRequest.bind(this)(params, url);\n\t}\n\t/**\n\t * Relays a request to a destination of your choosing from the server side,\n\t * with the service api key added where the browser cannot read it, and\n\t * streams the destination's response back as it arrives.\n\t *\n\t * The body is relayed verbatim, so an html form reaches the destination as\n\t * multipart/form-data, files included; the form's own enctype and method\n\t * attributes are not used. Supply options.onStream to receive the response\n\t * chunk by chunk. An error response throws a SkapiError either way; reading\n\t * the status code or a response header needs options.responseType\n\t * 'response'. options.signal stops the client receiving the response, it\n\t * does not cancel the request already sent to the destination.\n\t *\n\t * @param form Form element, submit event, FormData, or a plain object. Sent to the destination verbatim.\n\t * @param options Destination url, method, headers, and an optional onStream callback.\n\t * @returns A promise that resolves to the destination's response.\n\t */\n\t// Decorated like every other form-taking method, so\n\t// onsubmit=\"skapi.forwardRequest(event, {...})\" works with no preventDefault\n\t// from the caller: the decorator calls it and passes the event through\n\t// untouched.\n\t//\n\t// One caveat belongs with a STREAMING call. When the form carries an `action`\n\t// attribute the decorator serializes the resolved value into sessionStorage\n\t// and navigates there, which throws the stream away. Streaming forms should\n\t// have no action.\n\t@formHandler()\n\tforwardRequest(\n\t\tform: any,\n\t\toptions: {\n\t\t\turl: string;\n\t\t\tmethod?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD';\n\t\t\theaders?: { [key: string]: string };\n\t\t\tapiKeyHeader?: string;\n\t\t\tapiKeyScheme?: string;\n\t\t\tonStream?: (chunk: string) => void;\n\t\t\tsignal?: AbortSignal;\n\t\t\tresponseType?: 'json' | 'text' | 'response';\n\t\t},\n\t): Promise<any> {\n\t\treturn forwardRequest.bind(this)(form, options);\n\t}\n\t/**\n\t * Returns a normalized response object for form-based handler flows.\n\t * @returns A promise that resolves to Promise<any>.\n\t */\n\t@formHandler()\n\tgetFormResponse(): Promise<any> {\n\t\treturn getFormResponse.bind(this)();\n\t}\n\t/**\n\t * Queries database records with filtering, sorting, and pagination options.\n\t * @param query Query object used to filter results.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<RecordData>>.\n\t */\n\t@formHandler()\n\tgetRecords(\n\t\tquery: GetRecordQuery & { private_key?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<RecordData>> {\n\t\treturn getRecords.bind(this)(query, fetchOptions);\n\t}\n\t/**\n\t * Lists table metadata with optional table-name filters.\n\t * @param query Query object used to filter results.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<Table>>.\n\t */\n\t@formHandler()\n\tgetTables(\n\t\t/** If omitted, fetches the full list of tables. */\n\t\tquery?: {\n\t\t\ttable?: string;\n\t\t\t/** Condition operator of table name. */\n\t\t\tcondition?: Condition;\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<Table>> {\n\t\treturn getTables.bind(this)(query, fetchOptions);\n\t}\n\t/**\n\t * Lists index metadata and aggregated index statistics for a table.\n\t * @param query Query object used to filter results.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<Index>>.\n\t */\n\t@formHandler()\n\tgetIndexes(\n\t\tquery: {\n\t\t\t/** Table name */\n\t\t\ttable: string;\n\t\t\t/** Index name. When period is at the end of name, querys nested index keys. */\n\t\t\tindex?: string;\n\t\t\t/** Queries order by */\n\t\t\torder?: {\n\t\t\t\t/** Key name to order by. */\n\t\t\t\tby:\n\t\t\t\t\t| 'average_number'\n\t\t\t\t\t| 'total_number'\n\t\t\t\t\t| 'number_count'\n\t\t\t\t\t| 'average_bool'\n\t\t\t\t\t| 'total_bool'\n\t\t\t\t\t| 'bool_count'\n\t\t\t\t\t| 'string_count'\n\t\t\t\t\t| 'index_name'\n\t\t\t\t\t| 'number_of_records';\n\t\t\t\t/** Value to query. */\n\t\t\t\tvalue?: number | boolean | string;\n\t\t\t\tcondition?: Condition;\n\t\t\t};\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<Index>> {\n\t\treturn getIndexes.bind(this)(query, fetchOptions);\n\t}\n\t/**\n\t * Lists tags used in a table with optional tag-name filtering.\n\t * @param query Query object used to filter results.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<Tag>>.\n\t */\n\t@formHandler()\n\tgetTags(\n\t\tquery?: {\n\t\t\t/** Table name */\n\t\t\ttable?: string;\n\t\t\t/** Tag name */\n\t\t\ttag?: string;\n\t\t\t/** String query condition for tag name. */\n\t\t\tcondition?: Condition;\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<Tag>> {\n\t\treturn getTags.bind(this)(query, fetchOptions);\n\t}\n\t/**\n\t * Deletes records by query or record_id and returns deletion results.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<string | DatabaseResponse<RecordData>>.\n\t */\n\t@formHandler()\n\tdeleteRecords(\n\t\tparams: DelRecordQuery & { private_key?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<string | DatabaseResponse<RecordData>> {\n\t\treturn deleteRecords.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Resends the signup confirmation email for the current pending account.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Signup confirmation e-mail has been sent.'>.\n\t */\n\t@formHandler()\n\tresendSignupConfirmation(): Promise<'SUCCESS: Signup confirmation e-mail has been sent.'> {\n\t\treturn resendSignupConfirmation.bind(this)();\n\t}\n\t/**\n\t * Sends an account recovery email and optionally sets a recovery redirect URL.\n\t * @param redirect Redirect URL or false to disable redirect.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Recovery e-mail has been sent.\">.\n\t */\n\t@formHandler()\n\trecoverAccount(\n\t\t/** Redirect url on confirmation success. */\n\t\tredirect: boolean | string = false,\n\t): Promise<'SUCCESS: Recovery e-mail has been sent.'> {\n\t\treturn recoverAccount.bind(this)(redirect);\n\t}\n\t/**\n\t * Queries users by supported profile/search fields with pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<UserPublic>>.\n\t */\n\t@formHandler()\n\tgetUsers(\n\t\tparams?: {\n\t\t\t/** Index name to search. */\n\t\t\tsearchFor:\n\t\t\t\t| 'user_id'\n\t\t\t\t| 'email'\n\t\t\t\t| 'phone_number'\n\t\t\t\t| 'locale'\n\t\t\t\t| 'name'\n\t\t\t\t| 'address'\n\t\t\t\t| 'gender'\n\t\t\t\t| 'birthdate'\n\t\t\t\t| 'subscribers'\n\t\t\t\t| 'timestamp'\n\t\t\t\t| 'access_group'\n\t\t\t\t| 'approved';\n\t\t\t/** Index value to search. */\n\t\t\tvalue: string | number | string[];\n\t\t\t/** Search condition. */\n\t\t\tcondition?:\n\t\t\t\t| '>'\n\t\t\t\t| '>='\n\t\t\t\t| '='\n\t\t\t\t| '<'\n\t\t\t\t| '<='\n\t\t\t\t| 'gt'\n\t\t\t\t| 'gte'\n\t\t\t\t| 'eq'\n\t\t\t\t| 'lt'\n\t\t\t\t| 'lte';\n\t\t\t/** Range of search. */\n\t\t\trange?: string | number;\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<UserPublic>> {\n\t\treturn getUsers.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Disables the currently logged-in user account.\n\t * @returns A promise that resolves to Promise<'SUCCESS: account has been disabled.'>.\n\t */\n\t@formHandler()\n\tdisableAccount(): Promise<'SUCCESS: account has been disabled.'> {\n\t\treturn disableAccount.bind(this)();\n\t}\n\t/**\n\t * Returns the last verified email or reverts to it when revert is requested.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string | UserProfile>.\n\t */\n\t@formHandler()\n\tlastVerifiedEmail(params?: {\n\t\trevert: boolean; // Reverts to last verified e-mail when true.\n\t}): Promise<string | UserProfile> {\n\t\treturn lastVerifiedEmail.bind(this)(params);\n\t}\n\t/**\n\t * Unsubscribes the user from a newsletter group.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\tunsubscribeNewsletter(params: {\n\t\tgroup: number | 'public' | 'authorized' | 'admin';\n\t}): Promise<string> {\n\t\treturn unsubscribeNewsletter.bind(this)(params);\n\t}\n\t// /**\n\t// * Sends an administrative newsletter request payload.\n\t// * @param params Request parameters.\n\t// */\n\t// @formHandler()\n\t// adminNewsletterRequest(params) {\n\t// return adminNewsletterRequest.bind(this)(params);\n\t// }\n\t/**\n\t * Registers a web push subscription endpoint for notifications.\n\t * @param endpoint Push subscription endpoint URL.\n\t * @param keys Web Push key pair values.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Subscribed to receive notifications.'>.\n\t */\n\t@formHandler()\n\tsubscribeNotification(\n\t\tendpoint: string,\n\t\tkeys: {\n\t\t\tp256dh: string;\n\t\t\tauth: string;\n\t\t},\n\t): Promise<'SUCCESS: Subscribed to receive notifications.'> {\n\t\treturn subscribeNotification.bind(this)({ endpoint, keys });\n\t}\n\t/**\n\t * Removes a registered web push subscription endpoint.\n\t * @param endpoint Push subscription endpoint URL.\n\t * @param keys Web Push key pair values.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Unsubscribed from notifications.'>.\n\t */\n\t@formHandler()\n\tunsubscribeNotification(\n\t\tendpoint: string,\n\t\tkeys: {\n\t\t\tp256dh: string;\n\t\t\tauth: string;\n\t\t},\n\t): Promise<'SUCCESS: Unsubscribed from notifications.'> {\n\t\treturn unsubscribeNotification.bind(this)({ endpoint, keys });\n\t}\n\t/**\n\t * Returns the VAPID public key required for browser push subscription setup.\n\t * @returns A promise that resolves to Promise<{ VAPIDPublicKey: string }>.\n\t */\n\t@formHandler()\n\tvapidPublicKey(): Promise<{ VAPIDPublicKey: string }> {\n\t\treturn vapidPublicKey.bind(this)();\n\t}\n\t/**\n\t * Sends push notifications to one or more users.\n\t * @param params Payload for the request.\n\t * @param user_ids Parameter for this operation.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Notification sent.\">.\n\t */\n\t@formHandler()\n\tpushNotification(\n\t\tparams: {\n\t\t\ttitle: string;\n\t\t\tbody: string;\n\t\t},\n\t\tuser_ids?: string | string[],\n\t): Promise<'SUCCESS: Notification sent.'> {\n\t\treturn pushNotification.bind(this)(params, user_ids);\n\t}\n\n\t/**\n\t * Fetches newsletter delivery records with filters and pagination.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<Newsletter>>.\n\t */\n\t@formHandler()\n\tgetNewsletters(\n\t\tparams?: {\n\t\t\t/**\n\t\t\t * Search points.<br>\n\t\t\t * 'message_id' and 'subject' value should be string.<br>\n\t\t\t * Others numbers.\n\t\t\t */\n\t\t\tsearchFor:\n\t\t\t\t| 'message_id'\n\t\t\t\t| 'timestamp'\n\t\t\t\t| 'read'\n\t\t\t\t| 'complaint'\n\t\t\t\t| 'bounced'\n\t\t\t\t| 'subject';\n\t\t\tvalue: string | number;\n\t\t\trange?: string | number;\n\t\t\t/**\n\t\t\t * Defaults to '=',\n\t\t\t * Condition does not work with range.\n\t\t\t */\n\t\t\tcondition?:\n\t\t\t\t| '>'\n\t\t\t\t| '>='\n\t\t\t\t| '='\n\t\t\t\t| '<'\n\t\t\t\t| '<='\n\t\t\t\t| 'gt'\n\t\t\t\t| 'gte'\n\t\t\t\t| 'eq'\n\t\t\t\t| 'lt'\n\t\t\t\t| 'lte';\n\t\t\tgroup: 'public' | 'authorized' | number;\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<Newsletter>> {\n\t\treturn getNewsletters.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Gets newsletter subscription status for the requested groups.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<{ active: boolean; timestamp: number; group: number; subscribed_email: string; }[]>.\n\t */\n\t@formHandler()\n\tgetNewsletterSubscription(\n\t\tparams: { group?: number | 'public' | 'authorized'; user_id?: string },\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<\n\t\t| {\n\t\t\tactive: boolean;\n\t\t\ttimestamp: number;\n\t\t\tgroup: number;\n\t\t\tsubscribed_email: string;\n\t\t}[]\n\t\t| DatabaseResponse<{\n\t\t\tactive: boolean;\n\t\t\ttimestamp: number;\n\t\t\tgroup: number;\n\t\t\tsubscribed_email: string;\n\t\t}>\n\t> {\n\t\treturn getNewsletterSubscription.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Requests a username change confirmation flow for the current user.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: confirmation e-mail has been sent.'>.\n\t */\n\t@formHandler()\n\trequestUsernameChange(params: {\n\t\t/** Redirect URL when user clicks on the link. */\n\t\tredirect?: string;\n\t\t/** username(e-mail) user wish to change to. */\n\t\tusername: string;\n\t}): Promise<'SUCCESS: confirmation e-mail has been sent.'> {\n\t\treturn requestUsernameChange.bind(this)(params);\n\t}\n\t/**\n\t * Reports whether client-side record encryption is on, and whether it is\n\t * currently unlocked.\n\t * @returns { status: 'disabled' | 'locked' | 'unlocked', reason?, user_id?, fingerprint? }\n\t */\n\tgetEncryptionStatus(): {\n\t\tstatus: string;\n\t\treason?: string;\n\t\tuser_id?: string;\n\t\tfingerprint?: string;\n\t} {\n\t\treturn getEncryptionStatus.bind(this)();\n\t}\n\t/**\n\t * True when a record's `data` is the placeholder returned in place of\n\t * content this session cannot decrypt.\n\t *\n\t * Only relevant with `encryption: { withheld: 'sentinel' }`. Under the\n\t * default, withheld data is `null` and an ordinary falsy check is enough.\n\t * @param data The value of `record.data`.\n\t * @returns boolean\n\t */\n\tisWithheld(data: any): boolean {\n\t\treturn isWithheld.call(this, data);\n\t}\n\t/**\n\t * Unlocks record encryption with the user's password.\n\t *\n\t * Normally unnecessary: logging in unlocks automatically, and a page reload\n\t * unlocks from the device store. This is for a session restored from a token\n\t * on a device that has never been unlocked, and for Node, which has no\n\t * IndexedDB and is therefore always locked after a token restore.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<{ status: string }>.\n\t */\n\t@formHandler()\n\tunlockEncryption(params: { password: string }): Promise<{ status: string }> {\n\t\treturn unlockEncryption.bind(this)(params);\n\t}\n\t/**\n\t * Drops encryption keys from memory without logging out. Pass\n\t * { forgetDevice: true } to also clear the device store, which means the\n\t * next reload will require the password again.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<{ status: string }>.\n\t */\n\tlockEncryption(params?: { forgetDevice?: boolean }): Promise<{ status: string }> {\n\t\treturn lockEncryption.bind(this)(params);\n\t}\n\t/**\n\t * Collects a freshly minted recovery code, ONCE.\n\t *\n\t * Call it right after a login or signup that may have enrolled the user; it\n\t * returns the code and forgets it. There is no way to fetch it again later,\n\t * and that is the point: if the SDK could hand it back on demand it would be\n\t * holding the key, and so could the service provider. Show it, make the user\n\t * confirm they saved it, and never send it anywhere.\n\t * @returns The code, or null if nothing was enrolled.\n\t */\n\ttakeRecoveryCode(): string | null {\n\t\treturn takeRecoveryCode.bind(this)();\n\t}\n\t/**\n\t * Unlocks with a recovery code after a forgotten-password reset, and repairs\n\t * the keyring for the new password.\n\t *\n\t * The order is: reset the password, log in with the new one (encryption will\n\t * report 'locked'), then call this with the code and that new password. A\n\t * used code is retired and a replacement is returned.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<{ status, repaired, recoveryCode }>.\n\t */\n\t@formHandler()\n\tunlockWithRecoveryCode(params: {\n\t\tcode: string;\n\t\tpassword?: string;\n\t}): Promise<{ status: string; repaired: boolean; recoveryCode: string | null }> {\n\t\treturn unlockWithRecoveryCode.bind(this)(params);\n\t}\n\t/**\n\t * Retires the current recovery code and issues a new one. Requires an\n\t * unlocked session: only someone who can already decrypt can mint a code.\n\t * @returns A promise that resolves to Promise<{ recoveryCode: string }>.\n\t */\n\tregenerateRecoveryCode(): Promise<{ recoveryCode: string }> {\n\t\treturn regenerateRecoveryCode.bind(this)();\n\t}\n\t/**\n\t * Pins another user's public key fingerprint after verifying it out of band.\n\t *\n\t * Only needed when a peer's key has changed, or when trustPolicy is\n\t * 'strict'. The provider serves the key directory, so a changed key is both\n\t * what a legitimate account reset looks like and what a key substitution\n\t * attack looks like: the SDK refuses to guess.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<void>.\n\t */\n\tpinPeerKey(params: { user_id: string; fingerprint: string }): Promise<void> {\n\t\treturn pinPeerKey.bind(this)(params);\n\t}\n\t/**\n\t * Grants users access to a private record.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\tgrantPrivateRecordAccess(params: {\n\t\trecord_id: string;\n\t\tuser_id: string | string[];\n\t}): Promise<string> {\n\t\treturn grantPrivateRecordAccess.bind(this)(params);\n\t}\n\t/**\n\t * Removes previously granted private record access.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\tremovePrivateRecordAccess(params: {\n\t\trecord_id: string;\n\t\tuser_id: string | string[];\n\t}): Promise<string> {\n\t\treturn removePrivateRecordAccess.bind(this)(params);\n\t}\n\t/**\n\t * Lists current private record access grants.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<{ record_id: string; user_id: string; }>>.\n\t */\n\t@formHandler()\n\tlistPrivateRecordAccess(\n\t\tparams: {\n\t\t\trecord_id?: string;\n\t\t\tuser_id?: string | string[];\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<{ record_id: string; user_id: string }>> {\n\t\treturn listPrivateRecordAccess.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Requests a temporary access key for reading a private record.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\trequestPrivateRecordAccessKey(params: {\n\t\trecord_id: string;\n\t\treference_id?: string;\n\t}): Promise<string> {\n\t\treturn requestPrivateRecordAccessKey.bind(this)(params);\n\t}\n\t/**\n\t * Deletes uploaded files by endpoint list.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<RecordData[]>.\n\t */\n\t@formHandler()\n\tdeleteFiles(params: {\n\t\tendpoints: string | string[]; // bin file endpoints\n\t}): Promise<RecordData[]> {\n\t\treturn deleteFiles.bind(this)(params);\n\t}\n\t/**\n\t * Uploads files to an existing record and returns completed and failed results.\n\t * @param fileList Files or form event containing files.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<{ completed: File[], failed: File[], bin_endpoints: string[] }>.\n\t */\n\t@formHandler()\n\tuploadFiles(\n\t\tfileList: FormData | HTMLFormElement | SubmitEvent,\n\t\tparams: {\n\t\t\trecord_id: string; // Record ID of a record to upload files to.\n\t\t\tprogress?: ProgressCallback;\n\t\t},\n\t): Promise<{ completed: File[]; failed: File[]; bin_endpoints: string[] }> {\n\t\treturn uploadFiles.bind(this)(fileList, params);\n\t}\n\t/**\n\t * Calls the mock endpoint for testing request and error handling flows.\n\t * @param data Data payload for the request.\n\t * @param options Optional behavior configuration.\n\t * @returns A promise that resolves to Promise<{ [key: string]: any }>.\n\t */\n\t@formHandler()\n\tmock(\n\t\tdata: Form<\n\t\t\t| any\n\t\t\t| {\n\t\t\t\t\traise:\n\t\t\t\t\t\t| 'ERR_INVALID_REQUEST'\n\t\t\t\t\t\t| 'ERR_INVALID_PARAMETER'\n\t\t\t\t\t\t| 'SOMETHING_WENT_WRONG'\n\t\t\t\t\t\t| 'ERR_EXISTS'\n\t\t\t\t\t\t| 'ERR_NOT_EXISTS';\n\t\t\t }\n\t\t>,\n\t\toptions?: {\n\t\t\tauth?: boolean;\n\t\t\tmethod?: string;\n\t\t\tresponseType?:\n\t\t\t\t| 'blob'\n\t\t\t\t| 'json'\n\t\t\t\t| 'text'\n\t\t\t\t| 'arrayBuffer'\n\t\t\t\t| 'formData'\n\t\t\t\t| 'document';\n\t\t\tcontentType?: string;\n\t\t\ttokenHeaders?: {\n\t\t\t\taccessToken?: boolean | string;\n\t\t\t\tidToken?: boolean | string;\n\t\t\t};\n\t\t\tprogress?: ProgressCallback;\n\t\t},\n\t): Promise<{ [key: string]: any }> {\n\t\treturn mock.bind(this)(data, options);\n\t}\n\t/**\n\t * Authenticates a user with email/username and password.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<UserProfile>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tlogin(\n\t\tparams: Form<{\n\t\t\t/** if given, username will be used instead of email. */\n\t\t\tusername?: string;\n\t\t\t/** E-Mail for signin. 64 character max. */\n\t\t\temail: string;\n\t\t\t/** Password for signin. Should be at least 6 characters. */\n\t\t\tpassword: string;\n\t\t}>,\n\t): Promise<UserProfile> {\n\t\treturn login.bind(this)(params);\n\t}\n\t/**\n\t * Logs out the current user session (optionally globally).\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<'SUCCESS: The user has been logged out.'>.\n\t */\n\t@formHandler()\n\tlogout(\n\t\tparams?: Form<{ global: boolean }>,\n\t): Promise<'SUCCESS: The user has been logged out.'> {\n\t\treturn logout.bind(this)(params);\n\t}\n\n\t/**\n\t * Creates a new user account with optional signup and login behavior settings.\n\t * @param params Payload for the request.\n\t * @param option Optional behavior configuration.\n\t * @returns A promise that resolves to Promise<UserProfile | \"SUCCESS: The account has been created. User's signup confirmation is required.\" | 'SUCCESS: The account has been created.'>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tsignup(\n\t\tparams: Form<UserAttributes & { password: String; username?: string }>,\n\t\toption?: {\n\t\t\t/**\n\t\t\t * When true, the service will send out confirmation E-Mail.\n\t\t\t * User will not be able to signin to their account unless they have confirm their email.\n\t\t\t * Parameter also accepts URL string for user to be taken to when clicked on confirmation link.\n\t\t\t * Default is false.\n\t\t\t */\n\t\t\tsignup_confirmation?: boolean | string;\n\t\t\t/**\n\t\t\t * When true, user will be subscribed to the service newsletter (group 1) once they are signed up.\n\t\t\t * User's signup confirmation is required for this parameter.\n\t\t\t * Default is false.\n\t\t\t */\n\t\t\temail_subscription?: boolean;\n\t\t\t/**\n\t\t\t * Automatically login to account after signup. Will not work if signup confirmation is required.\n\t\t\t */\n\t\t\tlogin?: boolean;\n\t\t\ttemplate?: {\n\t\t\t\t/** message_id of the template to use for the signup confirmation e-mail. */\n\t\t\t\tsignup_confirmation?: string;\n\t\t\t\t/** message_id of the template to use for the welcome e-mail (sent on the user's first confirmed login). */\n\t\t\t\twelcome?: string;\n\t\t\t};\n\t\t},\n\t): Promise<\n\t\t| UserProfile\n\t\t| \"SUCCESS: The account has been created. User's signup confirmation is required.\"\n\t\t| 'SUCCESS: The account has been created.'\n\t> {\n\t\treturn signup.bind(this)(params, option);\n\t}\n\n\t/**\n\t * Resets a password using email, verification code, and new password.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: New password has been set.\">.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tresetPassword(\n\t\tparams: Form<{\n\t\t\t/** Signin E-Mail */\n\t\t\temail: string;\n\t\t\t/** The verification code user has received. */\n\t\t\tcode: string | number;\n\t\t\t/** New password to set. Verification code is required. */\n\t\t\tnew_password: string;\n\t\t}>,\n\t): Promise<'SUCCESS: New password has been set.'> {\n\t\treturn resetPassword.bind(this)(params);\n\t}\n\t/**\n\t * Verifies the user email address with a confirmation code.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tverifyEmail(params?: Form<{ code: string }>, options?: { template?: { verification?: string } }): Promise<string> {\n\t\t// 'SUCCESS: Verification code has been sent.' | 'SUCCESS: \"email\" is verified.'\n\t\treturn verifyEmail.bind(this)(params, options);\n\t}\n\t/**\n\t * Verifies the user phone number with a confirmation code.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tverifyPhoneNumber(params?: Form<{ code: string }>, options?: { template?: { verification?: string } }): Promise<string> {\n\t\t// 'SUCCESS: Verification code has been sent.' | 'SUCCESS: \"phone_number\" is verified.'\n\t\treturn verifyPhoneNumber.bind(this)(params, options);\n\t}\n\t/**\n\t * Sends a password reset verification code to the user email.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<\"SUCCESS: Verification code has been sent.\">.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tforgotPassword(\n\t\tparams: Form<{\n\t\t\t/** Signin E-Mail. */\n\t\t\temail: string;\n\t\t}>,\n\t\toptions?: {\n\t\t\ttemplate?: {\n\t\t\t\t/** message_id of the template to use for the password-reset verification e-mail. */\n\t\t\t\tverification?: string;\n\t\t\t};\n\t\t},\n\t): Promise<'SUCCESS: Verification code has been sent.'> {\n\t\treturn forgotPassword.bind(this)(params, options);\n\t}\n\t/**\n\t * Changes password for the authenticated user.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Password has been changed.'>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tchangePassword(params: {\n\t\tnew_password: string;\n\t\tcurrent_password: string;\n\t}): Promise<'SUCCESS: Password has been changed.'> {\n\t\treturn changePassword.bind(this)(params);\n\t}\n\t/**\n\t * Updates profile attributes for the authenticated user.\n\t * @param params Payload for the request.\n\t * @returns A promise that resolves to Promise<UserProfile>.\n\t */\n\t@formHandler({ preventMultipleCalls: true })\n\tupdateProfile(params: Form<UserAttributes>): Promise<UserProfile> {\n\t\treturn updateProfile.bind(this)(params);\n\t}\n\t/**\n\t * Creates or updates a database record with optional file uploads.\n\t * @param params Payload for the request.\n\t * @param config Required record configuration (table, record_id, index, tags, source, reference, etc.).\n\t * @param files File list to process.\n\t * @returns A promise that resolves to Promise<RecordData>.\n\t */\n\t@formHandler()\n\tpostRecord(\n\t\tparams: Form<Record<string, any>> | null | undefined,\n\t\tconfig: PostRecordConfig,\n\t\tfiles?: { name: string; file: File }[],\n\t): Promise<RecordData> {\n\t\treturn postRecord.bind(this)(params, config, files);\n\t}\n\t/**\n\t * Fetches subscriber/subscription relationships with filters and pagination. At least one of `subscriber` or `subscription` must be provided.\n\t * @param params Request parameters.\n\t * @param fetchOptions Pagination and fetch behavior options.\n\t * @returns A promise that resolves to Promise<DatabaseResponse<Subscription>>.\n\t */\n\t@formHandler()\n\tgetSubscriptions(\n\t\tparams: {\n\t\t\t/** Subscribers user id. */\n\t\t\tsubscriber?: string;\n\t\t\t/** User ID of the subscription. User id that subscriber has subscribed to. */\n\t\t\tsubscription?: string;\n\t\t\t/** Fetch blocked subscription when True */\n\t\t\tblocked?: boolean;\n\t\t},\n\t\tfetchOptions?: FetchOptions,\n\t): Promise<DatabaseResponse<Subscription>> {\n\t\treturn getSubscriptions.bind(this)(params, fetchOptions);\n\t}\n\t/**\n\t * Subscribes to another user with optional feed/notification/email preferences.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<Subscription>.\n\t */\n\t@formHandler()\n\tsubscribe(params: {\n\t\tuser_id: string;\n\t\tget_feed?: boolean;\n\t\tget_notified?: boolean;\n\t\tget_email?: boolean;\n\t}): Promise<Subscription> {\n\t\treturn subscribe.bind(this)(params);\n\t}\n\t/**\n\t * Unsubscribes from another user.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: The user has unsubscribed.'>.\n\t */\n\t@formHandler()\n\tunsubscribe(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: The user has unsubscribed.'> {\n\t\treturn unsubscribe.bind(this)(params);\n\t}\n\t/**\n\t * Blocks a subscriber user_id.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Blocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'>.\n\t */\n\t@formHandler()\n\tblockSubscriber(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: Blocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'> {\n\t\treturn blockSubscriber.bind(this)(params);\n\t}\n\t/**\n\t * Unblocks a previously blocked subscriber user_id.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<'SUCCESS: Unblocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'>.\n\t */\n\t@formHandler()\n\tunblockSubscriber(params: {\n\t\tuser_id: string;\n\t}): Promise<'SUCCESS: Unblocked user ID \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\".'> {\n\t\treturn unblockSubscriber.bind(this)(params);\n\t}\n\t/**\n\t * Subscribes an email/user to a newsletter group with optional redirect flow.\n\t * @param params Request parameters.\n\t * @returns A promise that resolves to Promise<string>.\n\t */\n\t@formHandler()\n\tsubscribeNewsletter(\n\t\tparams: Form<{\n\t\t\temail?: string | string[];\n\t\t\tgroup: number | 'public' | 'authorized' | 'admin' | (string & {});\n\t\t\tredirect?: string;\n\t\t}>,\n\t): Promise<string> {\n\t\treturn subscribeNewsletter.bind(this)(params);\n\t}\n\n\t/**\n\t * Creates or updates multiple database records in a single bulk request. Requires a non-empty array, and all entries must share the same table/service.\n\t * @param config Non-empty array of record configurations to post.\n\t * @returns A promise that resolves to Promise<RecordData[]>.\n\t */\n\tbulkPostRecords(config: PostRecordConfig[]): Promise<RecordData[]> {\n\t\treturn bulkPostRecords.bind(this)(config);\n\t}\n}\n","export type Condition = 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | '>' | '>=' | '<' | '<=' | '=';\n\n\nexport type RTCReceiverParams = {\n ice?: string;\n media?: {\n video: boolean;\n audio: boolean;\n } | MediaStream | MediaStreamConstraints;\n}\n\nexport type RTCConnectorParams = {\n cid: string;\n ice?: string;\n media?: {\n video: boolean;\n audio: boolean;\n } | MediaStream | MediaStreamConstraints;\n channels?: Array<RTCDataChannelInit | 'text-chat' | 'file-transfer' | 'video-chat' | 'voice-chat' | 'gaming'>;\n}\n\nexport type RTCConnector = {\n hangup: () => void;\n connection: Promise<RTCResolved>;\n}\n\nexport type RTCResolved = {\n target: RTCPeerConnection;\n channels: {\n [protocol: string]: RTCDataChannel\n };\n hangup: () => void;\n media: MediaStream;\n}\n\nexport type RTCEvent = {\n type: 'track' | 'connectionstatechange' | 'close' | 'message' | 'open' | 'bufferedamountlow' | 'error' | 'icecandidate' | 'icecandidateend' | 'icegatheringstatechange' | 'negotiationneeded' | 'signalingstatechange';\n [key: string]: any;\n}\n\nexport type WebSocketMessage = {\n type: 'message' | 'error' | 'success' | 'close' | 'notice' | 'private' | 'reconnect' | 'rtc:incoming' | 'rtc:closed';\n message?: any;\n connectRTC?: (params: RTCReceiverParams, callback: (e: RTCEvent) => void) => Promise<RTCResolved>;\n hangup?: () => void; // Reject incoming RTC connection.\n sender?: string; // user_id of the sender\n sender_cid?: string; // scid of the sender\n sender_rid?: string; // group of the sender\n code?: 'USER_LEFT' | 'USER_DISCONNECTED' | 'USER_JOINED' | null; // code for notice messeges\n}\n\nexport type RealtimeCallback = (rt: WebSocketMessage) => void;\n\nexport type DelRecordQuery = GetRecordQuery & {\n unique_id?: string;\n record_id?: string;\n};\n\nexport type GetRecordQuery = {\n unique_id?: string; // When unique_id is given, it will fetch the record with the given unique_id.\n record_id?: string; // When record_id is given, it will fetch the record with the given record_id. This overrides all other parameters.\n\n /** Table name not required when \"record_id\" is given. A bare string is shorthand for { name: <string> }. */\n table?: string | {\n /** Max 256 characters, where / ! * # % each count as 3. Blocks control chars and sentinel 􏿿. */\n name: string;\n /** Number range: 0 ~ 99. Default: 'public' */\n access_group?: number | 'private' | 'public' | 'authorized' | 'admin';\n /** User ID of subscription */\n subscription?: string;\n };\n\n reference?: string | { record_id?: string; unique_id?: string; user_id?: string } // Referenced record ID or unique ID (string), or the object form. If user ID is given, it will fetch records that are uploaded by the user.\n\n /** Index condition and range cannot be used simultaneously.*/\n index?: {\n /** Custom names: max 256 characters, where / ! * # % each count as 3. Cannot start with \"$\". Blocks control chars and sentinel 􏿿. Reserved names: $uploaded, $updated, $referenced_count, $user_id. */\n name: string | '$updated' | '$uploaded' | '$referenced_count' | '$user_id';\n /** String value max 256 characters. Any punctuation is allowed and counts as one character, and values compare exactly as written. Blocks control chars and sentinel 􏿿. */\n value: string | number | boolean;\n /** For a string value: '>=' = 'starts with', '<=' = 'ends with'. When the name is a compound name ending in '.', '>=' / '<=' match the child name segment (starts / ends with). '>' / '<' are lexicographic; numbers/booleans compare normally. */\n condition?: Condition;\n range?: string | number | boolean;\n };\n tag?: string;\n}\n\nexport type PostRecordConfig = {\n record_id?: string; // when record_id is given, it will update the record with the given record_id. If record_id is not given, it will create a new record. If unique ID is given as a record ID, it will update the record with the given unique ID. \n unique_id?: string | null; // You can set unique_id to the record with the given unique_id. Null will remove unique_id from the record.\n readonly?: boolean; // When true, record cannot be updated or deleted.\n\n /** Table name not required when \"record_id\" is given.*/\n table?: {\n /** Max 256 characters, where / ! * # % each count as 3. Blocks control chars and sentinel 􏿿. */\n name?: string;\n /** Number range: 0 ~ 99. Default: 'public' */\n access_group?: number | 'private' | 'public' | 'authorized' | 'admin';\n\n /** When true, Record will be only accessible for subscribed users. */\n subscription?: {\n is_subscription_record?: boolean; // When true, this record is a subscription record.\n upload_to_feed?: boolean; // When true, record will be uploaded to the feed of the subscribers.\n notify_subscribers?: boolean; // When true, subscribers will receive notification when the record is uploaded.\n feed_referencing_records?: boolean; // When true, records referencing this record will be included to the subscribers feed.\n notify_referencing_records?: boolean; // When true, records referencing this record will be notified to subscribers.\n } | null; // When null, it will remove all subscription settings from the record.\n };\n\n source?: {\n referencing_limit?: number; // Default: null (Infinite)\n prevent_multiple_referencing?: boolean; // If true, a single user can reference this record only once.\n can_remove_referencing_records?: boolean; // When true, owner of the record can remove any record that are referencing this record. Also when this record is deleted, all the record referencing this record will be deleted.\n only_granted_can_reference?: boolean; // When true, only the user who has granted private access to the record can reference this record.\n /** Index restrictions for referencing records. null removes all restrictions. */\n referencing_index_restrictions?: {\n /** Not allowed: White space, special characters. Allowed: Alphanumeric, Periods. */\n name: string; // Allowed index name\n /** Not allowed: Periods, special characters. Allowed: Alphanumeric, White space. */\n value?: string | number | boolean; // Allowed index value\n range?: string | number | boolean; // Allowed index range\n condition?: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!='; // Allowed index value condition\n }[] | null;\n allow_granted_to_grant_others?: boolean; // When true, the user who has granted private access to the record can grant access to other users.\n };\n\n /** Can be record ID or unique ID */\n reference?: string | null; // When null, it will remove reference from the record.\n\n /** null removes index */\n index?: {\n /** Max 256 characters, where / ! * # % each count as 3. Cannot start with \"$\". Blocks control chars and sentinel 􏿿. */\n name: string;\n /** String value max 256 characters. Any punctuation is allowed and counts as one character, and values compare exactly as written. Blocks control chars and sentinel 􏿿. */\n value: string | number | boolean;\n } | null;\n\n tags?: string[] | null; // null removes all tags. each tag 1..256 characters, where / ! * # % each count as 3. Blocks control chars and sentinel 􏿿.\n remove_bin?: BinaryFile[] | string[] | null; // Removes bin data from the record. When null, it will remove all bin data.\n progress?: ProgressCallback; // Callback for database request progress. Useful when building progress bar.\n reference_private_key?: string; // When referencing a record that has private access, you can provide the private key of the referenced record to pass the access check. This is only required when the referenced record has private access and the user does not have access to the record through subscription or granted access.\n}\n\nexport type BinaryFile = {\n access_group: number | 'private' | 'public' | 'authorized' | 'admin';\n filename: string;\n url: string;\n path: string;\n size: number;\n uploaded: number;\n getFile: (dataType?: 'base64' | 'download' | 'endpoint' | 'blob' | 'text' | 'info', progress?: ProgressCallback) => Promise<Blob | string | void | FileInfo>;\n}\n\n/**\n * Per-record encryption outcome. Present ONLY when the record's data went\n * through the client-side encryption layer, so its absence means the record was\n * stored in the clear.\n *\n * status 'encrypted' means the data in this object was decrypted successfully.\n * status 'failed' means `data` is null and `reason` says why:\n * NO_SESSION_KEY encryption is locked; call unlockEncryption()\n * NOT_A_RECIPIENT this user has no key wrap on the record\n * BAD_KEY the wrap did not open (wrong or rotated key)\n * BINDING_MISMATCH the envelope does not belong to this record\n * CORRUPT the payload failed its authentication tag\n * UNSUPPORTED_VERSION written by a newer SDK\n * ENCRYPTION_DISABLED the record is encrypted but this instance is not\n */\nexport type RecordEncryptionInfo = {\n status: 'encrypted' | 'failed';\n reason?: string;\n /** user_ids that hold a key wrap on this record. */\n recipients?: string[];\n};\n\n/** Options for `new Skapi(..., { encryption })`. */\nexport type EncryptionOptions = boolean | {\n /** PBKDF2 iteration count. Default 600000. Minimum 100000. */\n iterations?: number;\n /** 'tofu' pins a peer's key on first sight (default). 'strict' requires a prior pin. */\n trustPolicy?: 'tofu' | 'strict';\n /** Keep the master key in IndexedDB so a page reload stays unlocked. Default true. */\n persistDevice?: boolean;\n /** Refuse to enroll a password shorter than this. Default 0 (no check). */\n minPasswordLength?: number;\n /**\n * Issue a one-time recovery code at enrollment. Default 'code'.\n * 'none' opts out and accepts that a forgotten password means the user's\n * encrypted records are permanently unreadable.\n */\n recovery?: 'code' | 'none';\n /** Reserved keyring table name. Default 'skapi__keyring'. */\n table?: string;\n};\n\nexport type RecordData = {\n record_id: string;\n unique_id?: string;\n user_id: string;\n updated: number;\n uploaded: number;\n referenced_count: number;\n /** Set only when the record's data passed through the encryption layer. */\n encrypted?: RecordEncryptionInfo;\n\n table: {\n name: string;\n /** Number range: 0 ~ 99 */\n access_group: number | 'private' | 'public' | 'authorized' | 'admin';\n /** User ID of subscription */\n subscription?: {\n upload_to_feed: boolean; // When true, record will be uploaded to the feed of the subscribers.\n notify_subscribers: boolean; // When true, subscribers will receive notification when the record is uploaded.\n feed_referencing_records: boolean; // When true, records referencing this record will be included to the subscribers feed.\n notify_referencing_records: boolean; // When true, records referencing this record will be notified to subscribers.\n };\n };\n source: {\n referencing_limit: number; // Default: null (Infinite)\n prevent_multiple_referencing: boolean; // If true, a single user can reference this record only once.\n can_remove_referencing_records: boolean; // When true, owner of the record can remove any record that are referencing this record. Also when this record is deleted, all the record referencing this record will be deleted.\n only_granted_can_reference: boolean; // When true, only the user who has granted private access to the record can reference this record.\n referencing_index_restrictions?: {\n name: string; // Allowed index name\n value?: string | number | boolean; // Allowed index value\n range?: string | number | boolean; // Allowed index range\n condition?: 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'ne' | '>' | '>=' | '<' | '<=' | '=' | '!='; // Allowed index value condition\n }[];\n };\n reference?: string; // record id of the referenced record.\n index?: {\n name: string;\n value: string | number | boolean;\n };\n data?: Record<string, any>;\n tags?: string[];\n bin: { [key: string]: BinaryFile[] };\n ip: string;\n readonly: boolean;\n /**\n * Present ONLY on an element of a postRecords() result that the backend refused.\n * Such an element is an empty record (record_id is \"\"), and this carries the reason\n * the backend gave, e.g. { code: 'NOT_EXISTS', message: 'Reference \"...\" does not exists.' }.\n * A saved record never has it, so `record_id` stays the test for \"did this save\".\n */\n error?: { code?: string; message?: string;[key: string]: any };\n}\n\nexport type Connection = {\n /** User's locale */\n locale: string;\n user_agent: string;\n /** Connected user's IP address */\n ip: string;\n /** Service group */\n group: number;\n /** Service name */\n service_name: string;\n /** Service description */\n service_description: string;\n /** Service options */\n opt: {\n freeze_database: boolean;\n prevent_inquiry: boolean;\n prevent_signup: boolean;\n prevent_anonymous: boolean;\n },\n ai_agent?: string; // AI agent info.\n}\n\nexport type Form<T> = HTMLFormElement | FormData | SubmitEvent | T;\n\nexport type Newsletter = {\n /** Newsletter id */\n message_id: string;\n /** Time sent out */\n timestamp: number;\n /** Number of complaints */\n complaint: number;\n /** Number of read */\n read: number;\n /** Subject */\n subject: string;\n /**\n * Number of bounced.<br>\n * When e-mail address is bounced, skapi no longer sends e-mail to the bounced address.\n */\n bounced: string;\n /**\n * Url of the message html.\n */\n url: string;\n /** Number users delivered */\n delivered: number;\n}\n\nexport type UserAttributes = {\n /** User's name */\n name?: string;\n /**\n * User's E-Mail for signin.<br>\n * 64 character max.<br>\n * When E-Mail is changed, E-Mail verified state will be changed to false.\n * E-Mail is only visible to others when set to public.\n * E-Mail should be verified to set to public.\n * */\n email?: string;\n /**\n * User's phone number. Format: \"+0012341234\"<br>\n * When phone number is changed, phone number verified state will be changed to false.\n * Phone number is only visible to others when set to public.\n * Phone number should be verified to set to public.\n */\n phone_number?: string;\n /** User's address, only visible to others when set to public. */\n address?: string | {\n /**\n * Full mailing address, formatted for display or use on a mailing label. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n * street_address\n * Full street address component, which MAY include house number, street name, Post Office Box, and multi-line extended street address information. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n */\n formatted: string;\n // City or locality component.\n locality: string;\n // State, province, prefecture, or region component.\n region: string;\n // Zip code or postal code component.\n postal_code: string;\n // Country name component.\n country: string;\n };\n /**\n * User's gender. Can be \"female\" and \"male\".\n * Other values may be used when neither of the defined values are applicable.\n * Only visible to others when set to public.\n */\n gender?: string;\n /** User's birthdate. String format: \"1969-07-16\", only visible to others when set to public.*/\n birthdate?: string;\n\n /** Additional string value that can be used freely. This is only accessible to the owner of the account and the admins. */\n misc?: string;\n picture?: string;\n profile?: string;\n website?: string;\n nickname?: string;\n\n /** User's E-Mail is public when true. E-Mail should be verified. */\n email_public?: boolean;\n /** User's phone number is public when true. Phone number should be verified. */\n phone_number_public?: boolean;\n /** User's address is public when true. */\n address_public?: boolean;\n /** User's gender is public when true. */\n gender_public?: boolean;\n /** User's birthdate is public when true. */\n birthdate_public?: boolean;\n}\n\nexport type UserProfile = {\n /** Service id of the user account. */\n service: string;\n /** User ID of the service owner. */\n owner: string;\n /** Access level of the user's account. */\n access_group: number;\n /** User's ID. */\n user_id: string;\n /** Country code of where user first signed up from. */\n locale: string;\n /**\n Account approval info and timestamp.\n Comes with string with the following format: \"{approver}:{approved | suspended}:{approved_timestamp}\"\n \n {approver} is who approved the account:\n [by_master] is when account approval is done manually from skapi admin panel,\n [by_admin] is when approval is done by the admin account with api call within your service.\n [by_skapi] is when account approval is automatically done.\n Open ID logger ID will be the value if the user is logged with openIdLogin()\n This timestamp is generated when the user confirms their signup, or recovers their disabled account.\n \n {approved | suspended}\n [approved] is when the account is approved.\n [suspended] is when the account is blocked by the admin or the master.\n \n {approved_timestamp} is the timestamp when the account is approved or suspended.\n\n */\n approved: string;\n /** Last login timestamp(Seconds). */\n log: number;\n /** Shows true when user has verified their E-Mail. */\n email_verified?: boolean;\n /** Shows true when user has verified their phone number. */\n phone_number_verified?: boolean;\n /** User's E-Mail is public when true. E-Mail should be verified. */\n email_public?: boolean;\n /** User's phone number is public when true. Phone number should be verified. */\n phone_number_public?: boolean;\n /** User's address is public when true. */\n address_public?: boolean;\n /** User's gender is public when true. */\n gender_public?: boolean;\n /** User's birthdate is public when true. */\n birthdate_public?: boolean;\n\n /** User's name */\n name?: string;\n /**\n * User's E-Mail for signin.<br>\n * 64 character max.<br>\n * When E-Mail is changed, E-Mail verified state will be changed to false.\n * E-Mail is only visible to others when set to public.\n * E-Mail should be verified to set to public.\n * */\n email?: string;\n /**\n * User's phone number. Format: \"+0012341234\"<br>\n * When phone number is changed, phone number verified state will be changed to false.\n * Phone number is only visible to others when set to public.\n * Phone number should be verified to set to public.\n */\n phone_number?: string;\n /** User's address, only visible to others when set to public. */\n address?: string | {\n /**\n * Full mailing address, formatted for display or use on a mailing label. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n * street_address\n * Full street address component, which MAY include house number, street name, Post Office Box, and multi-line extended street address information. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n */\n formatted: string;\n // City or locality component.\n locality: string;\n // State, province, prefecture, or region component.\n region: string;\n // Zip code or postal code component.\n postal_code: string;\n // Country name component.\n country: string;\n };\n /**\n * User's gender. Can be \"female\" and \"male\".\n * Other values may be used when neither of the defined values are applicable.\n * Only visible to others when set to public.\n */\n gender?: string;\n /** User's birthdate. String format: \"1969-07-16\", only visible to others when set to public.*/\n birthdate?: string;\n\n /** Additional string value that can be used freely. This is only accessible to the owner of the account and the admins. */\n misc?: string;\n picture?: string;\n profile?: string;\n website?: string;\n nickname?: string;\n};\n\nexport type UserPublic = {\n /** Access level of the user's account. */\n access_group: number;\n /** User's ID. */\n user_id: string;\n /** Country code of where user first signed up from. */\n locale: string;\n /**\n Account approval info and timestamp.\n Comes with string with the following format: \"{approver}:{approved | suspended}:{approved_timestamp}\"\n \n {approver} is who approved the account:\n [by_master] is when account approval is done manually from skapi admin panel,\n [by_admin] is when approval is done by the admin account with api call within your service.\n [by_skapi] is when account approval is automatically done.\n Open ID logger ID will be the value if the user is logged with openIdLogin()\n This timestamp is generated when the user confirms their signup, or recovers their disabled account.\n \n {approved | suspended}\n [approved] is when the account is approved.\n [suspended] is when the account is blocked by the admin or the master.\n \n {approved_timestamp} is the timestamp when the account is approved or suspended.\n\n */\n approved: string;\n /** Account created timestamp(13 digit milliseconds). */\n timestamp: number;\n /** Last login timestamp(Seconds). */\n log: number;\n /** Number of the user's subscribers. */\n subscribers: number;\n /** Number of subscription the user has made */\n subscribed: number;\n /** Number of the records the user have created. */\n records: number;\n\n /** User's name */\n name?: string;\n /**\n * User's E-Mail for signin.<br>\n * 64 character max.<br>\n * When E-Mail is changed, E-Mail verified state will be changed to false.\n * E-Mail is only visible to others when set to public.\n * E-Mail should be verified to set to public.\n * */\n email?: string;\n /**\n * User's phone number. Format: \"+0012341234\"<br>\n * When phone number is changed, phone number verified state will be changed to false.\n * Phone number is only visible to others when set to public.\n * Phone number should be verified to set to public.\n */\n phone_number?: string;\n /** User's address, only visible to others when set to public. */\n address?: string | {\n /**\n * Full mailing address, formatted for display or use on a mailing label. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n * street_address\n * Full street address component, which MAY include house number, street name, Post Office Box, and multi-line extended street address information. This field MAY contain multiple lines, separated by newlines. Newlines can be represented either as a carriage return/line feed pair (\"\\r\\n\") or as a single line feed character (\"\\n\").\n */\n formatted: string;\n // City or locality component.\n locality: string;\n // State, province, prefecture, or region component.\n region: string;\n // Zip code or postal code component.\n postal_code: string;\n // Country name component.\n country: string;\n };\n /**\n * User's gender. Can be \"female\" and \"male\".\n * Other values may be used when neither of the defined values are applicable.\n * Only visible to others when set to public.\n */\n gender?: string;\n /** User's birthdate. String format: \"1969-07-16\", only visible to others when set to public.*/\n birthdate?: string;\n\n picture?: string;\n profile?: string;\n website?: string;\n nickname?: string;\n};\n\nexport type ProgressCallback = (e: {\n status: 'upload' | 'download';\n progress: number; // 0 ~ 100, number of percent completed.\n loaded: number; // Number of bytes loaded.\n total: number; // Total number of bytes to be loaded.\n currentFile?: File, // Only for uploadFiles()\n completed?: File[]; // Only for uploadFiles()\n failed?: File[]; // Only for uploadFiles()\n abort: () => void; // Aborts current data transfer. When abort is triggered during the FileList is on trasmit, it will continue to next file.\n}) => void;\n\nexport type FetchOptions = {\n /** Maximum number of records to fetch per call */\n limit?: number;\n /** Fetch next batch of data. Will return empty list if there is nothing more to fetch. */\n fetchMore?: boolean;\n /** Result in ascending order if true, decending when false. */\n ascending?: boolean;\n /** Start key to be used to query from the certain batch of fetch. */\n startKey?: { [key: string]: any; };\n /** Callback for database request progress. Useful when building progress bar. */\n progress?: ProgressCallback;\n}\nexport type RequestHistory = {\n id: string; // request id. Format: {stamp}:{entropy}\n status_code: number; // http status code of the request\n response_body: any;\n error?: any;\n created: number; // timestamp of when the request was created, in milliseconds. Set once and never changes.\n updated: number; // timestamp of the last update of the request status (e.g. when the response arrived), in milliseconds.\n request_body: any;\n expires?: number; // timestamp of when the request history will be deleted in epoch time (seconds).\n status: 'pending' | 'running' | 'resolved' | 'failed';\n queue_name?: string; // queue name if the request is in queue, empty string if the request is not in queue.\n // Compact-listing stubs. Present ONLY when the history was fetched with `compact: true`,\n // in which case request_body/response_body are omitted (the full bodies never leave the\n // server); re-fetch without `compact`, or poll the item, when a full body is needed.\n request_text?: string; // stub: first text of the request's LAST user message, truncated. Missing when the request body's shape was unrecognisable.\n response_text?: string; // stub: the head of the response text, truncated.\n response_complete_marker?: boolean; // stub: whether the response carried the indexing completion marker.\n compact?: boolean; // true on items returned by a `compact: true` listing, so consumers know bodies were deliberately omitted rather than empty.\n poll?: (arg?: {\n latency?: number;\n onResponse?: (res:any)=>void;\n onError?: (err:any)=>void;\n }) => Promise<any>; // function to poll the request status until it settles. The promise resolves with the final result of the request: the third-party API response body when it resolves, or the error payload when it fails. It does not resolve with a RequestHistory item, so \"created\" and \"updated\" are not on the polled value. A poll stopped by stopClientSecretPolling() resolves with { id, status: 'stopped' }. Optional argument \"latency\" can be used to set the latency of the polling in milliseconds. Default latency is 1000ms.\n}\n\nexport type DatabaseResponse<T> = {\n list: T[];\n startKey: { [key: string]: any; } | 'end';\n endOfList: boolean;\n startKeyHistory: string[];\n}\n\nexport type FileInfo = {\n url: string;\n filename: string;\n access_group: number | 'private' | 'public' | 'authorized';\n filesize: number;\n record_id: string;\n uploader: string;\n uploaded: number;\n fileKey: string;\n}\n\nexport type ConnectionInfo = {\n /** Public project ID (service + owner composed into the two-segment token). Empty when the service has no uuid owner. */\n project_id: string;\n user_ip: string;\n user_agent: string;\n user_location: string;\n service_name: string;\n service_description: string;\n version: string;\n ai_agent: string;\n conf: {\n freeze_database: boolean;\n prevent_signup: boolean;\n prevent_inquiry: boolean;\n prevent_anonymous: boolean;\n }\n};\n\nexport type Table = {\n table: string;\n number_of_records: string;\n size: number;\n number_of_records_in_access_group_public?: number;\n number_of_records_in_access_group_private?: number;\n number_of_records_in_access_group_authorized?: number;\n number_of_records_in_access_group_admin?: number;\n [number_of_records_in_access_group_xx: string]: number | string | undefined; // for other access groups\n}\n\nexport type Index = {\n table: string;\n index: string;\n number_of_records: number;\n string_count: number;\n number_count: number;\n boolean_count: number;\n total_number: number;\n total_bool: number;\n average_number: number;\n average_bool: number;\n}\n\nexport type Tag = {\n table: string;\n tag: string;\n number_of_records: number;\n}\n\nexport type UniqueId = {\n unique_id: string;\n record_id: string;\n}\n\nexport type Subscription = {\n subscriber: string;\n subscription: string;\n timestamp: number;\n blocked: boolean;\n get_feed: boolean;\n get_notified: boolean;\n get_email: boolean;\n}"]}