function SNS()

in src/plugins/AWS2SNSPlugin.ts [38:92]


    function SNS(this: any) {
      const sns = _SNS.apply(this, arguments);

      function instrument(name: string, addTraceId: any): void {
        const _func = sns[name];

        sns[name] = function (params: any, callback: any) {
          const to = params.TopicArn
            ? `Topic/${params.TopicArn.slice(params.TopicArn.lastIndexOf(':') + 1)}`
            : params.TargetArn
            ? `Target/${params.TargetArn.slice(params.TargetArn.lastIndexOf(':') + 1)}`
            : params.PhoneNumber
            ? `Phone/${params.PhoneNumber}`
            : '???';
          const operation = `AWS/SNS/${name}/${to}`;
          const span = ContextManager.current.newExitSpan(operation, Component.AWS_SNS, Component.HTTP);
          const arn = params.TopicArn || params.TargetArn;

          span.component = Component.AWS_SNS;
          span.layer = SpanLayer.MQ;

          if (arn) span.tag(Tag.arn(arn));

          if (params.TopicArn) params = addTraceId(params, span);

          return execute(span, this, _func, params, callback, 'mqBroker');
        };
      }

      instrument('publish', (params: any, span: Span) => {
        params = Object.assign({}, params);
        params.MessageAttributes = params.MessageAttributes ? Object.assign({}, params.MessageAttributes) : {};
        params.MessageAttributes.__revdTraceId = {
          DataType: 'String',
          StringValue: `${span.inject().value}/${hostname()}`,
        };

        return params;
      });

      instrument('publishBatch', (params: any, span: Span) => {
        const traceId = { __revdTraceId: { DataType: 'String', StringValue: `${span.inject().value}/${hostname()}` } };
        params = Object.assign({}, params);
        params.PublishBatchRequestEntries = params.PublishBatchRequestEntries.map(
          (e: any) =>
            (e = Object.assign({}, e, {
              MessageAttributes: e.MessageAttributes ? Object.assign({}, e.MessageAttributes, traceId) : traceId,
            })),
        );

        return params;
      });

      return sns;
    }