From 251ed60ebd6984d5fe494a764d8cd662dd0eba6d Mon Sep 17 00:00:00 2001 From: nklomp Date: Wed, 13 Jul 2022 00:39:01 +0200 Subject: [PATCH] feat: add Microsoft Request Service API support --- .gitignore | 1 + .../__tests__/localAgent.test.ts | 3 +- packages/ms-request-api/README.md | 2 +- .../__tests__/restAgent.test.ts | 2 +- .../shared/msRequestApiAgentLogic.ts | 38 ++++----- packages/ms-request-api/agent.yml | 8 +- packages/ms-request-api/package.json | 6 +- packages/ms-request-api/src/IssuerUtil.ts | 49 +++++------ .../ms-request-api/src/agent/MsRequestApi.ts | 34 ++++---- .../ms-request-api/src/types/IMsRequestApi.ts | 50 +++++------ packages/ms-request-api/tsconfig.json | 2 +- packages/tsconfig.json | 2 +- yarn.lock | 82 ++++++++++++++++++- 13 files changed, 177 insertions(+), 102 deletions(-) diff --git a/.gitignore b/.gitignore index 2f2586c7d..ed56276a3 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,4 @@ test/*.js /packages/vc-api-verifier/plugin.schema.json /packages/connection-manager/plugin.schema.json /packages/bls-key-manager/plugin.schema.json +/packages/ms-request-api/plugin.schema.json diff --git a/packages/connection-manager/__tests__/localAgent.test.ts b/packages/connection-manager/__tests__/localAgent.test.ts index 5e9a418d9..dd5d7a68e 100644 --- a/packages/connection-manager/__tests__/localAgent.test.ts +++ b/packages/connection-manager/__tests__/localAgent.test.ts @@ -32,5 +32,4 @@ const testContext = { describe('Local integration tests', () => { connectionManagerAgentLogic(testContext) -} -) +}) diff --git a/packages/ms-request-api/README.md b/packages/ms-request-api/README.md index 987adb118..6a8c92c29 100644 --- a/packages/ms-request-api/README.md +++ b/packages/ms-request-api/README.md @@ -14,7 +14,7 @@ # ms-request-api -Azure Active Directory (Azure AD) Verifiable Credentials allows you to issue a credential. This is a Veramo plugin that handles issuing a verifiable credential using issuer authentication info and issuer configuration. +Azure Active Directory (Azure AD) Verifiable Credentials allows you to issue a credential. This is a Veramo plugin that handles issuing a verifiable credential using issuer authentication info and issuer configuration. ### Installation diff --git a/packages/ms-request-api/__tests__/restAgent.test.ts b/packages/ms-request-api/__tests__/restAgent.test.ts index 91de0a2ae..866a5e595 100644 --- a/packages/ms-request-api/__tests__/restAgent.test.ts +++ b/packages/ms-request-api/__tests__/restAgent.test.ts @@ -31,7 +31,7 @@ const getAgent = (options?: IAgentOptions) => const setup = async (): Promise => { const config = getConfig('packages/ms-request-api/agent.yml') - const { agent } = createObjects(config, { agent: '/agent'}) + const { agent } = createObjects(config, { agent: '/agent' }) serverAgent = agent const agentRouter = AgentRouter({ diff --git a/packages/ms-request-api/__tests__/shared/msRequestApiAgentLogic.ts b/packages/ms-request-api/__tests__/shared/msRequestApiAgentLogic.ts index a99fc06a6..7fcf3f527 100644 --- a/packages/ms-request-api/__tests__/shared/msRequestApiAgentLogic.ts +++ b/packages/ms-request-api/__tests__/shared/msRequestApiAgentLogic.ts @@ -10,8 +10,7 @@ var requestIssuanceResponse: IIssueRequestResponse = { url: 'www.google.com', expiry: new Date(1655935606), id: 'fbef933e-f786-4b85-b1c8-6679346dc55d', - pin: '3683' - + pin: '3683', } export default (testContext: { getAgent: () => ConfiguredAgent; setup: () => Promise; tearDown: () => Promise }) => { @@ -19,23 +18,21 @@ export default (testContext: { getAgent: () => ConfiguredAgent; setup: () => Pro let agent: ConfiguredAgent beforeAll(async () => { - jest.mock('../../src/IssuerUtil', () => { return { fetchIssuanceRequestMs: jest.fn().mockResolvedValue(requestIssuanceResponse), - generatePin: jest.fn().mockResolvedValue(6363) + generatePin: jest.fn().mockResolvedValue(6363), } }) jest.mock('@sphereon/ms-authenticator', () => { return { ClientCredentialAuthenticator: jest.fn().mockResolvedValue('ey...'), - checkMsIdentityHostname: jest.fn().mockResolvedValue(MsAuthenticator.MS_IDENTITY_HOST_NAME_EU) + checkMsIdentityHostname: jest.fn().mockResolvedValue(MsAuthenticator.MS_IDENTITY_HOST_NAME_EU), } }) await testContext.setup() agent = testContext.getAgent() - }) afterAll(async () => { @@ -44,43 +41,38 @@ export default (testContext: { getAgent: () => ConfiguredAgent; setup: () => Pro }) it('should request issuance from Issuer', async () => { - var requestConfigFile = '../../config/issuance_request_config.json'; - var issuanceConfig: IClientIssuanceConfig = require(requestConfigFile); + var requestConfigFile = '../../config/issuance_request_config.json' + var issuanceConfig: IClientIssuanceConfig = require(requestConfigFile) var clientIssueRequest: IClientIssueRequest = { authenticationInfo: { azClientId: 'AzClientID', azClientSecret: 'AzClientSecret', azTenantId: 'AzTenantId', - credentialManifestUrl: 'CredentialManifestUrl' + credentialManifestUrl: 'CredentialManifestUrl', }, clientIssuanceConfig: issuanceConfig, claims: { - "given_name": "FIRSTNAME", - "family_name": "LASTNAME" - } + given_name: 'FIRSTNAME', + family_name: 'LASTNAME', + }, } // modify the callback method to make it easier to debug // with tools like ngrok since the URI changes all the time // this way you don't need to modify the callback URL in the payload every time // ngrok changes the URI - clientIssueRequest.clientIssuanceConfig.callback.url = `https://6270-2a02-a458-e71a-1-68b4-31d2-b44f-12b.eu.ngrok.io/api/issuer/issuance-request-callback`; + clientIssueRequest.clientIssuanceConfig.callback.url = `https://6270-2a02-a458-e71a-1-68b4-31d2-b44f-12b.eu.ngrok.io/api/issuer/issuance-request-callback` - clientIssueRequest.clientIssuanceConfig.registration.clientName = "Sphereon Node.js SDK API Issuer"; + clientIssueRequest.clientIssuanceConfig.registration.clientName = 'Sphereon Node.js SDK API Issuer' // modify payload with new state, the state is used to be able to update the UI when callbacks are received from the VC Service - var id = uuidv4(); - clientIssueRequest.clientIssuanceConfig.callback.state = id; + var id = uuidv4() + clientIssueRequest.clientIssuanceConfig.callback.state = id - const fetchIssuanceRequestMsMock = jest.fn().mockResolvedValue(requestIssuanceResponse); + const fetchIssuanceRequestMsMock = jest.fn().mockResolvedValue(requestIssuanceResponse) fetchIssuanceRequestMs.prototype = fetchIssuanceRequestMsMock - return await expect( - agent.issuanceRequestMsVc(clientIssueRequest) - ).resolves.not.toBeNull + return await expect(agent.issuanceRequestMsVc(clientIssueRequest)).resolves.not.toBeNull }) - }) } - - diff --git a/packages/ms-request-api/agent.yml b/packages/ms-request-api/agent.yml index d07e8a488..6fa398421 100644 --- a/packages/ms-request-api/agent.yml +++ b/packages/ms-request-api/agent.yml @@ -71,7 +71,7 @@ agent: plugins: - $require: ./packages/ms-request-api/dist#MsRequestApi $args: - - azClientId: {process.env.AZ_CLIENT_ID} - azClientSecret: {process.env.AZ_CLIENT_SECRET} - azTenantId: {process.env.AZ_TENANT_ID} - credentialManifestUrl: {process.env.CREDENTIAL_MANIFEST_URL} + - azClientId: { process.env.AZ_CLIENT_ID } + azClientSecret: { process.env.AZ_CLIENT_SECRET } + azTenantId: { process.env.AZ_TENANT_ID } + credentialManifestUrl: { process.env.CREDENTIAL_MANIFEST_URL } diff --git a/packages/ms-request-api/package.json b/packages/ms-request-api/package.json index bceff36e0..4a16c39bb 100644 --- a/packages/ms-request-api/package.json +++ b/packages/ms-request-api/package.json @@ -1,6 +1,6 @@ { "name": "@sphereon/ms-request-api", - "version": "0.5.2", + "version": "0.6.0", "source": "src/index.ts", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -17,10 +17,10 @@ "cross-fetch": "^3.1.5", "global-fetch": "^0.2.2", "express": "^4.17.1", - "express-session": "^1.17.2" + "express-session": "^1.17.2", + "@sphereon/ms-authenticator": "^0.6.0" }, "devDependencies": { - "@sphereon/ms-authenticator": "^0.5.1", "@types/express-session": "^1.17.4", "@types/jest": "^27.0.2", "@veramo/cli": "3.1.2-next.84", diff --git a/packages/ms-request-api/src/IssuerUtil.ts b/packages/ms-request-api/src/IssuerUtil.ts index 417656552..be185e3e9 100644 --- a/packages/ms-request-api/src/IssuerUtil.ts +++ b/packages/ms-request-api/src/IssuerUtil.ts @@ -1,30 +1,31 @@ -import { IIssueRequest, IIssueRequestResponse } from "./types/IMsRequestApi"; +import { IIssueRequest, IIssueRequestResponse } from './types/IMsRequestApi' -export async function fetchIssuanceRequestMs(issuanceInfo: IIssueRequest, accessToken: string, msIdentityHostName: string): Promise { - var client_api_request_endpoint = `${msIdentityHostName}${issuanceInfo.authenticationInfo.azTenantId}/verifiablecredentials/request`; +export async function fetchIssuanceRequestMs( + issuanceInfo: IIssueRequest, + accessToken: string, + msIdentityHostName: string +): Promise { + var client_api_request_endpoint = `${msIdentityHostName}${issuanceInfo.authenticationInfo.azTenantId}/verifiablecredentials/request` - var payload = JSON.stringify(issuanceInfo.issuanceConfig); - const fetchOptions = { - method: 'POST', - body: payload, - headers: { - 'Content-Type': 'application/json', - 'Content-Length': payload.length.toString(), - 'Authorization': `Bearer ${accessToken}` - } - }; - const response = await fetch(client_api_request_endpoint, fetchOptions); - return await response.json(); + var payload = JSON.stringify(issuanceInfo.issuanceConfig) + const fetchOptions = { + method: 'POST', + body: payload, + headers: { + 'Content-Type': 'application/json', + 'Content-Length': payload.length.toString(), + Authorization: `Bearer ${accessToken}`, + }, + } + const response = await fetch(client_api_request_endpoint, fetchOptions) + return await response.json() } export function generatePin(digits: number) { - var add = 1, max = 12 - add; - max = Math.pow(10, digits + add); - var min = max / 10; // Math.pow(10, n) basically - var number = Math.floor(Math.random() * (max - min + 1)) + min; - return ("" + number).substring(add); + var add = 1, + max = 12 - add + max = Math.pow(10, digits + add) + var min = max / 10 // Math.pow(10, n) basically + var number = Math.floor(Math.random() * (max - min + 1)) + min + return ('' + number).substring(add) } - - - - diff --git a/packages/ms-request-api/src/agent/MsRequestApi.ts b/packages/ms-request-api/src/agent/MsRequestApi.ts index 170f0acc7..24e9e23cd 100644 --- a/packages/ms-request-api/src/agent/MsRequestApi.ts +++ b/packages/ms-request-api/src/agent/MsRequestApi.ts @@ -1,21 +1,28 @@ import { IAgentPlugin } from '@veramo/core' -import { IClientIssueRequest, IIssueRequest, IIssueRequestResponse, IMsRequestApi, IRequiredContext, Issuance, IssuanceConfig } from '../types/IMsRequestApi' +import { + IClientIssueRequest, + IIssueRequest, + IIssueRequestResponse, + IMsRequestApi, + IRequiredContext, + Issuance, + IssuanceConfig, +} from '../types/IMsRequestApi' import { ClientCredentialAuthenticator, checkMsIdentityHostname } from '@sphereon/ms-authenticator' -import { generatePin, fetchIssuanceRequestMs } from '../IssuerUtil'; +import { generatePin, fetchIssuanceRequestMs } from '../IssuerUtil' /** * {@inheritDoc IMsRequestApi} */ export class MsRequestApi implements IAgentPlugin { readonly methods: IMsRequestApi = { - issuanceRequestMsVc: this.issuanceRequestMsVc.bind(this) + issuanceRequestMsVc: this.issuanceRequestMsVc.bind(this), } - /** {@inheritDoc IMsRequestApi.issuanceRequestMsVc} */ private async issuanceRequestMsVc(clientIssueRequest: IClientIssueRequest, context: IRequiredContext): Promise { - var accessToken = await ClientCredentialAuthenticator(clientIssueRequest.authenticationInfo); + var accessToken = await ClientCredentialAuthenticator(clientIssueRequest.authenticationInfo) - var msIdentityHostName = await checkMsIdentityHostname(clientIssueRequest.authenticationInfo); + var msIdentityHostName = await checkMsIdentityHostname(clientIssueRequest.authenticationInfo) // Config Request and App Config File should be a parameter to this function if (!clientIssueRequest.authenticationInfo.azTenantId) { @@ -25,14 +32,14 @@ export class MsRequestApi implements IAgentPlugin { // check if pin is required, if found make sure we set a new random pin // pincode is only used when the payload contains claim value pairs which results in an IDTokenhint if (clientIssueRequest.clientIssuanceConfig.issuance.pin) { - clientIssueRequest.clientIssuanceConfig.issuance.pin.value = generatePin(clientIssueRequest.clientIssuanceConfig.issuance.pin.length); + clientIssueRequest.clientIssuanceConfig.issuance.pin.value = generatePin(clientIssueRequest.clientIssuanceConfig.issuance.pin.length) } var issuance: Issuance = { type: clientIssueRequest.clientIssuanceConfig.issuance.type, manifest: clientIssueRequest.clientIssuanceConfig.issuance.manifest, pin: clientIssueRequest.clientIssuanceConfig.issuance.pin, - claims: clientIssueRequest.claims + claims: clientIssueRequest.claims, } var issuanceConfig: IssuanceConfig = { @@ -40,23 +47,22 @@ export class MsRequestApi implements IAgentPlugin { includeQRCode: clientIssueRequest.clientIssuanceConfig.includeQRCode, registration: clientIssueRequest.clientIssuanceConfig.registration, callback: clientIssueRequest.clientIssuanceConfig.callback, - issuance: issuance + issuance: issuance, } var issueRequest: IIssueRequest = { authenticationInfo: clientIssueRequest.authenticationInfo, - issuanceConfig: issuanceConfig - }; + issuanceConfig: issuanceConfig, + } var resp = await fetchIssuanceRequestMs(issueRequest, accessToken, msIdentityHostName) // the response from the VC Request API call is returned to the caller (the UI). It contains the URI to the request which Authenticator can download after // it has scanned the QR code. If the payload requested the VC Request service to create the QR code that is returned as well // the javascript in the UI will use that QR code to display it on the screen to the user. - resp.id = issueRequest.issuanceConfig.callback.state; // add session id so browser can pull status + resp.id = issueRequest.issuanceConfig.callback.state // add session id so browser can pull status if (issueRequest.issuanceConfig.issuance.pin) { - resp.pin = issueRequest.issuanceConfig.issuance.pin.value; // add pin code so browser can display it + resp.pin = issueRequest.issuanceConfig.issuance.pin.value // add pin code so browser can display it } return resp } - } diff --git a/packages/ms-request-api/src/types/IMsRequestApi.ts b/packages/ms-request-api/src/types/IMsRequestApi.ts index 6e7f2e884..b5ae71d94 100644 --- a/packages/ms-request-api/src/types/IMsRequestApi.ts +++ b/packages/ms-request-api/src/types/IMsRequestApi.ts @@ -2,7 +2,7 @@ import { IAgentContext, IPluginMethodMap } from '@veramo/core' import { IMsAuthenticationClientCredentialArgs } from '@sphereon/ms-authenticator' export interface IMsRequestApi extends IPluginMethodMap { - issuanceRequestMsVc(clientIssueRequest: IClientIssueRequest, context: IRequiredContext) : Promise + issuanceRequestMsVc(clientIssueRequest: IClientIssueRequest, context: IRequiredContext): Promise } export interface IClientIssueRequest { @@ -12,17 +12,17 @@ export interface IClientIssueRequest { } export interface IClientIssuanceConfig { - authority: string; - includeQRCode: boolean; - registration: Registration; - callback: Callback; - issuance: IClientIssuance; + authority: string + includeQRCode: boolean + registration: Registration + callback: Callback + issuance: IClientIssuance } export interface IClientIssuance { - type: string; - manifest: string; - pin: Pin; + type: string + manifest: string + pin: Pin } export interface IIssueRequest { @@ -39,22 +39,22 @@ export interface IIssueRequestResponse { } export interface Registration { - clientName: string; + clientName: string } export interface Headers { - apiKey: string; + apiKey: string } export interface Callback { - url: string; - state: string; - headers: Headers; + url: string + state: string + headers: Headers } export interface Pin { - value: string; - length: number; + value: string + length: number } export type CredentialSubject = { @@ -62,18 +62,18 @@ export type CredentialSubject = { } export interface Issuance { - type: string; - manifest: string; - pin: Pin; - claims: CredentialSubject; + type: string + manifest: string + pin: Pin + claims: CredentialSubject } export interface IssuanceConfig { - authority: string; - includeQRCode: boolean; - registration: Registration; - callback: Callback; - issuance: Issuance; + authority: string + includeQRCode: boolean + registration: Registration + callback: Callback + issuance: Issuance } export type IRequiredContext = IAgentContext> diff --git a/packages/ms-request-api/tsconfig.json b/packages/ms-request-api/tsconfig.json index 942a2fcde..239e4396a 100644 --- a/packages/ms-request-api/tsconfig.json +++ b/packages/ms-request-api/tsconfig.json @@ -5,5 +5,5 @@ "outDir": "dist", "declarationDir": "dist" }, - "references": [{ "path": "../ssi-sdk-core" }, { "path": "../ms-authenticator" }] + "references": [{ "path": "../ms-authenticator" }] } diff --git a/packages/tsconfig.json b/packages/tsconfig.json index f0dfa0170..24400b936 100644 --- a/packages/tsconfig.json +++ b/packages/tsconfig.json @@ -7,7 +7,7 @@ { "path": "mnemonic-seed-manager" }, { "path": "vc-api-issuer" }, { "path": "ms-authenticator" }, - { "path": "ms-request-api"}, + { "path": "ms-request-api" }, { "path": "vc-api-verifier" }, { "path": "vc-handler-ld-local" }, { "path": "did-auth-siop-op-authenticator" }, diff --git a/yarn.lock b/yarn.lock index 93d4fcf77..a0b90de4d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4015,6 +4015,13 @@ "@types/qs" "*" "@types/range-parser" "*" +"@types/express-session@^1.17.4": + version "1.17.5" + resolved "https://registry.yarnpkg.com/@types/express-session/-/express-session-1.17.5.tgz#13f48852b4aa60ff595835faeb4b4dda0ba0866e" + integrity sha512-l0DhkvNVfyUPEEis8fcwbd46VptfA/jmMwHfob2TfDMf3HyPLiB9mKD71LXhz5TMUobODXPD27zXSwtFQLHm+w== + dependencies: + "@types/express" "*" + "@types/express@*": version "4.17.13" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" @@ -6359,6 +6366,11 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + cookie@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" @@ -6693,7 +6705,7 @@ delimit-stream@0.1.0: resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== -depd@2.0.0: +depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -7047,7 +7059,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding@^0.1.12: +encoding@^0.1.11, encoding@^0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -7774,7 +7786,21 @@ express-handlebars@^6.0.2: graceful-fs "^4.2.10" handlebars "^4.7.7" -express@^4.17.2: +express-session@^1.17.2: + version "1.17.3" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.3.tgz#14b997a15ed43e5949cb1d073725675dd2777f36" + integrity sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw== + dependencies: + cookie "0.4.2" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~2.0.0" + on-headers "~1.0.2" + parseurl "~1.3.3" + safe-buffer "5.2.1" + uid-safe "~2.1.5" + +express@^4.17.1, express@^4.17.2: version "4.18.1" resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== @@ -8397,6 +8423,13 @@ glob@^8.0.2: minimatch "^5.0.1" once "^1.3.0" +global-fetch@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/global-fetch/-/global-fetch-0.2.2.tgz#69c295ba2bc94ce2207d176410987c2d56608b33" + integrity sha512-dpCYrp71569bLjFRO9em/EPKe6686JD60n55uVlqy75G6D1DIonVTTRzLj7yY7vXZ3nDmBkssiwGNtNRPVvZbw== + dependencies: + isomorphic-fetch "^2.2.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -9069,6 +9102,11 @@ is-ssh@^1.3.0: dependencies: protocols "^2.0.1" +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -9142,6 +9180,14 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isomorphic-fetch@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA== + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isomorphic-webcrypto@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/isomorphic-webcrypto/-/isomorphic-webcrypto-2.3.8.tgz#4a7493b486ef072b9f11b6f8fd66adde856e3eec" @@ -11405,6 +11451,14 @@ node-fetch@3.0.0-beta.9: data-uri-to-buffer "^3.0.1" fetch-blob "^2.1.1" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-forge@^0.10.0, node-forge@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -11927,6 +11981,11 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -12781,6 +12840,11 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ== + randombytes@2.1.0, randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -14638,6 +14702,13 @@ uid-number@0.0.6: resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w== +uid-safe@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + uint8arrays@3.0.0, uint8arrays@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.0.0.tgz#260869efb8422418b6f04e3fac73a3908175c63b" @@ -14955,6 +15026,11 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" +whatwg-fetch@>=0.10.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"