{"version":3,"file":"index.cjs","names":["AbstractGrantType","InvalidArgumentError","InvalidRequestError","InvalidTokenError"],"sources":["../src/verify-token.ts","../src/apple-grant-type.ts"],"sourcesContent":["import { createRemoteJWKSet, jwtVerify } from 'jose';\nimport type { AppleTokenData } from './types.js';\n\nconst JWKS = createRemoteJWKSet(new URL('https://appleid.apple.com/auth/keys'));\n\nconst ISSUER = 'https://appleid.apple.com';\n\nexport const verifyToken = async ({\n  token,\n  audience,\n}: {\n  token: string;\n  audience?: string | string[];\n}): Promise<AppleTokenData> => {\n  const { payload } = await jwtVerify<AppleTokenData>(token, JWKS, {\n    algorithms: ['RS256'],\n    issuer: ISSUER,\n    audience,\n  });\n\n  return payload;\n};\n","import {\n  AbstractGrantType,\n  InvalidArgumentError,\n  InvalidRequestError,\n  InvalidTokenError,\n} from '@node-oauth/oauth2-server';\nimport type {\n  Request,\n  Client,\n  TokenOptions,\n  User,\n  Token,\n} from '@node-oauth/oauth2-server';\nimport { verifyToken } from './verify-token.js';\nimport type { AppleTokenData, Model } from './types.js';\n\nexport interface Options extends TokenOptions {\n  model: Model;\n}\n\nexport class AppleGrantType extends AbstractGrantType {\n  model: Model;\n  appIds: string[] = [];\n\n  constructor(options: Options) {\n    super(options);\n\n    if (!options.model) {\n      throw new InvalidArgumentError('Missing parameter: `model`');\n    }\n\n    if (!options.model.getUserWithApple) {\n      throw new InvalidArgumentError(\n        'Invalid argument: model does not implement `getUserWithApple()`',\n      );\n    }\n\n    if (!options.model.saveToken) {\n      throw new InvalidArgumentError(\n        'Invalid argument: model does not implement `saveToken()`',\n      );\n    }\n\n    this.model = options.model;\n\n    const appId = this.model.appleGrantType?.appId;\n\n    if (appId) {\n      this.appIds = Array.isArray(appId) ? appId : [appId];\n    }\n\n    if (this.appIds.length === 0) {\n      throw new InvalidArgumentError(\n        'Invalid argument: Apple valid appId must be provided in options',\n      );\n    }\n\n    this.handle = this.handle.bind(this);\n    this.getUser = this.getUser.bind(this);\n    this.saveToken = this.saveToken.bind(this);\n  }\n\n  async handle(request: Request, client: Client) {\n    if (!request) {\n      throw new InvalidArgumentError('Missing parameter: `request`');\n    }\n\n    if (!client) {\n      throw new InvalidArgumentError('Missing parameter: `client`');\n    }\n\n    const scope = this.getScope(request);\n    const user = await this.getUser(request);\n\n    return await this.saveToken(user, client, scope);\n  }\n\n  async getUser(request: Request) {\n    const token = request.body.apple_token;\n    const name = request.body.name;\n\n    if (!token) {\n      throw new InvalidRequestError('Missing parameter: `apple_token`');\n    }\n\n    let data: AppleTokenData;\n\n    try {\n      data = await verifyToken({\n        token,\n        audience: this.appIds,\n      });\n    } catch {\n      throw new InvalidTokenError('Apple id token is invalid or expired');\n    }\n\n    return await this.model.getUserWithApple({ name, ...data });\n  }\n\n  async saveToken(user: User, client: Client, scope: string[]) {\n    const validatedScope = await this.validateScope(user, client, scope);\n    const accessToken = await this.generateAccessToken(client, user, scope);\n    const refreshToken = await this.generateRefreshToken(client, user, scope);\n    const accessTokenExpiresAt = this.getAccessTokenExpiresAt();\n    const refreshTokenExpiresAt = this.getRefreshTokenExpiresAt();\n\n    const token: Token = {\n      accessToken,\n      accessTokenExpiresAt,\n      refreshToken,\n      refreshTokenExpiresAt,\n      scope: validatedScope || [],\n      user: {\n        id: user.id,\n      },\n      client,\n    };\n\n    return await this.model.saveToken(token, client, user);\n  }\n}\n"],"mappings":";;;;AAGA,MAAM,QAAA,GAAA,KAAA,oBAA0B,IAAI,IAAI,qCAAqC,CAAC;AAE9E,MAAM,SAAS;AAEf,MAAa,cAAc,OAAO,EAChC,OACA,eAI6B;CAC7B,MAAM,EAAE,YAAY,OAAA,GAAA,KAAA,WAAgC,OAAO,MAAM;EAC/D,YAAY,CAAC,OAAO;EACpB,QAAQ;EACR;CACF,CAAC;CAED,OAAO;AACT;;;ACDA,IAAa,iBAAb,cAAoCA,0BAAAA,kBAAkB;CAIpD,YAAY,SAAkB;EAC5B,MAAM,OAAO;gBAHI,CAAC;EAKlB,IAAI,CAAC,QAAQ,OACX,MAAM,IAAIC,0BAAAA,qBAAqB,4BAA4B;EAG7D,IAAI,CAAC,QAAQ,MAAM,kBACjB,MAAM,IAAIA,0BAAAA,qBACR,iEACF;EAGF,IAAI,CAAC,QAAQ,MAAM,WACjB,MAAM,IAAIA,0BAAAA,qBACR,0DACF;EAGF,KAAK,QAAQ,QAAQ;EAErB,MAAM,QAAQ,KAAK,MAAM,gBAAgB;EAEzC,IAAI,OACF,KAAK,SAAS,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;EAGrD,IAAI,KAAK,OAAO,WAAW,GACzB,MAAM,IAAIA,0BAAAA,qBACR,iEACF;EAGF,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;EACnC,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;EACrC,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI;CAC3C;CAEA,MAAM,OAAO,SAAkB,QAAgB;EAC7C,IAAI,CAAC,SACH,MAAM,IAAIA,0BAAAA,qBAAqB,8BAA8B;EAG/D,IAAI,CAAC,QACH,MAAM,IAAIA,0BAAAA,qBAAqB,6BAA6B;EAG9D,MAAM,QAAQ,KAAK,SAAS,OAAO;EACnC,MAAM,OAAO,MAAM,KAAK,QAAQ,OAAO;EAEvC,OAAO,MAAM,KAAK,UAAU,MAAM,QAAQ,KAAK;CACjD;CAEA,MAAM,QAAQ,SAAkB;EAC9B,MAAM,QAAQ,QAAQ,KAAK;EAC3B,MAAM,OAAO,QAAQ,KAAK;EAE1B,IAAI,CAAC,OACH,MAAM,IAAIC,0BAAAA,oBAAoB,kCAAkC;EAGlE,IAAI;EAEJ,IAAI;GACF,OAAO,MAAM,YAAY;IACvB;IACA,UAAU,KAAK;GACjB,CAAC;EACH,QAAQ;GACN,MAAM,IAAIC,0BAAAA,kBAAkB,sCAAsC;EACpE;EAEA,OAAO,MAAM,KAAK,MAAM,iBAAiB;GAAE;GAAM,GAAG;EAAK,CAAC;CAC5D;CAEA,MAAM,UAAU,MAAY,QAAgB,OAAiB;EAC3D,MAAM,iBAAiB,MAAM,KAAK,cAAc,MAAM,QAAQ,KAAK;EACnE,MAAM,cAAc,MAAM,KAAK,oBAAoB,QAAQ,MAAM,KAAK;EACtE,MAAM,eAAe,MAAM,KAAK,qBAAqB,QAAQ,MAAM,KAAK;EAIxE,MAAM,QAAe;GACnB;GACA,sBAL2B,KAAK,wBAKb;GACnB;GACA,uBAN4B,KAAK,yBAMb;GACpB,OAAO,kBAAkB,CAAC;GAC1B,MAAM,EACJ,IAAI,KAAK,GACX;GACA;EACF;EAEA,OAAO,MAAM,KAAK,MAAM,UAAU,OAAO,QAAQ,IAAI;CACvD;AACF"}