Как я могу сделать Угловой Универсальный с зоной.JS дождитесь вызова вызова AWS Lambda SDK

#angular #apollo-client #zonejs

Вопрос:

Я использую Угловой Универсальный с зоной.JS и до сих пор думал, что он ждет разрешения моих вызовов API, прежде чем отправлять ответ. Как я понимаю, Зона.JS исправляет различные библиотеки, чтобы знать, когда приложение установилось и все готово.

Наше интерфейсное приложение работает в AWS Lambda, и в универсальном контексте мы выполняем другие вызовы AWS Lambda Apollo GraphQL к нашему API, используя пользовательскую ссылку.

Если я сделаю вызовы API, используя стандартный HttpClient, @angular/common/http то Universal будет ждать… но при использовании aws-sdk с агентом https этого не происходит. Я ни за что на свете не могу понять, как исправить это с помощью Зоны.

При просмотре углового HttpClient на сервере я вижу ссылки на перенос xhr2 в зону, но не уверен, как бы я сделал то же самое с помощью https/aws: https://github.com/angular/angular/blob/master/packages/platform-server/src/http.ts#L27

 import { Injectable } from '@angular/core';
import { ApolloLink, Observable } from '@apollo/client/core';
import { AuthService } from '@tma/core';
import AwsLambda from 'aws-sdk/clients/lambda';
import { print } from 'graphql';
import { Agent } from 'https';
import { first } from 'rxjs/operators';

@Injectable({ providedIn: 'root' })
export class ApiLinkLambda extends ApolloLink {
  client = new AwsLambda({
    region: process.env.AWS_REGION,
    httpOptions: {
      agent: new Agent({
        keepAlive: true,
        maxSockets: 50,
        rejectUnauthorized: true,
      }),
    },
  });

  constructor(authService: AuthService) {
    super(operation => {
      return new Observable(observer => {
        authService.token$
          .pipe(first())
          .toPromise()
          .then(token => {
            // Make lambda call
            return this.client
              .invoke({
                FunctionName: 'example-graphqlServer',
                InvocationType: 'RequestResponse',
                Payload: JSON.stringify({
                  body: {
                    query: print(operation.query),
                    variables: operation.variables,
                  },
                  headers: {
                    Authorization: token,
                  },
                  httpMethod: 'POST',
                  path: '/graphql',
                  requestContext: {
                    requestTimeEpoch: Date.now(),
                  },
                }),
              })
              .promise()
              .then(result => {
                const response = JSON.parse(result.Payload!.toString());
                const body = JSON.parse(response.body);
                observer.next(body);
                observer.complete();
              });
          });
      });
    });
  }
}