@aster-rpc/aster 0.1.2
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/dist/capabilities.d.ts +26 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +29 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/client.d.ts +65 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +108 -0
- package/dist/client.js.map +1 -0
- package/dist/codec.d.ts +156 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +477 -0
- package/dist/codec.js.map +1 -0
- package/dist/config.d.ts +102 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +454 -0
- package/dist/config.js.map +1 -0
- package/dist/contract/identity.d.ts +115 -0
- package/dist/contract/identity.d.ts.map +1 -0
- package/dist/contract/identity.js +188 -0
- package/dist/contract/identity.js.map +1 -0
- package/dist/contract/manifest.d.ts +77 -0
- package/dist/contract/manifest.d.ts.map +1 -0
- package/dist/contract/manifest.js +127 -0
- package/dist/contract/manifest.js.map +1 -0
- package/dist/contract/publication.d.ts +71 -0
- package/dist/contract/publication.d.ts.map +1 -0
- package/dist/contract/publication.js +85 -0
- package/dist/contract/publication.js.map +1 -0
- package/dist/decorators.d.ts +139 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +175 -0
- package/dist/decorators.js.map +1 -0
- package/dist/dynamic.d.ts +61 -0
- package/dist/dynamic.d.ts.map +1 -0
- package/dist/dynamic.js +147 -0
- package/dist/dynamic.js.map +1 -0
- package/dist/framing.d.ts +74 -0
- package/dist/framing.d.ts.map +1 -0
- package/dist/framing.js +162 -0
- package/dist/framing.js.map +1 -0
- package/dist/health.d.ts +127 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +236 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors/audit.d.ts +25 -0
- package/dist/interceptors/audit.d.ts.map +1 -0
- package/dist/interceptors/audit.js +46 -0
- package/dist/interceptors/audit.js.map +1 -0
- package/dist/interceptors/auth.d.ts +13 -0
- package/dist/interceptors/auth.d.ts.map +1 -0
- package/dist/interceptors/auth.js +34 -0
- package/dist/interceptors/auth.js.map +1 -0
- package/dist/interceptors/base.d.ts +74 -0
- package/dist/interceptors/base.d.ts.map +1 -0
- package/dist/interceptors/base.js +103 -0
- package/dist/interceptors/base.js.map +1 -0
- package/dist/interceptors/capability.d.ts +16 -0
- package/dist/interceptors/capability.d.ts.map +1 -0
- package/dist/interceptors/capability.js +63 -0
- package/dist/interceptors/capability.js.map +1 -0
- package/dist/interceptors/circuit-breaker.d.ts +40 -0
- package/dist/interceptors/circuit-breaker.d.ts.map +1 -0
- package/dist/interceptors/circuit-breaker.js +91 -0
- package/dist/interceptors/circuit-breaker.js.map +1 -0
- package/dist/interceptors/compression.d.ts +11 -0
- package/dist/interceptors/compression.d.ts.map +1 -0
- package/dist/interceptors/compression.js +12 -0
- package/dist/interceptors/compression.js.map +1 -0
- package/dist/interceptors/deadline.d.ts +12 -0
- package/dist/interceptors/deadline.d.ts.map +1 -0
- package/dist/interceptors/deadline.js +28 -0
- package/dist/interceptors/deadline.js.map +1 -0
- package/dist/interceptors/metrics.d.ts +43 -0
- package/dist/interceptors/metrics.d.ts.map +1 -0
- package/dist/interceptors/metrics.js +132 -0
- package/dist/interceptors/metrics.js.map +1 -0
- package/dist/interceptors/rate-limit.d.ts +24 -0
- package/dist/interceptors/rate-limit.d.ts.map +1 -0
- package/dist/interceptors/rate-limit.js +84 -0
- package/dist/interceptors/rate-limit.js.map +1 -0
- package/dist/interceptors/retry.d.ts +25 -0
- package/dist/interceptors/retry.d.ts.map +1 -0
- package/dist/interceptors/retry.js +55 -0
- package/dist/interceptors/retry.js.map +1 -0
- package/dist/limits.d.ts +77 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +137 -0
- package/dist/limits.js.map +1 -0
- package/dist/logging.d.ts +40 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +92 -0
- package/dist/logging.js.map +1 -0
- package/dist/metadata.d.ts +14 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +68 -0
- package/dist/metadata.js.map +1 -0
- package/dist/metrics.d.ts +40 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +92 -0
- package/dist/metrics.js.map +1 -0
- package/dist/peer-store.d.ts +53 -0
- package/dist/peer-store.d.ts.map +1 -0
- package/dist/peer-store.js +105 -0
- package/dist/peer-store.js.map +1 -0
- package/dist/protocol.d.ts +44 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +59 -0
- package/dist/protocol.js.map +1 -0
- package/dist/registration.d.ts +81 -0
- package/dist/registration.d.ts.map +1 -0
- package/dist/registration.js +161 -0
- package/dist/registration.js.map +1 -0
- package/dist/registry/acl.d.ts +57 -0
- package/dist/registry/acl.d.ts.map +1 -0
- package/dist/registry/acl.js +104 -0
- package/dist/registry/acl.js.map +1 -0
- package/dist/registry/client.d.ts +70 -0
- package/dist/registry/client.d.ts.map +1 -0
- package/dist/registry/client.js +115 -0
- package/dist/registry/client.js.map +1 -0
- package/dist/registry/gossip.d.ts +43 -0
- package/dist/registry/gossip.d.ts.map +1 -0
- package/dist/registry/gossip.js +102 -0
- package/dist/registry/gossip.js.map +1 -0
- package/dist/registry/keys.d.ts +25 -0
- package/dist/registry/keys.d.ts.map +1 -0
- package/dist/registry/keys.js +47 -0
- package/dist/registry/keys.js.map +1 -0
- package/dist/registry/models.d.ts +80 -0
- package/dist/registry/models.d.ts.map +1 -0
- package/dist/registry/models.js +35 -0
- package/dist/registry/models.js.map +1 -0
- package/dist/registry/publisher.d.ts +65 -0
- package/dist/registry/publisher.d.ts.map +1 -0
- package/dist/registry/publisher.js +164 -0
- package/dist/registry/publisher.js.map +1 -0
- package/dist/runtime.d.ts +267 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1366 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server.d.ts +100 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +511 -0
- package/dist/server.js.map +1 -0
- package/dist/service.d.ts +72 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +98 -0
- package/dist/service.js.map +1 -0
- package/dist/session.d.ts +64 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +350 -0
- package/dist/session.js.map +1 -0
- package/dist/status.d.ts +113 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +206 -0
- package/dist/status.js.map +1 -0
- package/dist/transport/base.d.ts +46 -0
- package/dist/transport/base.d.ts.map +1 -0
- package/dist/transport/base.js +10 -0
- package/dist/transport/base.js.map +1 -0
- package/dist/transport/iroh.d.ts +45 -0
- package/dist/transport/iroh.d.ts.map +1 -0
- package/dist/transport/iroh.js +225 -0
- package/dist/transport/iroh.js.map +1 -0
- package/dist/transport/local.d.ts +48 -0
- package/dist/transport/local.d.ts.map +1 -0
- package/dist/transport/local.js +139 -0
- package/dist/transport/local.js.map +1 -0
- package/dist/trust/admission.d.ts +60 -0
- package/dist/trust/admission.d.ts.map +1 -0
- package/dist/trust/admission.js +149 -0
- package/dist/trust/admission.js.map +1 -0
- package/dist/trust/bootstrap.d.ts +109 -0
- package/dist/trust/bootstrap.d.ts.map +1 -0
- package/dist/trust/bootstrap.js +311 -0
- package/dist/trust/bootstrap.js.map +1 -0
- package/dist/trust/clock.d.ts +93 -0
- package/dist/trust/clock.d.ts.map +1 -0
- package/dist/trust/clock.js +154 -0
- package/dist/trust/clock.js.map +1 -0
- package/dist/trust/consumer.d.ts +139 -0
- package/dist/trust/consumer.d.ts.map +1 -0
- package/dist/trust/consumer.js +323 -0
- package/dist/trust/consumer.js.map +1 -0
- package/dist/trust/credentials.d.ts +98 -0
- package/dist/trust/credentials.d.ts.map +1 -0
- package/dist/trust/credentials.js +250 -0
- package/dist/trust/credentials.js.map +1 -0
- package/dist/trust/delegated.d.ts +118 -0
- package/dist/trust/delegated.d.ts.map +1 -0
- package/dist/trust/delegated.js +292 -0
- package/dist/trust/delegated.js.map +1 -0
- package/dist/trust/gossip.d.ts +146 -0
- package/dist/trust/gossip.d.ts.map +1 -0
- package/dist/trust/gossip.js +334 -0
- package/dist/trust/gossip.js.map +1 -0
- package/dist/trust/hooks.d.ts +84 -0
- package/dist/trust/hooks.d.ts.map +1 -0
- package/dist/trust/hooks.js +125 -0
- package/dist/trust/hooks.js.map +1 -0
- package/dist/trust/iid.d.ts +65 -0
- package/dist/trust/iid.d.ts.map +1 -0
- package/dist/trust/iid.js +104 -0
- package/dist/trust/iid.js.map +1 -0
- package/dist/trust/mesh.d.ts +43 -0
- package/dist/trust/mesh.d.ts.map +1 -0
- package/dist/trust/mesh.js +105 -0
- package/dist/trust/mesh.js.map +1 -0
- package/dist/trust/nonce.d.ts +39 -0
- package/dist/trust/nonce.d.ts.map +1 -0
- package/dist/trust/nonce.js +46 -0
- package/dist/trust/nonce.js.map +1 -0
- package/dist/trust/producer.d.ts +80 -0
- package/dist/trust/producer.d.ts.map +1 -0
- package/dist/trust/producer.js +151 -0
- package/dist/trust/producer.js.map +1 -0
- package/dist/trust/rcan.d.ts +29 -0
- package/dist/trust/rcan.d.ts.map +1 -0
- package/dist/trust/rcan.js +57 -0
- package/dist/trust/rcan.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +50 -0
- package/dist/types.js.map +1 -0
- package/dist/xlang.d.ts +26 -0
- package/dist/xlang.d.ts.map +1 -0
- package/dist/xlang.js +55 -0
- package/dist/xlang.js.map +1 -0
- package/package.json +59 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aster-rpc/aster -- Aster RPC framework for TypeScript.
|
|
3
|
+
*
|
|
4
|
+
* P2P services with type safety, streaming, and trust.
|
|
5
|
+
* Built on Iroh (QUIC, blobs, docs, gossip).
|
|
6
|
+
*
|
|
7
|
+
* Works with Node.js 20+, Bun 1.0+, and Deno (via Node compat).
|
|
8
|
+
* All examples use TypeScript; plain JavaScript works by omitting type annotations.
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
// Status codes and errors
|
|
13
|
+
export { StatusCode, statusName, RpcError, CancelledError, UnknownRpcError, InvalidArgumentError, DeadlineExceededError, NotFoundError, AlreadyExistsError, PermissionDeniedError, ResourceExhaustedError, FailedPreconditionError, AbortedError, OutOfRangeError, UnimplementedError, InternalError, UnavailableError, DataLossError, UnauthenticatedError, ContractViolationError, } from './status.js';
|
|
14
|
+
// Types and enums
|
|
15
|
+
export { SerializationMode, RpcPattern, RpcScope, RPC_ALPN, DEFAULT_BACKOFF, DEFAULT_RETRY, } from './types.js';
|
|
16
|
+
// Security limits
|
|
17
|
+
export { MAX_FRAME_SIZE, MAX_DECOMPRESSED_SIZE, DEFAULT_FRAME_READ_TIMEOUT_S, MAX_METADATA_ENTRIES, MAX_METADATA_TOTAL_BYTES, MAX_STATUS_MESSAGE_LEN, HEX_FIELD_LENGTHS, LimitExceeded, validateHexField, validateMetadata, validateStatusMessage, } from './limits.js';
|
|
18
|
+
// Framing
|
|
19
|
+
export { COMPRESSED, TRAILER, HEADER, ROW_SCHEMA, CALL, CANCEL, FramingError, writeFrame, readFrame, encodeFrame, decodeFrame, } from './framing.js';
|
|
20
|
+
// Protocol types
|
|
21
|
+
export { StreamHeader, CallHeader, RpcStatus } from './protocol.js';
|
|
22
|
+
// Service metadata and registry
|
|
23
|
+
export { SERVICE_INFO_KEY, METHOD_INFO_KEY, getServiceInfo, ServiceRegistry, getMethod, hasMethod, getDefaultRegistry, setDefaultRegistry, } from './service.js';
|
|
24
|
+
// Metadata
|
|
25
|
+
export { Metadata } from './metadata.js';
|
|
26
|
+
// Decorators
|
|
27
|
+
export { Service, Rpc, ServerStream, ClientStream, BidiStream, WireType, WIRE_TYPE_KEY, WIRE_TYPE_FIELDS_KEY, } from './decorators.js';
|
|
28
|
+
// Codec
|
|
29
|
+
export { JsonCodec, ForyCodec, DEFAULT_COMPRESSION_THRESHOLD, walkTypeGraph, wireType, resolveForyConfig, } from './codec.js';
|
|
30
|
+
export { LocalTransport, MemRecvStream } from './transport/local.js';
|
|
31
|
+
// Client
|
|
32
|
+
export { createClient, createLocalClient, timeSleep, timeouts, ServiceClient, } from './client.js';
|
|
33
|
+
// Interceptors
|
|
34
|
+
export { CallContext, buildCallContext, applyRequestInterceptors, applyResponseInterceptors, applyErrorInterceptors, normalizeError, } from './interceptors/base.js';
|
|
35
|
+
export { DeadlineInterceptor } from './interceptors/deadline.js';
|
|
36
|
+
export { MetricsInterceptor } from './interceptors/metrics.js';
|
|
37
|
+
export { RetryInterceptor } from './interceptors/retry.js';
|
|
38
|
+
export { RateLimitInterceptor } from './interceptors/rate-limit.js';
|
|
39
|
+
export { AuthInterceptor } from './interceptors/auth.js';
|
|
40
|
+
export { CircuitBreakerInterceptor } from './interceptors/circuit-breaker.js';
|
|
41
|
+
export { CompressionInterceptor } from './interceptors/compression.js';
|
|
42
|
+
export { AuditLogInterceptor } from './interceptors/audit.js';
|
|
43
|
+
export { CapabilityInterceptor } from './interceptors/capability.js';
|
|
44
|
+
// Contract identity (delegated to Rust core via NAPI)
|
|
45
|
+
export { canonicalXlangBytes, computeContractId, contractIdFromContract, contractIdFromJson, contractIdFromService, buildTypeGraph, fromServiceInfo, setNativeContract, TypeKind as ContractTypeKind, ContainerKind, TypeDefKind, MethodPattern, CapabilityKind, ScopeKind, } from './contract/identity.js';
|
|
46
|
+
// Contract manifest and publication
|
|
47
|
+
export { FatalContractMismatch, verifyManifestOrFatal, manifestToJson, manifestFromJson, extractMethodDescriptors, saveManifest, } from './contract/manifest.js';
|
|
48
|
+
export { buildCollection, publishContract, uploadCollection, fetchFromCollection, fetchContract, } from './contract/publication.js';
|
|
49
|
+
// Dynamic type factory
|
|
50
|
+
export { DynamicTypeFactory, createDynamicType, } from './dynamic.js';
|
|
51
|
+
// Session-scoped services (extended)
|
|
52
|
+
export { SessionServer, SessionStub, createSession } from './session.js';
|
|
53
|
+
// Transport implementations
|
|
54
|
+
export { IrohTransport } from './transport/iroh.js';
|
|
55
|
+
// Configuration
|
|
56
|
+
export { configFromEnv, configFromFile, loadEndpointConfig, resolveRootPubkey, toEndpointConfig, loadIdentity, loadIdentityFile, findPeer, getProducerTokens, parseSimpleToml, printConfig, } from './config.js';
|
|
57
|
+
// Logging
|
|
58
|
+
export { AsterLogger, createLogger, withRequestContext, getRequestContext, } from './logging.js';
|
|
59
|
+
// Health
|
|
60
|
+
export { HealthServer, ConnectionMetrics as HealthConnectionMetrics, AdmissionMetrics as HealthAdmissionMetrics, getConnectionMetrics, getAdmissionMetrics, resetMetrics, checkHealth, checkReady, healthStatus, readyStatus, metricsSnapshot, } from './health.js';
|
|
61
|
+
// High-level API
|
|
62
|
+
export { AsterServer, AsterClientWrapper, ProxyClient, AdmissionDeniedError, } from './runtime.js';
|
|
63
|
+
// @aster endpoint registration
|
|
64
|
+
export { loadProducerTokens, resolveAsterAddress, startRegistrationLoop, } from './registration.js';
|
|
65
|
+
// Capability helpers
|
|
66
|
+
export { anyOf, allOf } from './capabilities.js';
|
|
67
|
+
// Trust & Security
|
|
68
|
+
export { generateKeypair, generateRootKeypair, loadPrivateKey, loadPublicKey, verifySignature, sign, verify, ATTR_ROLE, ATTR_NAME, canonicalJson, producerSigningBytes, consumerSigningBytes, credentialSigningBytes, signCredential, verifyCredentialSignature, hexToBytes, bytesToHex, } from './trust/credentials.js';
|
|
69
|
+
export { verifyConsumerCredential, verifyProducerCredential, checkOffline, checkRuntime, admit, } from './trust/admission.js';
|
|
70
|
+
export { AllowAllPolicy, DenyAllPolicy, MeshEndpointHook, CONSUMER_ADMISSION_ALPN, } from './trust/hooks.js';
|
|
71
|
+
export { MeshState, saveMeshState, loadMeshState, } from './trust/mesh.js';
|
|
72
|
+
// Producer admission
|
|
73
|
+
export { handleProducerAdmission, serveProducerAdmission, PRODUCER_ADMISSION_ALPN, } from './trust/producer.js';
|
|
74
|
+
// Nonce store
|
|
75
|
+
export { InMemoryNonceStore, } from './trust/nonce.js';
|
|
76
|
+
// RCAN validation
|
|
77
|
+
export { evaluateCapability, extractCallerRoles, validateRcan, encodeRcan, decodeRcan, } from './trust/rcan.js';
|
|
78
|
+
// IID (cloud identity)
|
|
79
|
+
export { verifyIID, getIIDBackend, MockIIDBackend, AWSIIDBackend, GCPIIDBackend, AzureIIDBackend, ATTR_IID_PROVIDER, ATTR_IID_ACCOUNT, ATTR_IID_REGION, ATTR_IID_ROLE_ARN, } from './trust/iid.js';
|
|
80
|
+
// Clock drift
|
|
81
|
+
export { ClockDriftTracker, computeDrift, shouldIsolate, DEFAULT_CLOCK_DRIFT_CONFIG, } from './trust/clock.js';
|
|
82
|
+
// Producer mesh gossip
|
|
83
|
+
export { ProducerMessageType, deriveGossipTopic, producerMessageSigningBytes, signProducerMessage, verifyProducerMessage, handleProducerMessage, encodeIntroducePayload, encodeDepartPayload, encodeContractPublishedPayload, encodeLeaseUpdatePayload, startLeaseHeartbeat, runLeaseHeartbeat, } from './trust/gossip.js';
|
|
84
|
+
// Mesh bootstrap
|
|
85
|
+
export { startFoundingNode, joinMesh, applyAdmissionResponse, handleAdmissionRpc, handleProducerAdmissionConnection, makeEphemeralMeshState, } from './trust/bootstrap.js';
|
|
86
|
+
// Connection & Admission Metrics (from metrics.ts)
|
|
87
|
+
export { ConnectionMetrics, AdmissionMetrics } from './metrics.js';
|
|
88
|
+
// RPC Server (QUIC accept loop)
|
|
89
|
+
export { RpcServer } from './server.js';
|
|
90
|
+
// Registry
|
|
91
|
+
export { RegistryClient, registryKey, } from './registry/client.js';
|
|
92
|
+
export { RegistryPublisher, } from './registry/publisher.js';
|
|
93
|
+
export { RegistryACL, } from './registry/acl.js';
|
|
94
|
+
export { RegistryGossip, } from './registry/gossip.js';
|
|
95
|
+
export { contractKey, versionKey, channelKey, tagKey, leaseKey, leasePrefix, aclKey, configKey, REGISTRY_PREFIXES, } from './registry/keys.js';
|
|
96
|
+
export { HealthStatus, GossipEventType, validate as validateHealthStatus, isLeaseFresh, isLeaseRoutable, } from './registry/models.js';
|
|
97
|
+
// Consumer admission
|
|
98
|
+
export { performAdmission, consumerCredToJson, consumerCredFromJson, handleConsumerAdmissionRpc, handleConsumerAdmissionConnection, serveConsumerAdmission, } from './trust/consumer.js';
|
|
99
|
+
// Delegated admission (aster.admission ALPN)
|
|
100
|
+
export { verifyAttestation, verifyToken, verifyProofOfPossession, buildChallengeBytes, handleDelegatedAdmissionConnection, } from './trust/delegated.js';
|
|
101
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit log interceptor — logs RPC calls for compliance/debugging.
|
|
3
|
+
*/
|
|
4
|
+
import type { Interceptor } from './base.js';
|
|
5
|
+
import { CallContext } from './base.js';
|
|
6
|
+
import { RpcError } from '../status.js';
|
|
7
|
+
export type AuditLogFn = (entry: AuditEntry) => void;
|
|
8
|
+
export interface AuditEntry {
|
|
9
|
+
timestamp: string;
|
|
10
|
+
service: string;
|
|
11
|
+
method: string;
|
|
12
|
+
callId: string;
|
|
13
|
+
peer: string | undefined;
|
|
14
|
+
status: 'started' | 'completed' | 'failed';
|
|
15
|
+
errorCode?: string;
|
|
16
|
+
errorMessage?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class AuditLogInterceptor implements Interceptor {
|
|
19
|
+
private log;
|
|
20
|
+
constructor(logFn?: AuditLogFn);
|
|
21
|
+
onRequest(ctx: CallContext, request: unknown): Promise<unknown>;
|
|
22
|
+
onResponse(ctx: CallContext, response: unknown): Promise<unknown>;
|
|
23
|
+
onError(ctx: CallContext, error: RpcError): Promise<RpcError>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/interceptors/audit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAc,MAAM,cAAc,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,GAAG,CAAa;gBAEZ,KAAK,CAAC,EAAE,UAAU;IAIxB,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAY/D,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAYjE,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;CAapE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit log interceptor — logs RPC calls for compliance/debugging.
|
|
3
|
+
*/
|
|
4
|
+
import { statusName } from '../status.js';
|
|
5
|
+
export class AuditLogInterceptor {
|
|
6
|
+
log;
|
|
7
|
+
constructor(logFn) {
|
|
8
|
+
this.log = logFn ?? ((entry) => console.log(JSON.stringify(entry)));
|
|
9
|
+
}
|
|
10
|
+
async onRequest(ctx, request) {
|
|
11
|
+
this.log({
|
|
12
|
+
timestamp: new Date().toISOString(),
|
|
13
|
+
service: ctx.service,
|
|
14
|
+
method: ctx.method,
|
|
15
|
+
callId: ctx.callId,
|
|
16
|
+
peer: ctx.peer,
|
|
17
|
+
status: 'started',
|
|
18
|
+
});
|
|
19
|
+
return request;
|
|
20
|
+
}
|
|
21
|
+
async onResponse(ctx, response) {
|
|
22
|
+
this.log({
|
|
23
|
+
timestamp: new Date().toISOString(),
|
|
24
|
+
service: ctx.service,
|
|
25
|
+
method: ctx.method,
|
|
26
|
+
callId: ctx.callId,
|
|
27
|
+
peer: ctx.peer,
|
|
28
|
+
status: 'completed',
|
|
29
|
+
});
|
|
30
|
+
return response;
|
|
31
|
+
}
|
|
32
|
+
async onError(ctx, error) {
|
|
33
|
+
this.log({
|
|
34
|
+
timestamp: new Date().toISOString(),
|
|
35
|
+
service: ctx.service,
|
|
36
|
+
method: ctx.method,
|
|
37
|
+
callId: ctx.callId,
|
|
38
|
+
peer: ctx.peer,
|
|
39
|
+
status: 'failed',
|
|
40
|
+
errorCode: statusName(error.code),
|
|
41
|
+
errorMessage: error.message,
|
|
42
|
+
});
|
|
43
|
+
return error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/interceptors/audit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAY,UAAU,EAAE,MAAM,cAAc,CAAC;AAepD,MAAM,OAAO,mBAAmB;IACtB,GAAG,CAAa;IAExB,YAAY,KAAkB;QAC5B,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAgB,EAAE,OAAgB;QAChD,IAAI,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAgB,EAAE,QAAiB;QAClD,IAAI,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAgB,EAAE,KAAe;QAC7C,IAAI,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;YACjC,YAAY,EAAE,KAAK,CAAC,OAAO;SAC5B,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth interceptor — injects or validates auth tokens in metadata.
|
|
3
|
+
*/
|
|
4
|
+
import type { Interceptor } from './base.js';
|
|
5
|
+
import { CallContext } from './base.js';
|
|
6
|
+
export declare class AuthInterceptor implements Interceptor {
|
|
7
|
+
private readonly tokenProvider?;
|
|
8
|
+
private readonly tokenValidator?;
|
|
9
|
+
private readonly headerKey;
|
|
10
|
+
constructor(tokenProvider?: (() => string | Promise<string>) | undefined, tokenValidator?: ((token: string) => boolean | Promise<boolean>) | undefined, headerKey?: string);
|
|
11
|
+
onRequest(ctx: CallContext, request: unknown): Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/interceptors/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,qBAAa,eAAgB,YAAW,WAAW;IAE/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,aAAa,CAAC,GAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,aAAA,EAC9C,cAAc,CAAC,GAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,aAAA,EAC9D,SAAS,SAAkB;IAGxC,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAqBtE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth interceptor — injects or validates auth tokens in metadata.
|
|
3
|
+
*/
|
|
4
|
+
import { RpcError, StatusCode } from '../status.js';
|
|
5
|
+
export class AuthInterceptor {
|
|
6
|
+
tokenProvider;
|
|
7
|
+
tokenValidator;
|
|
8
|
+
headerKey;
|
|
9
|
+
constructor(tokenProvider, tokenValidator, headerKey = 'authorization') {
|
|
10
|
+
this.tokenProvider = tokenProvider;
|
|
11
|
+
this.tokenValidator = tokenValidator;
|
|
12
|
+
this.headerKey = headerKey;
|
|
13
|
+
}
|
|
14
|
+
async onRequest(ctx, request) {
|
|
15
|
+
// Client-side: inject token
|
|
16
|
+
if (this.tokenProvider) {
|
|
17
|
+
const token = await this.tokenProvider();
|
|
18
|
+
ctx.metadata[this.headerKey] = token;
|
|
19
|
+
}
|
|
20
|
+
// Server-side: validate token
|
|
21
|
+
if (this.tokenValidator) {
|
|
22
|
+
const token = ctx.metadata[this.headerKey];
|
|
23
|
+
if (!token) {
|
|
24
|
+
throw new RpcError(StatusCode.UNAUTHENTICATED, 'missing auth token');
|
|
25
|
+
}
|
|
26
|
+
const valid = await this.tokenValidator(token);
|
|
27
|
+
if (!valid) {
|
|
28
|
+
throw new RpcError(StatusCode.UNAUTHENTICATED, 'invalid auth token');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return request;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/interceptors/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,OAAO,eAAe;IAEP;IACA;IACA;IAHnB,YACmB,aAA8C,EAC9C,cAA8D,EAC9D,YAAY,eAAe;QAF3B,kBAAa,GAAb,aAAa,CAAiC;QAC9C,mBAAc,GAAd,cAAc,CAAgD;QAC9D,cAAS,GAAT,SAAS,CAAkB;IAC3C,CAAC;IAEJ,KAAK,CAAC,SAAS,CAAC,GAAgB,EAAE,OAAgB;QAChD,4BAA4B;QAC5B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YACzC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;QACvC,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACvE,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base interceptor primitives and helpers.
|
|
3
|
+
*
|
|
4
|
+
* Interceptors form a middleware chain for RPC calls:
|
|
5
|
+
* - Request path: interceptor1 -> interceptor2 -> ... -> handler
|
|
6
|
+
* - Response path: same order
|
|
7
|
+
* - Error path: reverse order (LIFO)
|
|
8
|
+
*/
|
|
9
|
+
import { RpcError } from '../status.js';
|
|
10
|
+
import type { RpcPattern } from '../types.js';
|
|
11
|
+
/** Context describing a single RPC invocation. */
|
|
12
|
+
export declare class CallContext {
|
|
13
|
+
service: string;
|
|
14
|
+
method: string;
|
|
15
|
+
callId: string;
|
|
16
|
+
sessionId: string | undefined;
|
|
17
|
+
peer: string | undefined;
|
|
18
|
+
metadata: Record<string, string>;
|
|
19
|
+
attributes: Record<string, string>;
|
|
20
|
+
deadline: number | undefined;
|
|
21
|
+
isStreaming: boolean;
|
|
22
|
+
pattern: RpcPattern | undefined;
|
|
23
|
+
idempotent: boolean;
|
|
24
|
+
attempt: number;
|
|
25
|
+
constructor(init: {
|
|
26
|
+
service: string;
|
|
27
|
+
method: string;
|
|
28
|
+
callId?: string;
|
|
29
|
+
sessionId?: string;
|
|
30
|
+
peer?: string;
|
|
31
|
+
metadata?: Record<string, string>;
|
|
32
|
+
attributes?: Record<string, string>;
|
|
33
|
+
deadline?: number;
|
|
34
|
+
isStreaming?: boolean;
|
|
35
|
+
pattern?: RpcPattern;
|
|
36
|
+
idempotent?: boolean;
|
|
37
|
+
attempt?: number;
|
|
38
|
+
});
|
|
39
|
+
/** Seconds until deadline, or undefined if no deadline set. */
|
|
40
|
+
get remainingSeconds(): number | undefined;
|
|
41
|
+
/** True if deadline has passed. */
|
|
42
|
+
get expired(): boolean;
|
|
43
|
+
}
|
|
44
|
+
/** Base interceptor interface. */
|
|
45
|
+
export interface Interceptor {
|
|
46
|
+
onRequest?(ctx: CallContext, request: unknown): Promise<unknown>;
|
|
47
|
+
onResponse?(ctx: CallContext, response: unknown): Promise<unknown>;
|
|
48
|
+
onError?(ctx: CallContext, error: RpcError): Promise<RpcError | null>;
|
|
49
|
+
}
|
|
50
|
+
/** Convert deadline epoch ms to Unix seconds, or undefined. */
|
|
51
|
+
export declare function deadlineFromEpochMs(ms: number): number | undefined;
|
|
52
|
+
/** Build a CallContext from common parameters. */
|
|
53
|
+
export declare function buildCallContext(opts: {
|
|
54
|
+
service: string;
|
|
55
|
+
method: string;
|
|
56
|
+
metadata?: Record<string, string>;
|
|
57
|
+
deadlineEpochMs?: number;
|
|
58
|
+
peer?: string;
|
|
59
|
+
isStreaming?: boolean;
|
|
60
|
+
pattern?: RpcPattern;
|
|
61
|
+
idempotent?: boolean;
|
|
62
|
+
callId?: string;
|
|
63
|
+
sessionId?: string;
|
|
64
|
+
attributes?: Record<string, string>;
|
|
65
|
+
}): CallContext;
|
|
66
|
+
/** Apply request interceptors in order. */
|
|
67
|
+
export declare function applyRequestInterceptors(interceptors: Interceptor[], ctx: CallContext, request: unknown): Promise<unknown>;
|
|
68
|
+
/** Apply response interceptors in order. */
|
|
69
|
+
export declare function applyResponseInterceptors(interceptors: Interceptor[], ctx: CallContext, response: unknown): Promise<unknown>;
|
|
70
|
+
/** Apply error interceptors in reverse order (LIFO). */
|
|
71
|
+
export declare function applyErrorInterceptors(interceptors: Interceptor[], ctx: CallContext, error: RpcError): Promise<RpcError | null>;
|
|
72
|
+
/** Normalize any error into an RpcError. */
|
|
73
|
+
export declare function normalizeError(error: unknown): RpcError;
|
|
74
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/interceptors/base.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAc,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,kDAAkD;AAClD,qBAAa,WAAW;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;gBAEJ,IAAI,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,CAAC,EAAE,UAAU,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;IAeD,+DAA+D;IAC/D,IAAI,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAGzC;IAED,mCAAmC;IACnC,IAAI,OAAO,IAAI,OAAO,CAGrB;CACF;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,UAAU,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CACvE;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,GAAG,WAAW,CAKd;AAED,2CAA2C;AAC3C,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,WAAW,EAAE,EAC3B,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED,4CAA4C;AAC5C,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,WAAW,EAAE,EAC3B,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED,wDAAwD;AACxD,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,WAAW,EAAE,EAC3B,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQ1B;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CASvD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base interceptor primitives and helpers.
|
|
3
|
+
*
|
|
4
|
+
* Interceptors form a middleware chain for RPC calls:
|
|
5
|
+
* - Request path: interceptor1 -> interceptor2 -> ... -> handler
|
|
6
|
+
* - Response path: same order
|
|
7
|
+
* - Error path: reverse order (LIFO)
|
|
8
|
+
*/
|
|
9
|
+
import { RpcError, StatusCode } from '../status.js';
|
|
10
|
+
/** Context describing a single RPC invocation. */
|
|
11
|
+
export class CallContext {
|
|
12
|
+
service;
|
|
13
|
+
method;
|
|
14
|
+
callId;
|
|
15
|
+
sessionId;
|
|
16
|
+
peer;
|
|
17
|
+
metadata;
|
|
18
|
+
attributes;
|
|
19
|
+
deadline; // Unix seconds
|
|
20
|
+
isStreaming;
|
|
21
|
+
pattern;
|
|
22
|
+
idempotent;
|
|
23
|
+
attempt;
|
|
24
|
+
constructor(init) {
|
|
25
|
+
this.service = init.service;
|
|
26
|
+
this.method = init.method;
|
|
27
|
+
this.callId = init.callId ?? crypto.randomUUID();
|
|
28
|
+
this.sessionId = init.sessionId;
|
|
29
|
+
this.peer = init.peer;
|
|
30
|
+
this.metadata = init.metadata ?? {};
|
|
31
|
+
this.attributes = init.attributes ?? {};
|
|
32
|
+
this.deadline = init.deadline;
|
|
33
|
+
this.isStreaming = init.isStreaming ?? false;
|
|
34
|
+
this.pattern = init.pattern;
|
|
35
|
+
this.idempotent = init.idempotent ?? false;
|
|
36
|
+
this.attempt = init.attempt ?? 1;
|
|
37
|
+
}
|
|
38
|
+
/** Seconds until deadline, or undefined if no deadline set. */
|
|
39
|
+
get remainingSeconds() {
|
|
40
|
+
if (this.deadline === undefined)
|
|
41
|
+
return undefined;
|
|
42
|
+
return Math.max(0, this.deadline - Date.now() / 1000);
|
|
43
|
+
}
|
|
44
|
+
/** True if deadline has passed. */
|
|
45
|
+
get expired() {
|
|
46
|
+
const remaining = this.remainingSeconds;
|
|
47
|
+
return remaining !== undefined && remaining <= 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Convert deadline epoch ms to Unix seconds, or undefined. */
|
|
51
|
+
export function deadlineFromEpochMs(ms) {
|
|
52
|
+
return ms > 0 ? ms / 1000 : undefined;
|
|
53
|
+
}
|
|
54
|
+
/** Build a CallContext from common parameters. */
|
|
55
|
+
export function buildCallContext(opts) {
|
|
56
|
+
return new CallContext({
|
|
57
|
+
...opts,
|
|
58
|
+
deadline: deadlineFromEpochMs(opts.deadlineEpochMs ?? 0),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/** Apply request interceptors in order. */
|
|
62
|
+
export async function applyRequestInterceptors(interceptors, ctx, request) {
|
|
63
|
+
let current = request;
|
|
64
|
+
for (const i of interceptors) {
|
|
65
|
+
if (i.onRequest)
|
|
66
|
+
current = await i.onRequest(ctx, current);
|
|
67
|
+
}
|
|
68
|
+
return current;
|
|
69
|
+
}
|
|
70
|
+
/** Apply response interceptors in order. */
|
|
71
|
+
export async function applyResponseInterceptors(interceptors, ctx, response) {
|
|
72
|
+
let current = response;
|
|
73
|
+
for (const i of interceptors) {
|
|
74
|
+
if (i.onResponse)
|
|
75
|
+
current = await i.onResponse(ctx, current);
|
|
76
|
+
}
|
|
77
|
+
return current;
|
|
78
|
+
}
|
|
79
|
+
/** Apply error interceptors in reverse order (LIFO). */
|
|
80
|
+
export async function applyErrorInterceptors(interceptors, ctx, error) {
|
|
81
|
+
let current = error;
|
|
82
|
+
for (let idx = interceptors.length - 1; idx >= 0; idx--) {
|
|
83
|
+
if (current === null)
|
|
84
|
+
return null;
|
|
85
|
+
const i = interceptors[idx];
|
|
86
|
+
if (i.onError)
|
|
87
|
+
current = await i.onError(ctx, current);
|
|
88
|
+
}
|
|
89
|
+
return current;
|
|
90
|
+
}
|
|
91
|
+
/** Normalize any error into an RpcError. */
|
|
92
|
+
export function normalizeError(error) {
|
|
93
|
+
if (error instanceof RpcError)
|
|
94
|
+
return error;
|
|
95
|
+
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
96
|
+
return new RpcError(StatusCode.DEADLINE_EXCEEDED, 'deadline exceeded');
|
|
97
|
+
}
|
|
98
|
+
if (error instanceof Error) {
|
|
99
|
+
return new RpcError(StatusCode.UNKNOWN, error.message);
|
|
100
|
+
}
|
|
101
|
+
return new RpcError(StatusCode.UNKNOWN, String(error));
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/interceptors/base.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGpD,kDAAkD;AAClD,MAAM,OAAO,WAAW;IACtB,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,MAAM,CAAS;IACf,SAAS,CAAqB;IAC9B,IAAI,CAAqB;IACzB,QAAQ,CAAyB;IACjC,UAAU,CAAyB;IACnC,QAAQ,CAAqB,CAAC,eAAe;IAC7C,WAAW,CAAU;IACrB,OAAO,CAAyB;IAChC,UAAU,CAAU;IACpB,OAAO,CAAS;IAEhB,YAAY,IAaX;QACC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,+DAA+D;IAC/D,IAAI,gBAAgB;QAClB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAClD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,mCAAmC;IACnC,IAAI,OAAO;QACT,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACxC,OAAO,SAAS,KAAK,SAAS,IAAI,SAAS,IAAI,CAAC,CAAC;IACnD,CAAC;CACF;AASD,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACxC,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,gBAAgB,CAAC,IAYhC;IACC,OAAO,IAAI,WAAW,CAAC;QACrB,GAAG,IAAI;QACP,QAAQ,EAAE,mBAAmB,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;KACzD,CAAC,CAAC;AACL,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,YAA2B,EAC3B,GAAgB,EAChB,OAAgB;IAEhB,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,SAAS;YAAE,OAAO,GAAG,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,YAA2B,EAC3B,GAAgB,EAChB,QAAiB;IAEjB,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,UAAU;YAAE,OAAO,GAAG,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,YAA2B,EAC3B,GAAgB,EAChB,KAAe;IAEf,IAAI,OAAO,GAAoB,KAAK,CAAC;IACrC,KAAK,IAAI,GAAG,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QACxD,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAClC,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,OAAO;YAAE,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5D,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability interceptor — validates method-level access control.
|
|
3
|
+
*
|
|
4
|
+
* Checks that the caller's role (from admission attributes) satisfies
|
|
5
|
+
* the method's capability requirement.
|
|
6
|
+
*/
|
|
7
|
+
import type { Interceptor } from './base.js';
|
|
8
|
+
import { CallContext } from './base.js';
|
|
9
|
+
import type { CapabilityRequirement } from '../service.js';
|
|
10
|
+
export declare class CapabilityInterceptor implements Interceptor {
|
|
11
|
+
private requirements;
|
|
12
|
+
/** Register a capability requirement for a method. */
|
|
13
|
+
setRequirement(service: string, method: string, req: CapabilityRequirement | string): void;
|
|
14
|
+
onRequest(ctx: CallContext, request: unknown): Promise<unknown>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=capability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../src/interceptors/capability.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAoB3D,qBAAa,qBAAsB,YAAW,WAAW;IACvD,OAAO,CAAC,YAAY,CAA4C;IAEhE,sDAAsD;IACtD,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI;IAOpF,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CA4BtE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability interceptor — validates method-level access control.
|
|
3
|
+
*
|
|
4
|
+
* Checks that the caller's role (from admission attributes) satisfies
|
|
5
|
+
* the method's capability requirement.
|
|
6
|
+
*/
|
|
7
|
+
import { RpcError, StatusCode } from '../status.js';
|
|
8
|
+
/**
|
|
9
|
+
* Normalise a `requires` value to a `CapabilityRequirement` object.
|
|
10
|
+
*
|
|
11
|
+
* `@Rpc({ requires: Role.ADMIN })` passes a bare string for the common
|
|
12
|
+
* single-role case; `anyOf()`/`allOf()` produce a structured object. Both
|
|
13
|
+
* forms are accepted here so the interceptor logic stays uniform.
|
|
14
|
+
*/
|
|
15
|
+
function normaliseRequirement(req) {
|
|
16
|
+
if (req == null)
|
|
17
|
+
return null;
|
|
18
|
+
if (typeof req === 'string') {
|
|
19
|
+
return { kind: 'role', roles: [req] };
|
|
20
|
+
}
|
|
21
|
+
if (typeof req === 'object' && req !== null && 'kind' in req && 'roles' in req) {
|
|
22
|
+
return req;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
export class CapabilityInterceptor {
|
|
27
|
+
requirements = new Map();
|
|
28
|
+
/** Register a capability requirement for a method. */
|
|
29
|
+
setRequirement(service, method, req) {
|
|
30
|
+
const normalised = normaliseRequirement(req);
|
|
31
|
+
if (normalised) {
|
|
32
|
+
this.requirements.set(`${service}/${method}`, normalised);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async onRequest(ctx, request) {
|
|
36
|
+
const key = `${ctx.service}/${ctx.method}`;
|
|
37
|
+
const req = this.requirements.get(key);
|
|
38
|
+
if (!req)
|
|
39
|
+
return request;
|
|
40
|
+
// aster.role is a comma-separated list: "ops.status,ops.logs,ops.admin"
|
|
41
|
+
const roleStr = ctx.attributes['aster.role'] ?? '';
|
|
42
|
+
const callerRoles = new Set(roleStr.split(',').map(r => r.trim()).filter(Boolean));
|
|
43
|
+
switch (req.kind) {
|
|
44
|
+
case 'role':
|
|
45
|
+
if (!callerRoles.has(req.roles[0])) {
|
|
46
|
+
throw new RpcError(StatusCode.PERMISSION_DENIED, `requires role: ${req.roles.join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
case 'any_of':
|
|
50
|
+
if (!req.roles.some(r => callerRoles.has(r))) {
|
|
51
|
+
throw new RpcError(StatusCode.PERMISSION_DENIED, `requires any of: ${req.roles.join(', ')}`);
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
case 'all_of':
|
|
55
|
+
if (!req.roles.every(r => callerRoles.has(r))) {
|
|
56
|
+
throw new RpcError(StatusCode.PERMISSION_DENIED, `requires all of: ${req.roles.join(', ')}`);
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
return request;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=capability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../../src/interceptors/capability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit breaker interceptor — stops sending requests to failing services.
|
|
3
|
+
*
|
|
4
|
+
* States: CLOSED (normal) -> OPEN (failing) -> HALF_OPEN (probe) -> CLOSED
|
|
5
|
+
*/
|
|
6
|
+
import type { Interceptor } from './base.js';
|
|
7
|
+
import { CallContext } from './base.js';
|
|
8
|
+
import { RpcError } from '../status.js';
|
|
9
|
+
type State = 'closed' | 'open' | 'half_open';
|
|
10
|
+
export interface CircuitBreakerOptions {
|
|
11
|
+
failureThreshold?: number;
|
|
12
|
+
resetTimeoutMs?: number;
|
|
13
|
+
halfOpenMaxCalls?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class CircuitBreakerInterceptor implements Interceptor {
|
|
16
|
+
private state;
|
|
17
|
+
private failures;
|
|
18
|
+
private lastFailure;
|
|
19
|
+
private halfOpenCalls;
|
|
20
|
+
private readonly failureThreshold;
|
|
21
|
+
private readonly resetTimeoutMs;
|
|
22
|
+
private readonly halfOpenMaxCalls;
|
|
23
|
+
constructor(opts?: CircuitBreakerOptions);
|
|
24
|
+
onRequest(_ctx: CallContext, request: unknown): Promise<unknown>;
|
|
25
|
+
onResponse(_ctx: CallContext, response: unknown): Promise<unknown>;
|
|
26
|
+
onError(_ctx: CallContext, error: RpcError): Promise<RpcError>;
|
|
27
|
+
/** Current circuit state. */
|
|
28
|
+
get currentState(): State;
|
|
29
|
+
/**
|
|
30
|
+
* Pre-call gate check — throws if circuit is open.
|
|
31
|
+
* Alias for the logic in onRequest(), callable without a full call context.
|
|
32
|
+
*/
|
|
33
|
+
beforeCall(): void;
|
|
34
|
+
/** Record a successful call — resets the failure count. */
|
|
35
|
+
recordSuccess(): void;
|
|
36
|
+
/** Record a failed call — may open the circuit. */
|
|
37
|
+
recordFailure(): void;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/interceptors/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAc,MAAM,cAAc,CAAC;AAEpD,KAAK,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE7C,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,yBAA0B,YAAW,WAAW;IAC3D,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,IAAI,GAAE,qBAA0B;IAMtC,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBhE,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAQlE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IASpE,6BAA6B;IAC7B,IAAI,YAAY,IAAI,KAAK,CAExB;IAED;;;OAGG;IACH,UAAU,IAAI,IAAI;IAelB,2DAA2D;IAC3D,aAAa,IAAI,IAAI;IAKrB,mDAAmD;IACnD,aAAa,IAAI,IAAI;CAOtB"}
|