@psavelis/enterprise-blockchain 0.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -2
- package/dist/aid-settlement/application/reconciler.d.ts +13 -0
- package/dist/aid-settlement/application/reconciler.d.ts.map +1 -0
- package/dist/aid-settlement/application/reconciler.js +77 -0
- package/dist/aid-settlement/domain/entities.d.ts +24 -0
- package/dist/aid-settlement/domain/entities.d.ts.map +1 -0
- package/dist/aid-settlement/domain/entities.js +1 -0
- package/dist/aid-settlement/domain/ports.d.ts +10 -0
- package/dist/aid-settlement/domain/ports.d.ts.map +1 -0
- package/dist/aid-settlement/domain/ports.js +1 -0
- package/dist/aid-settlement/index.d.ts +19 -0
- package/dist/aid-settlement/index.d.ts.map +1 -0
- package/dist/aid-settlement/index.js +23 -0
- package/dist/aid-settlement/infrastructure/in-memory-store.d.ts +12 -0
- package/dist/aid-settlement/infrastructure/in-memory-store.d.ts.map +1 -0
- package/dist/aid-settlement/infrastructure/in-memory-store.js +17 -0
- package/dist/credentialing/application/clearance-evaluator.d.ts +10 -0
- package/dist/credentialing/application/clearance-evaluator.d.ts.map +1 -0
- package/dist/credentialing/application/clearance-evaluator.js +63 -0
- package/dist/credentialing/domain/entities.d.ts +28 -0
- package/dist/credentialing/domain/entities.d.ts.map +1 -0
- package/dist/credentialing/domain/entities.js +1 -0
- package/dist/credentialing/domain/ports.d.ts +9 -0
- package/dist/credentialing/domain/ports.d.ts.map +1 -0
- package/dist/credentialing/domain/ports.js +1 -0
- package/dist/credentialing/index.d.ts +19 -0
- package/dist/credentialing/index.d.ts.map +1 -0
- package/dist/credentialing/index.js +23 -0
- package/dist/credentialing/infrastructure/in-memory-store.d.ts +11 -0
- package/dist/credentialing/infrastructure/in-memory-store.d.ts.map +1 -0
- package/dist/credentialing/infrastructure/in-memory-store.js +14 -0
- package/dist/hsm/application/asymmetric-key-service.d.ts +23 -0
- package/dist/hsm/application/asymmetric-key-service.d.ts.map +1 -0
- package/dist/hsm/application/asymmetric-key-service.js +109 -0
- package/dist/hsm/application/envelope-encryption-service.d.ts +18 -0
- package/dist/hsm/application/envelope-encryption-service.d.ts.map +1 -0
- package/dist/hsm/application/envelope-encryption-service.js +59 -0
- package/dist/hsm/application/symmetric-key-service.d.ts +34 -0
- package/dist/hsm/application/symmetric-key-service.d.ts.map +1 -0
- package/dist/hsm/application/symmetric-key-service.js +107 -0
- package/dist/hsm/domain/entities.d.ts +104 -0
- package/dist/hsm/domain/entities.d.ts.map +1 -0
- package/dist/hsm/domain/entities.js +10 -0
- package/dist/hsm/domain/ports.d.ts +20 -0
- package/dist/hsm/domain/ports.d.ts.map +1 -0
- package/dist/hsm/domain/ports.js +1 -0
- package/dist/hsm/index.d.ts +48 -0
- package/dist/hsm/index.d.ts.map +1 -0
- package/dist/hsm/index.js +97 -0
- package/dist/hsm/infrastructure/audit-log-factory.d.ts +59 -0
- package/dist/hsm/infrastructure/audit-log-factory.d.ts.map +1 -0
- package/dist/hsm/infrastructure/audit-log-factory.js +95 -0
- package/dist/hsm/infrastructure/audit-log.d.ts +8 -0
- package/dist/hsm/infrastructure/audit-log.d.ts.map +1 -0
- package/dist/hsm/infrastructure/audit-log.js +18 -0
- package/dist/hsm/infrastructure/file-audit-log.d.ts +55 -0
- package/dist/hsm/infrastructure/file-audit-log.d.ts.map +1 -0
- package/dist/hsm/infrastructure/file-audit-log.js +128 -0
- package/dist/hsm/infrastructure/key-store.d.ts +9 -0
- package/dist/hsm/infrastructure/key-store.d.ts.map +1 -0
- package/dist/hsm/infrastructure/key-store.js +12 -0
- package/dist/hsm/infrastructure/syslog-audit-log.d.ts +64 -0
- package/dist/hsm/infrastructure/syslog-audit-log.d.ts.map +1 -0
- package/dist/hsm/infrastructure/syslog-audit-log.js +167 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/integrations/besu-client/error-mapper.d.ts +9 -0
- package/dist/integrations/besu-client/error-mapper.d.ts.map +1 -0
- package/dist/integrations/besu-client/error-mapper.js +22 -0
- package/dist/integrations/besu-client/index.d.ts +65 -0
- package/dist/integrations/besu-client/index.d.ts.map +1 -0
- package/dist/integrations/besu-client/index.js +276 -0
- package/dist/integrations/besu-client/ports.d.ts +44 -0
- package/dist/integrations/besu-client/ports.d.ts.map +1 -0
- package/dist/integrations/besu-client/ports.js +1 -0
- package/dist/integrations/corda-gateway/index.d.ts +37 -0
- package/dist/integrations/corda-gateway/index.d.ts.map +1 -0
- package/dist/integrations/corda-gateway/index.js +234 -0
- package/dist/integrations/corda-gateway/ports.d.ts +33 -0
- package/dist/integrations/corda-gateway/ports.d.ts.map +1 -0
- package/dist/integrations/corda-gateway/ports.js +1 -0
- package/dist/integrations/fabric-gateway/index.d.ts +78 -0
- package/dist/integrations/fabric-gateway/index.d.ts.map +1 -0
- package/dist/integrations/fabric-gateway/index.js +214 -0
- package/dist/integrations/fabric-gateway/ports.d.ts +50 -0
- package/dist/integrations/fabric-gateway/ports.d.ts.map +1 -0
- package/dist/integrations/fabric-gateway/ports.js +1 -0
- package/dist/integrations/index.d.ts +19 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +19 -0
- package/dist/integrations/shared/env.d.ts +4 -0
- package/dist/integrations/shared/env.d.ts.map +1 -0
- package/dist/integrations/shared/env.js +24 -0
- package/dist/integrations/shared/retry.d.ts +79 -0
- package/dist/integrations/shared/retry.d.ts.map +1 -0
- package/dist/integrations/shared/retry.js +315 -0
- package/dist/mpc/adapters.d.ts +36 -0
- package/dist/mpc/adapters.d.ts.map +1 -0
- package/dist/mpc/adapters.js +46 -0
- package/dist/mpc/crypto.d.ts +2 -0
- package/dist/mpc/crypto.d.ts.map +1 -0
- package/dist/mpc/crypto.js +2 -0
- package/dist/mpc/dsa.d.ts +134 -0
- package/dist/mpc/dsa.d.ts.map +1 -0
- package/dist/mpc/dsa.js +127 -0
- package/dist/mpc/field.d.ts +127 -0
- package/dist/mpc/field.d.ts.map +1 -0
- package/dist/mpc/field.js +209 -0
- package/dist/mpc/hybrid-kem.d.ts +96 -0
- package/dist/mpc/hybrid-kem.d.ts.map +1 -0
- package/dist/mpc/hybrid-kem.js +136 -0
- package/dist/mpc/index.d.ts +135 -0
- package/dist/mpc/index.d.ts.map +1 -0
- package/dist/mpc/index.js +348 -0
- package/dist/mpc/kyber.d.ts +134 -0
- package/dist/mpc/kyber.d.ts.map +1 -0
- package/dist/mpc/kyber.js +143 -0
- package/dist/mpc/ports.d.ts +67 -0
- package/dist/mpc/ports.d.ts.map +1 -0
- package/dist/mpc/ports.js +9 -0
- package/dist/mpc/quantum.d.ts +80 -0
- package/dist/mpc/quantum.d.ts.map +1 -0
- package/dist/mpc/quantum.js +180 -0
- package/dist/p2mr/adapters.d.ts +31 -0
- package/dist/p2mr/adapters.d.ts.map +1 -0
- package/dist/p2mr/adapters.js +35 -0
- package/dist/p2mr/index.d.ts +63 -0
- package/dist/p2mr/index.d.ts.map +1 -0
- package/dist/p2mr/index.js +59 -0
- package/dist/p2mr/merkle-tree.d.ts +109 -0
- package/dist/p2mr/merkle-tree.d.ts.map +1 -0
- package/dist/p2mr/merkle-tree.js +239 -0
- package/dist/p2mr/p2mr-output.d.ts +142 -0
- package/dist/p2mr/p2mr-output.d.ts.map +1 -0
- package/dist/p2mr/p2mr-output.js +150 -0
- package/dist/p2mr/ports.d.ts +52 -0
- package/dist/p2mr/ports.d.ts.map +1 -0
- package/dist/p2mr/ports.js +9 -0
- package/dist/p2mr/script-interpreter.d.ts +92 -0
- package/dist/p2mr/script-interpreter.d.ts.map +1 -0
- package/dist/p2mr/script-interpreter.js +535 -0
- package/dist/p2mr/script-leaf.d.ts +70 -0
- package/dist/p2mr/script-leaf.d.ts.map +1 -0
- package/dist/p2mr/script-leaf.js +203 -0
- package/dist/p2mr/spend-proof.d.ts +95 -0
- package/dist/p2mr/spend-proof.d.ts.map +1 -0
- package/dist/p2mr/spend-proof.js +358 -0
- package/dist/p2mr/types.d.ts +209 -0
- package/dist/p2mr/types.d.ts.map +1 -0
- package/dist/p2mr/types.js +9 -0
- package/dist/privacy/application/view-projector.d.ts +13 -0
- package/dist/privacy/application/view-projector.d.ts.map +1 -0
- package/dist/privacy/application/view-projector.js +85 -0
- package/dist/privacy/domain/entities.d.ts +26 -0
- package/dist/privacy/domain/entities.d.ts.map +1 -0
- package/dist/privacy/domain/entities.js +1 -0
- package/dist/privacy/domain/ports.d.ts +7 -0
- package/dist/privacy/domain/ports.d.ts.map +1 -0
- package/dist/privacy/domain/ports.js +1 -0
- package/dist/privacy/index.d.ts +21 -0
- package/dist/privacy/index.d.ts.map +1 -0
- package/dist/privacy/index.js +25 -0
- package/dist/privacy/infrastructure/in-memory-store.d.ts +8 -0
- package/dist/privacy/infrastructure/in-memory-store.d.ts.map +1 -0
- package/dist/privacy/infrastructure/in-memory-store.js +7 -0
- package/dist/protocols/besu-port.d.ts +80 -0
- package/dist/protocols/besu-port.d.ts.map +1 -0
- package/dist/protocols/besu-port.js +1 -0
- package/dist/protocols/corda-port.d.ts +103 -0
- package/dist/protocols/corda-port.d.ts.map +1 -0
- package/dist/protocols/corda-port.js +9 -0
- package/dist/protocols/credentialing-port.d.ts +11 -0
- package/dist/protocols/credentialing-port.d.ts.map +1 -0
- package/dist/protocols/credentialing-port.js +1 -0
- package/dist/protocols/fabric-port.d.ts +89 -0
- package/dist/protocols/fabric-port.d.ts.map +1 -0
- package/dist/protocols/fabric-port.js +9 -0
- package/dist/protocols/index.d.ts +14 -0
- package/dist/protocols/index.d.ts.map +1 -0
- package/dist/protocols/index.js +7 -0
- package/dist/protocols/p2mr-port.d.ts +159 -0
- package/dist/protocols/p2mr-port.d.ts.map +1 -0
- package/dist/protocols/p2mr-port.js +12 -0
- package/dist/protocols/privacy-port.d.ts +9 -0
- package/dist/protocols/privacy-port.d.ts.map +1 -0
- package/dist/protocols/privacy-port.js +1 -0
- package/dist/protocols/traceability-port.d.ts +12 -0
- package/dist/protocols/traceability-port.d.ts.map +1 -0
- package/dist/protocols/traceability-port.js +1 -0
- package/dist/shared/collection-store.d.ts +12 -0
- package/dist/shared/collection-store.d.ts.map +1 -0
- package/dist/shared/collection-store.js +26 -0
- package/dist/shared/commit.d.ts +24 -0
- package/dist/shared/commit.d.ts.map +1 -0
- package/dist/shared/commit.js +50 -0
- package/dist/shared/crypto.d.ts +2 -0
- package/dist/shared/crypto.d.ts.map +1 -0
- package/dist/shared/crypto.js +4 -0
- package/dist/shared/date.d.ts +2 -0
- package/dist/shared/date.d.ts.map +1 -0
- package/dist/shared/date.js +3 -0
- package/dist/shared/index.d.ts +9 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +11 -0
- package/dist/shared/logger.d.ts +37 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +45 -0
- package/dist/shared/store.d.ts +25 -0
- package/dist/shared/store.d.ts.map +1 -0
- package/dist/shared/store.js +18 -0
- package/dist/shared/telemetry-sdk.d.ts +26 -0
- package/dist/shared/telemetry-sdk.d.ts.map +1 -0
- package/dist/shared/telemetry-sdk.js +97 -0
- package/dist/shared/telemetry.d.ts +86 -0
- package/dist/shared/telemetry.d.ts.map +1 -0
- package/dist/shared/telemetry.js +137 -0
- package/dist/stark-settlement/application/aggregator-service.d.ts +112 -0
- package/dist/stark-settlement/application/aggregator-service.d.ts.map +1 -0
- package/dist/stark-settlement/application/aggregator-service.js +256 -0
- package/dist/stark-settlement/application/ledger-service.d.ts +114 -0
- package/dist/stark-settlement/application/ledger-service.d.ts.map +1 -0
- package/dist/stark-settlement/application/ledger-service.js +318 -0
- package/dist/stark-settlement/application/settlement-service.d.ts +104 -0
- package/dist/stark-settlement/application/settlement-service.d.ts.map +1 -0
- package/dist/stark-settlement/application/settlement-service.js +251 -0
- package/dist/stark-settlement/domain/entities.d.ts +365 -0
- package/dist/stark-settlement/domain/entities.d.ts.map +1 -0
- package/dist/stark-settlement/domain/entities.js +29 -0
- package/dist/stark-settlement/domain/ports.d.ts +485 -0
- package/dist/stark-settlement/domain/ports.d.ts.map +1 -0
- package/dist/stark-settlement/domain/ports.js +14 -0
- package/dist/stark-settlement/domain/value-objects.d.ts +268 -0
- package/dist/stark-settlement/domain/value-objects.d.ts.map +1 -0
- package/dist/stark-settlement/domain/value-objects.js +500 -0
- package/dist/stark-settlement/index.d.ts +172 -0
- package/dist/stark-settlement/index.d.ts.map +1 -0
- package/dist/stark-settlement/index.js +193 -0
- package/dist/stark-settlement/infrastructure/adapters/audit-adapter.d.ts +52 -0
- package/dist/stark-settlement/infrastructure/adapters/audit-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/audit-adapter.js +154 -0
- package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.d.ts +88 -0
- package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.js +187 -0
- package/dist/stark-settlement/infrastructure/adapters/clock-adapter.d.ts +59 -0
- package/dist/stark-settlement/infrastructure/adapters/clock-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/clock-adapter.js +85 -0
- package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.d.ts +60 -0
- package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.js +104 -0
- package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.d.ts +115 -0
- package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.js +191 -0
- package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.d.ts +65 -0
- package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.js +207 -0
- package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.d.ts +73 -0
- package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.js +287 -0
- package/dist/stark-settlement/infrastructure/adapters/solana-adapter.d.ts +78 -0
- package/dist/stark-settlement/infrastructure/adapters/solana-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/solana-adapter.js +172 -0
- package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.d.ts +56 -0
- package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.js +261 -0
- package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.d.ts +125 -0
- package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.js +416 -0
- package/dist/stark-settlement/infrastructure/persistence/ledger-store.d.ts +68 -0
- package/dist/stark-settlement/infrastructure/persistence/ledger-store.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/persistence/ledger-store.js +238 -0
- package/dist/stark-settlement/infrastructure/persistence/offset-store.d.ts +30 -0
- package/dist/stark-settlement/infrastructure/persistence/offset-store.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/persistence/offset-store.js +57 -0
- package/dist/stark-settlement/infrastructure/persistence/outbox-store.d.ts +45 -0
- package/dist/stark-settlement/infrastructure/persistence/outbox-store.d.ts.map +1 -0
- package/dist/stark-settlement/infrastructure/persistence/outbox-store.js +171 -0
- package/dist/traceability/application/recall-assessor.d.ts +13 -0
- package/dist/traceability/application/recall-assessor.d.ts.map +1 -0
- package/dist/traceability/application/recall-assessor.js +74 -0
- package/dist/traceability/domain/entities.d.ts +23 -0
- package/dist/traceability/domain/entities.d.ts.map +1 -0
- package/dist/traceability/domain/entities.js +1 -0
- package/dist/traceability/domain/ports.d.ts +23 -0
- package/dist/traceability/domain/ports.d.ts.map +1 -0
- package/dist/traceability/domain/ports.js +1 -0
- package/dist/traceability/domain/recall.d.ts +12 -0
- package/dist/traceability/domain/recall.d.ts.map +1 -0
- package/dist/traceability/domain/recall.js +1 -0
- package/dist/traceability/index.d.ts +22 -0
- package/dist/traceability/index.d.ts.map +1 -0
- package/dist/traceability/index.js +26 -0
- package/dist/traceability/infrastructure/in-memory-store.d.ts +13 -0
- package/dist/traceability/infrastructure/in-memory-store.d.ts.map +1 -0
- package/dist/traceability/infrastructure/in-memory-store.js +24 -0
- package/package.json +12 -9
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import grpc from "@grpc/grpc-js";
|
|
2
|
+
import { type Contract, type Gateway, type Identity, type Signer } from "@hyperledger/fabric-gateway";
|
|
3
|
+
import { type CircuitBreakerOptions } from "../shared/retry.js";
|
|
4
|
+
import type { FabricGatewayProfile, FabricProposalPlan, IFabricConnectionFactory, IFabricGatewayFactory, IFabricProfileFactory, IFabricProposalBuilder } from "./ports.js";
|
|
5
|
+
export type { FabricGatewayProfile, FabricProposalPlan } from "./ports.js";
|
|
6
|
+
export declare class FabricProfileFactory implements IFabricProfileFactory {
|
|
7
|
+
createProfileFromEnv(env?: NodeJS.ProcessEnv): FabricGatewayProfile;
|
|
8
|
+
createProfile(profile: FabricGatewayProfile): FabricGatewayProfile;
|
|
9
|
+
}
|
|
10
|
+
export declare class FabricConnectionFactory implements IFabricConnectionFactory {
|
|
11
|
+
createGrpcClient(profile: FabricGatewayProfile): Promise<grpc.Client>;
|
|
12
|
+
createIdentity(profile: FabricGatewayProfile): Promise<Identity>;
|
|
13
|
+
createSigner(profile: FabricGatewayProfile): Promise<Signer>;
|
|
14
|
+
}
|
|
15
|
+
export declare class FabricGatewayFactory implements IFabricGatewayFactory {
|
|
16
|
+
private readonly connectionFactory;
|
|
17
|
+
constructor(connectionFactory: IFabricConnectionFactory);
|
|
18
|
+
createGateway(profile: FabricGatewayProfile): Promise<{
|
|
19
|
+
gateway: Gateway;
|
|
20
|
+
client: grpc.Client;
|
|
21
|
+
}>;
|
|
22
|
+
getContract(gateway: Gateway, profile: FabricGatewayProfile): Contract;
|
|
23
|
+
}
|
|
24
|
+
export declare class FabricProposalBuilder implements IFabricProposalBuilder {
|
|
25
|
+
buildRecordShipmentProposal(input: {
|
|
26
|
+
lotId: string;
|
|
27
|
+
shipmentId: string;
|
|
28
|
+
temperatureCelsius: number;
|
|
29
|
+
location: string;
|
|
30
|
+
telemetryTimestamp: string;
|
|
31
|
+
endorsingOrganizations: string[];
|
|
32
|
+
}): FabricProposalPlan;
|
|
33
|
+
buildEvaluateRecallRequest(input: {
|
|
34
|
+
lotId: string;
|
|
35
|
+
reason: string;
|
|
36
|
+
}): FabricProposalPlan;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Resilient Fabric gateway client with circuit breaker and retry support.
|
|
40
|
+
*
|
|
41
|
+
* Circuit breaker prevents cascading failures when Fabric peer is unavailable.
|
|
42
|
+
* Retry policy handles transient gRPC errors (UNAVAILABLE, DEADLINE_EXCEEDED).
|
|
43
|
+
*/
|
|
44
|
+
export declare class FabricGatewayClientSketch implements IFabricProfileFactory, IFabricConnectionFactory, IFabricGatewayFactory, IFabricProposalBuilder {
|
|
45
|
+
private readonly profileFactory;
|
|
46
|
+
private readonly connectionFactory;
|
|
47
|
+
private readonly gatewayFactory;
|
|
48
|
+
private readonly proposalBuilder;
|
|
49
|
+
private readonly circuitBreaker;
|
|
50
|
+
constructor(circuitBreakerOptions?: Partial<CircuitBreakerOptions>);
|
|
51
|
+
createProfileFromEnv(env?: NodeJS.ProcessEnv): FabricGatewayProfile;
|
|
52
|
+
createProfile(profile: FabricGatewayProfile): FabricGatewayProfile;
|
|
53
|
+
createGrpcClient(profile: FabricGatewayProfile): Promise<grpc.Client>;
|
|
54
|
+
createIdentity(profile: FabricGatewayProfile): Promise<Identity>;
|
|
55
|
+
createSigner(profile: FabricGatewayProfile): Promise<Signer>;
|
|
56
|
+
createGateway(profile: FabricGatewayProfile): Promise<{
|
|
57
|
+
gateway: Gateway;
|
|
58
|
+
client: grpc.Client;
|
|
59
|
+
}>;
|
|
60
|
+
getContract(gateway: Gateway, profile: FabricGatewayProfile): Contract;
|
|
61
|
+
buildRecordShipmentProposal(input: {
|
|
62
|
+
lotId: string;
|
|
63
|
+
shipmentId: string;
|
|
64
|
+
temperatureCelsius: number;
|
|
65
|
+
location: string;
|
|
66
|
+
telemetryTimestamp: string;
|
|
67
|
+
endorsingOrganizations: string[];
|
|
68
|
+
}): FabricProposalPlan;
|
|
69
|
+
buildEvaluateRecallRequest(input: {
|
|
70
|
+
lotId: string;
|
|
71
|
+
reason: string;
|
|
72
|
+
}): FabricProposalPlan;
|
|
73
|
+
/** Get circuit breaker state for monitoring dashboards. */
|
|
74
|
+
getCircuitBreakerHealth(): import("../shared/retry.js").CircuitBreakerHealth;
|
|
75
|
+
/** Reset circuit breaker (use after resolving underlying issues). */
|
|
76
|
+
resetCircuitBreaker(): void;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/fabric-gateway/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { createPrivateKey } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import grpc from "@grpc/grpc-js";
|
|
4
|
+
import { connect, hash, signers, } from "@hyperledger/fabric-gateway";
|
|
5
|
+
import { getOptionalEnv, getRequiredEnv } from "../shared/env.js";
|
|
6
|
+
import { CircuitBreaker, FABRIC_RETRY_POLICY, withRetry, } from "../shared/retry.js";
|
|
7
|
+
import { createTracer, withSpan, TelemetryAttributes, } from "../../shared/telemetry.js";
|
|
8
|
+
const tracer = createTracer("fabric-gateway");
|
|
9
|
+
export class FabricProfileFactory {
|
|
10
|
+
createProfileFromEnv(env = process.env) {
|
|
11
|
+
const profile = {
|
|
12
|
+
mspId: getRequiredEnv("FABRIC_MSP_ID", env),
|
|
13
|
+
channelName: getRequiredEnv("FABRIC_CHANNEL_NAME", env),
|
|
14
|
+
chaincodeName: getRequiredEnv("FABRIC_CHAINCODE_NAME", env),
|
|
15
|
+
peerEndpoint: getRequiredEnv("FABRIC_PEER_ENDPOINT", env),
|
|
16
|
+
tlsCertPath: getRequiredEnv("FABRIC_TLS_CERT_PATH", env),
|
|
17
|
+
identityCertPath: getRequiredEnv("FABRIC_IDENTITY_CERT_PATH", env),
|
|
18
|
+
privateKeyPath: getRequiredEnv("FABRIC_PRIVATE_KEY_PATH", env),
|
|
19
|
+
};
|
|
20
|
+
const peerHostAlias = getOptionalEnv("FABRIC_PEER_HOST_ALIAS", env);
|
|
21
|
+
if (peerHostAlias) {
|
|
22
|
+
profile.peerHostAlias = peerHostAlias;
|
|
23
|
+
}
|
|
24
|
+
return profile;
|
|
25
|
+
}
|
|
26
|
+
createProfile(profile) {
|
|
27
|
+
if (!profile.peerEndpoint.includes(":")) {
|
|
28
|
+
throw new Error("FabricGatewayProfile.peerEndpoint must be in host:port format");
|
|
29
|
+
}
|
|
30
|
+
return profile;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class FabricConnectionFactory {
|
|
34
|
+
async createGrpcClient(profile) {
|
|
35
|
+
return withSpan(tracer, "fabric.createGrpcClient", async (span) => {
|
|
36
|
+
span.setAttribute(TelemetryAttributes.BLOCKCHAIN_PLATFORM, "fabric");
|
|
37
|
+
span.setAttribute("fabric.peer_endpoint", profile.peerEndpoint);
|
|
38
|
+
const tlsRootCert = await readFile(profile.tlsCertPath);
|
|
39
|
+
const credentials = grpc.credentials.createSsl(tlsRootCert);
|
|
40
|
+
const options = {};
|
|
41
|
+
if (profile.peerHostAlias) {
|
|
42
|
+
options["grpc.ssl_target_name_override"] = profile.peerHostAlias;
|
|
43
|
+
options["grpc.default_authority"] = profile.peerHostAlias;
|
|
44
|
+
span.setAttribute("fabric.peer_host_alias", profile.peerHostAlias);
|
|
45
|
+
}
|
|
46
|
+
return new grpc.Client(profile.peerEndpoint, credentials, options);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async createIdentity(profile) {
|
|
50
|
+
return withSpan(tracer, "fabric.createIdentity", async (span) => {
|
|
51
|
+
span.setAttribute("fabric.msp_id", profile.mspId);
|
|
52
|
+
return {
|
|
53
|
+
mspId: profile.mspId,
|
|
54
|
+
credentials: await readFile(profile.identityCertPath),
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async createSigner(profile) {
|
|
59
|
+
return withSpan(tracer, "fabric.createSigner", async () => {
|
|
60
|
+
const privateKeyPem = await readFile(profile.privateKeyPath);
|
|
61
|
+
const privateKey = createPrivateKey(privateKeyPem);
|
|
62
|
+
return signers.newPrivateKeySigner(privateKey);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export class FabricGatewayFactory {
|
|
67
|
+
connectionFactory;
|
|
68
|
+
constructor(connectionFactory) {
|
|
69
|
+
this.connectionFactory = connectionFactory;
|
|
70
|
+
}
|
|
71
|
+
async createGateway(profile) {
|
|
72
|
+
return withSpan(tracer, "fabric.createGateway", async (span) => {
|
|
73
|
+
span.setAttribute(TelemetryAttributes.BLOCKCHAIN_PLATFORM, "fabric");
|
|
74
|
+
span.setAttribute(TelemetryAttributes.BLOCKCHAIN_CHANNEL, profile.channelName);
|
|
75
|
+
span.setAttribute(TelemetryAttributes.BLOCKCHAIN_CHAINCODE, profile.chaincodeName);
|
|
76
|
+
const client = await this.connectionFactory.createGrpcClient(profile);
|
|
77
|
+
const identity = await this.connectionFactory.createIdentity(profile);
|
|
78
|
+
const signer = await this.connectionFactory.createSigner(profile);
|
|
79
|
+
const options = {
|
|
80
|
+
client,
|
|
81
|
+
identity,
|
|
82
|
+
signer,
|
|
83
|
+
hash: hash.sha256,
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
gateway: connect(options),
|
|
87
|
+
client,
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
getContract(gateway, profile) {
|
|
92
|
+
const network = gateway.getNetwork(profile.channelName);
|
|
93
|
+
return network.getContract(profile.chaincodeName);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export class FabricProposalBuilder {
|
|
97
|
+
buildRecordShipmentProposal(input) {
|
|
98
|
+
const payload = JSON.stringify(input);
|
|
99
|
+
return {
|
|
100
|
+
transactionName: "RecordShipment",
|
|
101
|
+
args: [
|
|
102
|
+
input.lotId,
|
|
103
|
+
input.shipmentId,
|
|
104
|
+
String(input.temperatureCelsius),
|
|
105
|
+
input.location,
|
|
106
|
+
],
|
|
107
|
+
transientData: {
|
|
108
|
+
telemetryTimestamp: Buffer.from(input.telemetryTimestamp, "utf8"),
|
|
109
|
+
},
|
|
110
|
+
endorsingOrganizations: input.endorsingOrganizations,
|
|
111
|
+
payloadDigestHex: Buffer.from(hash.sha256(Buffer.from(payload, "utf8"))).toString("hex"),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
buildEvaluateRecallRequest(input) {
|
|
115
|
+
const args = [input.lotId];
|
|
116
|
+
const transientData = {
|
|
117
|
+
recallReason: Buffer.from(input.reason, "utf8"),
|
|
118
|
+
};
|
|
119
|
+
return {
|
|
120
|
+
transactionName: "TraceOrigin",
|
|
121
|
+
args,
|
|
122
|
+
transientData,
|
|
123
|
+
endorsingOrganizations: ["RetailerMSP", "SupplierMSP"],
|
|
124
|
+
payloadDigestHex: Buffer.from(hash.sha256(Buffer.from(JSON.stringify(input), "utf8"))).toString("hex"),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Resilient Fabric gateway client with circuit breaker and retry support.
|
|
130
|
+
*
|
|
131
|
+
* Circuit breaker prevents cascading failures when Fabric peer is unavailable.
|
|
132
|
+
* Retry policy handles transient gRPC errors (UNAVAILABLE, DEADLINE_EXCEEDED).
|
|
133
|
+
*/
|
|
134
|
+
export class FabricGatewayClientSketch {
|
|
135
|
+
profileFactory = new FabricProfileFactory();
|
|
136
|
+
connectionFactory = new FabricConnectionFactory();
|
|
137
|
+
gatewayFactory = new FabricGatewayFactory(this.connectionFactory);
|
|
138
|
+
proposalBuilder = new FabricProposalBuilder();
|
|
139
|
+
circuitBreaker;
|
|
140
|
+
constructor(circuitBreakerOptions) {
|
|
141
|
+
this.circuitBreaker = new CircuitBreaker(circuitBreakerOptions, "fabric-gateway");
|
|
142
|
+
}
|
|
143
|
+
createProfileFromEnv(env) {
|
|
144
|
+
return this.profileFactory.createProfileFromEnv(env);
|
|
145
|
+
}
|
|
146
|
+
createProfile(profile) {
|
|
147
|
+
return this.profileFactory.createProfile(profile);
|
|
148
|
+
}
|
|
149
|
+
createGrpcClient(profile) {
|
|
150
|
+
return this.connectionFactory.createGrpcClient(profile);
|
|
151
|
+
}
|
|
152
|
+
createIdentity(profile) {
|
|
153
|
+
return this.connectionFactory.createIdentity(profile);
|
|
154
|
+
}
|
|
155
|
+
createSigner(profile) {
|
|
156
|
+
return this.connectionFactory.createSigner(profile);
|
|
157
|
+
}
|
|
158
|
+
createGateway(profile) {
|
|
159
|
+
return this.circuitBreaker.execute(() => withRetry(() => this.gatewayFactory.createGateway(profile), FABRIC_RETRY_POLICY, [], extractGrpcErrorCode, "fabric.createGateway"));
|
|
160
|
+
}
|
|
161
|
+
getContract(gateway, profile) {
|
|
162
|
+
return this.gatewayFactory.getContract(gateway, profile);
|
|
163
|
+
}
|
|
164
|
+
buildRecordShipmentProposal(input) {
|
|
165
|
+
return this.proposalBuilder.buildRecordShipmentProposal(input);
|
|
166
|
+
}
|
|
167
|
+
buildEvaluateRecallRequest(input) {
|
|
168
|
+
return this.proposalBuilder.buildEvaluateRecallRequest(input);
|
|
169
|
+
}
|
|
170
|
+
/** Get circuit breaker state for monitoring dashboards. */
|
|
171
|
+
getCircuitBreakerHealth() {
|
|
172
|
+
return this.circuitBreaker.getHealthStatus();
|
|
173
|
+
}
|
|
174
|
+
/** Reset circuit breaker (use after resolving underlying issues). */
|
|
175
|
+
resetCircuitBreaker() {
|
|
176
|
+
this.circuitBreaker.reset();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Extract gRPC error codes for retry policy decisions.
|
|
181
|
+
* Maps gRPC status codes to string names.
|
|
182
|
+
*/
|
|
183
|
+
function extractGrpcErrorCode(err) {
|
|
184
|
+
if (err && typeof err === "object") {
|
|
185
|
+
const e = err;
|
|
186
|
+
// gRPC-js ServiceError has numeric code
|
|
187
|
+
if (typeof e.code === "number") {
|
|
188
|
+
// Map gRPC status codes: https://grpc.io/docs/guides/status-codes/
|
|
189
|
+
const grpcCodeMap = {
|
|
190
|
+
0: "OK",
|
|
191
|
+
1: "CANCELLED",
|
|
192
|
+
2: "UNKNOWN",
|
|
193
|
+
3: "INVALID_ARGUMENT",
|
|
194
|
+
4: "DEADLINE_EXCEEDED",
|
|
195
|
+
5: "NOT_FOUND",
|
|
196
|
+
6: "ALREADY_EXISTS",
|
|
197
|
+
7: "PERMISSION_DENIED",
|
|
198
|
+
8: "RESOURCE_EXHAUSTED",
|
|
199
|
+
9: "FAILED_PRECONDITION",
|
|
200
|
+
10: "ABORTED",
|
|
201
|
+
11: "OUT_OF_RANGE",
|
|
202
|
+
12: "UNIMPLEMENTED",
|
|
203
|
+
13: "INTERNAL",
|
|
204
|
+
14: "UNAVAILABLE",
|
|
205
|
+
15: "DATA_LOSS",
|
|
206
|
+
16: "UNAUTHENTICATED",
|
|
207
|
+
};
|
|
208
|
+
return grpcCodeMap[e.code] ?? "UNKNOWN";
|
|
209
|
+
}
|
|
210
|
+
if (typeof e.code === "string")
|
|
211
|
+
return e.code.toUpperCase();
|
|
212
|
+
}
|
|
213
|
+
return "UNKNOWN";
|
|
214
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Client as GrpcClient } from "@grpc/grpc-js";
|
|
2
|
+
import type { Contract, Gateway, Identity, Signer } from "@hyperledger/fabric-gateway";
|
|
3
|
+
export interface FabricGatewayProfile {
|
|
4
|
+
mspId: string;
|
|
5
|
+
channelName: string;
|
|
6
|
+
chaincodeName: string;
|
|
7
|
+
peerEndpoint: string;
|
|
8
|
+
peerHostAlias?: string;
|
|
9
|
+
tlsCertPath: string;
|
|
10
|
+
identityCertPath: string;
|
|
11
|
+
privateKeyPath: string;
|
|
12
|
+
}
|
|
13
|
+
export interface FabricProposalPlan {
|
|
14
|
+
transactionName: string;
|
|
15
|
+
args: string[];
|
|
16
|
+
transientData?: Record<string, Uint8Array>;
|
|
17
|
+
endorsingOrganizations: string[];
|
|
18
|
+
payloadDigestHex: string;
|
|
19
|
+
}
|
|
20
|
+
export interface IFabricProfileFactory {
|
|
21
|
+
createProfileFromEnv(env?: NodeJS.ProcessEnv): FabricGatewayProfile;
|
|
22
|
+
createProfile(profile: FabricGatewayProfile): FabricGatewayProfile;
|
|
23
|
+
}
|
|
24
|
+
export interface IFabricConnectionFactory {
|
|
25
|
+
createGrpcClient(profile: FabricGatewayProfile): Promise<GrpcClient>;
|
|
26
|
+
createIdentity(profile: FabricGatewayProfile): Promise<Identity>;
|
|
27
|
+
createSigner(profile: FabricGatewayProfile): Promise<Signer>;
|
|
28
|
+
}
|
|
29
|
+
export interface IFabricGatewayFactory {
|
|
30
|
+
createGateway(profile: FabricGatewayProfile): Promise<{
|
|
31
|
+
gateway: Gateway;
|
|
32
|
+
client: GrpcClient;
|
|
33
|
+
}>;
|
|
34
|
+
getContract(gateway: Gateway, profile: FabricGatewayProfile): Contract;
|
|
35
|
+
}
|
|
36
|
+
export interface IFabricProposalBuilder {
|
|
37
|
+
buildRecordShipmentProposal(input: {
|
|
38
|
+
lotId: string;
|
|
39
|
+
shipmentId: string;
|
|
40
|
+
temperatureCelsius: number;
|
|
41
|
+
location: string;
|
|
42
|
+
telemetryTimestamp: string;
|
|
43
|
+
endorsingOrganizations: string[];
|
|
44
|
+
}): FabricProposalPlan;
|
|
45
|
+
buildEvaluateRecallRequest(input: {
|
|
46
|
+
lotId: string;
|
|
47
|
+
reason: string;
|
|
48
|
+
}): FabricProposalPlan;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=ports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/integrations/fabric-gateway/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EACV,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,MAAM,EACP,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3C,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,oBAAoB,CAAC;IACpE,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,oBAAoB,CAAC;CACpE;AAED,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrE,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjE,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,CACX,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IACrD,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,GAAG,QAAQ,CAAC;CACxE;AAED,MAAM,WAAW,sBAAsB;IACrC,2BAA2B,CAAC,KAAK,EAAE;QACjC,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,sBAAsB,EAAE,MAAM,EAAE,CAAC;KAClC,GAAG,kBAAkB,CAAC;IAEvB,0BAA0B,CAAC,KAAK,EAAE;QAChC,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,kBAAkB,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration clients for enterprise blockchain platforms.
|
|
3
|
+
*
|
|
4
|
+
* Provides SDK-based clients for:
|
|
5
|
+
* - Hyperledger Fabric (via @hyperledger/fabric-gateway)
|
|
6
|
+
* - Hyperledger Besu (via ethers.js)
|
|
7
|
+
* - R3 Corda (via REST gateway)
|
|
8
|
+
*
|
|
9
|
+
* Each client includes circuit breaker and retry patterns for resilience.
|
|
10
|
+
*/
|
|
11
|
+
export { FabricProfileFactory, FabricConnectionFactory, FabricGatewayFactory, FabricProposalBuilder, FabricGatewayClientSketch, type FabricGatewayProfile, type FabricProposalPlan, } from "./fabric-gateway/index.js";
|
|
12
|
+
export type { IFabricProfileFactory, IFabricConnectionFactory, IFabricGatewayFactory, IFabricProposalBuilder, } from "./fabric-gateway/ports.js";
|
|
13
|
+
export { BesuProfileFactory, BesuProviderFactory, BesuGasEstimator, BesuTransactionBuilder, BesuTransactionSender, BesuHealthChecker, BesuEthersClientSketch, type BesuRpcProfile, type BesuPrivateTransactionRequest, type BesuHealthStatus, } from "./besu-client/index.js";
|
|
14
|
+
export type { IBesuProfileFactory, IBesuProviderFactory, IBesuGasEstimator, IBesuTransactionBuilder, IBesuTransactionSender, IBesuHealthChecker, } from "./besu-client/ports.js";
|
|
15
|
+
export { CordaProfileFactory, CordaRequestBuilder, CordaFlowInvoker, CordaGatewayClientSketch, type CordaGatewayProfile, type CordaGatewayRequest, type ProviderClearancePayload, } from "./corda-gateway/index.js";
|
|
16
|
+
export type { ICordaProfileFactory, ICordaRequestBuilder, ICordaFlowInvoker, } from "./corda-gateway/ports.js";
|
|
17
|
+
export { CircuitBreaker, withRetry, FABRIC_RETRY_POLICY, BESU_RETRY_POLICY, BESU_NON_RETRYABLE, CORDA_RETRY_POLICY, CORDA_NON_RETRYABLE, type CircuitBreakerOptions, type RetryPolicy, } from "./shared/retry.js";
|
|
18
|
+
export { getRequiredEnv, getOptionalEnv, getNumberEnv } from "./shared/env.js";
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,6BAA6B,EAClC,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,GAC9B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration clients for enterprise blockchain platforms.
|
|
3
|
+
*
|
|
4
|
+
* Provides SDK-based clients for:
|
|
5
|
+
* - Hyperledger Fabric (via @hyperledger/fabric-gateway)
|
|
6
|
+
* - Hyperledger Besu (via ethers.js)
|
|
7
|
+
* - R3 Corda (via REST gateway)
|
|
8
|
+
*
|
|
9
|
+
* Each client includes circuit breaker and retry patterns for resilience.
|
|
10
|
+
*/
|
|
11
|
+
// Fabric Gateway
|
|
12
|
+
export { FabricProfileFactory, FabricConnectionFactory, FabricGatewayFactory, FabricProposalBuilder, FabricGatewayClientSketch, } from "./fabric-gateway/index.js";
|
|
13
|
+
// Besu Client
|
|
14
|
+
export { BesuProfileFactory, BesuProviderFactory, BesuGasEstimator, BesuTransactionBuilder, BesuTransactionSender, BesuHealthChecker, BesuEthersClientSketch, } from "./besu-client/index.js";
|
|
15
|
+
// Corda Gateway
|
|
16
|
+
export { CordaProfileFactory, CordaRequestBuilder, CordaFlowInvoker, CordaGatewayClientSketch, } from "./corda-gateway/index.js";
|
|
17
|
+
// Shared utilities
|
|
18
|
+
export { CircuitBreaker, withRetry, FABRIC_RETRY_POLICY, BESU_RETRY_POLICY, BESU_NON_RETRYABLE, CORDA_RETRY_POLICY, CORDA_NON_RETRYABLE, } from "./shared/retry.js";
|
|
19
|
+
export { getRequiredEnv, getOptionalEnv, getNumberEnv } from "./shared/env.js";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function getRequiredEnv(name: string, env?: NodeJS.ProcessEnv): string;
|
|
2
|
+
export declare function getOptionalEnv(name: string, env?: NodeJS.ProcessEnv): string | undefined;
|
|
3
|
+
export declare function getNumberEnv(name: string, fallback?: number, env?: NodeJS.ProcessEnv): number;
|
|
4
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/integrations/shared/env.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAOR;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAgBR"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function getRequiredEnv(name, env = process.env) {
|
|
2
|
+
const value = env[name];
|
|
3
|
+
if (value === undefined) {
|
|
4
|
+
throw new Error(`Missing required environment variable: ${name}`);
|
|
5
|
+
}
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
export function getOptionalEnv(name, env = process.env) {
|
|
9
|
+
return env[name];
|
|
10
|
+
}
|
|
11
|
+
export function getNumberEnv(name, fallback, env = process.env) {
|
|
12
|
+
const value = env[name];
|
|
13
|
+
if (value === undefined) {
|
|
14
|
+
if (fallback === undefined) {
|
|
15
|
+
throw new Error(`Missing required numeric environment variable: ${name}`);
|
|
16
|
+
}
|
|
17
|
+
return fallback;
|
|
18
|
+
}
|
|
19
|
+
const parsed = Number(value);
|
|
20
|
+
if (Number.isNaN(parsed)) {
|
|
21
|
+
throw new Error(`Invalid numeric environment variable: ${name}`);
|
|
22
|
+
}
|
|
23
|
+
return parsed;
|
|
24
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared retry policy and circuit breaker for integration adapters.
|
|
3
|
+
*
|
|
4
|
+
* Each platform adapter configures which error codes are retryable:
|
|
5
|
+
* - Fabric: UNAVAILABLE, DEADLINE_EXCEEDED gRPC status codes
|
|
6
|
+
* - Besu: SERVER_ERROR, TIMEOUT JSON-RPC errors (not NONCE_TOO_LOW)
|
|
7
|
+
* - Corda: HTTP 502/503/504 (not 400/401/403)
|
|
8
|
+
*
|
|
9
|
+
* OpenTelemetry instrumentation:
|
|
10
|
+
* - withRetry() creates spans per attempt with error code attributes
|
|
11
|
+
* - CircuitBreaker emits state transition metrics
|
|
12
|
+
*/
|
|
13
|
+
export interface RetryPolicy {
|
|
14
|
+
maxAttempts: number;
|
|
15
|
+
baseDelayMs: number;
|
|
16
|
+
maxDelayMs: number;
|
|
17
|
+
retryableErrors: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare const DEFAULT_RETRY_POLICY: RetryPolicy;
|
|
20
|
+
export declare const FABRIC_RETRY_POLICY: RetryPolicy;
|
|
21
|
+
export declare const BESU_RETRY_POLICY: RetryPolicy;
|
|
22
|
+
/** Non-retryable Besu errors (fail immediately). */
|
|
23
|
+
export declare const BESU_NON_RETRYABLE: string[];
|
|
24
|
+
export declare const CORDA_RETRY_POLICY: RetryPolicy;
|
|
25
|
+
/** Non-retryable Corda HTTP status codes. */
|
|
26
|
+
export declare const CORDA_NON_RETRYABLE: string[];
|
|
27
|
+
export declare function isRetryable(errorCode: string, policy: RetryPolicy, nonRetryable?: string[]): boolean;
|
|
28
|
+
export declare function computeDelay(attempt: number, policy: RetryPolicy): number;
|
|
29
|
+
export declare function withRetry<T>(fn: () => Promise<T>, policy: RetryPolicy, nonRetryable?: string[], extractErrorCode?: (err: unknown) => string, operationName?: string): Promise<T>;
|
|
30
|
+
export type CircuitState = "closed" | "open" | "half-open";
|
|
31
|
+
export interface CircuitBreakerOptions {
|
|
32
|
+
failureThreshold: number;
|
|
33
|
+
cooldownMs: number;
|
|
34
|
+
}
|
|
35
|
+
export declare const DEFAULT_CIRCUIT_BREAKER_OPTIONS: CircuitBreakerOptions;
|
|
36
|
+
export declare class CircuitBreaker {
|
|
37
|
+
private state;
|
|
38
|
+
private consecutiveFailures;
|
|
39
|
+
private lastFailureTime;
|
|
40
|
+
private readonly options;
|
|
41
|
+
private readonly name;
|
|
42
|
+
constructor(options?: Partial<CircuitBreakerOptions>, name?: string);
|
|
43
|
+
getState(): CircuitState;
|
|
44
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
45
|
+
private transitionTo;
|
|
46
|
+
private onSuccess;
|
|
47
|
+
private onFailure;
|
|
48
|
+
/** Reset the circuit to closed state. Useful for testing. */
|
|
49
|
+
reset(): void;
|
|
50
|
+
/** Get health status for Kubernetes probes or monitoring. */
|
|
51
|
+
getHealthStatus(): CircuitBreakerHealth;
|
|
52
|
+
}
|
|
53
|
+
export interface CircuitBreakerHealth {
|
|
54
|
+
state: CircuitState;
|
|
55
|
+
healthy: boolean;
|
|
56
|
+
consecutiveFailures: number;
|
|
57
|
+
lastFailureTime: string | null;
|
|
58
|
+
cooldownRemainingMs: number;
|
|
59
|
+
}
|
|
60
|
+
export interface IntegrationHealthStatus {
|
|
61
|
+
name: string;
|
|
62
|
+
healthy: boolean;
|
|
63
|
+
circuitBreaker: CircuitBreakerHealth;
|
|
64
|
+
lastCheckTime: string;
|
|
65
|
+
latencyMs?: number;
|
|
66
|
+
error?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Health checker for integration clients.
|
|
70
|
+
* Combines circuit breaker state with active endpoint probing.
|
|
71
|
+
*/
|
|
72
|
+
export declare class IntegrationHealthChecker {
|
|
73
|
+
private readonly name;
|
|
74
|
+
private readonly circuitBreaker;
|
|
75
|
+
private readonly probe?;
|
|
76
|
+
constructor(name: string, circuitBreaker: CircuitBreaker, probe?: (() => Promise<void>) | undefined);
|
|
77
|
+
check(): Promise<IntegrationHealthStatus>;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/integrations/shared/retry.ts"],"names":[],"mappings":"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"}
|