async (req: IncomingMessage) => {
    const issuer = await Issuer.discover('https://accounts.google.com');
    console.log('Discovered issuer %O', issuer.metadata.issuer);

    const client = new issuer.Client({
        client_id: 'c',
        client_secret: 's',
        redirect_uris: ['http://localhost:3000/cb'],
        response_types: ['code'],
    });
    console.log(client.metadata.client_id);

    const code_verifier = generators.codeVerifier();

    const code_challenge = generators.codeChallenge(code_verifier);

    client.authorizationUrl({
        scope: 'openid email profile',
        response_mode: 'form_post',
        nonce: 'nonce',
        resource: 'https://my.api.example.com/resource/32178',
        code_challenge,
        code_challenge_method: 'S256',
    }).substring(0);

    const params = client.callbackParams(req);
    const tokenSet = await client.callback('https://client.example.com/callback', params, { code_verifier });
    console.log(tokenSet.id_token, tokenSet.access_token, tokenSet.refresh_token);
    console.log(tokenSet.expired(), tokenSet.claims()["some claim name"]);

    await client.userinfo("access token");
    const userinfo = await client.userinfo(tokenSet);
    console.log(userinfo["some user info name"]);

    client.endSessionUrl({ id_token_hint: "id_token_hint" }).substring(0);
};
async (req: IncomingMessage) => {
    const issuer = await Issuer.discover('https://accounts.google.com');
    console.log('Discovered issuer %O', issuer.metadata.issuer);

    issuer.keystore();
    issuer.keystore(true);

    //

    const client = new issuer.Client({
        client_id: 'c',
        client_secret: 's',
        redirect_uris: ['http://localhost:3000/cb'],
        response_types: ['code'],
    });
    console.log(client.metadata.client_id);

    //

    const code_verifier = generators.codeVerifier();

    const code_challenge = generators.codeChallenge(code_verifier);

    //

    client.authorizationUrl({
        scope: 'openid email profile',
        response_mode: 'form_post',
        nonce: 'nonce',
        resource: 'https://my.api.example.com/resource/32178',
        code_challenge,
        code_challenge_method: 'S256',
    }).substring(0);

    //

    const params = client.callbackParams(req);
    const callbackResponse = await client.callback('https://client.example.com/callback', params, { code_verifier });
    console.log(callbackResponse.id_token, callbackResponse.access_token, callbackResponse.refresh_token);
    console.log(callbackResponse.expired(), callbackResponse.claims()["some claim name"]);

    //

    await client.userinfo("access token");
    const userinfo = await client.userinfo(callbackResponse);
    console.log(userinfo["some user info name"]);

    //

    const grantResponse = await client.grant({
        grant_type: "client_credentials",
        acr_values: "acr_values",
    });
    console.log(grantResponse.access_token);

    //

    const introspectResponse = await client.introspect("token");
    console.log(introspectResponse["some claim name"]);

    client.introspect("token", "tokenTypeHint");

    client.introspect("token", "tokenTypeHint", {});
    client.introspect("token", "tokenTypeHint", { introspectBody: {} });

    //

    client.endSessionUrl({ id_token_hint: "id_token_hint" }).substring(0);
};