Unverified Commit 37191e25 authored by Hong Minhee's avatar Hong Minhee
Browse files

Instrument `signJsonLd()`

parent a4d2cde1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ To be released.
     -  Added `VerifyObjectOptions.tracerProvider` option.
     -  Added `SignObjectOptions.tracerProvider` option.
     -  Added `VerifyJsonLdOptions.tracerProvider` option.
     -  Added `SignJsonLdOptions.tracerProvider` option.

 -  Added `@fedify/fedify/x/sveltekit` module for integrating with [SvelteKit]
    hook.  [[#171], [#183] by Jiyu Park]
+1 −0
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ spans:
| `activitypub.lookup_object`      | Client      | Looks up the Activity Streams object. |
| `http_signatures.sign`           | Internal    | Signs the HTTP request.               |
| `http_signatures.verify`         | Internal    | Verifies the HTTP request signature.  |
| `ld_signatures.sign`             | Internal    | Makes the Linked Data signature.      |
| `ld_signatures.verify`           | Internal    | Verifies the Linked Data signature.   |
| `object_integrity_proofs.sign`   | Internal    | Makes the object integrity proof.     |
| `object_integrity_proofs.verify` | Internal    | Verifies the object integrity proof.  |
+1 −0
Original line number Diff line number Diff line
@@ -1802,6 +1802,7 @@ export class FederationImpl<TContextData> implements Federation<TContextData> {
    } else {
      jsonLd = await signJsonLd(jsonLd, rsaKey.privateKey, rsaKey.keyId, {
        contextLoader: this.contextLoader,
        tracerProvider: this.tracerProvider,
      });
    }
    if (!proofCreated) {
+40 −2
Original line number Diff line number Diff line
@@ -114,6 +114,12 @@ export async function createSignature(
 * @since 1.0.0
 */
export interface SignJsonLdOptions extends CreateSignatureOptions {
  /**
   * The OpenTelemetry tracer provider for tracing the signing process.
   * If omitted, the global tracer provider is used.
   * @since 1.3.0
   */
  tracerProvider?: TracerProvider;
}

/**
@@ -135,8 +141,40 @@ export async function signJsonLd(
  keyId: URL,
  options: SignJsonLdOptions,
): Promise<{ signature: Signature }> {
  const signature = await createSignature(jsonLd, privateKey, keyId, options);
  const tracerProvider = options.tracerProvider ?? trace.getTracerProvider();
  const tracer = tracerProvider.getTracer(metadata.name, metadata.version);
  return await tracer.startActiveSpan(
    "ld_signatures.sign",
    {
      attributes: { "ld_signatures.key_id": keyId.href },
    },
    async (span) => {
      try {
        const signature = await createSignature(
          jsonLd,
          privateKey,
          keyId,
          options,
        );
        if (span.isRecording()) {
          span.setAttribute("ld_signatures.type", signature.type);
          span.setAttribute(
            "ld_signatures.signature",
            encodeHex(decodeBase64(signature.signatureValue)),
          );
        }
        return attachSignature(jsonLd, signature);
      } catch (error) {
        span.setStatus({
          code: SpanStatusCode.ERROR,
          message: String(error),
        });
        throw error;
      } finally {
        span.end();
      }
    },
  );
}

interface SignedJsonLd {