nupp.digest.spi

Implementation interfaces for nupp.digest algorithm catalogs.

The facade chooses the unique highest priority during module initialization. Importing this declaration does not load storage or algorithms. A provider supplies an algorithms map keyed by canonical algorithm name. Each descriptor's name agrees with its key, and each create returns independent owned state. The chosen catalog replaces matching built-in algorithms and may add names; other built-in algorithms remain available. Empty discovery uses the built-in catalog. Discovery order never selects a provider.

The facade validates and retains descriptors while requiring the module. Lookup, listing, and context creation then use cached descriptors without SPI resolution. Provider state processes chunks incrementally and retains neither input nor output spans. Cleanup consumes state without suspension. Reuse these canonical State and Algorithm identities, including ownership and borrowing signatures. Finalization writes exactly digestSize bytes into the caller's output span. The facade closes state on successful or failed finalization. Standard digest names retain their standard output sizes. MD5 and SHA-1 support interoperability; applications requiring collision resistance must choose an appropriate digest.

Module contents

Types

TypeKindDescription
AlgorithminterfaceImmutable algorithm identity, output metadata, and a factory for fresh state.
ProviderinterfaceA selectable implementation catalog.
StateinterfaceIndependent incremental state; close consumes its ownership without suspension.

Types#

Algorithminterface#

interface Algorithm ...

Immutable algorithm identity, output metadata, and a factory for fresh state.

Members

NameKindDescription
namefieldCanonical algorithm name, matching the catalog map key.
digestSizefieldFixed output size in bytes.
createmethodCreates independent owned state; self is the retained descriptor.

namefield#

name: string
@readonly

Canonical algorithm name, matching the catalog map key.

digestSizefield#

digestSize: integer
@readonly

Fixed output size in bytes.

createmethod#

create: function(self: Algorithm): State

Creates independent owned state; self is the retained descriptor.

Arguments
NameTypeDescription
selfAlgorithm
Returns
TypeDescription
State

Providerinterface#

interface Provider ...

A selectable implementation catalog. Extra descriptor members are permitted.

Members

NameKindDescription
priorityfield
algorithmsfieldCanonical names mapped to checked, independent-state factories.

priorityfield#

priority: integer?
@readonly

algorithmsfield#

algorithms: {[string]: Algorithm}
@readonly

Canonical names mapped to checked, independent-state factories.

Stateinterface#

interface State is nupp.Closeable ...

Independent incremental state; close consumes its ownership without suspension.

Members

NameKindDescription
closemethodReleases all state resources.
updatemethodProcesses this borrowed chunk without retaining its bytes.
finishmethodWrites exactly the descriptor's digestSize bytes.

closemethod#

close: @nosuspend function(takes self: State): nil

Releases all state resources.

Arguments
NameTypeDescription
takes selfState
Returns
TypeDescription
nil

updatemethod#

update: function(exclusive self: State, borrows bytes: ByteSpan): nil

Processes this borrowed chunk without retaining its bytes.

Arguments
NameTypeDescription
exclusive selfState
borrows bytesByteSpan
Returns
TypeDescription
nil

finishmethod#

finish: function(exclusive self: State, exclusive destination: ByteWriteSpan): nil

Writes exactly the descriptor's digestSize bytes. Does not close state; the owning facade closes it on success and on failure.

Arguments
NameTypeDescription
exclusive selfState
exclusive destinationByteWriteSpan
Returns
TypeDescription
nil