@apifuse/provider-sdk 2.2.0-beta.10 → 2.2.0-beta.12

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.
Files changed (83) hide show
  1. package/AUTHORING.md +37 -0
  2. package/CHANGELOG.md +8 -0
  3. package/README.md +18 -0
  4. package/bin/apifuse-pack-smoke.ts +14 -0
  5. package/bin/apifuse-pack-types.ts +11 -1
  6. package/dist/config/loader.d.ts +9 -1
  7. package/dist/config/loader.js +9 -0
  8. package/dist/errors.d.ts +5 -0
  9. package/dist/errors.js +15 -0
  10. package/dist/index.d.ts +3 -3
  11. package/dist/index.js +1 -1
  12. package/dist/runtime/stealth.js +113 -47
  13. package/dist/server/index.d.ts +1 -1
  14. package/dist/server/index.js +1 -1
  15. package/dist/server/serve.d.ts +98 -2
  16. package/dist/server/serve.js +485 -23
  17. package/dist/stateful/errors.d.ts +14 -0
  18. package/dist/stateful/errors.js +14 -0
  19. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  20. package/dist/stateful/http-provider-event-emitter.js +237 -0
  21. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  22. package/dist/stateful/http-session-owner-registry.js +210 -0
  23. package/dist/stateful/index.d.ts +18 -0
  24. package/dist/stateful/index.js +18 -0
  25. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  26. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  27. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  28. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  29. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  30. package/dist/stateful/provider-event-pipeline.js +1 -0
  31. package/dist/stateful/provider-events.d.ts +101 -0
  32. package/dist/stateful/provider-events.js +289 -0
  33. package/dist/stateful/session-key.d.ts +15 -0
  34. package/dist/stateful/session-key.js +86 -0
  35. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  36. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  37. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  38. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  39. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  40. package/dist/stateful/stateful-provider-adapter.js +287 -0
  41. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  42. package/dist/stateful/stateful-provider-observability.js +161 -0
  43. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  44. package/dist/stateful/stateful-provider-owner-forwarder.js +207 -0
  45. package/dist/stateful/stateful-provider-runtime-context.d.ts +32 -0
  46. package/dist/stateful/stateful-provider-runtime-context.js +60 -0
  47. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  48. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  49. package/dist/stateful/stateful-provider-session-routing.d.ts +71 -0
  50. package/dist/stateful/stateful-provider-session-routing.js +353 -0
  51. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  52. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  53. package/dist/stateful-signing.d.ts +18 -0
  54. package/dist/stateful-signing.js +27 -0
  55. package/dist/types.d.ts +39 -7
  56. package/package.json +7 -1
  57. package/src/config/loader.ts +22 -1
  58. package/src/errors.ts +15 -0
  59. package/src/index.ts +8 -1
  60. package/src/runtime/stealth.ts +127 -48
  61. package/src/server/index.ts +13 -1
  62. package/src/server/serve.ts +691 -25
  63. package/src/stateful/README.md +146 -0
  64. package/src/stateful/errors.ts +23 -0
  65. package/src/stateful/http-provider-event-emitter.ts +314 -0
  66. package/src/stateful/http-session-owner-registry.ts +306 -0
  67. package/src/stateful/index.ts +18 -0
  68. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  69. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  70. package/src/stateful/provider-event-pipeline.ts +61 -0
  71. package/src/stateful/provider-events.ts +462 -0
  72. package/src/stateful/session-key.ts +111 -0
  73. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  74. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  75. package/src/stateful/stateful-provider-adapter.ts +562 -0
  76. package/src/stateful/stateful-provider-observability.ts +261 -0
  77. package/src/stateful/stateful-provider-owner-forwarder.ts +279 -0
  78. package/src/stateful/stateful-provider-runtime-context.ts +92 -0
  79. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  80. package/src/stateful/stateful-provider-session-routing.ts +555 -0
  81. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  82. package/src/stateful-signing.ts +46 -0
  83. package/src/types.ts +41 -7
@@ -1,7 +1,56 @@
1
1
  import { Hono } from "hono";
2
+ import { z } from "zod";
2
3
  import { type ProviderErrorCategory } from "../observability.js";
3
- import type { ProviderDefinition, ProviderRuntimeState, SttContext } from "../types.js";
4
+ import type { ProviderContext, ProviderDefinition, ProviderRuntimeState, SttContext } from "../types.js";
4
5
  import { type OperationRequest } from "./types.js";
6
+ export declare const ProviderServerStatefulForwardEnvelopeSchema: z.ZodObject<{
7
+ requestId: z.ZodString;
8
+ providerId: z.ZodString;
9
+ operationId: z.ZodString;
10
+ sessionKey: z.ZodString;
11
+ connectionId: z.ZodString;
12
+ serviceAccountId: z.ZodString;
13
+ ownerPodId: z.ZodString;
14
+ generation: z.ZodNumber;
15
+ sourcePodId: z.ZodString;
16
+ forwardedAt: z.ZodString;
17
+ deadlineAt: z.ZodOptional<z.ZodString>;
18
+ idempotencyKey: z.ZodOptional<z.ZodString>;
19
+ operationRequest: z.ZodObject<{
20
+ requestId: z.ZodString;
21
+ input: z.ZodRecord<z.ZodString, z.ZodUnknown>;
22
+ connectionId: z.ZodOptional<z.ZodString>;
23
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
24
+ trace: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
25
+ connection: z.ZodOptional<z.ZodObject<{
26
+ id: z.ZodString;
27
+ mode: z.ZodEnum<{
28
+ none: "none";
29
+ credentials: "credentials";
30
+ oauth2: "oauth2";
31
+ "platform-managed": "platform-managed";
32
+ }>;
33
+ secrets: z.ZodRecord<z.ZodString, z.ZodString>;
34
+ scopes: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
+ metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
36
+ externalRef: z.ZodString;
37
+ }, z.core.$strict>>;
38
+ }, z.core.$strict>;
39
+ }, z.core.$strict>;
40
+ export type ProviderServerStatefulForwardEnvelope = Readonly<z.infer<typeof ProviderServerStatefulForwardEnvelopeSchema>>;
41
+ export type ProviderServerStatefulOwnerFence = Readonly<Pick<ProviderServerStatefulForwardEnvelope, "providerId" | "sessionKey" | "ownerPodId" | "generation" | "sourcePodId" | "forwardedAt" | "requestId" | "idempotencyKey">>;
42
+ export type ProviderServerStatefulOwnerFenceValidator = (fence: ProviderServerStatefulOwnerFence, signal: AbortSignal) => boolean | Promise<boolean>;
43
+ export type ProviderServerOperationExecutorInput = {
44
+ readonly provider: ProviderDefinition;
45
+ readonly operationId: string;
46
+ readonly ctx: ProviderContext;
47
+ readonly request: OperationRequest & {
48
+ readonly deadlineAt?: string;
49
+ };
50
+ readonly signal?: AbortSignal;
51
+ readonly internalStatefulForward?: ProviderServerStatefulForwardEnvelope;
52
+ };
53
+ export type ProviderServerOperationExecutor = (input: ProviderServerOperationExecutorInput) => Promise<unknown>;
5
54
  export declare function resolveProviderProxyAffinityKey(provider: ProviderDefinition, request: OperationRequest, operationId: string): string;
6
55
  type ProviderRequestCost = {
7
56
  durationMs: number;
@@ -49,18 +98,65 @@ export type ProviderServerLogEvent = (ProviderServerLogEventBase & {
49
98
  resource: "browser" | "stealth";
50
99
  errorClass: string;
51
100
  message: string;
101
+ } | {
102
+ level: "error";
103
+ event: "provider_shutdown_hook_failed";
104
+ providerId: string;
105
+ hookIndex: number;
106
+ errorClass: string;
107
+ message: string;
52
108
  };
53
109
  export type ProviderServerLogger = (event: ProviderServerLogEvent) => void;
54
110
  export type ProviderServerOptions = {
55
111
  logger?: ProviderServerLogger;
112
+ /** Optional provider-specific operation executor. Stateful providers use this to preserve provider-local runtime semantics. */
113
+ operationExecutor?: ProviderServerOperationExecutor;
114
+ /** Optional signed internal executor for stateful owner forwarding. */
115
+ internalOperationExecutor?: ProviderServerOperationExecutor;
116
+ statefulForwarding?: {
117
+ readonly secret: string;
118
+ readonly maxSkewMs?: number;
119
+ readonly replayCacheMaxEntries?: number;
120
+ /** Required fail-closed check against the SDK/runtime owner registry. */
121
+ readonly validateOwnerFence: ProviderServerStatefulOwnerFenceValidator;
122
+ };
56
123
  /** Optional STT override for tests or custom hosts; local/prod normally resolves from env. */
57
124
  stt?: SttContext;
58
125
  /** Optional runtime state override for tests or custom hosts. Production resolves Redis from env and fails closed when unavailable. */
59
126
  state?: ProviderRuntimeState;
60
127
  /** Allow process-local runtime state only for local development and tests. */
61
128
  allowMemoryStateFallback?: boolean;
129
+ /**
130
+ * Graceful process shutdown. Hooks run in declaration order after listeners stop accepting work.
131
+ *
132
+ * @example
133
+ * ```ts
134
+ * await serve(provider, {
135
+ * shutdown: {
136
+ * hooks: [
137
+ * async () => { await emitter.flush(); },
138
+ * async () => { await sessionManager.closeAll("server-shutdown"); },
139
+ * async () => { await lease.release(); },
140
+ * async () => { await router.close(); },
141
+ * ],
142
+ * },
143
+ * });
144
+ * ```
145
+ */
146
+ shutdown?: {
147
+ readonly hooks?: Array<() => Promise<void>>;
148
+ readonly signals?: boolean | NodeJS.Signals[];
149
+ readonly timeoutMs?: number;
150
+ };
62
151
  };
63
152
  export declare function createServerApp(provider: ProviderDefinition, options?: ProviderServerOptions): Hono;
153
+ export type ProviderServerCloseOptions = {
154
+ readonly timeoutMs?: number;
155
+ };
156
+ export type ProviderServerHandle = {
157
+ readonly port: number;
158
+ close(options?: ProviderServerCloseOptions): Promise<void>;
159
+ };
64
160
  export interface ServeOptions extends ProviderServerOptions {
65
161
  host?: string;
66
162
  port?: number;
@@ -71,5 +167,5 @@ export interface ServeOptions extends ProviderServerOptions {
71
167
  */
72
168
  selfTestPort?: number;
73
169
  }
74
- export declare function serve(provider: ProviderDefinition, options?: ServeOptions): Promise<void>;
170
+ export declare function serve(provider: ProviderDefinition, options?: ServeOptions): Promise<ProviderServerHandle>;
75
171
  export {};