async send()

in source/custom-resources/lib/shared/cfResponse.js [88:150]


  async send(data, physicalResourceId) {
    return new Promise((resolve, reject) => {
      const [
        responseStatus,
        responseData,
      ] = CloudFormationResponse.parseResponseData(data);
      console.log(`parseResponseData = ${JSON.stringify({ responseStatus, responseData }, null, 2)}`);

      /* TODO: remove the testing code */
      if (this.isUnitTest()) {
        resolve(responseData);
        return;
      }

      const responseBody = JSON.stringify({
        Status: responseStatus,
        Reason: `See details in CloudWatch Log Stream: ${this.logStreamName}`,
        PhysicalResourceId: physicalResourceId || this.logStreamName,
        StackId: this.stackId,
        RequestId: this.requestId,
        LogicalResourceId: this.logicalResourceId,
        Data: responseData,
      });

      let result = '';
      const url = URL.parse(this.responseUrl);
      const params = {
        hostname: url.hostname,
        port: 443,
        path: url.path,
        method: 'PUT',
        headers: {
          'Content-Type': '',
          'Content-Length': responseBody.length,
        },
      };

      const request = HTTPS.request(params, (response) => {
        response.setEncoding('utf8');
        response.on('data', (chunk) => {
          result += chunk.toString();
        });
        response.on('end', () => {
          if (response.statusCode >= 400) {
            const e = new Error(`${params.method} ${url.path} ${response.statusCode}`);
            e.statusCode = response.statusCode;
            reject(e);
          } else {
            resolve(result);
          }
        });
      });

      request.once('error', (e) => {
        e.message = `${params.method} ${url.path} - ${e.message}`;
        reject(e);
      });
      if (responseBody.length > 0) {
        request.write(responseBody);
      }
      request.end();
    });
  }