Hyperlinkv0.9.0-beta.0

Node

export const assume = (
  node: AnyNode,
  payload: { readonly token: string },
): Effect.Effect<
  void,
  | AssumeTokenMismatch
  | AssumeTokenReused
  | AssumeNotReady
  | NodeUnreachable
  | UnaddressedNode
> => {
  if (!isAddressedNode(node)) {
    return Effect.fail(new UnaddressedNode({ node: node.key }));
  }
  const address =
    typeof node.url === "string"
      ? node.url
      : typeof node.path === "string"
        ? node.path
        : node.key;
  return Effect.gen(function* () {
    yield* Effect.logDebug("Node.assume dialing peer").pipe(
      Effect.annotateLogs({
        "assume.node": node.key,
        "assume.address": address,
      }),
    );
    const { NodeStatusTag } = yield* Effect.promise(() => import("./nodeStatus"));
    const ctx = yield* Layer.build(
      Hyperlink.client(NodeStatusTag, node).pipe(
        Layer.provide(Hyperlink.clientVerify(false)),
      ),
    );
    yield* Effect.gen(function* () {
      const status = yield* NodeStatusTag;
      return yield* status.assume(payload);
    }).pipe(Effect.provide(ctx));
    yield* Effect.logInfo("Node.assume acknowledged").pipe(
      Effect.annotateLogs({ "assume.node": node.key }),
    );
  }).pipe(
    Effect.scoped,
    Effect.withLogSpan("node.assume"),
    Effect.withSpan("node.assume", {
      attributes: { "assume.node": node.key },
    }),
    Effect.mapError((cause) => {
      if (Schema.is(AssumeTokenMismatch)(cause)) return cause;
      if (Schema.is(AssumeTokenReused)(cause)) return cause;
      if (Schema.is(AssumeNotReady)(cause)) return cause;
      if (Predicate.isTagged(cause, "UnaddressedNode")) return cause;
      return new NodeUnreachable({
        node: node.key,
        url: address,
        cause,
      });
    }),
  );
};