{"version":3,"file":"PKCEManager.mjs","sources":["../../../../../../web/src/PKCEManager.ts"],"sourcesContent":["import { ISyncPKCEManager, logger, ProofkeyPair } from '@stytch/core';\n\nimport { B2BSubscriptionDataLayer, ConsumerSubscriptionDataLayer } from './SubscriptionService';\n\nconst PKCE_VERIFIER_STORAGE_KEY = 'PKCE_VERIFIER' as const;\n\nfunction toHex(n: number): string {\n  let str = n.toString(16);\n  if (str.length === 1) {\n    str = '0' + str;\n  }\n  return str;\n}\n\nfunction base64URLEncode(buf: ArrayBuffer) {\n  // Convert the ArrayBuffer to string using Uint8 array.\n  // btoa takes chars from 0-255 and base64 encodes.\n  // Then convert the base64 encoded to base64url encoded.\n  // (replace + with -, replace / with _, trim trailing =)\n  return btoa(String.fromCharCode.call(null, ...new Uint8Array(buf)))\n    .replace(/\\+/g, '-')\n    .replace(/\\//g, '_')\n    .replace(/=+$/, '');\n}\n\nexport class PKCEManager implements ISyncPKCEManager {\n  constructor(\n    private _dataLayer: ConsumerSubscriptionDataLayer | B2BSubscriptionDataLayer,\n    private namespace: string,\n  ) {}\n\n  private key() {\n    return `${PKCE_VERIFIER_STORAGE_KEY}:${this.namespace}` as const;\n  }\n\n  async startPKCETransaction(): Promise<ProofkeyPair> {\n    const keyPair = await PKCEManager.createProofkeyPair();\n    this._dataLayer.setItem(this.key(), JSON.stringify(keyPair));\n    return keyPair;\n  }\n\n  getPKPair(): ProofkeyPair | undefined {\n    const serialized = this._dataLayer.getItem(this.key());\n    if (serialized === null) {\n      return undefined;\n    }\n    try {\n      return JSON.parse(serialized) as ProofkeyPair;\n    } catch {\n      logger.warn('Found malformed Proof Key pair in localstorage.');\n      return undefined;\n    }\n  }\n\n  clearPKPair(): void {\n    return this._dataLayer.removeItem(this.key());\n  }\n\n  static async createProofkeyPair(): Promise<ProofkeyPair> {\n    const bytes = new Uint32Array(16);\n    window.crypto.getRandomValues(bytes);\n    const codeVerifier = Array.from(bytes).map(toHex).join('');\n\n    const digest = await window.crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier));\n\n    return {\n      code_challenge: base64URLEncode(digest),\n      code_verifier: codeVerifier,\n    };\n  }\n}\n"],"names":["PKCE_VERIFIER_STORAGE_KEY","toHex","n","str","toString","length","base64URLEncode","buf","btoa","String","fromCharCode","call","Uint8Array","replace","PKCEManager","namespace","_dataLayer","key","startPKCETransaction","keyPair","createProofkeyPair","setItem","JSON","stringify","getPKPair","serialized","getItem","undefined","parse","logger","warn","clearPKPair","removeItem","bytes","Uint32Array","window","crypto","getRandomValues","codeVerifier","Array","from","map","join","digest","subtle","TextEncoder","encode","code_challenge","code_verifier"],"mappings":";;AAIA,MAAMA,yBAAAA,GAA4B,eAAA;AAElC,SAASC,MAAMC,CAAS,EAAA;IACtB,IAAIC,GAAAA,GAAMD,CAAAA,CAAEE,QAAQ,CAAC,EAAA,CAAA;IACrB,IAAID,GAAAA,CAAIE,MAAM,KAAK,CAAA,EAAG;AACpBF,QAAAA,GAAAA,GAAM,GAAA,GAAMA,GAAAA;AACd,IAAA;IACA,OAAOA,GAAAA;AACT;AAEA,SAASG,gBAAgBC,GAAgB,EAAA;;;;;IAKvC,OAAOC,IAAAA,CAAKC,OAAOC,YAAY,CAACC,IAAI,CAAC,IAAA,EAAA,GAAS,IAAIC,UAAAA,CAAWL,GAAAA,CAAAA,CAAAA,CAAAA,CAC1DM,OAAO,CAAC,KAAA,EAAO,KACfA,OAAO,CAAC,OAAO,GAAA,CAAA,CACfA,OAAO,CAAC,KAAA,EAAO,EAAA,CAAA;AACpB;AAEO,MAAMC,WAAAA,CAAAA;;;AACX,IAAA,WAAA,CACE,UAA4E,EACpEC,SAAiB,CACzB;aAFQC,UAAAA,GAAAA,UAAAA;aACAD,SAAAA,GAAAA,SAAAA;AACP,IAAA;IAEKE,GAAAA,GAAM;AACZ,QAAA,OAAO,GAAGjB,yBAAAA,CAA0B,CAAC,EAAE,IAAI,CAACe,SAAS,CAAA,CAAE;AACzD,IAAA;AAEA,IAAA,MAAMG,oBAAAA,GAA8C;QAClD,MAAMC,OAAAA,GAAU,MAAML,WAAAA,CAAYM,kBAAkB,EAAA;QACpD,IAAI,CAACJ,UAAU,CAACK,OAAO,CAAC,IAAI,CAACJ,GAAG,EAAA,EAAIK,IAAAA,CAAKC,SAAS,CAACJ,OAAAA,CAAAA,CAAAA;QACnD,OAAOA,OAAAA;AACT,IAAA;IAEAK,SAAAA,GAAsC;QACpC,MAAMC,UAAAA,GAAa,IAAI,CAACT,UAAU,CAACU,OAAO,CAAC,IAAI,CAACT,GAAG,EAAA,CAAA;AACnD,QAAA,IAAIQ,eAAe,IAAA,EAAM;YACvB,OAAOE,SAAAA;AACT,QAAA;QACA,IAAI;YACF,OAAOL,IAAAA,CAAKM,KAAK,CAACH,UAAAA,CAAAA;AACpB,QAAA,CAAA,CAAE,OAAM;AACNI,YAAAA,MAAAA,CAAOC,IAAI,CAAC,iDAAA,CAAA;YACZ,OAAOH,SAAAA;AACT,QAAA;AACF,IAAA;IAEAI,WAAAA,GAAoB;QAClB,OAAO,IAAI,CAACf,UAAU,CAACgB,UAAU,CAAC,IAAI,CAACf,GAAG,EAAA,CAAA;AAC5C,IAAA;AAEA,IAAA,aAAaG,kBAAAA,GAA4C;QACvD,MAAMa,KAAAA,GAAQ,IAAIC,WAAAA,CAAY,EAAA,CAAA;QAC9BC,MAAAA,CAAOC,MAAM,CAACC,eAAe,CAACJ,KAAAA,CAAAA;QAC9B,MAAMK,YAAAA,GAAeC,MAAMC,IAAI,CAACP,OAAOQ,GAAG,CAACxC,KAAAA,CAAAA,CAAOyC,IAAI,CAAC,EAAA,CAAA;AAEvD,QAAA,MAAMC,MAAAA,GAAS,MAAMR,MAAAA,CAAOC,MAAM,CAACQ,MAAM,CAACD,MAAM,CAAC,SAAA,EAAW,IAAIE,WAAAA,EAAAA,CAAcC,MAAM,CAACR,YAAAA,CAAAA,CAAAA;QAErF,OAAO;AACLS,YAAAA,cAAAA,EAAgBzC,eAAAA,CAAgBqC,MAAAA,CAAAA;YAChCK,aAAAA,EAAeV;AACjB,SAAA;AACF,IAAA;AACF;;;;"}