The core asks the outside for what it cannot do itself: storage, randomness, a hasher, the key management
service, the ceremonies of WebAuthn. Each of these is a port, an interface of Beffroi\Core\Port, and each port
has one to five methods, so a caller sees what it calls and nothing more. When two callers need disjoint halves of
a store, the store has two ports: a person's page reads CanPageCredentialsInterface, where a login reads
CredentialRepositoryInterface.
Where a port says what its implementations throw, it says it in its contract, as @throws: JwsSignerInterface
throws when the tenant has no active key or when the key management service does not answer, and
GeoLocatorInterface never throws at all, an address nothing knows being no place.
Beside its ports, the core reads two PSR interfaces it is handed: a clock (PSR-20), which its use cases read the
time from, and an event dispatcher (PSR-14), which the bundle binds to its event bus (events).
Most ports have one implementation, which the bundle aliases the interface to; a name in the tables below is that
implementation, in the bridge of the core (Beffroi\Core\Bridge) or in the bundle. Where several implementations
of one interface are read as one list, a port, an interface of the model or an interface of the bridge, a tag
feeds that list, every service carrying the tag being in it:
Tag
What the class implements
What reads the tagged list
beffroi.password_algorithm
PasswordAlgorithmInterface
WiredPasswordAlgorithms, the hasher of the first wired making every new hash
beffroi.password_hasher
AlgorithmPasswordHasherInterface
PasswordHasherRegistry, which hands each hash to the hasher that supports its algorithm
beffroi.authentication_predicate
AuthenticationPredicateInterface
WiredAuthenticationPredicates, which the acr vocabulary and the floor of a tenant name predicates from
beffroi.archive_chapter
ArchiveChapterInterface
The archive a person asks for, one chapter per class
beffroi.dead_records
DeadRecordsInterface
The hourly step that drops the rows that can no longer do anything
beffroi.key_bound_artifact
KeyBoundArtifactInterface
The retirement window of a key
beffroi.signature_algorithm
JoseSignatureAlgorithmInterface
JoseSignatureAlgorithms, the first wired being the default signature algorithm
beffroi.key_encryption_algorithm
JoseKeyEncryptionAlgorithmInterface
JoseKeyEncryptionAlgorithms
beffroi.content_encryption_algorithm
JoseContentEncryptionAlgorithmInterface
JoseContentEncryptionAlgorithms
beffroi.message_sealing_algorithm
JoseMessageSealingAlgorithmInterface
JoseMessageSealingAlgorithms
beffroi.application_server_algorithm
JoseApplicationServerAlgorithmInterface
JoseApplicationServerAlgorithms, the configuration of web push tagging the algorithm when web push is turned on
beffroi.claim
ClaimInterface
WiredClaims, the claims a person may describe themselves with and an upstream profile may fill
The bridge of the core holds fourteen stores in memory, for tests and for whoever wires the core without the
bundle: InMemoryUserRepository, InMemoryCredentialRepository, InMemoryAuthenticationSessionRepository,
InMemoryTenantKeyRepository and their siblings; the journal has none. It holds three implementations that
answer nothing, NullBreachedPasswords, which asks no list, NullGeoLocator, which finds no place, and
NullUserAgentParser, which reads no device, and two sources fixed for tests, FixedUuidGenerator and
FixedRandomness. The protocol has ports of its own, which the ports of the protocol list.