{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/client/index.ts","webpack:///./src/lib/client-util/domReady.ts","webpack:///./src/client/services/index.ts","webpack:///./src/client/services/_generated.ts","webpack:///./src/lib/client-util/serviceRequest.ts","webpack:///./src/lib/client-util/http.ts","webpack:///./src/lib/client-util/json.ts","webpack:///./src/lib/client-util/util.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","submitContactRequest","e","preventDefault","messageSentIndicator","document","getElementById","messageErrorIndicator","contactRequestForm","contactName","contactEmail","contactMessage","contactFormSubmitButton","checkValidity","style","display","disabled","emailService","sendContactRequest","addEventListener","domReady","Promise","resolve","readyState","generatedServices","emailAddress","comments","executeServiceRequest","testService","testSimpleMethod","input","testFailedMethod","testServiceMethod","pendingLoginRequest","_executeServiceRequest","path","payload","otherArguments","headers","retryCount","createQueryString","executeRawHttpRequest","content","response","status","executeLoginHandler","body","size","type","JSON","parse","text","serviceJsonParseReviver","undefined","Error","statusText","loginHandler","returnValue","stringify","serviceJsonStringifyReplacer","handler","headerUpperCaseRegex","parseHttpResponseHeaders","rawHeaders","split","rawHeader","nameEnd","indexOf","substr","startsWith","replace","char","toUpperCase","newValue","trim","Array","isArray","push","rawResponse","httpStatusEnd","httpHeaderEnd","httpStatusLine","Number","parseInt","responseType","startingBase36Number","parts","valueExistsInPart","boundary","boundaryWithCrLfDashes","partContents","map","part","headerContent","header","base36BoundaryValue","toString","join","multipartPayload","boundaryIndex","lastIndexOf","length","rawPart","bodyDelimiter","parameters","keys","parameter","item","encodeURIComponent","filter","verb","url","options","reject","httpRequest","XMLHttpRequest","timeout","onprogress","event","onload","getAllResponseHeaders","onerror","open","valueItem","setRequestHeader","send","realValue","this","Date","toISOString","Uint8Array","bufferToBase64","charAt","iterator","from","index","substring","base64ToBuffer","value1","value2","milliseconds","setTimeout","globals","Function","base64","binaryString","atob","charCodeAt","buffer","byteLength","String","fromCharCode","btoa"],"mappings":"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","file":"client.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","import domReady from \"../lib/client-util/domReady\";\r\nimport { emailService } from \"./services\";\r\n\r\nasync function submitContactRequest(e: Event) {\r\n e.preventDefault();\r\n let messageSentIndicator = document.getElementById(\"messageSentIndicator\") as HTMLElement;\r\n let messageErrorIndicator = document.getElementById(\"messageErrorIndicator\") as HTMLElement;\r\n let contactRequestForm = document.getElementById(\"contactRequestForm\") as HTMLFormElement;\r\n let contactName = document.getElementById(\"contactName\") as HTMLInputElement;\r\n let contactEmail = document.getElementById(\"contactEmail\") as HTMLInputElement;\r\n let contactMessage = document.getElementById(\"contactMessage\") as HTMLTextAreaElement;\r\n let contactFormSubmitButton = document.getElementById(\"contactFormSubmitButton\") as HTMLButtonElement;\r\n try {\r\n if (!contactRequestForm.checkValidity()) return;\r\n messageSentIndicator.style.display = \"none\";\r\n messageErrorIndicator.style.display = \"none\";\r\n contactName.disabled = true;\r\n contactEmail.disabled = true;\r\n contactMessage.disabled = true;\r\n contactFormSubmitButton.disabled = true;\r\n await emailService.sendContactRequest(\r\n contactName.value,\r\n contactEmail.value,\r\n contactMessage.value\r\n );\r\n messageSentIndicator.style.display = \"\";\r\n } catch (error) {\r\n contactName.disabled = false;\r\n contactEmail.disabled = false;\r\n contactMessage.disabled = false;\r\n contactFormSubmitButton.disabled = false;\r\n messageErrorIndicator.style.display = \"\";\r\n }\r\n}\r\n\r\nvoid async function() {\r\n await domReady;\r\n\r\n let contactRequestForm = document.getElementById(\"contactRequestForm\") as HTMLFormElement;\r\n if (contactRequestForm) {\r\n contactRequestForm.addEventListener(\"submit\", submitContactRequest);\r\n }\r\n}();","const domReady: Promise = new Promise(resolve => {\r\n if (document.readyState === \"complete\" || document.readyState === \"interactive\") {\r\n resolve();\r\n } else {\r\n document.addEventListener(\"DOMContentLoaded\", () => resolve());\r\n }\r\n});\r\nexport default domReady;","import * as generatedServices from \"./_generated\";\r\n\r\nexport = generatedServices;","// GENERATED CODE - DO NOT EDIT\r\nimport { executeServiceRequest, executeUploadServiceRequest } from \"../../lib/client-util/serviceRequest\";\r\nexport const emailService = {\r\n sendContactRequest(\r\n name: string,\r\n emailAddress: string,\r\n comments: string,\r\n ): Promise {\r\n return executeServiceRequest(\r\n \"./services/FormidableDesigns.Services.V1.EmailService.SendContactRequest\", {\r\n name,\r\n emailAddress,\r\n comments,\r\n }\r\n );\r\n },\r\n}\r\nexport const testService = {\r\n testSimpleMethod(\r\n input: string,\r\n ): Promise {\r\n return executeServiceRequest(\r\n \"./services/FormidableDesigns.Services.V1.TestService.TestSimpleMethod\", {\r\n input,\r\n }\r\n );\r\n },\r\n testFailedMethod(\r\n ): Promise {\r\n return executeServiceRequest(\r\n \"./services/FormidableDesigns.Services.V1.TestService.TestFailedMethod\", {\r\n }\r\n );\r\n },\r\n testServiceMethod(\r\n ): Promise {\r\n return executeServiceRequest(\r\n \"./services/FormidableDesigns.Services.V1.TestService.TestServiceMethod\", {\r\n }\r\n );\r\n },\r\n}\r\n","import { executeRawHttpRequest, HttpBlobResponse, createQueryString } from \"./http\";\r\nimport { serviceJsonStringifyReplacer, serviceJsonParseReviver } from \"./json\";\r\n\r\nexport async function executeServiceRequest(\r\n path: string,\r\n payload: any\r\n): Promise {\r\n return await _executeServiceRequest(path, JSON.stringify(payload, serviceJsonStringifyReplacer));\r\n}\r\n\r\nexport async function executeUploadServiceRequest(\r\n path: string,\r\n payload: Blob,\r\n otherArguments: { [name: string]: string | string[] }\r\n): Promise {\r\n let headers = payload.type ? { \"Content-Type\": payload.type } : undefined;\r\n return await _executeServiceRequest(path, payload, otherArguments, headers);\r\n}\r\n\r\nexport async function _executeServiceRequest(\r\n path: string,\r\n payload: any,\r\n otherArguments?: { [name: string]: string | string[] },\r\n headers?: { [name: string]: string | string[] }\r\n): Promise {\r\n let retryCount = 3;\r\n let response: HttpBlobResponse;\r\n if (otherArguments) {\r\n path = path + createQueryString(otherArguments);\r\n }\r\n while (retryCount-- > 0) {\r\n response = await executeRawHttpRequest(\"POST\", path, \"blob\", {\r\n content: payload,\r\n headers\r\n });\r\n if (response.status === 401) {\r\n // The user needs to log in; if the user cancels this request or we have no login handler\r\n // we stop retrying and report the error, otherwise we do a retry once the login is done\r\n let loginCompleted = await executeLoginHandler();\r\n if (!loginCompleted) break;\r\n } else if (response.status >= 400) {\r\n // We don't currently retry for anything but an authentication error; kick out of our\r\n // retry cycle and report the error\r\n break;\r\n } else if (response.body?.size) {\r\n let contentType = response.body.type || \"application/octet-stream\";\r\n if (contentType == \"application/json\") {\r\n return JSON.parse(await response.body.text(), serviceJsonParseReviver);\r\n } else {\r\n return response.body as unknown as TResult;\r\n }\r\n } else {\r\n // Because of compile time checks this should never happen unless TResult is actually\r\n // compatible with TResult\r\n return (undefined as unknown) as TResult;\r\n }\r\n }\r\n\r\n // If we get here, we either failed in a way that doesn't allow a retry or we went through\r\n // all of our retries; the response will be an error we need to report\r\n // TODO: Add additional info from the server to this payload\r\n throw new Error(`Error executing service call: ${response!.statusText} (${response!.status})`);\r\n}\r\n\r\nexport function registerLoginHandler(handler: () => Promise): void {\r\n if (loginHandler) {\r\n throw new Error(\"Login handler can only be registered once\");\r\n }\r\n loginHandler = handler;\r\n}\r\n\r\nexport async function executeLoginHandler(): Promise {\r\n // If we have no login handler, we can't succeed\r\n if (!loginHandler) return false;\r\n\r\n // If there's a pending login request already on the books, wait for it; if not, start\r\n // up a new one\r\n if (pendingLoginRequest) {\r\n return await pendingLoginRequest;\r\n } else {\r\n pendingLoginRequest = loginHandler();\r\n let returnValue = await pendingLoginRequest;\r\n pendingLoginRequest = null;\r\n return returnValue;\r\n }\r\n}\r\n\r\nvar pendingLoginRequest: Promise | null;\r\n\r\nvar loginHandler: (() => Promise) | null = null;\r\n","export interface HttpRequestOptions {\r\n content?: Document | BodyInit;\r\n headers?: { [name: string]: string | string[] };\r\n noDelay?: boolean;\r\n}\r\n\r\nexport interface HttpArrayBufferResponse {\r\n status: number;\r\n statusText: string;\r\n responseType: \"arraybuffer\";\r\n body: ArrayBuffer;\r\n headers: { [name: string]: string | string[] };\r\n}\r\n\r\nexport interface HttpBlobResponse {\r\n status: number;\r\n statusText: string;\r\n responseType: \"blob\";\r\n body: Blob;\r\n headers: { [name: string]: string | string[] };\r\n}\r\n\r\nexport interface HttpDocumentResponse {\r\n status: number;\r\n statusText: string;\r\n responseType: \"document\";\r\n body: Document;\r\n headers: { [name: string]: string | string[] };\r\n}\r\n\r\nexport interface HttpJsonResponse {\r\n status: number;\r\n statusText: string;\r\n responseType: \"json\";\r\n body: T;\r\n headers: { [name: string]: string | string[] };\r\n}\r\n\r\nexport interface HttpTextResponse {\r\n status: number;\r\n statusText: string;\r\n responseType: \"text\";\r\n body: string;\r\n headers: { [name: string]: string | string[] };\r\n}\r\n\r\nexport type HttpResponse =\r\n | HttpArrayBufferResponse\r\n | HttpBlobResponse\r\n | HttpDocumentResponse\r\n | HttpJsonResponse\r\n | HttpTextResponse;\r\n\r\nconst headerUpperCaseRegex = /^.|-./g;\r\n\r\nexport function parseHttpResponseHeaders(\r\n rawHeaders: string\r\n): { [name: string]: string | string[] } {\r\n let returnValue: { [name: string]: string | string[] } = {};\r\n for (let rawHeader of rawHeaders.split(\"\\r\\n\")) {\r\n if (rawHeader) {\r\n let nameEnd = rawHeader.indexOf(\":\");\r\n let name = rawHeader.substr(0, nameEnd);\r\n // Headers from XMLHttpRequest are always lowercase, we'll convert to uppercase except for\r\n // the x-ms-* headers, which Microsoft seems to leave as all lowercase\r\n // HACK: Is this strictly necessary? Should we just lowercase everything?\r\n if (!name.startsWith(\"x-ms-\"))\r\n name = name.replace(headerUpperCaseRegex, function(char) {\r\n return char.toUpperCase();\r\n });\r\n let newValue = rawHeader.substr(nameEnd + 1).trim();\r\n if (name in returnValue) {\r\n let value = returnValue[name];\r\n if (Array.isArray(value)) {\r\n value.push(newValue);\r\n } else {\r\n returnValue[name] = [value, newValue];\r\n }\r\n } else {\r\n returnValue[name] = newValue;\r\n }\r\n }\r\n }\r\n return returnValue;\r\n}\r\n\r\nexport function parseRawHttpResponse(rawResponse: string): HttpTextResponse {\r\n let httpStatusEnd = rawResponse.indexOf(\"\\r\\n\");\r\n let httpHeaderEnd = rawResponse.indexOf(\"\\r\\n\\r\\n\");\r\n let httpStatusLine = rawResponse.substr(0, httpStatusEnd);\r\n if (!httpStatusLine.startsWith(\"HTTP/1.1\")) throw new Error(\"Invalid HTTP payload\");\r\n return {\r\n status: Number.parseInt(httpStatusLine.substr(9, 3)),\r\n statusText: httpStatusLine.substr(13),\r\n responseType: \"text\",\r\n body: rawResponse.substr(httpHeaderEnd + 4),\r\n headers: parseHttpResponseHeaders(rawResponse.substr(httpStatusEnd + 2, httpHeaderEnd))\r\n };\r\n}\r\n\r\nexport interface MultipartPayloadItem {\r\n content: string;\r\n headers: { [name: string]: string | string[] };\r\n}\r\n\r\nexport interface MultipartPayload {\r\n content: string;\r\n boundary: string;\r\n}\r\n\r\nconst startingBase36Number = Number.parseInt(\"aaaaaaaaaa\", 36);\r\n\r\nexport function createMultipartPayload(parts: MultipartPayloadItem[]): MultipartPayload {\r\n // Produce the HTML chunk for each part\r\n let partContents = parts.map(function(part) {\r\n let headerContent = \"\";\r\n for (let key in part.headers) {\r\n let header = part.headers[key];\r\n if (Array.isArray(header)) {\r\n for (let headerItem of header) {\r\n headerContent += `${key}: ${headerItem}\\r\\n`;\r\n }\r\n } else {\r\n headerContent += `${key}: ${header}\\r\\n`;\r\n }\r\n }\r\n return `${headerContent}\\r\\n${part.content}`;\r\n });\r\n\r\n // Come up with a multipart string that isn't already in use anywhere; we use the base 36 radix\r\n // starting at startingBase36Number, which produces the 10 character string \"aaaaaaaaaa\", tripled\r\n // up to produce a 30 character string; if we find it in any payload we increment by one until we\r\n // get a unique combination; the MIME documentation (RFC 1341) indicates that the CRLF before the\r\n // boundary is part of the boundary but the CRLF after the boundary is not\r\n let base36BoundaryValue = startingBase36Number;\r\n let valueExistsInPart: boolean;\r\n let boundary: string;\r\n let boundaryWithCrLfDashes: string;\r\n do {\r\n valueExistsInPart = false;\r\n boundary = base36BoundaryValue.toString(36);\r\n boundary = boundary + boundary + boundary;\r\n boundaryWithCrLfDashes = \"\\r\\n--\" + boundary;\r\n for (let content of partContents) {\r\n if (content.indexOf(boundaryWithCrLfDashes) !== -1) {\r\n valueExistsInPart = true;\r\n base36BoundaryValue++;\r\n break;\r\n }\r\n }\r\n } while (valueExistsInPart);\r\n\r\n // We have our boundary; form the full remaining body payload with the start and end boundary\r\n // strings being slightly different from the standard one\r\n return {\r\n content:\r\n \"--\" +\r\n boundary +\r\n \"\\r\\n\" +\r\n partContents.join(boundaryWithCrLfDashes + \"\\r\\n\") +\r\n \"\\r\\n--\" +\r\n boundary +\r\n \"--\",\r\n boundary\r\n };\r\n}\r\n\r\nexport function splitMultipartPayload(multipartPayload: MultipartPayload): MultipartPayloadItem[] {\r\n // The end of the multipart document will look like \"\\r\\n----\"; strip everything that\r\n // comes after that symbol\r\n let boundary = multipartPayload.boundary;\r\n let content = multipartPayload.content;\r\n let boundaryIndex = content.lastIndexOf(`\\r\\n--${boundary}--`);\r\n if (boundaryIndex === -1) throw new Error(\"Invalid multipart payload\");\r\n content = content.substr(0, boundaryIndex);\r\n\r\n // We need to do a similar check at the beginning of the content block\r\n boundaryIndex = content.indexOf(`--${boundary}\\r\\n`);\r\n if (boundaryIndex === -1) throw new Error(\"Invalid multipart payload\");\r\n content = content.substr(boundaryIndex + boundary.length + 4);\r\n\r\n // Split the remaining content using the boundary string\r\n let rawParts = content.split(`\\r\\n--${boundary}\\r\\n`);\r\n\r\n // Parse out the headers for each item and return the result\r\n return rawParts.map(function(rawPart) {\r\n // If there are no headers the payload is preceded by a single CRLF; if there are headers\r\n // we'll need to strip them out\r\n let headers: { [name: string]: string | string[] } = {};\r\n if (rawPart.startsWith(\"\\r\\n\")) {\r\n headers = {};\r\n rawPart = rawPart.substr(2);\r\n } else {\r\n let bodyDelimiter = rawPart.indexOf(\"\\r\\n\\r\\n\");\r\n headers = parseHttpResponseHeaders(rawPart.substr(0, bodyDelimiter));\r\n rawPart = rawPart.substr(bodyDelimiter + 4);\r\n }\r\n return { headers, content: rawPart };\r\n });\r\n}\r\n\r\nexport function createQueryString(parameters: { [name: string]: string | string[] }): string {\r\n return (\r\n \"?\" +\r\n Object.keys(parameters)\r\n .map(function(key) {\r\n let parameter = parameters[key];\r\n if (Array.isArray(parameter)) {\r\n return parameter\r\n .map(function(item) {\r\n return `${key}=${encodeURIComponent(item)}`;\r\n })\r\n .join(\"&\");\r\n } else if (parameter !== undefined) {\r\n return `${key}=${encodeURIComponent(parameter)}`;\r\n } else {\r\n return \"\";\r\n }\r\n })\r\n .filter(function(part) {\r\n return !!part;\r\n })\r\n .join(\"&\")\r\n );\r\n}\r\n\r\nexport function executeRawHttpRequest(\r\n verb: string,\r\n url: string,\r\n responseType: \"arraybuffer\",\r\n options?: HttpRequestOptions\r\n): Promise;\r\nexport function executeRawHttpRequest(\r\n verb: string,\r\n url: string,\r\n responseType: \"blob\",\r\n options?: HttpRequestOptions\r\n): Promise;\r\nexport function executeRawHttpRequest(\r\n verb: string,\r\n url: string,\r\n responseType: \"document\",\r\n options?: HttpRequestOptions\r\n): Promise;\r\nexport function executeRawHttpRequest(\r\n verb: string,\r\n url: string,\r\n responseType: \"json\",\r\n options?: HttpRequestOptions\r\n): Promise>;\r\nexport function executeRawHttpRequest(\r\n verb: string,\r\n url: string,\r\n responseType: \"text\",\r\n options?: HttpRequestOptions\r\n): Promise;\r\nexport function executeRawHttpRequest(\r\n verb: string,\r\n url: string,\r\n responseType: \"arraybuffer\" | \"blob\" | \"document\" | \"json\" | \"text\",\r\n options?: HttpRequestOptions\r\n): Promise {\r\n return new Promise((resolve, reject) => {\r\n var httpRequest = new XMLHttpRequest();\r\n // TODO: Reassess this\r\n httpRequest.timeout = 1200000;\r\n httpRequest.responseType = responseType;\r\n httpRequest.onprogress = function(event) {};\r\n httpRequest.onload = function() {\r\n resolve({\r\n status: httpRequest.status,\r\n statusText: httpRequest.statusText,\r\n responseType,\r\n body: httpRequest.response,\r\n headers: parseHttpResponseHeaders(httpRequest.getAllResponseHeaders())\r\n } as HttpResponse);\r\n };\r\n httpRequest.onerror = function(event) {\r\n // TODO: Specifics?\r\n reject(new Error(\"There was an HTTP connectivity error\"));\r\n };\r\n // TODO: Do we want to leverage those items below?\r\n // httpRequest.ontimeout = function () { };\r\n // httpRequest.onabort = function () { };\r\n\r\n httpRequest.open(verb, url, true);\r\n if (options && options.headers) {\r\n let headers = options.headers;\r\n for (let key in headers) {\r\n let value = headers[key];\r\n if (Array.isArray(value)) {\r\n for (let valueItem of value) {\r\n httpRequest.setRequestHeader(key, valueItem);\r\n }\r\n } else {\r\n httpRequest.setRequestHeader(key, value);\r\n }\r\n }\r\n }\r\n httpRequest.send(options && \"content\" in options ? options.content : null);\r\n });\r\n}\r\n","import { bufferToBase64, base64ToBuffer } from \"./util\";\r\n\r\nexport function serviceJsonStringifyReplacer(this: any, key: string, value: any): any {\r\n let realValue = this[key];\r\n if (realValue instanceof Date) {\r\n return \"`DATE'\" + this[key].toISOString();\r\n } else if (realValue instanceof Uint8Array) {\r\n return \"`BASE64'\" + bufferToBase64(value);\r\n } else if (value === \"\") {\r\n // TODO: Do we want to coerce all empty strings to null?\r\n // Can we use the code generator to only do this in non-string circumstances?\r\n // Should we handle this on the form binding side instead, which is the real\r\n // source of the problem?\r\n return null;\r\n } else if (typeof value === \"string\" && value.charAt(0) === \"`\") {\r\n return \"`\" + value;\r\n } else if (value !== null && typeof value === \"object\" && Symbol.iterator in value) {\r\n return Array.from(value);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport function serviceJsonParseReviver(key: string, value: any): any {\r\n if (typeof value === \"string\" && value.charAt(0) === \"`\") {\r\n if (value.charAt(1) === \"`\") return value.substr(1);\r\n let index = value.indexOf(\"'\", 2);\r\n let type = value.substring(1, index++);\r\n value = value.substr(index);\r\n switch (type) {\r\n case \"DATE\":\r\n return new Date(value);\r\n case \"BASE64\":\r\n return base64ToBuffer(value);\r\n default:\r\n throw new Error(`Unknown JSON type '${type}' in JSON payload`);\r\n }\r\n }\r\n\r\n return value;\r\n}\r\n","export function uint8ArraysEqual(value1: Uint8Array, value2: Uint8Array): boolean {\r\n if (value1.length !== value2.length) return false;\r\n for (let i = 0; i < value1.length; i++) {\r\n if (value1[i] !== value2[i]) return false;\r\n }\r\n return true;\r\n}\r\n\r\nexport function pause(milliseconds: number): Promise {\r\n return new Promise(function(resolve) {\r\n setTimeout(resolve, milliseconds);\r\n });\r\n}\r\n\r\nexport var globals: any = Function(\"return this\")();\r\n\r\nexport function base64ToBuffer(base64: string): Uint8Array {\r\n let binaryString = atob(base64);\r\n let returnValue = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n returnValue[i] = binaryString.charCodeAt(i);\r\n }\r\n return returnValue;\r\n}\r\n\r\nexport function bufferToBase64(buffer: Uint8Array): string {\r\n let binaryString = \"\";\r\n for (let i = 0; i < buffer.byteLength; i++) {\r\n binaryString += String.fromCharCode(buffer[i]);\r\n }\r\n return btoa(binaryString);\r\n}\r\n"],"sourceRoot":""}