PackageService
fraktal-lib / PackageService
Class: PackageService
Defined in: src/lib/services/package/PackageService.ts:83
High-level API for interacting with blockchain-based package management via Hyperledger FireFly.
Responsibilities:
- Create and manage FireFly datatypes and contract APIs.
- Invoke smart contract functions for package lifecycle.
- Subscribe to blockchain events and dispatch them to registered handlers.
Examples
import FireFly from "@hyperledger/firefly-sdk"
import { PackageService } from "fraktal-lib"
const ff = new FireFly(/* ... */)
const svc = new PackageService(ff)
await svc.initalize()
await svc.onEvent("CreatePackage", (e) => {
console.log("New package:", e.output.externalId, e.txid)
})
const packageDetails = { /* ... */ }
const pii = { name: "Alice" }
const salt = crypto.randomBytes(16).toString("hex")
await svc.createPackage("pkg123", packageDetails, pii, salt)
Constructors
Constructor
new PackageService(
ff):PackageService
Defined in: src/lib/services/package/PackageService.ts:88
Parameters
ff
FireFly
Returns
PackageService
Methods
acceptTransfer()
acceptTransfer(
externalId,termsId,privateTransferTerms):Promise<Required<{ }>>
Defined in: src/lib/services/package/PackageService.ts:792
Accepts a previously proposed transfer.
The chaincode internally verifies the package details and PII hash by calling CheckPackageDetailsAndPIIHash. The caller must provide the private transfer terms via transient map for verification.
Parameters
externalId
string
Package external ID.
termsId
string
Identifier of the terms being accepted.
privateTransferTerms
Private fields (e.g., salt, price) sent via transientMap.
price
number
salt
string
Returns
Promise<Required<{ }>>
FireFly invocation response.
checkPackageDetailsAndPIIHash()
checkPackageDetailsAndPIIHash(
externalId,expectedHash):Promise<boolean>
Defined in: src/lib/services/package/PackageService.ts:674
Verifies that the private package details and PII hash matches the expected hash.
Parameters
externalId
string
Package external ID.
expectedHash
string
Expected SHA256 hex hash.
Returns
Promise<boolean>
true if the hash matches; otherwise false.
createPackage()
createPackage(
externalId,recipientOrgMSP,packageDetails,pii,salt,broadcast):Promise<Required<{ }>>
Defined in: src/lib/services/package/PackageService.ts:531
Creates a new package on-chain.
Parameters
externalId
string
Unique external identifier for the package.
recipientOrgMSP
string
packageDetails
Public package metadata (serialized into transient map).
pii
Private identifiable information (serialized into transient map).
salt
string
Random salt used for hashing private data elsewhere.
broadcast
boolean = true
Whether to broadcast the transaction (default: true).
Returns
Promise<Required<{ }>>
FireFly invocation response (transaction submission).
Example
await svc.createPackage("pkg-001", details, { name: "Alice" }, saltHex);
deletePackage()
deletePackage(
externalId):Promise<Required<{ }>>
Defined in: src/lib/services/package/PackageService.ts:653
Deletes a package from the ledger. You can only delete packages that you own and that are in a deletable state.
Parameters
externalId
string
Package external ID.
Returns
Promise<Required<{ }>>
FireFly invocation response.
executeTransfer()
executeTransfer(
externalId,termsId,storeObject):Promise<Required<{ }>>
Defined in: src/lib/services/package/PackageService.ts:824
Executes a confirmed transfer (finalization step).
Parameters
externalId
string
Package external ID.
termsId
string
Transfer terms ID.
storeObject
The same data passed in CreatePackage, including salt, PII, and packageDetails. For integrity verification and transfer of data to the new owner.
Returns
Promise<Required<{ }>>
FireFly invocation response.
getDataType()
getDataType():
Promise<{ }>
Defined in: src/lib/services/package/PackageService.ts:400
Retrieves the private package datatype from FireFly.
Returns
Promise<{ }>
The datatype object.
Throws
If the datatype does not exist.
getLocalPackage()
getLocalPackage(
id):Promise<Required<{ }> |null>
Defined in: src/lib/services/package/PackageService.ts:493
Reads a locally-cached FireFly data record by ID.
Parameters
id
string
FireFly data ID.
Returns
Promise<Required<{ }> | null>
The data record (if found) or null if missing/errored.
getTransferOfferDataType()
getTransferOfferDataType():
Promise<{ }>
Defined in: src/lib/services/package/PackageService.ts:472
Retrieve the Transfer Offer FireFly datatype.
This method first verifies that the Transfer Offer datatype exists by calling
transferOfferDataTypeExists(). If the datatype is not present, it throws an Error.
If it exists, the method queries the FireFly client (this.ff.getDatatypes) for
datatypes matching the configured name and version and returns the first result.
Returns
Promise<{ }>
A promise that resolves to the first matching FireFly datatype.
Throws
If the Transfer Offer datatype does not exist.
Throws
If the underlying FireFly client call (this.ff.getDatatypes) fails.
initalize()
initalize():
Promise<void>
Defined in: src/lib/services/package/PackageService.ts:102
Initializes the service:
- Ensures the private package datatype exists (creates if missing).
- Ensures the transfer offer datatype exists (creates if missing).
- Ensures the contract interface and contract API exist (creates if missing).
- Registers blockchain event listeners for all interface events.
Safe to call multiple times; subsequent calls will no-op.
Returns
Promise<void>
Resolves when initialization finishes.
initialized()
initialized():
boolean
Defined in: src/lib/services/package/PackageService.ts:122
Whether the service has completed initialization.
Returns
boolean
true if initialized; otherwise false.
onEvent()
Call Signature
onEvent(
eventName,handler):Promise<void>
Defined in: src/lib/services/package/PackageService.ts:267
Registers a local handler for a blockchain event with type-safe casting. Provides specific event types for known events, and a generic fallback for others.
Parameters
eventName
"CreatePackage"
Name of the blockchain event (as defined in the contract interface).
handler
(event) => void
Callback invoked for each event delivery with properly typed event data.
Returns
Promise<void>
Example
// Type-safe listener for CreatePackage event
await svc.onEvent("CreatePackage", (e) => {
console.log(e.output.externalId, e.output.ownerOrgMSP)
})
// Type-safe listener for StatusUpdated event
await svc.onEvent("StatusUpdated", (e) => {
console.log(e.output.externalId, e.output.status)
})
// Type-safe listener for ProposeTransfer event
await svc.onEvent("ProposeTransfer", (e) => {
console.log(e.output.termsId, e.output.terms.fromMSP)
})
Call Signature
onEvent(
eventName,handler):Promise<void>
Defined in: src/lib/services/package/PackageService.ts:274
Registers a local handler for a blockchain event with type-safe casting. Provides specific event types for known events, and a generic fallback for others.
Parameters
eventName
"StatusUpdated"
Name of the blockchain event (as defined in the contract interface).
handler
(event) => void
Callback invoked for each event delivery with properly typed event data.
Returns
Promise<void>
Example
// Type-safe listener for CreatePackage event
await svc.onEvent("CreatePackage", (e) => {
console.log(e.output.externalId, e.output.ownerOrgMSP)
})
// Type-safe listener for StatusUpdated event
await svc.onEvent("StatusUpdated", (e) => {
console.log(e.output.externalId, e.output.status)
})
// Type-safe listener for ProposeTransfer event
await svc.onEvent("ProposeTransfer", (e) => {
console.log(e.output.termsId, e.output.terms.fromMSP)
})
Call Signature
onEvent(
eventName,handler):Promise<void>
Defined in: src/lib/services/package/PackageService.ts:281
Registers a local handler for a blockchain event with type-safe casting. Provides specific event types for known events, and a generic fallback for others.
Parameters
eventName
"DeletePackage"
Name of the blockchain event (as defined in the contract interface).
handler
(event) => void
Callback invoked for each event delivery with properly typed event data.
Returns
Promise<void>
Example
// Type-safe listener for CreatePackage event
await svc.onEvent("CreatePackage", (e) => {
console.log(e.output.externalId, e.output.ownerOrgMSP)
})
// Type-safe listener for StatusUpdated event
await svc.onEvent("StatusUpdated", (e) => {
console.log(e.output.externalId, e.output.status)
})
// Type-safe listener for ProposeTransfer event
await svc.onEvent("ProposeTransfer", (e) => {
console.log(e.output.termsId, e.output.terms.fromMSP)
})
Call Signature
onEvent(
eventName,handler):Promise<void>
Defined in: src/lib/services/package/PackageService.ts:288
Registers a local handler for a blockchain event with type-safe casting. Provides specific event types for known events, and a generic fallback for others.
Parameters
eventName
"ProposeTransfer"
Name of the blockchain event (as defined in the contract interface).
handler
(event) => void
Callback invoked for each event delivery with properly typed event data.
Returns
Promise<void>
Example
// Type-safe listener for CreatePackage event
await svc.onEvent("CreatePackage", (e) => {
console.log(e.output.externalId, e.output.ownerOrgMSP)
})
// Type-safe listener for StatusUpdated event
await svc.onEvent("StatusUpdated", (e) => {
console.log(e.output.externalId, e.output.status)
})
// Type-safe listener for ProposeTransfer event
await svc.onEvent("ProposeTransfer", (e) => {
console.log(e.output.termsId, e.output.terms.fromMSP)
})
Call Signature
onEvent(
eventName,handler):Promise<void>
Defined in: src/lib/services/package/PackageService.ts:295
Registers a local handler for a blockchain event with type-safe casting. Provides specific event types for known events, and a generic fallback for others.
Parameters
eventName
"AcceptTransfer"
Name of the blockchain event (as defined in the contract interface).
handler
(event) => void
Callback invoked for each event delivery with properly typed event data.
Returns
Promise<void>
Example
// Type-safe listener for CreatePackage event
await svc.onEvent("CreatePackage", (e) => {
console.log(e.output.externalId, e.output.ownerOrgMSP)
})
// Type-safe listener for StatusUpdated event
await svc.onEvent("StatusUpdated", (e) => {
console.log(e.output.externalId, e.output.status)
})
// Type-safe listener for ProposeTransfer event
await svc.onEvent("ProposeTransfer", (e) => {
console.log(e.output.termsId, e.output.terms.fromMSP)
})
Call Signature
onEvent(
eventName,handler):Promise<void>
Defined in: src/lib/services/package/PackageService.ts:302
Registers a local handler for a blockchain event with type-safe casting. Provides specific event types for known events, and a generic fallback for others.
Parameters
eventName
"TransferExecuted"
Name of the blockchain event (as defined in the contract interface).
handler
(event) => void
Callback invoked for each event delivery with properly typed event data.
Returns
Promise<void>
Example
// Type-safe listener for CreatePackage event
await svc.onEvent("CreatePackage", (e) => {
console.log(e.output.externalId, e.output.ownerOrgMSP)
})
// Type-safe listener for StatusUpdated event
await svc.onEvent("StatusUpdated", (e) => {
console.log(e.output.externalId, e.output.status)
})
// Type-safe listener for ProposeTransfer event
await svc.onEvent("ProposeTransfer", (e) => {
console.log(e.output.termsId, e.output.terms.fromMSP)
})
Call Signature
onEvent(
eventName,handler):Promise<void>
Defined in: src/lib/services/package/PackageService.ts:310
Registers a local handler for a blockchain event with type-safe casting. Provides specific event types for known events, and a generic fallback for others.
Parameters
eventName
"message"
Name of the blockchain event (as defined in the contract interface).
handler
(event) => void
Callback invoked for each event delivery with properly typed event data.
Returns
Promise<void>
Example
// Type-safe listener for CreatePackage event
await svc.onEvent("CreatePackage", (e) => {
console.log(e.output.externalId, e.output.ownerOrgMSP)
})
// Type-safe listener for StatusUpdated event
await svc.onEvent("StatusUpdated", (e) => {
console.log(e.output.externalId, e.output.status)
})
// Type-safe listener for ProposeTransfer event
await svc.onEvent("ProposeTransfer", (e) => {
console.log(e.output.termsId, e.output.terms.fromMSP)
})
Call Signature
onEvent(
eventName,handler):Promise<void>
Defined in: src/lib/services/package/PackageService.ts:316
Registers a local handler for a blockchain event with type-safe casting. Provides specific event types for known events, and a generic fallback for others.
Parameters
eventName
string
Name of the blockchain event (as defined in the contract interface).
handler
(event) => void
Callback invoked for each event delivery with properly typed event data.
Returns
Promise<void>
Example
// Type-safe listener for CreatePackage event
await svc.onEvent("CreatePackage", (e) => {
console.log(e.output.externalId, e.output.ownerOrgMSP)
})
// Type-safe listener for StatusUpdated event
await svc.onEvent("StatusUpdated", (e) => {
console.log(e.output.externalId, e.output.status)
})
// Type-safe listener for ProposeTransfer event
await svc.onEvent("ProposeTransfer", (e) => {
console.log(e.output.termsId, e.output.terms.fromMSP)
})
packageExists()
packageExists(
externalId):Promise<boolean>
Defined in: src/lib/services/package/PackageService.ts:615
Checks if a package exists on-chain.
Parameters
externalId
string
Package external ID.
Returns
Promise<boolean>
true if the package exists; otherwise false.
proposeTransfer()
proposeTransfer(
externalId,toMSP,terms,expiryISO?):Promise<Required<{ }>>
Defined in: src/lib/services/package/PackageService.ts:705
Proposes a transfer to another organization.
Parameters
externalId
string
Package external ID.
toMSP
string
MSP ID of the recipient organization.
terms
Proposed terms { id, price, salt }. The price and salt are sent privately via transientMap.
id
string
price
number
salt
string
expiryISO?
string
Optional ISO-8601 expiry time for the offer.
Returns
Promise<Required<{ }>>
FireFlyContractInvokeResponse.
Example
const salt = crypto.randomBytes(16).toString("hex")
await svc.proposeTransfer("pkg-001", "Org2MSP", { id: "t-123", price: 42.5, salt });
readBlockchainPackage()
readBlockchainPackage(
externalId):Promise<BlockchainPackage>
Defined in: src/lib/services/package/PackageService.ts:595
Reads the public, on-chain package record.
Parameters
externalId
string
Package external ID.
Returns
Promise<BlockchainPackage>
The BlockchainPackage.
readPackageDetailsAndPII()
readPackageDetailsAndPII(
externalId):Promise<Required<any>>
Defined in: src/lib/services/package/PackageService.ts:633
Reads the private package details and PII visible to the caller’s org.
Parameters
externalId
string
Package external ID.
Returns
Promise<Required<any>>
Implementation-specific object with details + PII.
readPrivateTransferTerms()
readPrivateTransferTerms(
termsId):Promise<Required<any>>
Defined in: src/lib/services/package/PackageService.ts:765
Reads the private transfer terms for a given terms ID. Only the recipient organization (toMSP) can read their private terms.
Parameters
termsId
string
Transfer terms identifier.
Returns
Promise<Required<any>>
The private transfer terms as a JSON string.
readTransferTerms()
readTransferTerms(
termsId):Promise<Required<any>>
Defined in: src/lib/services/package/PackageService.ts:744
Reads the public transfer terms for a given terms ID.
Parameters
termsId
string
Transfer terms identifier.
Returns
Promise<Required<any>>
The transfer terms as a JSON string.
transferOfferDataTypeExists()
transferOfferDataTypeExists():
Promise<boolean>
Defined in: src/lib/services/package/PackageService.ts:451
Determines whether the Transfer Offer data type (identified by TRANSFER_OFFER_DT_NAME and TRANSFER_OFFER_DT_VERSION) is present in the data type registry.
The method queries the underlying data-type service via this.ff.getDatatypes(...) and returns
true if at least one matching data type is returned.
Returns
Promise<boolean>
A Promise that resolves to true if one or more matching data types exist, otherwise false.
Throws
Propagates any error thrown by this.ff.getDatatypes.
transferToPM3()
transferToPM3(
externalId):Promise<Required<{ }>>
Defined in: src/lib/services/package/PackageService.ts:851
Transfers a package to PM3 (used for archiving or external transfers). The reciepient is always PM3. Additionally the package status must be "Delivered" to be eligible for transfer to PM3 and the reciepint org must be the owner (and the one executing the transfer).
Parameters
externalId
string
Package external ID.
Returns
Promise<Required<{ }>>
FireFly invocation response.
updatePackageStatus()
updatePackageStatus(
externalId,status):Promise<Required<{ }>>
Defined in: src/lib/services/package/PackageService.ts:574
Updates the status of an existing package.
Parameters
externalId
string
Package external ID.
status
New Status.
Returns
Promise<Required<{ }>>
FireFly invocation response.
uploadPackage()
uploadPackage(
pkg):Promise<Required<{ }>>
Defined in: src/lib/services/package/PackageService.ts:500
Parameters
pkg
Returns
Promise<Required<{ }>>