#pragma once #include #include namespace workerd::server { class ActorIdFactoryImpl final: public ActorIdFactory { public: ActorIdFactoryImpl(kj::StringPtr uniqueKey); ActorIdFactoryImpl(const kj::byte keyParam[SHA256_DIGEST_LENGTH]); class ActorIdImpl final: public ActorId { public: ActorIdImpl(const kj::byte idParam[SHA256_DIGEST_LENGTH], kj::Maybe name); kj::String toString() const override; kj::Maybe getName() const override; kj::Maybe getJurisdiction() const override; bool equals(const ActorId& other) const override; kj::Own clone() const override; void clearName() { name = kj::none; } private: kj::byte id[SHA256_DIGEST_LENGTH]; kj::Maybe name; }; kj::Own newUniqueId(kj::Maybe jurisdiction) override; kj::Own idFromName(kj::String name) override; kj::Own idFromString(kj::String str) override; kj::Own cloneWithJurisdiction( kj::Maybe maybeJurisdiction) override; bool matchesJurisdiction(const ActorId& id) override; private: kj::byte key[SHA256_DIGEST_LENGTH]; uint64_t counter = 0; // only used in predictable mode static constexpr size_t BASE_LENGTH = SHA256_DIGEST_LENGTH / 2; void computeMac(kj::byte id[BASE_LENGTH + SHA256_DIGEST_LENGTH]); }; } // namespace workerd::server