export function negotiate()

in sdk/webpubsub-socketio-extension/src/SIO/components/negotiate.ts [27:59]


export function negotiate(
  io: SIO.Server | AzureSocketIOOptions | AzureSocketIOCredentialOptions,
  configureNegotiateOptions?: ConfigureNegotiateOptions
): (req: IncomingMessage, res: ServerResponse, next: (err?: Error) => void) => void {
  debug(`getNegotiateExpressMiddleware`);

  const wpsOptions: AzureSocketIOOptions | AzureSocketIOCredentialOptions =
    io instanceof SIO.Server ? io[WEB_PUBSUB_OPTIONS_PROPERY_NAME] : io;
  const serviceClient = getWebPubSubServiceClient(wpsOptions);

  return async (req: IncomingMessage, res: ServerResponse, _next: (err?: Error) => void): Promise<void> => {
    try {
      debug("negotiate, start");

      if (!configureNegotiateOptions) {
        configureNegotiateOptions = defaultNegotiateOptions;
      }
      const negotiateOptions = await configureNegotiateOptions(req);
      const tokenResponse = await serviceClient.getClientAccessToken(negotiateOptions);
      const url = new URL(tokenResponse.baseUrl);
      const message: NegotiateResponse = {
        endpoint: url.origin,
        path: url.pathname,
        token: tokenResponse.token,
      };
      writeResponse(res, 200, message);
      debug("negotiate, finished");
    } catch (e) {
      writeResponse(res, 500, { message: "Internal Server Error" });
      debug(`negotiate, error: ${e.message}`);
    }
  };
}