@looker/sdk-rtl 21.0.19 → 21.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/lib/CSRFSession.d.ts +2 -2
- package/lib/CSRFSession.js.map +1 -1
- package/lib/apiMethods.d.ts +3 -3
- package/lib/apiMethods.js.map +1 -1
- package/lib/apiSettings.d.ts +1 -1
- package/lib/apiSettings.js.map +1 -1
- package/lib/authSession.d.ts +3 -3
- package/lib/authSession.js.map +1 -1
- package/lib/authToken.d.ts +1 -1
- package/lib/authToken.js.map +1 -1
- package/lib/baseTransport.d.ts +1 -1
- package/lib/baseTransport.js.map +1 -1
- package/lib/browserServices.d.ts +4 -4
- package/lib/browserServices.js.map +1 -1
- package/lib/browserSession.d.ts +2 -2
- package/lib/browserSession.js.map +1 -1
- package/lib/browserTransport.d.ts +4 -4
- package/lib/browserTransport.js +4 -7
- package/lib/browserTransport.js.map +1 -1
- package/lib/esm/CSRFSession.js.map +1 -1
- package/lib/esm/apiMethods.js.map +1 -1
- package/lib/esm/apiSettings.js.map +1 -1
- package/lib/esm/authSession.js.map +1 -1
- package/lib/esm/authToken.js.map +1 -1
- package/lib/esm/baseTransport.js.map +1 -1
- package/lib/esm/browserServices.js.map +1 -1
- package/lib/esm/browserSession.js.map +1 -1
- package/lib/esm/browserTransport.js +5 -7
- package/lib/esm/browserTransport.js.map +1 -1
- package/lib/esm/extensionSession.js.map +1 -1
- package/lib/esm/extensionTransport.js.map +1 -1
- package/lib/esm/oauthSession.js +2 -1
- package/lib/esm/oauthSession.js.map +1 -1
- package/lib/esm/paging.js.map +1 -1
- package/lib/esm/proxySession.js.map +1 -1
- package/lib/esm/transport.js +39 -13
- package/lib/esm/transport.js.map +1 -1
- package/lib/extensionSession.d.ts +3 -3
- package/lib/extensionSession.js.map +1 -1
- package/lib/extensionTransport.d.ts +2 -2
- package/lib/extensionTransport.js.map +1 -1
- package/lib/oauthSession.d.ts +4 -4
- package/lib/oauthSession.js +2 -1
- package/lib/oauthSession.js.map +1 -1
- package/lib/paging.d.ts +2 -2
- package/lib/paging.js.map +1 -1
- package/lib/platformServices.d.ts +3 -3
- package/lib/proxySession.d.ts +2 -2
- package/lib/proxySession.js.map +1 -1
- package/lib/transport.d.ts +6 -3
- package/lib/transport.js +41 -13
- package/lib/transport.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/browserTransport.ts"],"names":["PassThrough","trace","LookerAppId","agentPrefix","responseMode","ResponseMode","safeBase64","BaseTransport","BrowserCryptoHash","arrayToHex","array","Array","from","map","b","toString","padStart","join","fromBase64","str","atob","split","c","charCodeAt","secureRandom","byteCount","bytes","Uint8Array","window","crypto","getRandomValues","sha256Hash","message","msgUint8","TextEncoder","encode","hashBuffer","subtle","digest","BrowserTransport","constructor","options","supportsPerformance","performance","mark","measure","trackPerformance","_trackPerf","value","name","tag","markName","url","entries","getEntriesByName","length","last","startTime","markStart","startMark","markEnd","startName","measureName","end","endMark","clearMarks","rawRequest","method","path","queryParams","body","authenticator","requestPath","makeUrl","props","initRequest","req","fetch","res","started","contentType","String","headers","get","mode","responseBody","binary","blob","text","forEach","key","response","ok","statusCode","status","statusMessage","statusText","observer","parseResponse","perfMark","error","JSON","parse","match","err","startsWith","result","request","fromRequest","e","type","agentTag","Object","val","undefined","stringify","credentials","stream","callback","returnPromise","Promise","reject","Error"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport { PassThrough, Readable } from 'readable-stream'\nimport {\n ISDKError,\n SDKResponse,\n ITransportSettings,\n HttpMethod,\n Authenticator,\n trace,\n IRequestProps,\n IRequestHeaders,\n LookerAppId,\n agentPrefix,\n Values,\n IRawResponse,\n responseMode,\n ResponseMode,\n safeBase64,\n} from './transport'\nimport { BaseTransport } from './baseTransport'\nimport { ICryptoHash } from './cryptoHash'\n\nexport class BrowserCryptoHash implements ICryptoHash {\n arrayToHex(array: Uint8Array): string {\n return Array.from(array)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n\n fromBase64(str: string) {\n return atob(str)\n .split('')\n .map(function (c) {\n return c.charCodeAt(0)\n })\n }\n\n secureRandom(byteCount: number): string {\n const bytes = new Uint8Array(byteCount)\n window.crypto.getRandomValues(bytes)\n return this.arrayToHex(bytes)\n }\n\n async sha256Hash(message: string): Promise<string> {\n const msgUint8 = new TextEncoder().encode(message)\n const hashBuffer = await window.crypto.subtle.digest('SHA-256', msgUint8)\n return safeBase64(new Uint8Array(hashBuffer))\n }\n}\n\nexport class BrowserTransport extends BaseTransport {\n constructor(protected readonly options: ITransportSettings) {\n super(options)\n }\n\n /** Does this browser have the necessary performance APIs? */\n static supportsPerformance() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return !!(performance && performance.mark && performance.measure)\n }\n\n private static _trackPerf = false\n\n public static get trackPerformance() {\n return this._trackPerf\n }\n\n public static set trackPerformance(value: boolean) {\n this._trackPerf = value && BrowserTransport.supportsPerformance()\n }\n\n static startMark = 'A'\n static endMark = 'B'\n\n /**\n * Create a performance mark\n * @param name to use as prefix of mark. Use `markName()` to determine the name\n * @param tag tag to use to distinguish mark\n * @returns the name of the mark used, or '' if not marked\n */\n static mark(name: string, tag: string) {\n if (this.trackPerformance) {\n const mark = `${name}-${tag}`\n performance.mark(mark)\n return mark\n }\n return ''\n }\n\n /**\n * Create a unique name for the performance metric of the url based on its start time\n * @param url metric to find\n *\n * Uses the last entry of the matching metric to create the name for the tracker so\n * post processing can use it to merge into the main resource tracker\n *\n */\n static markName(url: string) {\n if (!this.trackPerformance) return ''\n\n const entries = performance.getEntriesByName(url, 'resource')\n if (entries.length > 0) {\n const last = entries[entries.length - 1]\n return `${url}-${last.startTime}`\n }\n return url\n }\n\n /**\n * Mark the start of a performance measure\n * @param name to use as prefix of mark. Use `markName()` to determine the name\n */\n static markStart(name: string) {\n return BrowserTransport.mark(name, BrowserTransport.startMark)\n }\n\n /**\n * Mark the end of a performance measure\n * @param url to find starting mark which doesn't have a resource entry yet\n * @param startName name of the start mark\n *\n * Creates the start/end performance measure\n *\n * @returns the name of the performance measure\n */\n static markEnd(url: string, startName: string) {\n if (this.trackPerformance) {\n // Find the resource entry and use it to create the measure name\n const measureName = this.markName(url)\n const end = BrowserTransport.mark(measureName, BrowserTransport.endMark)\n performance.measure(measureName, startName, end)\n // Marks have been processed into a measure, so remove them\n performance.clearMarks(startName)\n performance.clearMarks(end)\n return measureName\n }\n return ''\n }\n\n async rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse> {\n options = { ...this.options, ...options }\n const requestPath = this.makeUrl(path, options, queryParams)\n const props = await this.initRequest(\n method,\n requestPath,\n body,\n authenticator,\n options\n )\n const req = fetch(\n props.url,\n props // Weird package issues with unresolved imports for RequestInit :(\n )\n\n const res = await req\n\n // Start tracking the time it takes to convert the response\n const started = BrowserTransport.markStart(\n BrowserTransport.markName(requestPath)\n )\n const contentType = String(res.headers.get('content-type'))\n const mode = responseMode(contentType)\n const responseBody =\n mode === ResponseMode.binary ? await res.blob() : await res.text()\n if (!('fromRequest' in options)) {\n // Request will markEnd, so don't mark the end here\n BrowserTransport.markEnd(requestPath, started)\n }\n const headers = {}\n res.headers.forEach((value, key) => (headers[key] = value))\n const response: IRawResponse = {\n url: requestPath,\n body: responseBody,\n contentType,\n ok: true,\n statusCode: res.status,\n statusMessage: res.statusText,\n startMark: started,\n headers,\n }\n // Update OK with response statusCode check\n response.ok = this.ok(response)\n return this.observer ? this.observer(response) : response\n }\n\n /**\n * Process the response based on content type\n * @param res response to process\n */\n async parseResponse<TSuccess, TError>(\n res: IRawResponse\n ): Promise<SDKResponse<TSuccess, TError>> {\n const perfMark = res.startMark || ''\n if (!res.ok) {\n // Raw request had an error. Make sure it's a string before parsing the result\n let error = res.body\n if (typeof error === 'string') {\n try {\n error = JSON.parse(error)\n } catch {\n error = { message: `Request failed: ${error}` }\n }\n }\n const response: SDKResponse<TSuccess, TError> = { ok: false, error }\n return response\n }\n\n let value\n let error\n if (res.contentType.match(/application\\/json/g)) {\n try {\n value = JSON.parse(await res.body)\n BrowserTransport.markEnd(res.url, perfMark)\n } catch (err) {\n error = err\n BrowserTransport.markEnd(res.url, perfMark)\n }\n } else if (\n res.contentType === 'text' ||\n res.contentType.startsWith('text/')\n ) {\n value = res.body.toString()\n BrowserTransport.markEnd(res.url, perfMark)\n } else {\n try {\n BrowserTransport.markEnd(res.url, perfMark)\n value = res.body\n } catch (err) {\n BrowserTransport.markEnd(res.url, perfMark)\n error = err\n }\n }\n let result: SDKResponse<TSuccess, TError>\n if (error) {\n result = { ok: false, error }\n } else {\n result = { ok: true, value }\n }\n return result\n }\n\n async request<TSuccess, TError>(\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<SDKResponse<TSuccess, TError>> {\n try {\n if (BrowserTransport.trackPerformance) {\n options = { ...options, ...{ fromRequest: true } }\n }\n const res = await this.rawRequest(\n method,\n path,\n queryParams,\n body,\n authenticator,\n options\n )\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n const result: SDKResponse<TSuccess, TError> = await this.parseResponse(\n res\n )\n return result\n } catch (e) {\n const error: ISDKError = {\n message:\n typeof e.message === 'string'\n ? e.message\n : `The SDK call was not successful. The error was '${e}'.`,\n type: 'sdk_error',\n }\n return { error, ok: false }\n }\n }\n\n private async initRequest(\n method: HttpMethod,\n path: string,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ) {\n const agentTag = options?.agentTag || agentPrefix\n options = options ? { ...this.options, ...options } : this.options\n const headers: IRequestHeaders = { [LookerAppId]: agentTag }\n if (options && options.headers) {\n Object.entries(options.headers).forEach(([key, val]) => {\n headers[key] = val\n })\n }\n\n // Make sure an empty body is undefined\n if (!body) {\n body = undefined\n } else {\n if (typeof body !== 'string') {\n body = JSON.stringify(body)\n headers['Content-Type'] = 'application/json'\n }\n }\n let props: IRequestProps = {\n body,\n credentials: 'same-origin',\n headers,\n method,\n url: path,\n }\n\n if (authenticator) {\n // Add authentication information to the request\n props = await authenticator(props)\n }\n\n return props\n }\n\n // TODO finish this method\n async stream<TSuccess>(\n callback: (readable: Readable) => Promise<TSuccess>,\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<TSuccess> {\n options = options ? { ...this.options, ...options } : this.options\n const stream = new PassThrough()\n const returnPromise = callback(stream)\n const requestPath = this.makeUrl(path, options, queryParams)\n const props = await this.initRequest(\n method,\n requestPath,\n body,\n authenticator,\n options\n )\n trace(`[stream] attempting to stream via download url`, props)\n\n return Promise.reject<TSuccess>(\n // Silly error message to prevent linter from complaining about unused variables\n Error(\n `Streaming for${returnPromise ? 'callback' : ''} ${props.method} ${\n props.requestPath\n } is not implemented`\n )\n )\n\n /*\n TODO complete this for the browser implementation\n const streamPromise = new Promise<void>((resolve, reject) => {\n trace(`[stream] beginning stream via download url`, props)\n reject(Error('Not implemented yet!'))\n // let hasResolved = false\n // const req = this.requestor(props)\n //\n // req\n // .on(\"error\", (err) => {\n // if (hasResolved && (err as any).code === \"ECONNRESET\") {\n // trace('ignoring ECONNRESET that occurred after streaming finished', props)\n // } else {\n // trace('streaming error', err)\n // reject(err)\n // }\n // })\n // .on(\"finish\", () => {\n // trace(`[stream] streaming via download url finished`, props)\n // })\n // .on(\"socket\", (socket) => {\n // trace(`[stream] setting keepalive on socket`, props)\n // socket.setKeepAlive(true)\n // })\n // .on(\"abort\", () => {\n // trace(`[stream] streaming via download url aborted`, props)\n // })\n // .on(\"response\", () => {\n // trace(`[stream] got response from download url`, props)\n // })\n // .on(\"close\", () => {\n // trace(`[stream] request stream closed`, props)\n // })\n // .pipe(stream)\n // .on(\"error\", (err) => {\n // trace(`[stream] PassThrough stream error`, err)\n // reject(err)\n // })\n // .on(\"finish\", () => {\n // trace(`[stream] PassThrough stream finished`, props)\n // resolve()\n // hasResolved = true\n // })\n // .on(\"close\", () => {\n // trace(`[stream] PassThrough stream closed`, props)\n // })\n })\n\n const results = await Promise.all([returnPromise, streamPromise])\n return results[0]\n */\n }\n}\n"],"file":"browserTransport.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/browserTransport.ts"],"names":["trace","LookerAppId","agentPrefix","responseMode","ResponseMode","safeBase64","isErrorLike","BaseTransport","BrowserCryptoHash","arrayToHex","array","Array","from","map","b","toString","padStart","join","fromBase64","str","atob","split","c","charCodeAt","secureRandom","byteCount","bytes","Uint8Array","window","crypto","getRandomValues","sha256Hash","message","msgUint8","TextEncoder","encode","hashBuffer","subtle","digest","BrowserTransport","constructor","options","supportsPerformance","performance","mark","measure","trackPerformance","_trackPerf","value","name","tag","markName","url","entries","getEntriesByName","length","last","startTime","markStart","startMark","markEnd","startName","measureName","end","endMark","clearMarks","rawRequest","method","path","queryParams","body","authenticator","requestPath","makeUrl","props","initRequest","req","fetch","res","started","contentType","String","headers","get","mode","responseBody","binary","blob","text","forEach","key","response","ok","statusCode","status","statusMessage","statusText","observer","parseResponse","perfMark","error","JSON","parse","match","err","startsWith","result","request","fromRequest","e","type","agentTag","Object","val","undefined","stringify","credentials","stream","_callback","Promise","reject","Error"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { Readable } from 'readable-stream'\nimport type {\n ISDKError,\n SDKResponse,\n ITransportSettings,\n HttpMethod,\n Authenticator,\n IRequestProps,\n IRequestHeaders,\n Values,\n IRawResponse,\n} from './transport'\nimport {\n trace,\n LookerAppId,\n agentPrefix,\n responseMode,\n ResponseMode,\n safeBase64,\n isErrorLike,\n} from './transport'\nimport { BaseTransport } from './baseTransport'\nimport type { ICryptoHash } from './cryptoHash'\n\nexport class BrowserCryptoHash implements ICryptoHash {\n arrayToHex(array: Uint8Array): string {\n return Array.from(array)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n\n fromBase64(str: string) {\n return atob(str)\n .split('')\n .map(function (c) {\n return c.charCodeAt(0)\n })\n }\n\n secureRandom(byteCount: number): string {\n const bytes = new Uint8Array(byteCount)\n window.crypto.getRandomValues(bytes)\n return this.arrayToHex(bytes)\n }\n\n async sha256Hash(message: string): Promise<string> {\n const msgUint8 = new TextEncoder().encode(message)\n const hashBuffer = await window.crypto.subtle.digest('SHA-256', msgUint8)\n return safeBase64(new Uint8Array(hashBuffer))\n }\n}\n\nexport class BrowserTransport extends BaseTransport {\n constructor(protected readonly options: ITransportSettings) {\n super(options)\n }\n\n /** Does this browser have the necessary performance APIs? */\n static supportsPerformance() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return !!(performance && performance.mark && performance.measure)\n }\n\n private static _trackPerf = false\n\n public static get trackPerformance() {\n return this._trackPerf\n }\n\n public static set trackPerformance(value: boolean) {\n this._trackPerf = value && BrowserTransport.supportsPerformance()\n }\n\n static startMark = 'A'\n static endMark = 'B'\n\n /**\n * Create a performance mark\n * @param name to use as prefix of mark. Use `markName()` to determine the name\n * @param tag tag to use to distinguish mark\n * @returns the name of the mark used, or '' if not marked\n */\n static mark(name: string, tag: string) {\n if (this.trackPerformance) {\n const mark = `${name}-${tag}`\n performance.mark(mark)\n return mark\n }\n return ''\n }\n\n /**\n * Create a unique name for the performance metric of the url based on its start time\n * @param url metric to find\n *\n * Uses the last entry of the matching metric to create the name for the tracker so\n * post processing can use it to merge into the main resource tracker\n *\n */\n static markName(url: string) {\n if (!this.trackPerformance) return ''\n\n const entries = performance.getEntriesByName(url, 'resource')\n if (entries.length > 0) {\n const last = entries[entries.length - 1]\n return `${url}-${last.startTime}`\n }\n return url\n }\n\n /**\n * Mark the start of a performance measure\n * @param name to use as prefix of mark. Use `markName()` to determine the name\n */\n static markStart(name: string) {\n return BrowserTransport.mark(name, BrowserTransport.startMark)\n }\n\n /**\n * Mark the end of a performance measure\n * @param url to find starting mark which doesn't have a resource entry yet\n * @param startName name of the start mark\n *\n * Creates the start/end performance measure\n *\n * @returns the name of the performance measure\n */\n static markEnd(url: string, startName: string) {\n if (this.trackPerformance) {\n // Find the resource entry and use it to create the measure name\n const measureName = this.markName(url)\n const end = BrowserTransport.mark(measureName, BrowserTransport.endMark)\n performance.measure(measureName, startName, end)\n // Marks have been processed into a measure, so remove them\n performance.clearMarks(startName)\n performance.clearMarks(end)\n return measureName\n }\n return ''\n }\n\n async rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse> {\n options = { ...this.options, ...options }\n const requestPath = this.makeUrl(path, options, queryParams)\n const props = await this.initRequest(\n method,\n requestPath,\n body,\n authenticator,\n options\n )\n const req = fetch(\n props.url,\n props // Weird package issues with unresolved imports for RequestInit :(\n )\n\n const res = await req\n\n // Start tracking the time it takes to convert the response\n const started = BrowserTransport.markStart(\n BrowserTransport.markName(requestPath)\n )\n const contentType = String(res.headers.get('content-type'))\n const mode = responseMode(contentType)\n const responseBody =\n mode === ResponseMode.binary ? await res.blob() : await res.text()\n if (!('fromRequest' in options)) {\n // Request will markEnd, so don't mark the end here\n BrowserTransport.markEnd(requestPath, started)\n }\n const headers = {}\n res.headers.forEach((value, key) => (headers[key] = value))\n const response: IRawResponse = {\n url: requestPath,\n body: responseBody,\n contentType,\n ok: true,\n statusCode: res.status,\n statusMessage: res.statusText,\n startMark: started,\n headers,\n }\n // Update OK with response statusCode check\n response.ok = this.ok(response)\n return this.observer ? this.observer(response) : response\n }\n\n /**\n * Process the response based on content type\n * @param res response to process\n */\n async parseResponse<TSuccess, TError>(\n res: IRawResponse\n ): Promise<SDKResponse<TSuccess, TError>> {\n const perfMark = res.startMark || ''\n if (!res.ok) {\n // Raw request had an error. Make sure it's a string before parsing the result\n let error = res.body\n if (typeof error === 'string') {\n try {\n error = JSON.parse(error)\n } catch {\n error = { message: `Request failed: ${error}` }\n }\n }\n const response: SDKResponse<TSuccess, TError> = { ok: false, error }\n return response\n }\n\n let value\n let error\n if (res.contentType.match(/application\\/json/g)) {\n try {\n value = JSON.parse(await res.body)\n BrowserTransport.markEnd(res.url, perfMark)\n } catch (err) {\n error = err\n BrowserTransport.markEnd(res.url, perfMark)\n }\n } else if (\n res.contentType === 'text' ||\n res.contentType.startsWith('text/')\n ) {\n value = res.body.toString()\n BrowserTransport.markEnd(res.url, perfMark)\n } else {\n try {\n BrowserTransport.markEnd(res.url, perfMark)\n value = res.body\n } catch (err) {\n BrowserTransport.markEnd(res.url, perfMark)\n error = err\n }\n }\n let result: SDKResponse<TSuccess, TError>\n if (error) {\n result = { ok: false, error: error as TError }\n } else {\n result = { ok: true, value }\n }\n return result\n }\n\n async request<TSuccess, TError>(\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<SDKResponse<TSuccess, TError>> {\n try {\n if (BrowserTransport.trackPerformance) {\n options = { ...options, ...{ fromRequest: true } }\n }\n const res = await this.rawRequest(\n method,\n path,\n queryParams,\n body,\n authenticator,\n options\n )\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n const result: SDKResponse<TSuccess, TError> = await this.parseResponse(\n res\n )\n return result\n } catch (e: unknown) {\n if (!isErrorLike(e)) throw e\n const error: ISDKError = {\n message:\n typeof e.message === 'string'\n ? e.message\n : `The SDK call was not successful. The error was '${e}'.`,\n type: 'sdk_error',\n }\n return { error, ok: false }\n }\n }\n\n private async initRequest(\n method: HttpMethod,\n path: string,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ) {\n const agentTag = options?.agentTag || agentPrefix\n options = options ? { ...this.options, ...options } : this.options\n const headers: IRequestHeaders = { [LookerAppId]: agentTag }\n if (options && options.headers) {\n Object.entries(options.headers).forEach(([key, val]) => {\n headers[key] = val\n })\n }\n\n // Make sure an empty body is undefined\n if (!body) {\n body = undefined\n } else {\n if (typeof body !== 'string') {\n body = JSON.stringify(body)\n headers['Content-Type'] = 'application/json'\n }\n }\n let props: IRequestProps = {\n body,\n credentials: 'same-origin',\n headers,\n method,\n url: path,\n }\n\n if (authenticator) {\n // Add authentication information to the request\n props = await authenticator(props)\n }\n\n return props\n }\n\n // TODO finish this method\n async stream<TSuccess>(\n _callback: (readable: Readable) => Promise<TSuccess>,\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<TSuccess> {\n options = options ? { ...this.options, ...options } : this.options\n // const stream = new PassThrough()\n // const returnPromise = callback(stream)\n const requestPath = this.makeUrl(path, options, queryParams)\n const props = await this.initRequest(\n method,\n requestPath,\n body,\n authenticator,\n options\n )\n trace(`[stream] attempting to stream via download url`, props)\n\n return Promise.reject<TSuccess>(\n // Silly error message to prevent linter from complaining about unused variables\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n Error(\n `Streaming for callback ${props.method} ${props.requestPath} is not implemented`\n )\n )\n\n /*\n TODO complete this for the browser implementation\n const streamPromise = new Promise<void>((resolve, reject) => {\n trace(`[stream] beginning stream via download url`, props)\n reject(Error('Not implemented yet!'))\n // let hasResolved = false\n // const req = this.requestor(props)\n //\n // req\n // .on(\"error\", (err) => {\n // if (hasResolved && (err as any).code === \"ECONNRESET\") {\n // trace('ignoring ECONNRESET that occurred after streaming finished', props)\n // } else {\n // trace('streaming error', err)\n // reject(err)\n // }\n // })\n // .on(\"finish\", () => {\n // trace(`[stream] streaming via download url finished`, props)\n // })\n // .on(\"socket\", (socket) => {\n // trace(`[stream] setting keepalive on socket`, props)\n // socket.setKeepAlive(true)\n // })\n // .on(\"abort\", () => {\n // trace(`[stream] streaming via download url aborted`, props)\n // })\n // .on(\"response\", () => {\n // trace(`[stream] got response from download url`, props)\n // })\n // .on(\"close\", () => {\n // trace(`[stream] request stream closed`, props)\n // })\n // .pipe(stream)\n // .on(\"error\", (err) => {\n // trace(`[stream] PassThrough stream error`, err)\n // reject(err)\n // })\n // .on(\"finish\", () => {\n // trace(`[stream] PassThrough stream finished`, props)\n // resolve()\n // hasResolved = true\n // })\n // .on(\"close\", () => {\n // trace(`[stream] PassThrough stream closed`, props)\n // })\n })\n\n const results = await Promise.all([returnPromise, streamPromise])\n return results[0]\n */\n }\n}\n"],"file":"browserTransport.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/extensionSession.ts"],"names":["ExtensionSession","constructor","settings","transport","isAuthenticated","authenticate","init","Promise","reject","Error","getToken","isSudo","login","sudoId","logout","reset"],"mappings":";;;;;;AA8BA,OAAO,MAAMA,gBAAN,CAA+C;AAIpDC,EAAAA,WAAW,CAAQC,QAAR,EAAgCC,SAAhC,EAAuD;AAAA,SAA/CD,QAA+C,GAA/CA,QAA+C;;AAAA,oCAHzD,EAGyD;;AAAA;;AAChE,SAAKA,QAAL,GAAgBA,QAAhB;AACA,SAAKC,SAAL,GAAiBA,SAAjB;AACD;;AAEDC,EAAAA,eAAe,GAAG;AAEhB,WAAO,IAAP;AACD;;AAEKC,EAAAA,YAAY,CAACC,IAAD,EAAsB;AAAA;AACtC,aAAOC,OAAO,CAACC,MAAR,CACLC,KAAK,wBAEDH,IAAI,GAAG,4BAAH,GAAkC,EAFrC,0CADA,CAAP;AADsC;AAQvC;;AAEKI,EAAAA,QAAQ,GAAiB;AAAA;AAC7B,aAAOH,OAAO,CAACC,MAAR,CACLC,KAAK,CAAC,sDAAD,CADA,CAAP;AAD6B;AAI9B;;AAEDE,EAAAA,MAAM,GAAY;AAChB,UAAM,IAAIF,KAAJ,CAAU,6CAAV,CAAN;AACD;;AAEKG,EAAAA,KAAK,CAACC,MAAD,EAAyC;AAAA;AAClD,aAAON,OAAO,CAACC,MAAR,CACLC,KAAK,iBACMI,MAAM,GAAG,UAAH,GAAgB,EAD5B,0CADA,CAAP;AADkD;AAMnD;;AAEKC,EAAAA,MAAM,GAAqB;AAAA;AAC/B,aAAOP,OAAO,CAACC,MAAR,CAAeC,KAAK,CAAC,4CAAD,CAApB,CAAP;AAD+B;AAEhC;;AAEDM,EAAAA,KAAK,GAAS,CAEb;;AAhDmD","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport { IApiSettings } from './apiSettings'\nimport { ITransport, IRequestProps } from './transport'\nimport { IAuthSession } from './authSession'\n\nexport class ExtensionSession implements IAuthSession {\n sudoId = ''\n transport: ITransport\n\n constructor(public settings: IApiSettings, transport: ITransport) {\n this.settings = settings\n this.transport = transport\n }\n\n isAuthenticated() {\n // Assume if the extension exists then it is authenticated\n return true\n }\n\n async authenticate(init: IRequestProps) {\n return Promise.reject(\n Error(\n `Authenticate ${\n init ? 'request property overrides' : ''\n } not supported from ExtensionSession`\n )\n )\n }\n\n async getToken(): Promise<any> {\n return Promise.reject(\n Error('Access to token is not allowed from ExtensionSession')\n )\n }\n\n isSudo(): boolean {\n throw new Error('isSudo is not allowed from ExtensionSession')\n }\n\n async login(sudoId?: string | number): Promise<any> {\n return Promise.reject(\n Error(\n `Login ${sudoId ? 'for sudo' : ''} not supported from ExtensionSession`\n )\n )\n }\n\n async logout(): Promise<boolean> {\n return Promise.reject(Error('Logout not supported from ExtensionSession'))\n }\n\n reset(): void {\n // noop\n }\n}\n"],"file":"extensionSession.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/extensionSession.ts"],"names":["ExtensionSession","constructor","settings","transport","isAuthenticated","authenticate","init","Promise","reject","Error","getToken","isSudo","login","sudoId","logout","reset"],"mappings":";;;;;;AA8BA,OAAO,MAAMA,gBAAN,CAA+C;AAIpDC,EAAAA,WAAW,CAAQC,QAAR,EAAgCC,SAAhC,EAAuD;AAAA,SAA/CD,QAA+C,GAA/CA,QAA+C;;AAAA,oCAHzD,EAGyD;;AAAA;;AAChE,SAAKA,QAAL,GAAgBA,QAAhB;AACA,SAAKC,SAAL,GAAiBA,SAAjB;AACD;;AAEDC,EAAAA,eAAe,GAAG;AAEhB,WAAO,IAAP;AACD;;AAEKC,EAAAA,YAAY,CAACC,IAAD,EAAsB;AAAA;AACtC,aAAOC,OAAO,CAACC,MAAR,CACLC,KAAK,wBAEDH,IAAI,GAAG,4BAAH,GAAkC,EAFrC,0CADA,CAAP;AADsC;AAQvC;;AAEKI,EAAAA,QAAQ,GAAiB;AAAA;AAC7B,aAAOH,OAAO,CAACC,MAAR,CACLC,KAAK,CAAC,sDAAD,CADA,CAAP;AAD6B;AAI9B;;AAEDE,EAAAA,MAAM,GAAY;AAChB,UAAM,IAAIF,KAAJ,CAAU,6CAAV,CAAN;AACD;;AAEKG,EAAAA,KAAK,CAACC,MAAD,EAAyC;AAAA;AAClD,aAAON,OAAO,CAACC,MAAR,CACLC,KAAK,iBACMI,MAAM,GAAG,UAAH,GAAgB,EAD5B,0CADA,CAAP;AADkD;AAMnD;;AAEKC,EAAAA,MAAM,GAAqB;AAAA;AAC/B,aAAOP,OAAO,CAACC,MAAR,CAAeC,KAAK,CAAC,4CAAD,CAApB,CAAP;AAD+B;AAEhC;;AAEDM,EAAAA,KAAK,GAAS,CAEb;;AAhDmD","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IApiSettings } from './apiSettings'\nimport type { ITransport, IRequestProps } from './transport'\nimport type { IAuthSession } from './authSession'\n\nexport class ExtensionSession implements IAuthSession {\n sudoId = ''\n transport: ITransport\n\n constructor(public settings: IApiSettings, transport: ITransport) {\n this.settings = settings\n this.transport = transport\n }\n\n isAuthenticated() {\n // Assume if the extension exists then it is authenticated\n return true\n }\n\n async authenticate(init: IRequestProps) {\n return Promise.reject(\n Error(\n `Authenticate ${\n init ? 'request property overrides' : ''\n } not supported from ExtensionSession`\n )\n )\n }\n\n async getToken(): Promise<any> {\n return Promise.reject(\n Error('Access to token is not allowed from ExtensionSession')\n )\n }\n\n isSudo(): boolean {\n throw new Error('isSudo is not allowed from ExtensionSession')\n }\n\n async login(sudoId?: string | number): Promise<any> {\n return Promise.reject(\n Error(\n `Login ${sudoId ? 'for sudo' : ''} not supported from ExtensionSession`\n )\n )\n }\n\n async logout(): Promise<boolean> {\n return Promise.reject(Error('Logout not supported from ExtensionSession'))\n }\n\n reset(): void {\n // noop\n }\n}\n"],"file":"extensionSession.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/extensionTransport.ts"],"names":["ExtensionTransport","constructor","options","hostConnection","rawRequest","method","path","queryParams","body","authenticator","response","observer","request","stream","callback","parseResponse","_raw","result","ok","error","Error","Promise","resolve"],"mappings":";;;;;;;;;;AAoEA,OAAO,MAAMA,kBAAN,CAA+C;AACpDC,EAAAA,WAAW,CACQC,OADR,EAEDC,cAFC,EAGT;AAAA,SAFiBD,OAEjB,GAFiBA,OAEjB;AAAA,SADQC,cACR,GADQA,cACR;;AAAA;;AACA,SAAKD,OAAL,GAAeA,OAAf;AACA,SAAKC,cAAL,GAAsBA,cAAtB;AACD;;AAIKC,EAAAA,UAAU,CACdC,MADc,EAEdC,IAFc,EAGdC,WAHc,EAIdC,IAJc,EAKdC,aALc,EAMdP,OANc,EAOS;AAAA;;AAAA;AACvB,UAAMQ,QAAQ,SAAS,KAAI,CAACP,cAAL,CAAoBC,UAApB,CACrBC,MADqB,EAErBC,IAFqB,EAGrBE,IAHqB,EAIrBD,WAJqB,EAKrBE,aALqB,EAMrBP,OANqB,CAAvB;AAQA,aAAO,KAAI,CAACS,QAAL,GAAgB,KAAI,CAACA,QAAL,CAAcD,QAAd,CAAhB,GAA0CA,QAAjD;AATuB;AAUxB;;AAEKE,EAAAA,OAAO,CACXP,MADW,EAEXC,IAFW,EAGXC,WAHW,EAIXC,IAJW,EAKXC,aALW,EAMXP,OANW,EAO6B;AAAA;;AAAA;AACxC,aAAO,MAAI,CAACC,cAAL,CAAoBS,OAApB,CACLP,MADK,EAELC,IAFK,EAGLE,IAHK,EAILD,WAJK,EAKLE,aALK,EAMLP,OANK,CAAP;AADwC;AASzC;;AAEKW,EAAAA,MAAM,CACVC,QADU,EAEVT,MAFU,EAGVC,IAHU,EAIVC,WAJU,EAKVC,IALU,EAMVC,aANU,EAOVP,OAPU,EAQS;AAAA;;AAAA;AACnBA,MAAAA,OAAO,GAAGA,OAAO,mCAAQ,MAAI,CAACA,OAAb,GAAyBA,OAAzB,IAAqC,MAAI,CAACA,OAA3D;AACA,aAAO,MAAI,CAACC,cAAL,CAAoBU,MAApB,CACLC,QADK,EAELT,MAFK,EAGLC,IAHK,EAILE,IAJK,EAKLD,WALK,EAMLE,aANK,EAOLP,OAPK,CAAP;AAFmB;AAWpB;;AAEDa,EAAAA,aAAa,CACXC,IADW,EAE6B;AACxC,QAAMC,MAAqC,GAAG;AAC5CC,MAAAA,EAAE,EAAE,KADwC;AAE5CC,MAAAA,KAAK,EAAE,IAAIC,KAAJ,CAAU,uBAAV;AAFqC,KAA9C;AAIA,WAAOC,OAAO,CAACC,OAAR,CAAgBL,MAAhB,CAAP;AACD;;AA7EmD","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport { Readable } from 'readable-stream'\nimport {\n Authenticator,\n Values,\n SDKResponse,\n ITransport,\n ITransportSettings,\n HttpMethod,\n IRawResponse,\n RawObserver,\n} from './transport'\n\nexport interface IHostConnection {\n rawRequest(\n httpMethod: string,\n path: string,\n body?: any,\n params?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse>\n\n request(\n httpMethod: string,\n path: string,\n body?: any,\n params?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<any>\n\n stream<T>(\n callback: (readable: Readable) => Promise<T>,\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<T>\n}\n\nexport class ExtensionTransport implements ITransport {\n constructor(\n private readonly options: ITransportSettings,\n private hostConnection: IHostConnection\n ) {\n this.options = options\n this.hostConnection = hostConnection\n }\n\n observer: RawObserver | undefined\n\n async rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: any,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse> {\n const response = await this.hostConnection.rawRequest(\n method,\n path,\n body,\n queryParams,\n authenticator,\n options\n )\n return this.observer ? this.observer(response) : response\n }\n\n async request<TSuccess, TError>(\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: any,\n options?: Partial<ITransportSettings>\n ): Promise<SDKResponse<TSuccess, TError>> {\n return this.hostConnection.request(\n method,\n path,\n body,\n queryParams,\n authenticator,\n options\n )\n }\n\n async stream<TSuccess>(\n callback: (readable: any) => Promise<TSuccess>,\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: any,\n options?: Partial<ITransportSettings>\n ): Promise<TSuccess> {\n options = options ? { ...this.options, ...options } : this.options\n return this.hostConnection.stream(\n callback,\n method,\n path,\n body,\n queryParams,\n authenticator,\n options\n )\n }\n\n parseResponse<TSuccess, TError>(\n _raw: IRawResponse\n ): Promise<SDKResponse<TSuccess, TError>> {\n const result: SDKResponse<TSuccess, TError> = {\n ok: false,\n error: new Error('Should not be called!') as unknown as TError,\n }\n return Promise.resolve(result)\n }\n}\n"],"file":"extensionTransport.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/extensionTransport.ts"],"names":["ExtensionTransport","constructor","options","hostConnection","rawRequest","method","path","queryParams","body","authenticator","response","observer","request","stream","callback","parseResponse","_raw","result","ok","error","Error","Promise","resolve"],"mappings":";;;;;;;;;;AAoEA,OAAO,MAAMA,kBAAN,CAA+C;AACpDC,EAAAA,WAAW,CACQC,OADR,EAEDC,cAFC,EAGT;AAAA,SAFiBD,OAEjB,GAFiBA,OAEjB;AAAA,SADQC,cACR,GADQA,cACR;;AAAA;;AACA,SAAKD,OAAL,GAAeA,OAAf;AACA,SAAKC,cAAL,GAAsBA,cAAtB;AACD;;AAIKC,EAAAA,UAAU,CACdC,MADc,EAEdC,IAFc,EAGdC,WAHc,EAIdC,IAJc,EAKdC,aALc,EAMdP,OANc,EAOS;AAAA;;AAAA;AACvB,UAAMQ,QAAQ,SAAS,KAAI,CAACP,cAAL,CAAoBC,UAApB,CACrBC,MADqB,EAErBC,IAFqB,EAGrBE,IAHqB,EAIrBD,WAJqB,EAKrBE,aALqB,EAMrBP,OANqB,CAAvB;AAQA,aAAO,KAAI,CAACS,QAAL,GAAgB,KAAI,CAACA,QAAL,CAAcD,QAAd,CAAhB,GAA0CA,QAAjD;AATuB;AAUxB;;AAEKE,EAAAA,OAAO,CACXP,MADW,EAEXC,IAFW,EAGXC,WAHW,EAIXC,IAJW,EAKXC,aALW,EAMXP,OANW,EAO6B;AAAA;;AAAA;AACxC,aAAO,MAAI,CAACC,cAAL,CAAoBS,OAApB,CACLP,MADK,EAELC,IAFK,EAGLE,IAHK,EAILD,WAJK,EAKLE,aALK,EAMLP,OANK,CAAP;AADwC;AASzC;;AAEKW,EAAAA,MAAM,CACVC,QADU,EAEVT,MAFU,EAGVC,IAHU,EAIVC,WAJU,EAKVC,IALU,EAMVC,aANU,EAOVP,OAPU,EAQS;AAAA;;AAAA;AACnBA,MAAAA,OAAO,GAAGA,OAAO,mCAAQ,MAAI,CAACA,OAAb,GAAyBA,OAAzB,IAAqC,MAAI,CAACA,OAA3D;AACA,aAAO,MAAI,CAACC,cAAL,CAAoBU,MAApB,CACLC,QADK,EAELT,MAFK,EAGLC,IAHK,EAILE,IAJK,EAKLD,WALK,EAMLE,aANK,EAOLP,OAPK,CAAP;AAFmB;AAWpB;;AAEDa,EAAAA,aAAa,CACXC,IADW,EAE6B;AACxC,QAAMC,MAAqC,GAAG;AAC5CC,MAAAA,EAAE,EAAE,KADwC;AAE5CC,MAAAA,KAAK,EAAE,IAAIC,KAAJ,CAAU,uBAAV;AAFqC,KAA9C;AAIA,WAAOC,OAAO,CAACC,OAAR,CAAgBL,MAAhB,CAAP;AACD;;AA7EmD","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { Readable } from 'readable-stream'\nimport type {\n Authenticator,\n Values,\n SDKResponse,\n ITransport,\n ITransportSettings,\n HttpMethod,\n IRawResponse,\n RawObserver,\n} from './transport'\n\nexport interface IHostConnection {\n rawRequest(\n httpMethod: string,\n path: string,\n body?: any,\n params?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse>\n\n request(\n httpMethod: string,\n path: string,\n body?: any,\n params?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<any>\n\n stream<T>(\n callback: (readable: Readable) => Promise<T>,\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<T>\n}\n\nexport class ExtensionTransport implements ITransport {\n constructor(\n private readonly options: ITransportSettings,\n private hostConnection: IHostConnection\n ) {\n this.options = options\n this.hostConnection = hostConnection\n }\n\n observer: RawObserver | undefined\n\n async rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: any,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse> {\n const response = await this.hostConnection.rawRequest(\n method,\n path,\n body,\n queryParams,\n authenticator,\n options\n )\n return this.observer ? this.observer(response) : response\n }\n\n async request<TSuccess, TError>(\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: any,\n options?: Partial<ITransportSettings>\n ): Promise<SDKResponse<TSuccess, TError>> {\n return this.hostConnection.request(\n method,\n path,\n body,\n queryParams,\n authenticator,\n options\n )\n }\n\n async stream<TSuccess>(\n callback: (readable: any) => Promise<TSuccess>,\n method: HttpMethod,\n path: string,\n queryParams?: any,\n body?: any,\n authenticator?: any,\n options?: Partial<ITransportSettings>\n ): Promise<TSuccess> {\n options = options ? { ...this.options, ...options } : this.options\n return this.hostConnection.stream(\n callback,\n method,\n path,\n body,\n queryParams,\n authenticator,\n options\n )\n }\n\n parseResponse<TSuccess, TError>(\n _raw: IRawResponse\n ): Promise<SDKResponse<TSuccess, TError>> {\n const result: SDKResponse<TSuccess, TError> = {\n ok: false,\n error: new Error('Should not be called!') as unknown as TError,\n }\n return Promise.resolve(result)\n }\n}\n"],"file":"extensionTransport.js"}
|
package/lib/esm/oauthSession.js
CHANGED
|
@@ -89,7 +89,8 @@ export class OAuthSession extends AuthSession {
|
|
|
89
89
|
if (!_this2.isAuthenticated()) {
|
|
90
90
|
if (!_this2.returnUrl) {
|
|
91
91
|
var authUrl = yield _this2.createAuthCodeRequestUrl('cors_api', agentPrefix);
|
|
92
|
-
|
|
92
|
+
var returnTo = window.location.pathname + window.location.search;
|
|
93
|
+
_this2.returnUrl = returnTo;
|
|
93
94
|
window.location.href = authUrl;
|
|
94
95
|
} else {
|
|
95
96
|
_this2.returnUrl = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/oauthSession.ts"],"names":["AuthSession","agentPrefix","sdkError","AuthToken","OAuthSession","constructor","services","settings","transport","crypto","keys","config","readConfig","forEach","key","value","message","authenticate","props","token","getToken","access_token","headers","Authorization","code_verifier","sessionStorage","getItem","codeVerifierKey","removeItem","setItem","returnUrl","returnUrlKey","clearStorage","login","_sudoId","isAuthenticated","authUrl","createAuthCodeRequestUrl","window","location","pathname","search","href","Promise","reject","Error","params","URLSearchParams","code","get","redeemAuthCode","activeToken","requestToken","body","url","URL","base_url","ok","request","toString","undefined","setToken","scope","state","secureRandom","code_challenge","sha256Hash","client_id","code_challenge_method","redirect_uri","response_type","looker_url","redeemAuthCodeBody","authCode","codeVerifier","verifier","grant_type","refresh_token","isActive","logout","init"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport { AuthSession, IAccessToken, IError } from './authSession'\nimport { agentPrefix, IRequestProps, sdkError } from './transport'\nimport { AuthToken } from './authToken'\nimport { ICryptoHash } from './cryptoHash'\nimport { IPlatformServices } from './platformServices'\n\ninterface IAuthCodeGrantTypeParams {\n grant_type: 'authorization_code'\n code: string\n code_verifier: string\n client_id: string\n redirect_uri: string\n}\n\ninterface IRefreshTokenGrantTypeParams {\n grant_type: 'refresh_token'\n refresh_token: string\n client_id: string\n redirect_uri: string\n}\n\nexport class OAuthSession extends AuthSession {\n activeToken = new AuthToken()\n crypto: ICryptoHash\n private static readonly codeVerifierKey = 'looker_oauth_code_verifier'\n private static readonly returnUrlKey = 'looker_oauth_return_url'\n\n constructor(services: IPlatformServices) {\n super(services.settings, services.transport)\n\n this.crypto = services.crypto\n\n const keys: string[] = [\n 'client_id',\n 'redirect_uri',\n 'base_url',\n 'looker_url',\n ]\n const config = { ...this.settings, ...this.settings.readConfig() }\n\n keys.forEach((key) => {\n const value = config[key]\n if (!value) {\n throw sdkError({\n message: `Missing required configuration setting: '${key}'`,\n })\n }\n })\n }\n\n /**\n * merge the dynamically defined configuration values with the initial settings\n */\n readConfig() {\n return { ...this.settings, ...this.settings.readConfig() }\n }\n\n /**\n * Apply current auth token credentials to an HTTP request\n * @param props request properties to update\n * @returns updated request properties with auth information added\n */\n async authenticate(props: IRequestProps): Promise<IRequestProps> {\n const token = await this.getToken()\n if (token.access_token) {\n props.headers.Authorization = `Bearer ${token.access_token}`\n }\n return props\n }\n\n /**\n * Gets session storage for OAuth code verification\n * @returns saved code verifier\n */\n get code_verifier() {\n return sessionStorage.getItem(OAuthSession.codeVerifierKey)\n }\n\n /**\n * Sets session storage for OAuth code verification\n */\n set code_verifier(value: string | null) {\n if (value === null) {\n // only clear code_verifier if it's `null`\n sessionStorage.removeItem(OAuthSession.codeVerifierKey)\n } else {\n sessionStorage.setItem(OAuthSession.codeVerifierKey, value)\n }\n }\n\n /**\n * URL to return to after login process completes\n * @returns the URL that started the OAuth login process\n */\n get returnUrl() {\n return sessionStorage.getItem(OAuthSession.returnUrlKey)\n }\n\n /**\n * Sets the return URL for successful OAuth login\n */\n set returnUrl(value: string | null) {\n if (!value) {\n sessionStorage.removeItem(OAuthSession.returnUrlKey)\n } else {\n sessionStorage.setItem(OAuthSession.returnUrlKey, value)\n }\n }\n\n /**\n * Clears all Looker SDK OAuth-related session storage\n */\n clearStorage() {\n sessionStorage.removeItem(OAuthSession.codeVerifierKey)\n sessionStorage.removeItem(OAuthSession.returnUrlKey)\n }\n\n async login(_sudoId?: string | number): Promise<any> {\n if (!this.isAuthenticated()) {\n if (!this.returnUrl) {\n // OAuth has not been initiated\n const authUrl = await this.createAuthCodeRequestUrl(\n 'cors_api',\n agentPrefix\n )\n this.returnUrl = window.location.pathname + window.location.search\n // Save the current URL so redirected successful OAuth login can restore it\n window.location.href = authUrl\n } else {\n // If return URL is stored, we must be coming back from an OAuth request\n // so catch and release the stored return url at the start of the redemption\n this.returnUrl = null\n if (!this.code_verifier) {\n return Promise.reject(\n new Error('OAuth failed: expected code_verifier to be stored')\n )\n }\n const params = new URLSearchParams(window.location.search)\n const code = params.get('code')\n if (!code) {\n return Promise.reject(\n new Error(\n `OAuth failed: no OAuth code parameter found in ${\n window.location.pathname + window.location.search\n }`\n )\n )\n }\n await this.redeemAuthCode(code)\n }\n return await this.getToken()\n }\n return this.activeToken\n }\n\n private async requestToken(\n body: IAuthCodeGrantTypeParams | IRefreshTokenGrantTypeParams\n ) {\n const config = this.readConfig()\n const url = new URL(config.base_url)\n // replace the entire path of the base_url because this\n // auth endpoint is independent of API version\n url.pathname = '/api/token'\n const token = await this.ok(\n this.transport.request<IAccessToken, IError>(\n 'POST',\n url.toString(),\n undefined,\n body\n )\n )\n\n return this.activeToken.setToken(token)\n }\n\n /*\n Generate an OAuth2 authCode request URL\n */\n async createAuthCodeRequestUrl(\n scope: string,\n state: string\n ): Promise<string> {\n // TODO: remove this comment when we remove hex backwards compatibility\n // in Looker API. For now it must not be 2^n so that Looker correctly\n // treats it as base64 encoded\n this.code_verifier = this.crypto.secureRandom(33)\n const code_challenge = await this.crypto.sha256Hash(this.code_verifier)\n const config = this.readConfig()\n const params: Record<string, string> = {\n client_id: config.client_id,\n code_challenge: code_challenge,\n code_challenge_method: 'S256',\n redirect_uri: config.redirect_uri,\n response_type: 'code',\n scope: scope,\n state: state,\n }\n const url = new URL(config.looker_url)\n url.pathname = '/auth'\n url.search = new URLSearchParams(params).toString()\n return url.toString()\n }\n\n redeemAuthCodeBody(authCode: string, codeVerifier?: string) {\n const verifier = codeVerifier || this.code_verifier || ''\n const config = this.readConfig()\n return {\n client_id: config.client_id,\n code: authCode,\n code_verifier: verifier,\n grant_type: 'authorization_code',\n redirect_uri: config.redirect_uri,\n } as IAuthCodeGrantTypeParams\n }\n\n /**\n * Convert an authCode received from server into an active auth token\n * The app is responsible for obtaining the authCode via interactive user login\n * via /auth front-end endpoint and URL redirect. When the authCode is received\n * by url redirect to an app route, pass the authCode into this function to\n * get an access_token and refresh_token.\n * @param {string} authCode\n * @param {string} codeVerifier\n * @returns {Promise<AuthToken>}\n */\n async redeemAuthCode(authCode: string, codeVerifier?: string) {\n return this.requestToken(this.redeemAuthCodeBody(authCode, codeVerifier))\n }\n\n async getToken() {\n if (!this.isAuthenticated()) {\n if (this.activeToken.refresh_token) {\n const config = this.readConfig()\n await this.requestToken({\n client_id: config.client_id,\n grant_type: 'refresh_token',\n redirect_uri: config.redirect_uri,\n refresh_token: this.activeToken.refresh_token,\n })\n }\n }\n return this.activeToken\n }\n\n isAuthenticated(): boolean {\n return this.activeToken.isActive()\n }\n\n async logout() {\n if (this.activeToken.access_token) {\n await this.ok(\n this.transport.request<IAccessToken, IError>(\n 'DELETE',\n `/api/logout`,\n undefined,\n undefined,\n (init: IRequestProps) => {\n init.headers.Authorization = `Bearer ${this.activeToken.access_token}`\n return init\n }\n )\n )\n\n // logout destroys the access_token AND the refresh_token\n this.activeToken = new AuthToken()\n this.clearStorage()\n return true\n }\n return false\n }\n}\n"],"file":"oauthSession.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/oauthSession.ts"],"names":["AuthSession","agentPrefix","sdkError","AuthToken","OAuthSession","constructor","services","settings","transport","crypto","keys","config","readConfig","forEach","key","value","message","authenticate","props","token","getToken","access_token","headers","Authorization","code_verifier","sessionStorage","getItem","codeVerifierKey","removeItem","setItem","returnUrl","returnUrlKey","clearStorage","login","_sudoId","isAuthenticated","authUrl","createAuthCodeRequestUrl","returnTo","window","location","pathname","search","href","Promise","reject","Error","params","URLSearchParams","code","get","redeemAuthCode","activeToken","requestToken","body","url","URL","base_url","ok","request","toString","undefined","setToken","scope","state","secureRandom","code_challenge","sha256Hash","client_id","code_challenge_method","redirect_uri","response_type","looker_url","redeemAuthCodeBody","authCode","codeVerifier","verifier","grant_type","refresh_token","isActive","logout","init"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IAccessToken, IError } from './authSession'\nimport { AuthSession } from './authSession'\nimport type { IRequestProps } from './transport'\nimport { agentPrefix, sdkError } from './transport'\nimport { AuthToken } from './authToken'\nimport type { ICryptoHash } from './cryptoHash'\nimport type { IPlatformServices } from './platformServices'\n\ninterface IAuthCodeGrantTypeParams {\n grant_type: 'authorization_code'\n code: string\n code_verifier: string\n client_id: string\n redirect_uri: string\n}\n\ninterface IRefreshTokenGrantTypeParams {\n grant_type: 'refresh_token'\n refresh_token: string\n client_id: string\n redirect_uri: string\n}\n\nexport class OAuthSession extends AuthSession {\n activeToken = new AuthToken()\n crypto: ICryptoHash\n private static readonly codeVerifierKey = 'looker_oauth_code_verifier'\n public static readonly returnUrlKey = 'looker_oauth_return_url'\n\n constructor(services: IPlatformServices) {\n super(services.settings, services.transport)\n\n this.crypto = services.crypto\n\n const keys: string[] = [\n 'client_id',\n 'redirect_uri',\n 'base_url',\n 'looker_url',\n ]\n const config = { ...this.settings, ...this.settings.readConfig() }\n\n keys.forEach((key) => {\n const value = config[key]\n if (!value) {\n throw sdkError({\n message: `Missing required configuration setting: '${key}'`,\n })\n }\n })\n }\n\n /**\n * merge the dynamically defined configuration values with the initial settings\n */\n readConfig() {\n return { ...this.settings, ...this.settings.readConfig() }\n }\n\n /**\n * Apply current auth token credentials to an HTTP request\n * @param props request properties to update\n * @returns updated request properties with auth information added\n */\n async authenticate(props: IRequestProps): Promise<IRequestProps> {\n const token = await this.getToken()\n if (token.access_token) {\n props.headers.Authorization = `Bearer ${token.access_token}`\n }\n return props\n }\n\n /**\n * Gets session storage for OAuth code verification\n * @returns saved code verifier\n */\n get code_verifier() {\n return sessionStorage.getItem(OAuthSession.codeVerifierKey)\n }\n\n /**\n * Sets session storage for OAuth code verification\n */\n set code_verifier(value: string | null) {\n if (value === null) {\n // only clear code_verifier if it's `null`\n sessionStorage.removeItem(OAuthSession.codeVerifierKey)\n } else {\n sessionStorage.setItem(OAuthSession.codeVerifierKey, value)\n }\n }\n\n /**\n * URL to return to after login process completes\n * @returns the URL that started the OAuth login process\n */\n get returnUrl() {\n return sessionStorage.getItem(OAuthSession.returnUrlKey)\n }\n\n /**\n * Sets the return URL for successful OAuth login\n */\n set returnUrl(value: string | null) {\n if (!value) {\n sessionStorage.removeItem(OAuthSession.returnUrlKey)\n } else {\n sessionStorage.setItem(OAuthSession.returnUrlKey, value)\n }\n }\n\n /**\n * Clears all Looker SDK OAuth-related session storage\n */\n clearStorage() {\n sessionStorage.removeItem(OAuthSession.codeVerifierKey)\n sessionStorage.removeItem(OAuthSession.returnUrlKey)\n }\n\n async login(_sudoId?: string | number): Promise<any> {\n if (!this.isAuthenticated()) {\n if (!this.returnUrl) {\n // OAuth has not been initiated\n const authUrl = await this.createAuthCodeRequestUrl(\n 'cors_api',\n agentPrefix\n )\n const returnTo = window.location.pathname + window.location.search\n this.returnUrl = returnTo\n // Save the current URL so redirected successful OAuth login can restore it\n window.location.href = authUrl\n } else {\n // If return URL is stored, we must be coming back from an OAuth request\n // so release the stored return url at the start of the redemption\n this.returnUrl = null\n if (!this.code_verifier) {\n return Promise.reject(\n new Error('OAuth failed: expected code_verifier to be stored')\n )\n }\n const params = new URLSearchParams(window.location.search)\n const code = params.get('code')\n if (!code) {\n return Promise.reject(\n new Error(\n `OAuth failed: no OAuth code parameter found in ${\n window.location.pathname + window.location.search\n }`\n )\n )\n }\n await this.redeemAuthCode(code)\n }\n return await this.getToken()\n }\n return this.activeToken\n }\n\n private async requestToken(\n body: IAuthCodeGrantTypeParams | IRefreshTokenGrantTypeParams\n ) {\n const config = this.readConfig()\n const url = new URL(config.base_url)\n // replace the entire path of the base_url because this\n // auth endpoint is independent of API version\n url.pathname = '/api/token'\n const token = await this.ok(\n this.transport.request<IAccessToken, IError>(\n 'POST',\n url.toString(),\n undefined,\n body\n )\n )\n\n return this.activeToken.setToken(token)\n }\n\n /*\n Generate an OAuth2 authCode request URL\n */\n async createAuthCodeRequestUrl(\n scope: string,\n state: string\n ): Promise<string> {\n // TODO: remove this comment when we remove hex backwards compatibility\n // in Looker API. For now it must not be 2^n so that Looker correctly\n // treats it as base64 encoded\n this.code_verifier = this.crypto.secureRandom(33)\n const code_challenge = await this.crypto.sha256Hash(this.code_verifier)\n const config = this.readConfig()\n const params: Record<string, string> = {\n client_id: config.client_id,\n code_challenge: code_challenge,\n code_challenge_method: 'S256',\n redirect_uri: config.redirect_uri,\n response_type: 'code',\n scope: scope,\n state: state,\n }\n const url = new URL(config.looker_url)\n url.pathname = '/auth'\n url.search = new URLSearchParams(params).toString()\n return url.toString()\n }\n\n redeemAuthCodeBody(authCode: string, codeVerifier?: string) {\n const verifier = codeVerifier || this.code_verifier || ''\n const config = this.readConfig()\n return {\n client_id: config.client_id,\n code: authCode,\n code_verifier: verifier,\n grant_type: 'authorization_code',\n redirect_uri: config.redirect_uri,\n } as IAuthCodeGrantTypeParams\n }\n\n /**\n * Convert an authCode received from server into an active auth token\n * The app is responsible for obtaining the authCode via interactive user login\n * via /auth front-end endpoint and URL redirect. When the authCode is received\n * by url redirect to an app route, pass the authCode into this function to\n * get an access_token and refresh_token.\n * @param {string} authCode\n * @param {string} codeVerifier\n * @returns {Promise<AuthToken>}\n */\n async redeemAuthCode(authCode: string, codeVerifier?: string) {\n return this.requestToken(this.redeemAuthCodeBody(authCode, codeVerifier))\n }\n\n async getToken() {\n if (!this.isAuthenticated()) {\n if (this.activeToken.refresh_token) {\n const config = this.readConfig()\n await this.requestToken({\n client_id: config.client_id,\n grant_type: 'refresh_token',\n redirect_uri: config.redirect_uri,\n refresh_token: this.activeToken.refresh_token,\n })\n }\n }\n return this.activeToken\n }\n\n isAuthenticated(): boolean {\n return this.activeToken.isActive()\n }\n\n async logout() {\n if (this.activeToken.access_token) {\n await this.ok(\n this.transport.request<IAccessToken, IError>(\n 'DELETE',\n `/api/logout`,\n undefined,\n undefined,\n (init: IRequestProps) => {\n init.headers.Authorization = `Bearer ${this.activeToken.access_token}`\n return init\n }\n )\n )\n\n // logout destroys the access_token AND the refresh_token\n this.activeToken = new AuthToken()\n this.clearStorage()\n return true\n }\n return false\n }\n}\n"],"file":"oauthSession.js"}
|
package/lib/esm/paging.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/paging.ts"],"names":["sdkOk","LinkHeader","TotalCountHeader","linkHeaderParser","linkHeader","re","links","split","obj","arrRes","forEach","link","trim","exec","key","toLocaleLowerCase","url","rel","name","pager","sdk","pageFunc","options","Paging","init","pageAll","onPage","page","paged","items","more","ok","nextPage","err","Promise","reject","constructor","func","transport","authSession","rawCatch","raw","saved","observer","response","Object","keys","length","headers","Error","parse","limit","offset","x","Math","ceil","pages","total","hasRel","paramDefault","value","defaultValue","convert","v","parseInt","reset","getRel","result","authenticator","authenticate","undefined","error","URL","params","searchParams","set","toString","rawRequest","parseResponse","e","findHeader","toLowerCase","toUpperCase","get","totalHeader","firstPage","lastPage","prevPage"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport {\n IRawResponse,\n ITransportSettings,\n sdkOk,\n SDKResponse,\n} from './transport'\nimport { IAPIMethods } from './apiMethods'\nimport { BaseTransport } from './baseTransport'\n\nexport const LinkHeader = 'Link'\nexport const TotalCountHeader = 'X-Total-Count'\n\n/**\n * Types of paging link relative URLs\n * based on https://docs.github.com/en/rest/overview/resources-in-the-rest-api#link-header\n */\nexport type PageLinkRel = 'first' | 'last' | 'next' | 'prev'\n\n/** Constraints for TSuccess type */\ninterface ILength {\n length: number\n}\n\n/** Result paging function call */\nexport type PagingFunc<TSuccess, TError> = () => Promise<\n SDKResponse<TSuccess, TError>\n>\n\n/** Page link structure */\nexport interface IPageLink {\n /** Name of link */\n name?: string\n /** Type of link */\n rel: PageLinkRel\n /** Media type for link */\n mediaType?: string\n /** URL for retrieving the link results */\n url: string\n}\n\n/**\n * Collection of page links\n *\n * TODO can this be Record<PageLinkRel, IPageLink> instead and still init to {}?\n */\nexport type PageLinks = Record<string, IPageLink>\n\nexport interface IPager<TSuccess, TError> {\n /** Total number of available items being paginated */\n total: number\n /** Offset extracted from pager request */\n offset: number\n /** Limit extracted from pager request */\n limit: number\n /** Paging links extracted from Link header */\n links: PageLinks\n /** Latest items returned from response */\n items: TSuccess\n /** Captured from the original paging request */\n options?: Partial<ITransportSettings>\n /** Total number of pages. -1 if not known. */\n pages: number\n /** Current page. -1 if not known. */\n page: number\n\n /**\n * Is the specified link rel defined in the Link header?\n * @param link to check\n */\n hasRel(link: PageLinkRel): boolean\n\n /**\n * GET the requested relative link\n *\n * if the requested link is not defined, all calculated values are reset to their defaults, including\n * `total`, `items`, `offset`, and `limit`\n *\n * @param name of Link Relationship\n * @param limit optional limit override to replace limit saved in `rel`\n * @param offset optional offset override to replace offset saved in `rel`\n */\n getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /** Get the first page of items. This is the same as offset=0 */\n firstPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the last page of items\n *\n * @remarks This link is only provided if `total` is known.\n */\n lastPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the next page of items\n *\n * @remarks This link is provided if `total` is known, or if the number of items returned == `limit`. In the latter case, this function may return an empty result set.\n */\n nextPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the previous page of items\n *\n * @remarks This link is provided if the last page was not the first page.\n */\n prevPage(): Promise<SDKResponse<TSuccess, TError>>\n\n /** `true` if the `next` link is defined */\n more(): boolean\n}\n\n/**\n * Parse a link header to extract rels\n * @param linkHeader to parse\n *\n * Several different approaches are discussed at https://stackoverflow.com/questions/8735792/how-to-parse-link-header-from-github-api\n *\n * Unfortunately, none of them are a good implementation\n *\n */\nexport const linkHeaderParser = (linkHeader: string): PageLinks => {\n const re = /<\\s*(.*)\\s*>;\\s*rel=\"\\s*(.*)\\s*\"\\s*/gm\n const links = linkHeader.split(',')\n const obj: PageLinks = {}\n let arrRes\n\n links.forEach((link) => {\n link = link.trim()\n while ((arrRes = re.exec(link))) {\n const key = arrRes[2].split(' ')[0].trim().toLocaleLowerCase()\n obj[key] = {\n url: arrRes[1].trim(),\n rel: key as PageLinkRel,\n name: arrRes[2].trim(),\n }\n }\n })\n return obj\n}\n\n/** Event to observe the paging call */\nexport type PageObserver<TSuccess> = (\n /** Current retrieved page of results */\n page: TSuccess\n) => TSuccess\n\n/**\n * Create an API response pager for an endpoint that returns a Link header\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pager<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n return await new Paging<TSuccess, TError>(sdk, pageFunc, options).init()\n}\n\n/**\n * Create an API response pager and iterate through all pages, calling a page event per page\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param onPage observer of the latest page of results. Defaults to noop.\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pageAll<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n onPage: PageObserver<TSuccess> = (page: TSuccess) => page,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n const paged = await pager(sdk, pageFunc, options)\n // Process the first page\n onPage(paged.items)\n try {\n while (paged.more()) {\n // Pass the page items to the event\n onPage(await sdk.ok(paged.nextPage()))\n }\n } catch (err) {\n return Promise.reject(err)\n }\n return paged\n}\n\n/**\n * Link header pages class\n */\nexport class Paging<TSuccess extends ILength, TError>\n implements IPager<TSuccess, TError>\n{\n items: TSuccess = [] as unknown as TSuccess\n links: PageLinks = {}\n total = -1\n offset = -1\n limit = -1\n\n private transport: BaseTransport\n\n /**\n * Create an API paginator\n * @param sdk functional AuthSession or full SDK implementation\n * @param func sdk function to call\n * @param options transport overrides to use for subsequent requests\n */\n constructor(\n public sdk: IAPIMethods,\n public func: PagingFunc<TSuccess, TError>,\n public options?: Partial<ITransportSettings>\n ) {\n this.transport = sdk.authSession.transport as BaseTransport\n }\n\n private async rawCatch(func: () => any) {\n let raw: IRawResponse = {} as IRawResponse\n const saved = this.transport.observer\n try {\n // Capture the raw request for header parsing\n this.transport.observer = (response: IRawResponse) => {\n if (saved) {\n // Chain the observer\n response = saved(response)\n }\n raw = response\n return response\n }\n this.items = await sdkOk(func())\n } finally {\n // Restore the previous observer (if any)\n this.transport.observer = saved\n }\n if (Object.keys(raw).length === 0 || Object.keys(raw.headers).length === 0)\n return Promise.reject(new Error('No paging headers were found'))\n this.parse(raw)\n return this\n }\n\n get page(): number {\n if (this.limit < 1 || this.offset < 0) return -1\n const x = this.offset / this.limit + 1\n return Math.ceil(x)\n }\n\n get pages(): number {\n if (this.total < 1 || this.limit < 1) return -1\n const x = this.total / this.limit\n return Math.ceil(x)\n }\n\n async init() {\n return await this.rawCatch(this.func)\n }\n\n hasRel(link: PageLinkRel): boolean {\n return !!this.links[link]\n }\n\n more() {\n return this.hasRel('next')\n }\n\n /**\n * Default string value\n * @param value to retrieve or default\n * @param defaultValue to apply if string is null\n * @param convert function to convert assigned string value\n * @private\n */\n private static paramDefault(\n value: string | null,\n defaultValue: any,\n convert = (v: string) => parseInt(v, 10)\n ) {\n if (value === null) return defaultValue\n return convert(value)\n }\n\n reset() {\n this.links = {}\n this.total = this.offset = this.limit = -1\n this.items = [] as unknown as TSuccess\n }\n\n async getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>> {\n const rel = this.links[name]\n let result: SDKResponse<TSuccess, TError>\n this.reset()\n if (!rel) {\n result = { ok: true, value: this.items }\n return result\n }\n const authenticator = (init: any) => {\n return this.sdk.authSession.authenticate(init)\n }\n\n let link = rel.url\n if (limit !== undefined) {\n if (offset === undefined) {\n offset = 0\n }\n if (limit < 1 || offset < 0) {\n result = {\n ok: false,\n error: new Error(\n 'limit must be > 0 and offset must be >= 0'\n ) as unknown as TError,\n }\n return result\n }\n const url = new URL(link)\n const params = url.searchParams\n params.set('limit', limit.toString())\n params.set('offset', offset.toString())\n link = url.toString()\n }\n const raw = await this.transport.rawRequest(\n 'GET',\n link,\n undefined,\n undefined,\n authenticator,\n this.options\n )\n try {\n this.parse(raw)\n this.items = await sdkOk(this.transport.parseResponse(raw))\n result = { ok: true, value: this.items }\n } catch (e) {\n result = { ok: false, error: e }\n }\n return result\n }\n\n static findHeader(raw: IRawResponse, name: string) {\n return (\n raw.headers[name] ||\n raw.headers[name.toLowerCase()] ||\n raw.headers[name.toUpperCase()]\n )\n }\n\n parse(raw: IRawResponse): IPager<TSuccess, TError> {\n const params = new URL(raw.url, 'http://default').searchParams\n this.limit = Paging.paramDefault(params.get('limit'), -1)\n this.offset = Paging.paramDefault(\n params.get('offset'),\n this.limit > 0 ? 0 : -1\n )\n const linkHeader = Paging.findHeader(raw, LinkHeader)\n if (linkHeader) {\n this.links = linkHeaderParser(linkHeader)\n } else {\n this.links = {}\n }\n const totalHeader = Paging.findHeader(raw, TotalCountHeader)\n if (totalHeader) {\n this.total = parseInt(totalHeader.trim(), 10)\n } else {\n this.total = -1\n }\n return this as unknown as IPager<TSuccess, TError>\n }\n\n async firstPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('first')\n }\n\n async lastPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('last')\n }\n\n async nextPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('next')\n }\n\n async prevPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('prev')\n }\n}\n"],"file":"paging.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/paging.ts"],"names":["sdkOk","LinkHeader","TotalCountHeader","linkHeaderParser","linkHeader","re","links","split","obj","arrRes","forEach","link","trim","exec","key","toLocaleLowerCase","url","rel","name","pager","sdk","pageFunc","options","Paging","init","pageAll","onPage","page","paged","items","more","ok","nextPage","err","Promise","reject","constructor","func","transport","authSession","rawCatch","raw","saved","observer","response","Object","keys","length","headers","Error","parse","limit","offset","x","Math","ceil","pages","total","hasRel","paramDefault","value","defaultValue","convert","v","parseInt","reset","getRel","result","authenticator","authenticate","undefined","error","URL","params","searchParams","set","toString","rawRequest","parseResponse","e","findHeader","toLowerCase","toUpperCase","get","totalHeader","firstPage","lastPage","prevPage"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IRawResponse, ITransportSettings, SDKResponse } from './transport'\nimport { sdkOk } from './transport'\nimport type { IAPIMethods } from './apiMethods'\nimport type { BaseTransport } from './baseTransport'\n\nexport const LinkHeader = 'Link'\nexport const TotalCountHeader = 'X-Total-Count'\n\n/**\n * Types of paging link relative URLs\n * based on https://docs.github.com/en/rest/overview/resources-in-the-rest-api#link-header\n */\nexport type PageLinkRel = 'first' | 'last' | 'next' | 'prev'\n\n/** Constraints for TSuccess type */\ninterface ILength {\n length: number\n}\n\n/** Result paging function call */\nexport type PagingFunc<TSuccess, TError> = () => Promise<\n SDKResponse<TSuccess, TError>\n>\n\n/** Page link structure */\nexport interface IPageLink {\n /** Name of link */\n name?: string\n /** Type of link */\n rel: PageLinkRel\n /** Media type for link */\n mediaType?: string\n /** URL for retrieving the link results */\n url: string\n}\n\n/**\n * Collection of page links\n *\n * TODO can this be Record<PageLinkRel, IPageLink> instead and still init to {}?\n */\nexport type PageLinks = Record<string, IPageLink>\n\nexport interface IPager<TSuccess, TError> {\n /** Total number of available items being paginated */\n total: number\n /** Offset extracted from pager request */\n offset: number\n /** Limit extracted from pager request */\n limit: number\n /** Paging links extracted from Link header */\n links: PageLinks\n /** Latest items returned from response */\n items: TSuccess\n /** Captured from the original paging request */\n options?: Partial<ITransportSettings>\n /** Total number of pages. -1 if not known. */\n pages: number\n /** Current page. -1 if not known. */\n page: number\n\n /**\n * Is the specified link rel defined in the Link header?\n * @param link to check\n */\n hasRel(link: PageLinkRel): boolean\n\n /**\n * GET the requested relative link\n *\n * if the requested link is not defined, all calculated values are reset to their defaults, including\n * `total`, `items`, `offset`, and `limit`\n *\n * @param name of Link Relationship\n * @param limit optional limit override to replace limit saved in `rel`\n * @param offset optional offset override to replace offset saved in `rel`\n */\n getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /** Get the first page of items. This is the same as offset=0 */\n firstPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the last page of items\n *\n * @remarks This link is only provided if `total` is known.\n */\n lastPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the next page of items\n *\n * @remarks This link is provided if `total` is known, or if the number of items returned == `limit`. In the latter case, this function may return an empty result set.\n */\n nextPage(): Promise<SDKResponse<TSuccess, TError>>\n /**\n * Get the previous page of items\n *\n * @remarks This link is provided if the last page was not the first page.\n */\n prevPage(): Promise<SDKResponse<TSuccess, TError>>\n\n /** `true` if the `next` link is defined */\n more(): boolean\n}\n\n/**\n * Parse a link header to extract rels\n * @param linkHeader to parse\n *\n * Several different approaches are discussed at https://stackoverflow.com/questions/8735792/how-to-parse-link-header-from-github-api\n *\n * Unfortunately, none of them are a good implementation\n *\n */\nexport const linkHeaderParser = (linkHeader: string): PageLinks => {\n const re = /<\\s*(.*)\\s*>;\\s*rel=\"\\s*(.*)\\s*\"\\s*/gm\n const links = linkHeader.split(',')\n const obj: PageLinks = {}\n let arrRes\n\n links.forEach((link) => {\n link = link.trim()\n while ((arrRes = re.exec(link))) {\n const key = arrRes[2].split(' ')[0].trim().toLocaleLowerCase()\n obj[key] = {\n url: arrRes[1].trim(),\n rel: key as PageLinkRel,\n name: arrRes[2].trim(),\n }\n }\n })\n return obj\n}\n\n/** Event to observe the paging call */\nexport type PageObserver<TSuccess> = (\n /** Current retrieved page of results */\n page: TSuccess\n) => TSuccess\n\n/**\n * Create an API response pager for an endpoint that returns a Link header\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pager<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n return await new Paging<TSuccess, TError>(sdk, pageFunc, options).init()\n}\n\n/**\n * Create an API response pager and iterate through all pages, calling a page event per page\n * @param sdk implementation of IAPIMethods. Can be a full SDK or functional auth session. The active transport object is captured from this parameter, which is why it must be passed separately from the paging function.\n * @param pageFunc sdk call that includes a paging header\n * @param onPage observer of the latest page of results. Defaults to noop.\n * @param options transport options override to capture and use in paging requests\n *\n * @remarks `TSuccess` must be a collection type that supports `length`\n */\nexport async function pageAll<TSuccess extends ILength, TError>(\n sdk: IAPIMethods,\n pageFunc: PagingFunc<TSuccess, TError>,\n onPage: PageObserver<TSuccess> = (page: TSuccess) => page,\n options?: Partial<ITransportSettings>\n): Promise<IPager<TSuccess, TError>> {\n const paged = await pager(sdk, pageFunc, options)\n // Process the first page\n onPage(paged.items)\n try {\n while (paged.more()) {\n // Pass the page items to the event\n onPage(await sdk.ok(paged.nextPage()))\n }\n } catch (err) {\n return Promise.reject(err)\n }\n return paged\n}\n\n/**\n * Link header pages class\n */\nexport class Paging<TSuccess extends ILength, TError>\n implements IPager<TSuccess, TError>\n{\n items: TSuccess = [] as unknown as TSuccess\n links: PageLinks = {}\n total = -1\n offset = -1\n limit = -1\n\n private transport: BaseTransport\n\n /**\n * Create an API paginator\n * @param sdk functional AuthSession or full SDK implementation\n * @param func sdk function to call\n * @param options transport overrides to use for subsequent requests\n */\n constructor(\n public sdk: IAPIMethods,\n public func: PagingFunc<TSuccess, TError>,\n public options?: Partial<ITransportSettings>\n ) {\n this.transport = sdk.authSession.transport as BaseTransport\n }\n\n private async rawCatch(func: () => any) {\n let raw: IRawResponse = {} as IRawResponse\n const saved = this.transport.observer\n try {\n // Capture the raw request for header parsing\n this.transport.observer = (response: IRawResponse) => {\n if (saved) {\n // Chain the observer\n response = saved(response)\n }\n raw = response\n return response\n }\n this.items = await sdkOk(func())\n } finally {\n // Restore the previous observer (if any)\n this.transport.observer = saved\n }\n if (Object.keys(raw).length === 0 || Object.keys(raw.headers).length === 0)\n return Promise.reject(new Error('No paging headers were found'))\n this.parse(raw)\n return this\n }\n\n get page(): number {\n if (this.limit < 1 || this.offset < 0) return -1\n const x = this.offset / this.limit + 1\n return Math.ceil(x)\n }\n\n get pages(): number {\n if (this.total < 1 || this.limit < 1) return -1\n const x = this.total / this.limit\n return Math.ceil(x)\n }\n\n async init() {\n return await this.rawCatch(this.func)\n }\n\n hasRel(link: PageLinkRel): boolean {\n return !!this.links[link]\n }\n\n more() {\n return this.hasRel('next')\n }\n\n /**\n * Default string value\n * @param value to retrieve or default\n * @param defaultValue to apply if string is null\n * @param convert function to convert assigned string value\n * @private\n */\n private static paramDefault(\n value: string | null,\n defaultValue: any,\n convert = (v: string) => parseInt(v, 10)\n ) {\n if (value === null) return defaultValue\n return convert(value)\n }\n\n reset() {\n this.links = {}\n this.total = this.offset = this.limit = -1\n this.items = [] as unknown as TSuccess\n }\n\n async getRel(\n name: PageLinkRel,\n limit?: number,\n offset?: number\n ): Promise<SDKResponse<TSuccess, TError>> {\n const rel = this.links[name]\n let result: SDKResponse<TSuccess, TError>\n this.reset()\n if (!rel) {\n result = { ok: true, value: this.items }\n return result\n }\n const authenticator = (init: any) => {\n return this.sdk.authSession.authenticate(init)\n }\n\n let link = rel.url\n if (limit !== undefined) {\n if (offset === undefined) {\n offset = 0\n }\n if (limit < 1 || offset < 0) {\n result = {\n ok: false,\n error: new Error(\n 'limit must be > 0 and offset must be >= 0'\n ) as unknown as TError,\n }\n return result\n }\n const url = new URL(link)\n const params = url.searchParams\n params.set('limit', limit.toString())\n params.set('offset', offset.toString())\n link = url.toString()\n }\n const raw = await this.transport.rawRequest(\n 'GET',\n link,\n undefined,\n undefined,\n authenticator,\n this.options\n )\n try {\n this.parse(raw)\n this.items = await sdkOk(this.transport.parseResponse(raw))\n result = { ok: true, value: this.items }\n } catch (e: any) {\n result = { ok: false, error: e }\n }\n return result\n }\n\n static findHeader(raw: IRawResponse, name: string) {\n return (\n raw.headers[name] ||\n raw.headers[name.toLowerCase()] ||\n raw.headers[name.toUpperCase()]\n )\n }\n\n parse(raw: IRawResponse): IPager<TSuccess, TError> {\n const params = new URL(raw.url, 'http://default').searchParams\n this.limit = Paging.paramDefault(params.get('limit'), -1)\n this.offset = Paging.paramDefault(\n params.get('offset'),\n this.limit > 0 ? 0 : -1\n )\n const linkHeader = Paging.findHeader(raw, LinkHeader)\n if (linkHeader) {\n this.links = linkHeaderParser(linkHeader)\n } else {\n this.links = {}\n }\n const totalHeader = Paging.findHeader(raw, TotalCountHeader)\n if (totalHeader) {\n this.total = parseInt(totalHeader.trim(), 10)\n } else {\n this.total = -1\n }\n return this as unknown as IPager<TSuccess, TError>\n }\n\n async firstPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('first')\n }\n\n async lastPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('last')\n }\n\n async nextPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('next')\n }\n\n async prevPage(): Promise<SDKResponse<TSuccess, TError>> {\n return await this.getRel('prev')\n }\n}\n"],"file":"paging.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/proxySession.ts"],"names":["AuthSession","BrowserTransport","LookerAppId","agentPrefix","ProxySession","constructor","settings","proxyUrl","transport","isAuthenticated","authenticate","props","headers","url"],"mappings":";;;;AA0BA,SAASA,WAAT,QAA4B,eAA5B;AACA,SAASC,gBAAT,QAAiC,oBAAjC;
|
|
1
|
+
{"version":3,"sources":["../../src/proxySession.ts"],"names":["AuthSession","BrowserTransport","LookerAppId","agentPrefix","ProxySession","constructor","settings","proxyUrl","transport","isAuthenticated","authenticate","props","headers","url"],"mappings":";;;;AA0BA,SAASA,WAAT,QAA4B,eAA5B;AACA,SAASC,gBAAT,QAAiC,oBAAjC;AAEA,SAASC,WAAT,EAAsBC,WAAtB,QAAyC,aAAzC;AAWA,OAAO,MAAeC,YAAf,SAAoCJ,WAApC,CAAgD;AACrDK,EAAAA,WAAW,CACFC,QADE,EAEFC,QAFE,EAGTC,SAHS,EAIT;AACA,UAAMF,QAAN,EAAgBE,SAAS,IAAI,IAAIP,gBAAJ,CAAqBK,QAArB,CAA7B;AADA,SAHOA,QAGP,GAHOA,QAGP;AAAA,SAFOC,QAEP,GAFOA,QAEP;AAED;;AAODE,EAAAA,eAAe,GAAG;AAChB,WAAO,IAAP;AACD;;AAWKC,EAAAA,YAAY,CAACC,KAAD,EAAuB;AAAA;;AAAA;AACvC,UAAI,CAACA,KAAK,CAACC,OAAX,EAAoB;AAClBD,QAAAA,KAAK,CAACC,OAAN,GAAgB,EAAhB;AACD;;AACDD,MAAAA,KAAK,CAACC,OAAN,CAAc,iBAAd,IAAmCD,KAAK,CAACE,GAAzC;AACAF,MAAAA,KAAK,CAACC,OAAN,CAAcV,WAAd,IAA6BC,WAA7B;AACAQ,MAAAA,KAAK,CAACE,GAAN,GAAY,KAAI,CAACN,QAAjB;AACA,aAAOI,KAAP;AAPuC;AAQxC;;AAnCoD","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport { AuthSession } from './authSession'\nimport { BrowserTransport } from './browserTransport'\nimport type { ITransport, IRequestProps } from './transport'\nimport { LookerAppId, agentPrefix } from './transport'\nimport type { IApiSettings } from './apiSettings'\n\n/**\n * An AuthSession class intended for use with proxied requests\n *\n * This session uses `authenticate` to modify all requests to pass through a proxy server with\n * passing the request to the proxy server specified in the `proxyUrl` parameter, and sets\n * the original request path as an `X-Forwarded-For` header.\n *\n */\nexport abstract class ProxySession extends AuthSession {\n constructor(\n public settings: IApiSettings,\n public proxyUrl: string,\n transport?: ITransport\n ) {\n super(settings, transport || new BrowserTransport(settings))\n }\n\n /**\n * Proxy session is considered to be always authenticated since the proxy handles all auth\n *\n * @returns `true` since the proxy handles all authentication\n */\n isAuthenticated() {\n return true\n }\n\n /**\n * This implementation swaps the request's path with the proxy url, and puts the original\n * request path in the `X-Forwarded-For` header, presuming that the proxy server will add API authentication\n * information to the request that gets submitted to the Looker API, then forward the API response to the requestor\n *\n * @param props the properties of the request\n * @returns the same request properties with \"authentication\" data added\n *\n */\n async authenticate(props: IRequestProps) {\n if (!props.headers) {\n props.headers = {}\n }\n props.headers['X-Forwarded-For'] = props.url\n props.headers[LookerAppId] = agentPrefix\n props.url = this.proxyUrl\n return props\n }\n}\n"],"file":"proxySession.js"}
|
package/lib/esm/transport.js
CHANGED
|
@@ -143,9 +143,30 @@ export function addQueryParams(path, obj) {
|
|
|
143
143
|
var qp = encodeParams(obj);
|
|
144
144
|
return "".concat(path).concat(qp ? '?' + qp : '');
|
|
145
145
|
}
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
var utf8 = 'utf-8';
|
|
147
|
+
|
|
148
|
+
function bufferString(val) {
|
|
149
|
+
var result = 'Unknown error';
|
|
148
150
|
|
|
151
|
+
try {
|
|
152
|
+
var decoder = new TextDecoder(utf8);
|
|
153
|
+
result = decoder.decode(val);
|
|
154
|
+
} catch (e) {
|
|
155
|
+
try {
|
|
156
|
+
if (val instanceof Buffer) {
|
|
157
|
+
result = Buffer.from(val).toString(utf8);
|
|
158
|
+
} else {
|
|
159
|
+
result = JSON.stringify(val);
|
|
160
|
+
}
|
|
161
|
+
} catch (err) {
|
|
162
|
+
result = JSON.stringify(val);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function sdkError(response) {
|
|
149
170
|
if (typeof response === 'string') {
|
|
150
171
|
return new Error(response);
|
|
151
172
|
}
|
|
@@ -157,17 +178,8 @@ export function sdkError(response) {
|
|
|
157
178
|
return new Error(_error);
|
|
158
179
|
}
|
|
159
180
|
|
|
160
|
-
if ('
|
|
161
|
-
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if ('error' in _error && _error.error instanceof Buffer) {
|
|
165
|
-
var result = Buffer.from(_error.error).toString(utf8);
|
|
166
|
-
return new Error(result);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
if (_error instanceof Buffer) {
|
|
170
|
-
var _result = Buffer.from(_error).toString(utf8);
|
|
181
|
+
if ('error' in _error) {
|
|
182
|
+
var _result = bufferString(_error.error);
|
|
171
183
|
|
|
172
184
|
return new Error(_result);
|
|
173
185
|
}
|
|
@@ -175,6 +187,13 @@ export function sdkError(response) {
|
|
|
175
187
|
if ('message' in _error) {
|
|
176
188
|
return new Error(response.error.message.toString());
|
|
177
189
|
}
|
|
190
|
+
|
|
191
|
+
if ('statusMessage' in _error) {
|
|
192
|
+
return new Error(_error.statusMessage);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
var result = bufferString(_error);
|
|
196
|
+
return new Error(result);
|
|
178
197
|
}
|
|
179
198
|
|
|
180
199
|
if ('message' in response) {
|
|
@@ -205,4 +224,11 @@ export function safeBase64(u8) {
|
|
|
205
224
|
var rawBase64 = btoa(String.fromCharCode(...u8));
|
|
206
225
|
return rawBase64.replace(/\+/g, '-').replace(/\//g, '_');
|
|
207
226
|
}
|
|
227
|
+
export function isErrorLike(error) {
|
|
228
|
+
if (typeof error !== 'object') return false;
|
|
229
|
+
if (!error) return false;
|
|
230
|
+
if (!Object.prototype.hasOwnProperty.call(error, 'message')) return false;
|
|
231
|
+
if (typeof error.message !== 'string') return false;
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
208
234
|
//# sourceMappingURL=transport.js.map
|
package/lib/esm/transport.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/transport.ts"],"names":["matchCharsetUtf8","matchModeBinary","matchModeString","agentPrefix","LookerAppId","tracing","trace","message","info","console","debug","ResponseMode","contentPatternString","RegExp","contentPatternBinary","charsetUtf8Pattern","defaultTimeout","StatusCode","responseMode","contentType","match","string","binary","unknown","isUtf8","encodeParam","value","Date","toISOString","encoded","toString","decoded","decodeURIComponent","encodeURIComponent","e","URIError","encodeParams","values","keys","Object","filter","k","undefined","map","join","addQueryParams","path","obj","qp","sdkError","response","utf8","Error","error","statusMessage","Buffer","result","from","JSON","stringify","sdkOk","promise","ok","safeBase64","u8","rawBase64","btoa","String","fromCharCode","replace"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport { Agent } from 'https'\nimport { Headers } from 'request'\nimport { Readable } from 'readable-stream'\nimport { matchCharsetUtf8, matchModeBinary, matchModeString } from './constants'\n\nexport const agentPrefix = 'TS-SDK'\nexport const LookerAppId = 'x-looker-appid'\n\n/** Set to `true` to follow streaming process */\nconst tracing = false\n\n/**\n * trivial tracing function that should be replaced with a log plugin\n * @param message description for trace\n * @param info any additional information to produce for output\n */\nexport function trace(message: string, info?: any) {\n if (tracing) {\n // eslint-disable-next-line no-console\n console.debug(message)\n if (info) {\n // eslint-disable-next-line no-console\n console.debug({ info })\n }\n }\n}\n\n/** ResponseMode for an HTTP request */\nexport enum ResponseMode {\n 'binary', // this is a binary response\n 'string', // this is a \"string\" response\n 'unknown', // unrecognized response type\n}\n\n/**\n * MIME patterns for string content types\n * @type {RegExp}\n */\nexport const contentPatternString = new RegExp(matchModeString, 'i')\n\n/**\n * MIME patterns for \"binary\" content types\n * @type {RegExp}\n */\nexport const contentPatternBinary = new RegExp(matchModeBinary, 'i')\n\n/**\n * MIME pattern for UTF8 charset attribute\n * @type {RegExp}\n */\nexport const charsetUtf8Pattern = new RegExp(matchCharsetUtf8, 'i')\n\n/**\n * Default request timeout\n * @type {number} default request timeout is 120 seconds, or two minutes\n */\nexport const defaultTimeout = 120\n\n/** Recognized HTTP methods */\nexport type HttpMethod =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'PATCH'\n | 'TRACE'\n | 'HEAD'\n\n/**\n * HTTP status codes\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status for reference\n * TODO is there a platform-agnostic list of these that can be used instead of this static declaration?\n */\nexport enum StatusCode {\n OK = 200,\n Created,\n Accepted,\n NonAuthoritative,\n NoContent,\n ResetContent,\n PartialContent,\n MultiStatus,\n MultiStatusDav,\n IMUsed = 226,\n MultipleChoice = 300,\n MovedPermanently,\n Found,\n SeeOther,\n NotModified,\n UseProxy,\n UnusedRedirect,\n TemporaryRedirect,\n PermanentRedirect,\n BadRequest = 400,\n Unauthorized,\n PaymentRequired,\n Forbidden,\n NotFound,\n MethodNotAllowed,\n NotAcceptable,\n ProxyAuthRequired,\n RequestTimeout,\n Conflict,\n Gone,\n LengthRequired,\n PreconditionFailed,\n PayloadTooLarge,\n UriTooLong,\n UnsupportedMediaType,\n RequestedRangeNotSatisfiable,\n ExpectationFailed,\n ImATeapot,\n MisdirectedRequest = 421,\n UnprocessableEntity,\n Locked,\n FailedDependency,\n TooEarly,\n UpgradeRequired,\n PreconditionRequired,\n TooManyRequests,\n RequestHeaderFieldsTooLarge,\n UnavailableForLegalReasons,\n InternalServerError = 500,\n NotImplemented,\n BadGateway,\n ServiceUnavailable,\n GatewayTimeout,\n HttpVersionNotSupported,\n VariantAlsoNegotiates,\n InsufficientStorage,\n LoopDetected,\n NotExtended = 510,\n NetworkAuthRequired,\n}\n\n/** Untyped basic HTTP response type for \"raw\" HTTP requests */\nexport interface IRawResponse {\n /** ok is `true` if the response is successful, `false` otherwise */\n ok: boolean\n /** HTTP request url */\n url: string\n /** HTTP response code */\n statusCode: number\n /** HTTP response status message text */\n statusMessage: string\n /** MIME type of the response from the HTTP response header */\n contentType: string\n /** The body of the HTTP response, without any additional processing */\n body: any\n /** Optional performance tracking starting mark name */\n startMark?: string\n /** Response headers */\n headers: IRequestHeaders\n}\n\n/** IRawResponse observer function type */\nexport type RawObserver = (raw: IRawResponse) => IRawResponse\n\n/** Transport plug-in interface */\nexport interface ITransport {\n /** Observer lambda to process raw responses */\n observer: RawObserver | undefined\n\n /**\n * HTTP request function for atomic, fully downloaded raw HTTP responses\n *\n * Note: This method returns the result of the HTTP request without any error handling\n *\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse>\n\n /**\n * HTTP request function for atomic, fully downloaded responses\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n request<TSuccess, TError>(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * Processes the raw response, converting it into an SDKResponse\n * @param raw response result\n */\n parseResponse<TSuccess, TError>(\n raw: IRawResponse\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * HTTP request function for a streamable response\n * @param callback that receives the stream response and pipes it somewhere\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns `T` upon success\n * @throws `ISDKErrorResponse` on failure\n */\n stream<T>(\n callback: (readable: Readable) => Promise<T>,\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<T>\n}\n\n/** A successful SDK call. */\nexport interface ISDKSuccessResponse<T> {\n /** Whether the SDK call was successful. */\n ok: true\n /** The object returned by the SDK call. */\n value: T\n}\n\n/** An errant SDK call. */\nexport interface ISDKErrorResponse<T> {\n /** Whether the SDK call was successful. */\n ok: false\n /** The error object returned by the SDK call. */\n error: T\n}\n\n/** An error representing an issue in the SDK, like a network or parsing error. */\nexport interface ISDKError {\n type: 'sdk_error'\n message: string\n}\n\nexport type SDKResponse<TSuccess, TError> =\n | ISDKSuccessResponse<TSuccess>\n | ISDKErrorResponse<TError | ISDKError>\n\n/** Generic collection */\nexport interface IRequestHeaders {\n [key: string]: string\n}\n\n/**\n * Generic http request property collection\n * TODO: Trim this down to what is required\n */\nexport interface IRequestProps {\n [key: string]: any\n /** full url for request, including any query params */\n url: string\n\n /** body of request. optional */\n body?: any\n /** headers for request. optional */\n headers: IRequestHeaders\n /** Http method for request. required. */\n method: HttpMethod\n /** Redirect processing for request. optional */\n redirect?: any\n /** Credentials to use */\n credentials?: 'include' | 'omit' | 'same-origin' | undefined\n\n /** http.Agent instance, allows custom proxy, certificate etc. */\n agent?: Agent\n /** support gzip/deflate content encoding. false to disable */\n compress?: boolean\n /** maximum redirect count. 0 to not follow redirect */\n follow?: number\n /** maximum response body size in bytes */\n size?: number\n /** req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies) */\n timeout?: number\n}\n\n/** General purpose authentication callback */\nexport type Authenticator = (props: any) => any\n\n/** Interface for API transport values */\nexport interface ITransportSettings {\n [key: string]: any\n /** base URL of API REST web service */\n base_url: string\n /** standard headers to provide in all transport requests */\n headers?: Headers\n /** whether to verify ssl certs or not. Defaults to true */\n verify_ssl: boolean\n /** request timeout in seconds. Default to 30 */\n timeout: number\n /** encoding override */\n encoding?: string | null\n /** agent tag to use for the SDK requests */\n agentTag: string\n}\n\n/**\n * Is the content type binary or \"string\"?\n * @param {string} contentType\n * @returns {ResponseMode.binary | ResponseMode.string}\n */\nexport function responseMode(contentType: string) {\n if (contentType.match(contentPatternString)) {\n return ResponseMode.string\n }\n if (contentType.match(contentPatternBinary)) {\n return ResponseMode.binary\n }\n return ResponseMode.unknown\n}\n\n/**\n * Does this content type have a UTF-8 charset?\n * @param contentType\n * @returns match if it exists\n */\nexport function isUtf8(contentType: string) {\n return contentType.match(/;.*\\bcharset\\b=\\butf-8\\b/i)\n}\n\n/** Used for name/value pair collections like for QueryParams */\nexport type Values = { [key: string]: any } | null | undefined\n\n/**\n * Encode parameter if not already encoded\n * @param value value of parameter\n * @returns URI encoded value\n */\nexport function encodeParam(value: any) {\n if (value instanceof Date) {\n value = value.toISOString()\n }\n let encoded = value.toString()\n\n // decodeURIComponent throws URIError if there is a % character\n // without it being part of an encoded\n try {\n const decoded = decodeURIComponent(value)\n if (value === decoded) {\n encoded = encodeURIComponent(value)\n }\n } catch (e) {\n if (e instanceof URIError) {\n encoded = encodeURIComponent(value)\n } else {\n throw e\n }\n }\n return encoded\n}\n\n/**\n * Converts `Values` to query string parameter format\n * @param values Name/value collection to encode\n * @returns {string} query string parameter formatted values. Both `false` and `null` are included. Only `undefined` are omitted.\n */\nexport function encodeParams(values?: Values) {\n if (!values) return ''\n\n const keys = Object.keys(values)\n return keys\n .filter((k) => values[k] !== undefined) // `null` and `false` will both be passed\n .map((k) => k + '=' + encodeParam(values[k]))\n .join('&')\n}\n\n/**\n * constructs the path argument including any optional query parameters\n * @param path the base path of the request\n * @param obj optional collection of query parameters to encode and append to the path\n */\nexport function addQueryParams(path: string, obj?: Values) {\n if (!obj) {\n return path\n }\n const qp = encodeParams(obj)\n return `${path}${qp ? '?' + qp : ''}`\n}\n\n/**\n * SDK error handler\n * @param response any kind of error\n * @returns a new `Error` object with the failure message\n */\nexport function sdkError(response: any) {\n const utf8 = 'utf-8'\n if (typeof response === 'string') {\n return new Error(response)\n }\n if ('error' in response) {\n const error = response.error\n if (typeof error === 'string') {\n return new Error(error)\n }\n // Try to get most specific error first\n if ('statusMessage' in error) {\n return new Error(error.statusMessage)\n }\n if ('error' in error && error.error instanceof Buffer) {\n const result = Buffer.from(error.error).toString(utf8)\n return new Error(result)\n }\n if (error instanceof Buffer) {\n const result = Buffer.from(error).toString(utf8)\n return new Error(result)\n }\n if ('message' in error) {\n return new Error(response.error.message.toString())\n }\n }\n if ('message' in response) {\n return new Error(response.message)\n }\n const error = JSON.stringify(response)\n return new Error(`Unknown error with SDK method ${error}`)\n}\n\n/** A helper method for simplifying error handling of SDK responses.\n *\n * Pass in a promise returned by any SDK method, and it will return a promise\n * that rejects if the `SDKResponse` is not `ok`. This will swallow the type\n * information in the error case, but allows you to route all the error cases\n * into a single promise rejection.\n *\n * The promise will have an `Error` rejection reason with a string `message`.\n * If the server error contains a `message` field, it will be provided, otherwise a\n * generic message will occur.\n *\n * ```ts\n * const sdk = LookerSDK({...})\n * let look\n * try {\n * look = await sdkOk(sdk.create_look({...}))\n * // do something with look\n * }\n * catch(e) {\n * // handle error case\n * }\n * ```\n */\nexport async function sdkOk<TSuccess, TError>(\n promise: Promise<SDKResponse<TSuccess, TError>>\n) {\n const result = await promise\n if (result.ok) {\n return result.value\n } else {\n throw sdkError(result)\n }\n}\n\n/**\n * Converts a byte array to a \"URL safe\" base64 string\n * @param u8 byte array to convert\n */\nexport function safeBase64(u8: Uint8Array) {\n const rawBase64 = btoa(String.fromCharCode(...u8))\n return rawBase64.replace(/\\+/g, '-').replace(/\\//g, '_')\n}\n"],"file":"transport.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/transport.ts"],"names":["matchCharsetUtf8","matchModeBinary","matchModeString","agentPrefix","LookerAppId","tracing","trace","message","info","console","debug","ResponseMode","contentPatternString","RegExp","contentPatternBinary","charsetUtf8Pattern","defaultTimeout","StatusCode","responseMode","contentType","match","string","binary","unknown","isUtf8","encodeParam","value","Date","toISOString","encoded","toString","decoded","decodeURIComponent","encodeURIComponent","e","URIError","encodeParams","values","keys","Object","filter","k","undefined","map","join","addQueryParams","path","obj","qp","utf8","bufferString","val","result","decoder","TextDecoder","decode","Buffer","from","JSON","stringify","err","sdkError","response","Error","error","statusMessage","sdkOk","promise","ok","safeBase64","u8","rawBase64","btoa","String","fromCharCode","replace","isErrorLike","prototype","hasOwnProperty","call"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { Agent } from 'https'\nimport type { Headers } from 'request'\nimport type { Readable } from 'readable-stream'\nimport { matchCharsetUtf8, matchModeBinary, matchModeString } from './constants'\n\nexport const agentPrefix = 'TS-SDK'\nexport const LookerAppId = 'x-looker-appid'\n\n/** Set to `true` to follow streaming process */\nconst tracing = false\n\n/**\n * trivial tracing function that should be replaced with a log plugin\n * @param message description for trace\n * @param info any additional information to produce for output\n */\nexport function trace(message: string, info?: any) {\n if (tracing) {\n // eslint-disable-next-line no-console\n console.debug(message)\n if (info) {\n // eslint-disable-next-line no-console\n console.debug({ info })\n }\n }\n}\n\n/** ResponseMode for an HTTP request */\nexport enum ResponseMode {\n 'binary', // this is a binary response\n 'string', // this is a \"string\" response\n 'unknown', // unrecognized response type\n}\n\n/**\n * MIME patterns for string content types\n * @type {RegExp}\n */\nexport const contentPatternString = new RegExp(matchModeString, 'i')\n\n/**\n * MIME patterns for \"binary\" content types\n * @type {RegExp}\n */\nexport const contentPatternBinary = new RegExp(matchModeBinary, 'i')\n\n/**\n * MIME pattern for UTF8 charset attribute\n * @type {RegExp}\n */\nexport const charsetUtf8Pattern = new RegExp(matchCharsetUtf8, 'i')\n\n/**\n * Default request timeout\n * @type {number} default request timeout is 120 seconds, or two minutes\n */\nexport const defaultTimeout = 120\n\n/** Recognized HTTP methods */\nexport type HttpMethod =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'PATCH'\n | 'TRACE'\n | 'HEAD'\n\n/**\n * HTTP status codes\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status for reference\n * TODO is there a platform-agnostic list of these that can be used instead of this static declaration?\n */\nexport enum StatusCode {\n OK = 200,\n Created,\n Accepted,\n NonAuthoritative,\n NoContent,\n ResetContent,\n PartialContent,\n MultiStatus,\n MultiStatusDav,\n IMUsed = 226,\n MultipleChoice = 300,\n MovedPermanently,\n Found,\n SeeOther,\n NotModified,\n UseProxy,\n UnusedRedirect,\n TemporaryRedirect,\n PermanentRedirect,\n BadRequest = 400,\n Unauthorized,\n PaymentRequired,\n Forbidden,\n NotFound,\n MethodNotAllowed,\n NotAcceptable,\n ProxyAuthRequired,\n RequestTimeout,\n Conflict,\n Gone,\n LengthRequired,\n PreconditionFailed,\n PayloadTooLarge,\n UriTooLong,\n UnsupportedMediaType,\n RequestedRangeNotSatisfiable,\n ExpectationFailed,\n ImATeapot,\n MisdirectedRequest = 421,\n UnprocessableEntity,\n Locked,\n FailedDependency,\n TooEarly,\n UpgradeRequired,\n PreconditionRequired,\n TooManyRequests,\n RequestHeaderFieldsTooLarge,\n UnavailableForLegalReasons,\n InternalServerError = 500,\n NotImplemented,\n BadGateway,\n ServiceUnavailable,\n GatewayTimeout,\n HttpVersionNotSupported,\n VariantAlsoNegotiates,\n InsufficientStorage,\n LoopDetected,\n NotExtended = 510,\n NetworkAuthRequired,\n}\n\n/** Untyped basic HTTP response type for \"raw\" HTTP requests */\nexport interface IRawResponse {\n /** ok is `true` if the response is successful, `false` otherwise */\n ok: boolean\n /** HTTP request url */\n url: string\n /** HTTP response code */\n statusCode: number\n /** HTTP response status message text */\n statusMessage: string\n /** MIME type of the response from the HTTP response header */\n contentType: string\n /** The body of the HTTP response, without any additional processing */\n body: any\n /** Optional performance tracking starting mark name */\n startMark?: string\n /** Response headers */\n headers: IRequestHeaders\n}\n\n/** IRawResponse observer function type */\nexport type RawObserver = (raw: IRawResponse) => IRawResponse\n\n/** Transport plug-in interface */\nexport interface ITransport {\n /** Observer lambda to process raw responses */\n observer: RawObserver | undefined\n\n /**\n * HTTP request function for atomic, fully downloaded raw HTTP responses\n *\n * Note: This method returns the result of the HTTP request without any error handling\n *\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n rawRequest(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<IRawResponse>\n\n /**\n * HTTP request function for atomic, fully downloaded responses\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns typed response of `TSuccess`, or `TError` result\n */\n request<TSuccess, TError>(\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * Processes the raw response, converting it into an SDKResponse\n * @param raw response result\n */\n parseResponse<TSuccess, TError>(\n raw: IRawResponse\n ): Promise<SDKResponse<TSuccess, TError>>\n\n /**\n * HTTP request function for a streamable response\n * @param callback that receives the stream response and pipes it somewhere\n * @param method of HTTP request\n * @param path request path, either relative or fully specified\n * @param queryParams name/value pairs to pass as part of the URL\n * @param body data for the body of the request\n * @param authenticator authenticator callback, typically from `IAuthSession` implementation\n * @param options overrides of default transport settings\n * @returns `T` upon success\n * @throws `ISDKErrorResponse` on failure\n */\n stream<T>(\n callback: (readable: Readable) => Promise<T>,\n method: HttpMethod,\n path: string,\n queryParams?: Values,\n body?: any,\n authenticator?: Authenticator,\n options?: Partial<ITransportSettings>\n ): Promise<T>\n}\n\n/** A successful SDK call. */\nexport interface ISDKSuccessResponse<T> {\n /** Whether the SDK call was successful. */\n ok: true\n /** The object returned by the SDK call. */\n value: T\n}\n\n/** An errant SDK call. */\nexport interface ISDKErrorResponse<T> {\n /** Whether the SDK call was successful. */\n ok: false\n /** The error object returned by the SDK call. */\n error: T\n}\n\n/** An error representing an issue in the SDK, like a network or parsing error. */\nexport interface ISDKError {\n type: 'sdk_error'\n message: string\n}\n\nexport type SDKResponse<TSuccess, TError> =\n | ISDKSuccessResponse<TSuccess>\n | ISDKErrorResponse<TError | ISDKError>\n\n/** Generic collection */\nexport interface IRequestHeaders {\n [key: string]: string\n}\n\n/**\n * Generic http request property collection\n * TODO: Trim this down to what is required\n */\nexport interface IRequestProps {\n [key: string]: any\n /** full url for request, including any query params */\n url: string\n\n /** body of request. optional */\n body?: any\n /** headers for request. optional */\n headers: IRequestHeaders\n /** Http method for request. required. */\n method: HttpMethod\n /** Redirect processing for request. optional */\n redirect?: any\n /** Credentials to use */\n credentials?: 'include' | 'omit' | 'same-origin' | undefined\n\n /** http.Agent instance, allows custom proxy, certificate etc. */\n agent?: Agent\n /** support gzip/deflate content encoding. false to disable */\n compress?: boolean\n /** maximum redirect count. 0 to not follow redirect */\n follow?: number\n /** maximum response body size in bytes */\n size?: number\n /** req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies) */\n timeout?: number\n}\n\n/** General purpose authentication callback */\nexport type Authenticator = (props: any) => any\n\n/** Interface for API transport values */\nexport interface ITransportSettings {\n [key: string]: any\n /** base URL of API REST web service */\n base_url: string\n /** standard headers to provide in all transport requests */\n headers?: Headers\n /** whether to verify ssl certs or not. Defaults to true */\n verify_ssl: boolean\n /** request timeout in seconds. Default to 30 */\n timeout: number\n /** encoding override */\n encoding?: string | null\n /** agent tag to use for the SDK requests */\n agentTag: string\n}\n\n/**\n * Is the content type binary or \"string\"?\n * @param {string} contentType\n * @returns {ResponseMode.binary | ResponseMode.string}\n */\nexport function responseMode(contentType: string) {\n if (contentType.match(contentPatternString)) {\n return ResponseMode.string\n }\n if (contentType.match(contentPatternBinary)) {\n return ResponseMode.binary\n }\n return ResponseMode.unknown\n}\n\n/**\n * Does this content type have a UTF-8 charset?\n * @param contentType\n * @returns match if it exists\n */\nexport function isUtf8(contentType: string) {\n return contentType.match(/;.*\\bcharset\\b=\\butf-8\\b/i)\n}\n\n/** Used for name/value pair collections like for QueryParams */\nexport type Values = { [key: string]: any } | null | undefined\n\n/**\n * Encode parameter if not already encoded\n * @param value value of parameter\n * @returns URI encoded value\n */\nexport function encodeParam(value: any) {\n if (value instanceof Date) {\n value = value.toISOString()\n }\n let encoded = value.toString()\n\n // decodeURIComponent throws URIError if there is a % character\n // without it being part of an encoded\n try {\n const decoded = decodeURIComponent(value)\n if (value === decoded) {\n encoded = encodeURIComponent(value)\n }\n } catch (e) {\n if (e instanceof URIError) {\n encoded = encodeURIComponent(value)\n } else {\n throw e\n }\n }\n return encoded\n}\n\n/**\n * Converts `Values` to query string parameter format\n * @param values Name/value collection to encode\n * @returns {string} query string parameter formatted values. Both `false` and `null` are included. Only `undefined` are omitted.\n */\nexport function encodeParams(values?: Values) {\n if (!values) return ''\n\n const keys = Object.keys(values)\n return keys\n .filter((k) => values[k] !== undefined) // `null` and `false` will both be passed\n .map((k) => k + '=' + encodeParam(values[k]))\n .join('&')\n}\n\n/**\n * constructs the path argument including any optional query parameters\n * @param path the base path of the request\n * @param obj optional collection of query parameters to encode and append to the path\n */\nexport function addQueryParams(path: string, obj?: Values) {\n if (!obj) {\n return path\n }\n const qp = encodeParams(obj)\n return `${path}${qp ? '?' + qp : ''}`\n}\n\nconst utf8 = 'utf-8'\n\n/**\n * Convert this value to a string representation however we can do it\n * @param val\n */\nfunction bufferString(val: any) {\n let result = 'Unknown error'\n try {\n const decoder = new TextDecoder(utf8)\n result = decoder.decode(val)\n } catch (e: any) {\n // Supremely ugly hack. If we get here, we must be in Node (or IE 11, but who cares about that?)\n // Node requires an import from `util` for TextDecoder to be found BUT it \"just has\" Buffer unless WebPack messes us up\n try {\n if (val instanceof Buffer) {\n result = Buffer.from(val).toString(utf8)\n } else {\n result = JSON.stringify(val)\n }\n } catch (err: any) {\n // The fallback logic here will at least give us some information about the error being thrown\n result = JSON.stringify(val)\n }\n }\n return result\n}\n\n/**\n * SDK error handler\n * @param response any kind of error\n * @returns a new `Error` object with the failure message\n */\nexport function sdkError(response: any) {\n if (typeof response === 'string') {\n return new Error(response)\n }\n if ('error' in response) {\n const error = response.error\n if (typeof error === 'string') {\n return new Error(error)\n }\n // Try to get most specific error first\n if ('error' in error) {\n const result = bufferString(error.error)\n return new Error(result)\n }\n if ('message' in error) {\n return new Error(response.error.message.toString())\n }\n if ('statusMessage' in error) {\n return new Error(error.statusMessage)\n }\n const result = bufferString(error)\n return new Error(result)\n }\n if ('message' in response) {\n return new Error(response.message)\n }\n const error = JSON.stringify(response)\n return new Error(`Unknown error with SDK method ${error}`)\n}\n\n/** A helper method for simplifying error handling of SDK responses.\n *\n * Pass in a promise returned by any SDK method, and it will return a promise\n * that rejects if the `SDKResponse` is not `ok`. This will swallow the type\n * information in the error case, but allows you to route all the error cases\n * into a single promise rejection.\n *\n * The promise will have an `Error` rejection reason with a string `message`.\n * If the server error contains a `message` field, it will be provided, otherwise a\n * generic message will occur.\n *\n * ```ts\n * const sdk = LookerSDK({...})\n * let look\n * try {\n * look = await sdkOk(sdk.create_look({...}))\n * // do something with look\n * }\n * catch(e) {\n * // handle error case\n * }\n * ```\n */\nexport async function sdkOk<TSuccess, TError>(\n promise: Promise<SDKResponse<TSuccess, TError>>\n) {\n const result = await promise\n if (result.ok) {\n return result.value\n } else {\n throw sdkError(result)\n }\n}\n\n/**\n * Converts a byte array to a \"URL safe\" base64 string\n * @param u8 byte array to convert\n */\nexport function safeBase64(u8: Uint8Array) {\n const rawBase64 = btoa(String.fromCharCode(...u8))\n return rawBase64.replace(/\\+/g, '-').replace(/\\//g, '_')\n}\n\n/**\n * Type predicate. Asserts that a given object is error-like.\n * @param error a value of unknown type\n * @return boolean true if the error has a `message` key of type string.\n */\nexport function isErrorLike<T extends unknown>(\n error: T\n): error is T & { message: string } {\n if (typeof error !== 'object') return false\n if (!error) return false\n if (!Object.prototype.hasOwnProperty.call(error, 'message')) return false\n if (typeof (error as { message: unknown }).message !== 'string') return false\n return true\n}\n"],"file":"transport.js"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { IApiSettings } from './apiSettings';
|
|
2
|
-
import { ITransport, IRequestProps } from './transport';
|
|
3
|
-
import { IAuthSession } from './authSession';
|
|
1
|
+
import type { IApiSettings } from './apiSettings';
|
|
2
|
+
import type { ITransport, IRequestProps } from './transport';
|
|
3
|
+
import type { IAuthSession } from './authSession';
|
|
4
4
|
export declare class ExtensionSession implements IAuthSession {
|
|
5
5
|
settings: IApiSettings;
|
|
6
6
|
sudoId: string;
|