@looker/sdk-rtl 21.5.0 → 21.6.1

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.
Files changed (101) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/lib/CSRFSession.js +3 -17
  3. package/lib/CSRFSession.js.map +1 -1
  4. package/lib/apiMethods.js +6 -47
  5. package/lib/apiMethods.js.map +1 -1
  6. package/lib/apiSettings.js +4 -24
  7. package/lib/apiSettings.js.map +1 -1
  8. package/lib/authSession.js +3 -18
  9. package/lib/authSession.js.map +1 -1
  10. package/lib/authToken.js +3 -18
  11. package/lib/authToken.js.map +1 -1
  12. package/lib/baseTransport.js +3 -12
  13. package/lib/baseTransport.js.map +1 -1
  14. package/lib/browser.js +0 -34
  15. package/lib/browser.js.map +1 -1
  16. package/lib/browserServices.js +3 -11
  17. package/lib/browserServices.js.map +1 -1
  18. package/lib/browserSession.js +6 -21
  19. package/lib/browserSession.js.map +1 -1
  20. package/lib/browserTransport.js +5 -63
  21. package/lib/browserTransport.js.map +1 -1
  22. package/lib/constants.js +1 -11
  23. package/lib/constants.js.map +1 -1
  24. package/lib/cryptoHash.js +1 -1
  25. package/lib/cryptoHash.js.map +1 -1
  26. package/lib/delimArray.js +3 -8
  27. package/lib/delimArray.js.map +1 -1
  28. package/lib/errorDoc.d.ts +1 -1
  29. package/lib/errorDoc.js +9 -50
  30. package/lib/errorDoc.js.map +1 -1
  31. package/lib/esm/CSRFSession.js +14 -17
  32. package/lib/esm/CSRFSession.js.map +1 -1
  33. package/lib/esm/apiMethods.js +18 -46
  34. package/lib/esm/apiMethods.js.map +1 -1
  35. package/lib/esm/apiSettings.js +32 -28
  36. package/lib/esm/apiSettings.js.map +1 -1
  37. package/lib/esm/authSession.js +14 -19
  38. package/lib/esm/authSession.js.map +1 -1
  39. package/lib/esm/authToken.js +11 -17
  40. package/lib/esm/authToken.js.map +1 -1
  41. package/lib/esm/baseTransport.js +14 -13
  42. package/lib/esm/baseTransport.js.map +1 -1
  43. package/lib/esm/browser.js +192 -17
  44. package/lib/esm/browser.js.map +1 -1
  45. package/lib/esm/browserServices.js +15 -12
  46. package/lib/esm/browserServices.js.map +1 -1
  47. package/lib/esm/browserSession.js +21 -23
  48. package/lib/esm/browserSession.js.map +1 -1
  49. package/lib/esm/browserTransport.js +24 -68
  50. package/lib/esm/browserTransport.js.map +1 -1
  51. package/lib/esm/constants.js +22 -10
  52. package/lib/esm/constants.js.map +1 -1
  53. package/lib/esm/cryptoHash.js.map +1 -1
  54. package/lib/esm/delimArray.js +10 -6
  55. package/lib/esm/delimArray.js.map +1 -1
  56. package/lib/esm/errorDoc.js +23 -51
  57. package/lib/esm/errorDoc.js.map +1 -1
  58. package/lib/esm/extensionSession.js +11 -16
  59. package/lib/esm/extensionSession.js.map +1 -1
  60. package/lib/esm/extensionTransport.js +13 -19
  61. package/lib/esm/extensionTransport.js.map +1 -1
  62. package/lib/esm/index.js +236 -21
  63. package/lib/esm/index.js.map +1 -1
  64. package/lib/esm/lookerSDKError.js +13 -12
  65. package/lib/esm/lookerSDKError.js.map +1 -1
  66. package/lib/esm/oauthSession.js +23 -66
  67. package/lib/esm/oauthSession.js.map +1 -1
  68. package/lib/esm/paging.js +24 -71
  69. package/lib/esm/paging.js.map +1 -1
  70. package/lib/esm/platformServices.js.map +1 -1
  71. package/lib/esm/proxySession.js +13 -13
  72. package/lib/esm/proxySession.js.map +1 -1
  73. package/lib/esm/testUtils/index.js +17 -0
  74. package/lib/esm/testUtils/index.js.map +1 -0
  75. package/lib/esm/testUtils/testUtils.js +46 -0
  76. package/lib/esm/testUtils/testUtils.js.map +1 -0
  77. package/lib/esm/transport.js +59 -64
  78. package/lib/esm/transport.js.map +1 -1
  79. package/lib/extensionSession.js +3 -17
  80. package/lib/extensionSession.js.map +1 -1
  81. package/lib/extensionTransport.js +5 -20
  82. package/lib/extensionTransport.js.map +1 -1
  83. package/lib/index.js +0 -42
  84. package/lib/index.js.map +1 -1
  85. package/lib/lookerSDKError.js +5 -13
  86. package/lib/lookerSDKError.js.map +1 -1
  87. package/lib/oauthSession.js +8 -63
  88. package/lib/oauthSession.js.map +1 -1
  89. package/lib/paging.js +5 -70
  90. package/lib/paging.js.map +1 -1
  91. package/lib/platformServices.js +1 -1
  92. package/lib/platformServices.js.map +1 -1
  93. package/lib/proxySession.js +0 -12
  94. package/lib/proxySession.js.map +1 -1
  95. package/lib/testUtils/index.js +0 -2
  96. package/lib/testUtils/index.js.map +1 -1
  97. package/lib/testUtils/testUtils.js +1 -16
  98. package/lib/testUtils/testUtils.js.map +1 -1
  99. package/lib/transport.js +16 -58
  100. package/lib/transport.js.map +1 -1
  101. package/package.json +3 -3
@@ -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","reentry","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 reentry = false\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.reentry) {\n // do nothing\n } else 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 this.reentry = true\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"}
1
+ {"version":3,"file":"oauthSession.js","names":["_authSession","require","_transport","_authToken","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","_objectSpread","target","i","length","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","obj","_toPropertyKey","configurable","writable","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","res","call","TypeError","Number","OAuthSession","AuthSession","constructor","services","settings","transport","AuthToken","crypto","config","readConfig","sdkError","message","concat","authenticate","props","_this","token","getToken","access_token","headers","Authorization","code_verifier","sessionStorage","getItem","codeVerifierKey","removeItem","setItem","returnUrl","returnUrlKey","clearStorage","login","_sudoId","_this2","isAuthenticated","reentry","authUrl","createAuthCodeRequestUrl","agentPrefix","returnTo","window","location","pathname","search","href","Error","params","URLSearchParams","code","get","redeemAuthCode","activeToken","requestToken","body","_this3","url","URL","base_url","ok","request","toString","setToken","scope","state","_this4","verifier","secureRandom","code_challenge","sha256Hash","client_id","code_challenge_method","redirect_uri","response_type","looker_url","redeemAuthCodeBody","authCode","codeVerifier","grant_type","_this5","_this6","refresh_token","isActive","logout","_this7","init","exports"],"sources":["../../src/oauthSession.ts"],"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 reentry = false\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.reentry) {\n // do nothing\n } else 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 this.reentry = true\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 const verifier = this.crypto.secureRandom(33)\n this.code_verifier = verifier\n const code_challenge = await this.crypto.sha256Hash(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"],"mappings":"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"}
package/lib/esm/paging.js CHANGED
@@ -1,20 +1,28 @@
1
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
-
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.linkHeaderParser = exports.TotalCountHeader = exports.Paging = exports.LinkHeader = void 0;
7
+ exports.pageAll = pageAll;
8
+ exports.pager = pager;
9
+ var _transport = require("./transport");
10
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
12
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
3
13
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
4
-
5
14
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
6
-
7
- import { sdkOk } from './transport';
8
- export var LinkHeader = 'Link';
9
- export var TotalCountHeader = 'X-Total-Count';
10
- export var linkHeaderParser = linkHeader => {
15
+ var LinkHeader = 'Link';
16
+ exports.LinkHeader = LinkHeader;
17
+ var TotalCountHeader = 'X-Total-Count';
18
+ exports.TotalCountHeader = TotalCountHeader;
19
+ var linkHeaderParser = linkHeader => {
11
20
  var re = /<\s*(.*)\s*>;\s*rel="\s*(.*)\s*"\s*/gm;
12
21
  var links = linkHeader.split(',');
13
22
  var obj = {};
14
23
  var arrRes;
15
24
  links.forEach(link => {
16
25
  link = link.trim();
17
-
18
26
  while (arrRes = re.exec(link)) {
19
27
  var key = arrRes[2].split(' ')[0].trim().toLocaleLowerCase();
20
28
  obj[key] = {
@@ -26,28 +34,25 @@ export var linkHeaderParser = linkHeader => {
26
34
  });
27
35
  return obj;
28
36
  };
29
- export function pager(_x, _x2, _x3) {
37
+ exports.linkHeaderParser = linkHeaderParser;
38
+ function pager(_x, _x2, _x3) {
30
39
  return _pager.apply(this, arguments);
31
40
  }
32
-
33
41
  function _pager() {
34
42
  _pager = _asyncToGenerator(function* (sdk, pageFunc, options) {
35
43
  return yield new Paging(sdk, pageFunc, options).init();
36
44
  });
37
45
  return _pager.apply(this, arguments);
38
46
  }
39
-
40
- export function pageAll(_x4, _x5) {
47
+ function pageAll(_x4, _x5) {
41
48
  return _pageAll.apply(this, arguments);
42
49
  }
43
-
44
50
  function _pageAll() {
45
51
  _pageAll = _asyncToGenerator(function* (sdk, pageFunc) {
46
52
  var onPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : page => page;
47
53
  var options = arguments.length > 3 ? arguments[3] : undefined;
48
54
  var paged = yield pager(sdk, pageFunc, options);
49
55
  onPage(paged.items);
50
-
51
56
  try {
52
57
  while (paged.more()) {
53
58
  onPage(yield sdk.ok(paged.nextPage()));
@@ -55,112 +60,83 @@ function _pageAll() {
55
60
  } catch (err) {
56
61
  return Promise.reject(err);
57
62
  }
58
-
59
63
  return paged;
60
64
  });
61
65
  return _pageAll.apply(this, arguments);
62
66
  }
63
-
64
- export class Paging {
67
+ class Paging {
65
68
  constructor(sdk, func, options) {
66
69
  this.sdk = sdk;
67
70
  this.func = func;
68
71
  this.options = options;
69
-
70
72
  _defineProperty(this, "items", []);
71
-
72
73
  _defineProperty(this, "links", {});
73
-
74
74
  _defineProperty(this, "total", -1);
75
-
76
75
  _defineProperty(this, "offset", -1);
77
-
78
76
  _defineProperty(this, "limit", -1);
79
-
80
77
  _defineProperty(this, "transport", void 0);
81
-
82
78
  this.transport = sdk.authSession.transport;
83
79
  }
84
-
85
80
  rawCatch(func) {
86
81
  var _this = this;
87
-
88
82
  return _asyncToGenerator(function* () {
89
83
  var raw = {};
90
84
  var saved = _this.transport.observer;
91
-
92
85
  try {
93
86
  _this.transport.observer = response => {
94
87
  if (saved) {
95
88
  response = saved(response);
96
89
  }
97
-
98
90
  raw = response;
99
91
  return response;
100
92
  };
101
-
102
- _this.items = yield sdkOk(func());
93
+ _this.items = yield (0, _transport.sdkOk)(func());
103
94
  } finally {
104
95
  _this.transport.observer = saved;
105
96
  }
106
-
107
97
  if (Object.keys(raw).length === 0 || Object.keys(raw.headers).length === 0) return Promise.reject(new Error('No paging headers were found'));
108
-
109
98
  _this.parse(raw);
110
-
111
99
  return _this;
112
100
  })();
113
101
  }
114
-
115
102
  get page() {
116
103
  if (this.limit < 1 || this.offset < 0) return -1;
117
104
  var x = this.offset / this.limit + 1;
118
105
  return Math.ceil(x);
119
106
  }
120
-
121
107
  get pages() {
122
108
  if (this.total < 1 || this.limit < 1) return -1;
123
109
  var x = this.total / this.limit;
124
110
  return Math.ceil(x);
125
111
  }
126
-
127
112
  init() {
128
113
  var _this2 = this;
129
-
130
114
  return _asyncToGenerator(function* () {
131
115
  return yield _this2.rawCatch(_this2.func);
132
116
  })();
133
117
  }
134
-
135
118
  hasRel(link) {
136
119
  return !!this.links[link];
137
120
  }
138
-
139
121
  more() {
140
122
  return this.hasRel('next');
141
123
  }
142
-
143
124
  static paramDefault(value, defaultValue) {
144
125
  var convert = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : v => parseInt(v, 10);
145
126
  if (value === null) return defaultValue;
146
127
  return convert(value);
147
128
  }
148
-
149
129
  reset() {
150
130
  this.links = {};
151
131
  this.total = this.offset = this.limit = -1;
152
132
  this.items = [];
153
133
  }
154
-
155
134
  getRel(name, limit, offset) {
156
135
  var _this3 = this;
157
-
158
136
  return _asyncToGenerator(function* () {
159
137
  var rel = _this3.links[name];
160
138
  var result;
161
-
162
139
  _this3.reset();
163
-
164
140
  if (!rel) {
165
141
  result = {
166
142
  ok: true,
@@ -168,18 +144,14 @@ export class Paging {
168
144
  };
169
145
  return result;
170
146
  }
171
-
172
147
  var authenticator = init => {
173
148
  return _this3.sdk.authSession.authenticate(init);
174
149
  };
175
-
176
150
  var link = rel.url;
177
-
178
151
  if (limit !== undefined) {
179
152
  if (offset === undefined) {
180
153
  offset = 0;
181
154
  }
182
-
183
155
  if (limit < 1 || offset < 0) {
184
156
  result = {
185
157
  ok: false,
@@ -187,20 +159,16 @@ export class Paging {
187
159
  };
188
160
  return result;
189
161
  }
190
-
191
162
  var url = new URL(link);
192
163
  var params = url.searchParams;
193
164
  params.set('limit', limit.toString());
194
165
  params.set('offset', offset.toString());
195
166
  link = url.toString();
196
167
  }
197
-
198
168
  var raw = yield _this3.transport.rawRequest('GET', link, undefined, undefined, authenticator, _this3.options);
199
-
200
169
  try {
201
170
  _this3.parse(raw);
202
-
203
- _this3.items = yield sdkOk(_this3.transport.parseResponse(raw));
171
+ _this3.items = yield (0, _transport.sdkOk)(_this3.transport.parseResponse(raw));
204
172
  result = {
205
173
  ok: true,
206
174
  value: _this3.items
@@ -211,69 +179,54 @@ export class Paging {
211
179
  error: e
212
180
  };
213
181
  }
214
-
215
182
  return result;
216
183
  })();
217
184
  }
218
-
219
185
  static findHeader(raw, name) {
220
186
  return raw.headers[name] || raw.headers[name.toLowerCase()] || raw.headers[name.toUpperCase()];
221
187
  }
222
-
223
188
  parse(raw) {
224
189
  var params = new URL(raw.url, 'http://default').searchParams;
225
190
  this.limit = Paging.paramDefault(params.get('limit'), -1);
226
191
  this.offset = Paging.paramDefault(params.get('offset'), this.limit > 0 ? 0 : -1);
227
192
  var linkHeader = Paging.findHeader(raw, LinkHeader);
228
-
229
193
  if (linkHeader) {
230
194
  this.links = linkHeaderParser(linkHeader);
231
195
  } else {
232
196
  this.links = {};
233
197
  }
234
-
235
198
  var totalHeader = Paging.findHeader(raw, TotalCountHeader);
236
-
237
199
  if (totalHeader) {
238
200
  this.total = parseInt(totalHeader.trim(), 10);
239
201
  } else {
240
202
  this.total = -1;
241
203
  }
242
-
243
204
  return this;
244
205
  }
245
-
246
206
  firstPage() {
247
207
  var _this4 = this;
248
-
249
208
  return _asyncToGenerator(function* () {
250
209
  return yield _this4.getRel('first');
251
210
  })();
252
211
  }
253
-
254
212
  lastPage() {
255
213
  var _this5 = this;
256
-
257
214
  return _asyncToGenerator(function* () {
258
215
  return yield _this5.getRel('last');
259
216
  })();
260
217
  }
261
-
262
218
  nextPage() {
263
219
  var _this6 = this;
264
-
265
220
  return _asyncToGenerator(function* () {
266
221
  return yield _this6.getRel('next');
267
222
  })();
268
223
  }
269
-
270
224
  prevPage() {
271
225
  var _this7 = this;
272
-
273
226
  return _asyncToGenerator(function* () {
274
227
  return yield _this7.getRel('prev');
275
228
  })();
276
229
  }
277
-
278
230
  }
231
+ exports.Paging = Paging;
279
232
  //# sourceMappingURL=paging.js.map
@@ -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 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
+ {"version":3,"file":"paging.js","names":["_transport","require","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","asyncGeneratorStep","gen","resolve","reject","_next","_throw","info","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","LinkHeader","exports","TotalCountHeader","linkHeaderParser","linkHeader","re","links","split","arrRes","forEach","link","trim","exec","toLocaleLowerCase","url","rel","name","pager","_x","_x2","_x3","_pager","sdk","pageFunc","options","Paging","init","pageAll","_x4","_x5","_pageAll","onPage","length","page","paged","items","more","ok","nextPage","constructor","func","transport","authSession","rawCatch","_this","raw","saved","observer","response","sdkOk","keys","headers","Error","parse","limit","offset","x","Math","ceil","pages","total","_this2","hasRel","paramDefault","defaultValue","convert","v","parseInt","reset","getRel","_this3","result","authenticator","authenticate","URL","params","searchParams","set","toString","rawRequest","parseResponse","e","findHeader","toLowerCase","toUpperCase","get","totalHeader","firstPage","_this4","lastPage","_this5","_this6","prevPage","_this7"],"sources":["../../src/paging.ts"],"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"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"platformServices.js"}
1
+ {"version":3,"file":"platformServices.js","names":[],"sources":["../../src/platformServices.ts"],"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 } from './transport'\nimport type { ICryptoHash } from './cryptoHash'\n\n/**\n * Contract for OAuth authentication services\n */\nexport interface IPlatformServices {\n settings: IApiSettings\n transport: ITransport\n crypto: ICryptoHash\n}\n"],"mappings":""}
@@ -1,35 +1,35 @@
1
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
1
+ "use strict";
2
2
 
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ProxySession = void 0;
7
+ var _authSession = require("./authSession");
8
+ var _browserTransport = require("./browserTransport");
9
+ var _transport = require("./transport");
10
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
3
11
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
4
-
5
- import { AuthSession } from './authSession';
6
- import { BrowserTransport } from './browserTransport';
7
- import { LookerAppId, agentPrefix } from './transport';
8
- export class ProxySession extends AuthSession {
12
+ class ProxySession extends _authSession.AuthSession {
9
13
  constructor(settings, proxyUrl, transport) {
10
- super(settings, transport || new BrowserTransport(settings));
14
+ super(settings, transport || new _browserTransport.BrowserTransport(settings));
11
15
  this.settings = settings;
12
16
  this.proxyUrl = proxyUrl;
13
17
  }
14
-
15
18
  isAuthenticated() {
16
19
  return true;
17
20
  }
18
-
19
21
  authenticate(props) {
20
22
  var _this = this;
21
-
22
23
  return _asyncToGenerator(function* () {
23
24
  if (!props.headers) {
24
25
  props.headers = {};
25
26
  }
26
-
27
27
  props.headers['X-Forwarded-For'] = props.url;
28
- props.headers[LookerAppId] = agentPrefix;
28
+ props.headers[_transport.LookerAppId] = _transport.agentPrefix;
29
29
  props.url = _this.proxyUrl;
30
30
  return props;
31
31
  })();
32
32
  }
33
-
34
33
  }
34
+ exports.ProxySession = ProxySession;
35
35
  //# sourceMappingURL=proxySession.js.map
@@ -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;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"}
1
+ {"version":3,"file":"proxySession.js","names":["_authSession","require","_browserTransport","_transport","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","ProxySession","AuthSession","constructor","settings","proxyUrl","transport","BrowserTransport","isAuthenticated","authenticate","props","_this","headers","url","LookerAppId","agentPrefix","exports"],"sources":["../../src/proxySession.ts"],"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"],"mappings":";;;;;;AA0BA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAAsD,SAAAG,mBAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,EAAAC,GAAA,EAAAC,GAAA,cAAAC,IAAA,GAAAP,GAAA,CAAAK,GAAA,EAAAC,GAAA,OAAAE,KAAA,GAAAD,IAAA,CAAAC,KAAA,WAAAC,KAAA,IAAAP,MAAA,CAAAO,KAAA,iBAAAF,IAAA,CAAAG,IAAA,IAAAT,OAAA,CAAAO,KAAA,YAAAG,OAAA,CAAAV,OAAA,CAAAO,KAAA,EAAAI,IAAA,CAAAT,KAAA,EAAAC,MAAA;AAAA,SAAAS,kBAAAC,EAAA,6BAAAC,IAAA,SAAAC,IAAA,GAAAC,SAAA,aAAAN,OAAA,WAAAV,OAAA,EAAAC,MAAA,QAAAF,GAAA,GAAAc,EAAA,CAAAI,KAAA,CAAAH,IAAA,EAAAC,IAAA,YAAAb,MAAAK,KAAA,IAAAT,kBAAA,CAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,UAAAI,KAAA,cAAAJ,OAAAe,GAAA,IAAApB,kBAAA,CAAAC,GAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,MAAA,WAAAe,GAAA,KAAAhB,KAAA,CAAAiB,SAAA;AAW/C,MAAeC,YAAY,SAASC,wBAAW,CAAC;EACrDC,WAAWA,CACFC,QAAsB,EACtBC,QAAgB,EACvBC,SAAsB,EACtB;IACA,KAAK,CAACF,QAAQ,EAAEE,SAAS,IAAI,IAAIC,kCAAgB,CAACH,QAAQ,CAAC,CAAC;IAAA,KAJrDA,QAAsB,GAAtBA,QAAsB;IAAA,KACtBC,QAAgB,GAAhBA,QAAgB;EAIzB;EAOAG,eAAeA,CAAA,EAAG;IAChB,OAAO,IAAI;EACb;EAWMC,YAAYA,CAACC,KAAoB,EAAE;IAAA,IAAAC,KAAA;IAAA,OAAAlB,iBAAA;MACvC,IAAI,CAACiB,KAAK,CAACE,OAAO,EAAE;QAClBF,KAAK,CAACE,OAAO,GAAG,CAAC,CAAC;MACpB;MACAF,KAAK,CAACE,OAAO,CAAC,iBAAiB,CAAC,GAAGF,KAAK,CAACG,GAAG;MAC5CH,KAAK,CAACE,OAAO,CAACE,sBAAW,CAAC,GAAGC,sBAAW;MACxCL,KAAK,CAACG,GAAG,GAAGF,KAAI,CAACN,QAAQ;MACzB,OAAOK,KAAK;IAAA;EACd;AACF;AAACM,OAAA,CAAAf,YAAA,GAAAA,YAAA"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _testUtils = require("./testUtils");
7
+ Object.keys(_testUtils).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _testUtils[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function get() {
13
+ return _testUtils[key];
14
+ }
15
+ });
16
+ });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_testUtils","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get"],"sources":["../../../src/testUtils/index.ts"],"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\nexport * from './testUtils'\n"],"mappings":";;;;;AA0BA,IAAAA,UAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,UAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,UAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAT,UAAA,CAAAK,GAAA;IAAA;EAAA;AAAA"}