every-plugin 0.1.0 → 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.
Files changed (65) hide show
  1. package/README.md +1 -329
  2. package/dist/errors.d.ts +11 -7
  3. package/dist/errors.d.ts.map +1 -1
  4. package/dist/errors.js +3 -14
  5. package/dist/index.d.ts +2 -4
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -3
  8. package/dist/plugin.d.ts +149 -103
  9. package/dist/plugin.d.ts.map +1 -1
  10. package/dist/plugin.js +155 -23
  11. package/dist/runtime/errors.d.ts +41 -53
  12. package/dist/runtime/errors.d.ts.map +1 -1
  13. package/dist/runtime/errors.js +48 -8
  14. package/dist/runtime/index.d.ts +17 -66
  15. package/dist/runtime/index.d.ts.map +1 -1
  16. package/dist/runtime/index.js +22 -126
  17. package/dist/runtime/services/module-federation.service.d.ts +10 -38
  18. package/dist/runtime/services/module-federation.service.d.ts.map +1 -1
  19. package/dist/runtime/services/module-federation.service.js +131 -124
  20. package/dist/runtime/services/plugin.service.d.ts +21 -67
  21. package/dist/runtime/services/plugin.service.d.ts.map +1 -1
  22. package/dist/runtime/services/plugin.service.js +265 -328
  23. package/dist/runtime/services/secrets.service.d.ts +9 -29
  24. package/dist/runtime/services/secrets.service.js +26 -30
  25. package/dist/runtime/services.d.ts +1 -1
  26. package/dist/runtime/streaming/index.d.ts +4 -0
  27. package/dist/runtime/streaming/index.d.ts.map +1 -0
  28. package/dist/runtime/streaming/index.js +2 -0
  29. package/dist/runtime/streaming/state-effects.d.ts +28 -0
  30. package/dist/runtime/streaming/state-effects.d.ts.map +1 -0
  31. package/dist/runtime/streaming/state-effects.js +30 -0
  32. package/dist/runtime/streaming/streaming.d.ts +8 -0
  33. package/dist/runtime/streaming/streaming.d.ts.map +1 -0
  34. package/dist/runtime/streaming/streaming.js +113 -0
  35. package/dist/runtime/streaming/types.d.ts +19 -0
  36. package/dist/runtime/streaming/types.d.ts.map +1 -0
  37. package/dist/runtime/streaming/types.js +1 -0
  38. package/dist/runtime/test-utils.d.ts +1 -1
  39. package/dist/runtime/test-utils.js +4 -10
  40. package/dist/runtime/types.d.ts +28 -28
  41. package/dist/runtime/types.d.ts.map +1 -1
  42. package/dist/runtime/validation.d.ts +2 -7
  43. package/dist/runtime/validation.js +11 -14
  44. package/dist/testing/index.d.ts +25 -0
  45. package/dist/testing/index.d.ts.map +1 -0
  46. package/dist/testing/index.js +40 -0
  47. package/dist/testing/mocks/module-federation.service.d.ts +8 -0
  48. package/dist/testing/mocks/module-federation.service.d.ts.map +1 -0
  49. package/dist/testing/mocks/module-federation.service.js +35 -0
  50. package/package.json +27 -14
  51. package/dist/runtime/mf.test.d.ts +0 -2
  52. package/dist/runtime/mf.test.d.ts.map +0 -1
  53. package/dist/runtime/mf.test.js +0 -135
  54. package/dist/runtime/runtime.test.d.ts +0 -2
  55. package/dist/runtime/runtime.test.d.ts.map +0 -1
  56. package/dist/runtime/runtime.test.js +0 -378
  57. package/dist/runtime/streaming.d.ts +0 -29
  58. package/dist/runtime/streaming.d.ts.map +0 -1
  59. package/dist/runtime/streaming.js +0 -59
  60. package/dist/runtime/streaming.test.d.ts +0 -2
  61. package/dist/runtime/streaming.test.d.ts.map +0 -1
  62. package/dist/runtime/streaming.test.js +0 -271
  63. package/dist/source.d.ts +0 -70
  64. package/dist/source.d.ts.map +0 -1
  65. package/dist/source.js +0 -37
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/dist/plugin.js CHANGED
@@ -1,27 +1,159 @@
1
- import { Context } from "effect";
1
+ import { Context, Effect } from "effect";
2
2
  import { z } from "zod";
3
- // Helpers
4
- export const createOutputSchema = (dataSchema) =>
5
- z.object({
6
- success: z.boolean(),
7
- data: dataSchema.optional(),
8
- errors: z.array(ErrorDetailsSchema).optional(),
9
- });
10
3
  export function createConfigSchema(variablesSchema, secretsSchema) {
11
- return z.object({
12
- variables: (
13
- variablesSchema ?? z.record(z.string(), z.unknown())
14
- ).optional(),
15
- secrets: (secretsSchema ?? z.record(z.string(), z.unknown())).optional(),
16
- });
4
+ return z.object({
5
+ variables: variablesSchema,
6
+ secrets: secretsSchema
7
+ });
17
8
  }
18
- export function createInputSchema(inputSchema) {
19
- return inputSchema;
9
+ export function createStateSchema(pluginStateSchema) {
10
+ const BaseStreamingStateSchema = z.object({
11
+ nextPollMs: z.number().nullable().optional(), // null = terminate, undefined/0 = no delay, number = delay ms
12
+ });
13
+ return BaseStreamingStateSchema.and(pluginStateSchema);
14
+ }
15
+ export class PluginLoggerTag extends Context.Tag("PluginLogger")() {
16
+ }
17
+ /**
18
+ * Common error schemas that all plugins can use
19
+ * These provide consistent error handling across the plugin ecosystem
20
+ */
21
+ export const CommonPluginErrors = {
22
+ UNAUTHORIZED: {
23
+ data: z.object({
24
+ apiKeyProvided: z.boolean(),
25
+ provider: z.string().optional(),
26
+ authType: z.enum(['apiKey', 'oauth', 'token']).optional(),
27
+ })
28
+ },
29
+ RATE_LIMITED: {
30
+ data: z.object({
31
+ retryAfter: z.number().int().min(1),
32
+ remainingRequests: z.number().int().min(0).optional(),
33
+ resetTime: z.string().datetime().optional(),
34
+ limitType: z.enum(['requests', 'tokens', 'bandwidth']).optional(),
35
+ })
36
+ },
37
+ SERVICE_UNAVAILABLE: {
38
+ data: z.object({
39
+ retryAfter: z.number().int().optional(),
40
+ maintenanceWindow: z.boolean().default(false),
41
+ estimatedUptime: z.string().datetime().optional(),
42
+ })
43
+ },
44
+ BAD_REQUEST: {
45
+ data: z.object({
46
+ invalidFields: z.array(z.string()).optional(),
47
+ validationErrors: z.array(z.object({
48
+ field: z.string(),
49
+ message: z.string(),
50
+ code: z.string().optional(),
51
+ })).optional(),
52
+ })
53
+ },
54
+ NOT_FOUND: {
55
+ data: z.object({
56
+ resource: z.string().optional(),
57
+ resourceId: z.string().optional(),
58
+ })
59
+ },
60
+ FORBIDDEN: {
61
+ data: z.object({
62
+ requiredPermissions: z.array(z.string()).optional(),
63
+ action: z.string().optional(),
64
+ })
65
+ }
66
+ };
67
+ /**
68
+ * Schema creators for contract-based plugins
69
+ */
70
+ export function createPluginInputSchema(contract, stateSchema) {
71
+ const contractEntries = Object.entries(contract);
72
+ const procedureSchemas = contractEntries.map(([procedureName, procedureSpec]) => {
73
+ // Extract input and output schemas from oRPC contract procedure
74
+ const inputSchema = procedureSpec['~orpc']?.inputSchema || z.object({});
75
+ const outputSchema = procedureSpec['~orpc']?.outputSchema || z.object({});
76
+ // Check if this procedure is streamable (has nextState in output)
77
+ const isStreamable = outputSchema._def?.shape?.nextState !== undefined;
78
+ const baseSchema = z.object({
79
+ procedure: z.literal(procedureName),
80
+ input: inputSchema,
81
+ });
82
+ // Only add state field for streamable procedures
83
+ // Allow null state for initial calls to streamable procedures
84
+ const stateInputSchema = stateSchema.nullable();
85
+ return isStreamable
86
+ ? baseSchema.extend({ state: stateInputSchema })
87
+ : baseSchema;
88
+ });
89
+ return z.discriminatedUnion("procedure", procedureSchemas);
90
+ }
91
+ export function createPluginOutputSchema(contract, stateSchema) {
92
+ const contractEntries = Object.entries(contract);
93
+ const procedureOutputSchemas = contractEntries.map(([_, procedureSpec]) => {
94
+ // Extract output schema from oRPC contract procedure
95
+ return procedureSpec['~orpc']?.outputSchema || z.object({});
96
+ });
97
+ // Return union of all procedure output schemas
98
+ return z.union(procedureOutputSchemas);
99
+ }
100
+ /**
101
+ * State transition utilities for plugins
102
+ * These provide a functional approach to state updates while keeping the API simple
103
+ */
104
+ export const StateTransitions = {
105
+ /**
106
+ * Transition to a new phase with optional updates
107
+ */
108
+ to: (phase, updates = {}) => (state) => ({ ...state, phase, ...updates }),
109
+ /**
110
+ * Add polling delay to state
111
+ */
112
+ withPolling: (delayMs) => (state) => ({ ...state, nextPollMs: delayMs }),
113
+ /**
114
+ * Set error state with message and stop polling
115
+ */
116
+ withError: (errorMessage) => (state) => ({
117
+ ...state,
118
+ phase: 'error',
119
+ errorMessage,
120
+ nextPollMs: null
121
+ }),
122
+ /**
123
+ * Preserve existing state with updates
124
+ */
125
+ update: (updates) => (state) => ({ ...state, ...updates }),
126
+ };
127
+ /**
128
+ * Simple pipe utility for composing state transformations
129
+ */
130
+ export const pipe = (value, ...fns) => fns.reduce((acc, fn) => fn(acc), value);
131
+ /**
132
+ * Simple plugin base class that uses pure oRPC patterns
133
+ * Plugin just needs to define contract, config, and create oRPC router
134
+ */
135
+ export class SimplePlugin {
136
+ // Auto-generated schemas
137
+ get inputSchema() {
138
+ return createPluginInputSchema(this.contract, this.stateSchema);
139
+ }
140
+ get outputSchema() {
141
+ return createPluginOutputSchema(this.contract, this.stateSchema);
142
+ }
143
+ // Default implementations - runtime handles validation
144
+ initialize(config) {
145
+ return Effect.void;
146
+ }
147
+ shutdown() {
148
+ return Effect.void;
149
+ }
150
+ // Default streamable detection
151
+ isStreamable(procedureName) {
152
+ const contractEntries = Object.entries(this.contract);
153
+ const procedure = contractEntries.find(([name]) => name === procedureName);
154
+ if (!procedure)
155
+ return false;
156
+ const outputSchema = procedure[1]['~orpc']?.outputSchema;
157
+ return outputSchema?._def?.shape?.nextState !== undefined;
158
+ }
20
159
  }
21
- // Core schemas
22
- export const ErrorDetailsSchema = z.object({
23
- message: z.string(),
24
- details: z.record(z.string(), z.unknown()).optional(),
25
- stack: z.string().optional(),
26
- });
27
- export class PluginLoggerTag extends Context.Tag("PluginLogger")() {}
@@ -1,62 +1,50 @@
1
+ import { ORPCError } from "@orpc/contract";
1
2
  import type { z } from "zod";
2
- declare const PluginRuntimeError_base: new <A extends Record<string, any> = {}>(
3
- args: import("effect/Types").Equals<A, {}> extends true
4
- ? void
5
- : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] },
6
- ) => import("effect/Cause").YieldableError & {
7
- readonly _tag: "PluginRuntimeError";
3
+ declare const PluginRuntimeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
4
+ readonly _tag: "PluginRuntimeError";
8
5
  } & Readonly<A>;
9
6
  export declare class PluginRuntimeError extends PluginRuntimeError_base<{
10
- readonly pluginId?: string;
11
- readonly operation: string;
12
- readonly cause?: Error;
13
- readonly retryable: boolean;
14
- }> {}
15
- declare const ModuleFederationError_base: new <
16
- A extends Record<string, any> = {},
17
- >(
18
- args: import("effect/Types").Equals<A, {}> extends true
19
- ? void
20
- : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] },
21
- ) => import("effect/Cause").YieldableError & {
22
- readonly _tag: "ModuleFederationError";
7
+ readonly pluginId?: string;
8
+ readonly operation?: string;
9
+ readonly procedureName?: string;
10
+ readonly cause?: Error;
11
+ readonly retryable: boolean;
12
+ }> {
13
+ }
14
+ declare const ModuleFederationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
15
+ readonly _tag: "ModuleFederationError";
23
16
  } & Readonly<A>;
24
17
  export declare class ModuleFederationError extends ModuleFederationError_base<{
25
- readonly pluginId: string;
26
- readonly remoteUrl: string;
27
- readonly cause?: Error;
28
- }> {}
29
- declare const ValidationError_base: new <A extends Record<string, any> = {}>(
30
- args: import("effect/Types").Equals<A, {}> extends true
31
- ? void
32
- : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] },
33
- ) => import("effect/Cause").YieldableError & {
34
- readonly _tag: "ValidationError";
18
+ readonly pluginId: string;
19
+ readonly remoteUrl: string;
20
+ readonly cause?: Error;
21
+ }> {
22
+ }
23
+ declare const ValidationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
24
+ readonly _tag: "ValidationError";
35
25
  } & Readonly<A>;
36
26
  export declare class ValidationError extends ValidationError_base<{
37
- readonly pluginId: string;
38
- readonly stage: "config" | "input" | "output" | "state";
39
- readonly zodError: z.ZodError;
40
- }> {}
41
- declare const StreamError_base: new <A extends Record<string, any> = {}>(
42
- args: import("effect/Types").Equals<A, {}> extends true
43
- ? void
44
- : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] },
45
- ) => import("effect/Cause").YieldableError & {
46
- readonly _tag: "StreamError";
27
+ readonly pluginId: string;
28
+ readonly stage: "config" | "input" | "output" | "state";
29
+ readonly zodError: z.ZodError;
30
+ }> {
31
+ }
32
+ declare const StreamError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
33
+ readonly _tag: "StreamError";
47
34
  } & Readonly<A>;
48
35
  export declare class StreamError extends StreamError_base<{
49
- readonly pluginId: string;
50
- readonly operation:
51
- | "callback"
52
- | "state-extraction"
53
- | "item-extraction"
54
- | "stream-termination";
55
- readonly cause?: Error;
56
- readonly context?: {
57
- readonly iteration?: number;
58
- readonly itemsProcessed?: number;
59
- readonly procedureName?: string;
60
- };
61
- }> {}
62
- //# sourceMappingURL=errors.d.ts.map
36
+ readonly pluginId: string;
37
+ readonly operation: "callback" | "state-extraction" | "item-extraction" | "stream-termination";
38
+ readonly cause?: Error;
39
+ readonly context?: {
40
+ readonly iteration?: number;
41
+ readonly itemsProcessed?: number;
42
+ readonly procedureName?: string;
43
+ };
44
+ }> {
45
+ }
46
+ export declare const isRetryableORPCCode: (code: string) => boolean;
47
+ export declare const wrapORPCError: (orpcError: ORPCError<string, unknown>, pluginId?: string, procedureName?: string, operation?: string) => PluginRuntimeError;
48
+ export declare const toPluginRuntimeError: (error: unknown, pluginId?: string, procedureName?: string, operation?: string, defaultRetryable?: boolean) => PluginRuntimeError;
49
+ export {};
50
+ //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/runtime/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;;;;AAE7B,qBAAa,kBAAmB,SAAQ,wBAAuC;IAC9E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC5B,CAAC;CAAG;;;;AAEL,qBAAa,qBAAsB,SAAQ,2BAEzC;IACD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACvB,CAAC;CAAG;;;;AAEL,qBAAa,eAAgB,SAAQ,qBAAoC;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACxD,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;CAC9B,CAAC;CAAG;;;;AAEL,qBAAa,WAAY,SAAQ,iBAAgC;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;IAC/F,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE;QAClB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;KAChC,CAAC;CACF,CAAC;CAAG"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/runtime/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;;;;AAE7B,qBAAa,kBAAmB,SAAQ,wBAAuC;IAC9E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC5B,CAAC;CAAI;;;;AAEN,qBAAa,qBAAsB,SAAQ,2BAEzC;IACD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACvB,CAAC;CAAI;;;;AAEN,qBAAa,eAAgB,SAAQ,qBAAoC;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACxD,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;CAC9B,CAAC;CAAI;;;;AAEN,qBAAa,WAAY,SAAQ,iBAAgC;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;IAC/F,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE;QAClB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;KAChC,CAAC;CACF,CAAC;CAAI;AAGN,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,OAWlD,CAAC;AAGF,eAAO,MAAM,aAAa,GACzB,WAAW,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,WAAW,MAAM,EACjB,gBAAgB,MAAM,EACtB,YAAY,MAAM,KAChB,kBAQF,CAAC;AAGF,eAAO,MAAM,oBAAoB,GAChC,OAAO,OAAO,EACd,WAAW,MAAM,EACjB,gBAAgB,MAAM,EACtB,YAAY,MAAM,EAClB,0BAAwB,KACtB,kBAgBF,CAAC"}
@@ -1,9 +1,49 @@
1
+ import { ORPCError } from "@orpc/contract";
1
2
  import { Data } from "effect";
2
- export class PluginRuntimeError extends Data.TaggedError(
3
- "PluginRuntimeError",
4
- ) {}
5
- export class ModuleFederationError extends Data.TaggedError(
6
- "ModuleFederationError",
7
- ) {}
8
- export class ValidationError extends Data.TaggedError("ValidationError") {}
9
- export class StreamError extends Data.TaggedError("StreamError") {}
3
+ export class PluginRuntimeError extends Data.TaggedError("PluginRuntimeError") {
4
+ }
5
+ export class ModuleFederationError extends Data.TaggedError("ModuleFederationError") {
6
+ }
7
+ export class ValidationError extends Data.TaggedError("ValidationError") {
8
+ }
9
+ export class StreamError extends Data.TaggedError("StreamError") {
10
+ }
11
+ // Helper to determine if an oRPC error code is retryable
12
+ export const isRetryableORPCCode = (code) => {
13
+ switch (code) {
14
+ case 'TOO_MANY_REQUESTS':
15
+ case 'SERVICE_UNAVAILABLE':
16
+ case 'BAD_GATEWAY':
17
+ case 'GATEWAY_TIMEOUT':
18
+ case 'TIMEOUT':
19
+ return true;
20
+ default:
21
+ return false;
22
+ }
23
+ };
24
+ // Convert ORPC errors from plugin procedures to PluginRuntimeError
25
+ export const wrapORPCError = (orpcError, pluginId, procedureName, operation) => {
26
+ return new PluginRuntimeError({
27
+ pluginId,
28
+ operation,
29
+ procedureName,
30
+ retryable: isRetryableORPCCode(orpcError.code),
31
+ cause: orpcError
32
+ });
33
+ };
34
+ // Universal error converter for the runtime
35
+ export const toPluginRuntimeError = (error, pluginId, procedureName, operation, defaultRetryable = false) => {
36
+ if (error instanceof ORPCError) {
37
+ return wrapORPCError(error, pluginId, procedureName, operation);
38
+ }
39
+ if (error instanceof PluginRuntimeError) {
40
+ return error; // Already converted
41
+ }
42
+ return new PluginRuntimeError({
43
+ pluginId,
44
+ operation,
45
+ procedureName,
46
+ retryable: defaultRetryable,
47
+ cause: error instanceof Error ? error : new Error(String(error))
48
+ });
49
+ };
@@ -1,73 +1,24 @@
1
1
  import { Effect, Layer, ManagedRuntime, type Stream } from "effect";
2
2
  import type { z } from "zod";
3
- import type { SourcePlugin } from "../source";
3
+ import { Contract, type Plugin } from "../plugin";
4
4
  import { PluginRuntimeError } from "./errors";
5
- import { type SourceStreamOptions } from "./streaming";
6
- import type {
7
- AnyPlugin,
8
- InitializedPlugin,
9
- PluginConstructor,
10
- PluginInstance,
11
- PluginRuntimeConfig,
12
- } from "./types";
5
+ import { type StreamingOptions } from "./streaming";
6
+ import type { AnyPlugin, InitializedPlugin, PluginConstructor, PluginInstance, PluginRuntimeConfig } from "./types";
13
7
  export interface IPluginRuntime {
14
- readonly loadPlugin: (
15
- pluginId: string,
16
- ) => Effect.Effect<PluginConstructor, PluginRuntimeError>;
17
- readonly instantiatePlugin: <T extends AnyPlugin>(
18
- ctor: PluginConstructor,
19
- ) => Effect.Effect<PluginInstance<T>, PluginRuntimeError>;
20
- readonly initializePlugin: <T extends AnyPlugin>(
21
- instance: PluginInstance<T>,
22
- config: z.infer<T["configSchema"]>,
23
- ) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
24
- readonly executePlugin: <T extends AnyPlugin>(
25
- initializedPlugin: InitializedPlugin<T>,
26
- input: z.infer<T["inputSchema"]>,
27
- ) => Effect.Effect<z.infer<T["outputSchema"]>, PluginRuntimeError>;
28
- readonly usePlugin: <T extends AnyPlugin>(
29
- pluginId: string,
30
- config: z.infer<T["configSchema"]>,
31
- ) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
32
- readonly streamPlugin: <
33
- T extends SourcePlugin,
34
- TInput extends z.infer<T["inputSchema"]> = z.infer<T["inputSchema"]>,
35
- TItem = unknown,
36
- >(
37
- pluginId: string,
38
- config: z.infer<T["configSchema"]>,
39
- input: TInput,
40
- options?: SourceStreamOptions<TItem>,
41
- ) => Effect.Effect<
42
- Stream.Stream<TItem, PluginRuntimeError>,
43
- PluginRuntimeError
44
- >;
45
- readonly shutdown: () => Effect.Effect<void, never, never>;
8
+ readonly loadPlugin: (pluginId: string) => Effect.Effect<PluginConstructor, PluginRuntimeError>;
9
+ readonly instantiatePlugin: <T extends AnyPlugin>(ctor: PluginConstructor) => Effect.Effect<PluginInstance<T>, PluginRuntimeError>;
10
+ readonly initializePlugin: <T extends AnyPlugin>(instance: PluginInstance<T>, config: z.infer<T["configSchema"]>) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
11
+ readonly executePlugin: <T extends AnyPlugin>(initializedPlugin: InitializedPlugin<T>, input: z.infer<T["inputSchema"]>) => Effect.Effect<z.infer<T["outputSchema"]>, PluginRuntimeError>;
12
+ readonly usePlugin: <T extends AnyPlugin>(pluginId: string, config: z.infer<T["configSchema"]>) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
13
+ readonly streamPlugin: <T extends Plugin<Contract>, TInput extends z.infer<T["inputSchema"]> = z.infer<T["inputSchema"]>, TItem = unknown, TPluginState extends z.infer<T["stateSchema"]> = z.infer<T["stateSchema"]>>(pluginId: string, config: z.infer<T["configSchema"]>, input: TInput, options?: StreamingOptions<TItem, TPluginState>) => Effect.Effect<Stream.Stream<TItem, PluginRuntimeError>, PluginRuntimeError>;
14
+ readonly shutdown: () => Effect.Effect<void, never, never>;
46
15
  }
47
- declare const PluginRuntime_base: import("effect/Context").TagClass<
48
- PluginRuntime,
49
- "PluginRuntime",
50
- IPluginRuntime
51
- > &
52
- Effect.Tag.Proxy<PluginRuntime, IPluginRuntime> & {
53
- use: <X>(
54
- body: (_: IPluginRuntime) => X,
55
- ) => [X] extends [Effect.Effect<infer A, infer E, infer R>]
56
- ? Effect.Effect<A, E, PluginRuntime | R>
57
- : [X] extends [PromiseLike<infer A_1>]
58
- ? Effect.Effect<
59
- A_1,
60
- import("effect/Cause").UnknownException,
61
- PluginRuntime
62
- >
63
- : Effect.Effect<X, never, PluginRuntime>;
64
- };
16
+ declare const PluginRuntime_base: import("effect/Context").TagClass<PluginRuntime, "PluginRuntime", IPluginRuntime> & Effect.Tag.Proxy<PluginRuntime, IPluginRuntime> & {
17
+ use: <X>(body: (_: IPluginRuntime) => X) => [X] extends [Effect.Effect<infer A, infer E, infer R>] ? Effect.Effect<A, E, PluginRuntime | R> : [X] extends [PromiseLike<infer A_1>] ? Effect.Effect<A_1, import("effect/Cause").UnknownException, PluginRuntime> : Effect.Effect<X, never, PluginRuntime>;
18
+ };
65
19
  export declare class PluginRuntime extends PluginRuntime_base {
66
- static Live: (
67
- config: PluginRuntimeConfig,
68
- ) => Layer.Layer<PluginRuntime, never, never>;
20
+ static Live: (config: PluginRuntimeConfig) => Layer.Layer<PluginRuntime, never, never>;
69
21
  }
70
- export declare const createPluginRuntime: (
71
- config: PluginRuntimeConfig,
72
- ) => ManagedRuntime.ManagedRuntime<PluginRuntime, never>;
73
- //# sourceMappingURL=index.d.ts.map
22
+ export declare const createPluginRuntime: (config: PluginRuntimeConfig) => ManagedRuntime.ManagedRuntime<PluginRuntime, never>;
23
+ export {};
24
+ //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAM9C,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EACX,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,MAAM,SAAS,CAAC;AAwBjB,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,UAAU,EAAE,CACpB,QAAQ,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAC1D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,SAAS,EAC/C,IAAI,EAAE,iBAAiB,KACnB,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC1D,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC,SAAS,SAAS,EAC9C,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,EAC3B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,KAC9B,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,SAAS,SAAS,EAC3C,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,KAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACnE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,SAAS,EACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,KAC9B,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7D,QAAQ,CAAC,YAAY,EAAE,CACtB,CAAC,SAAS,YAAY,EACtB,MAAM,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EACpE,KAAK,GAAG,OAAO,EAEf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC3D;;;;AAED,qBAAa,aAAc,SAAQ,kBAGhC;IACF,MAAM,CAAC,IAAI,GAAI,QAAQ,mBAAmB,8CAyGzC;CACD;AAED,eAAO,MAAM,mBAAmB,GAAI,QAAQ,mBAAmB,wDACf,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAsC,MAAM,WAAW,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAM9C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EACX,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,MAAM,SAAS,CAAC;AAuBjB,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,UAAU,EAAE,CACpB,QAAQ,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAC1D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,SAAS,EAC/C,IAAI,EAAE,iBAAiB,KACnB,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC1D,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC,SAAS,SAAS,EAC9C,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,EAC3B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,KAC9B,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,SAAS,SAAS,EAC3C,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,KAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACnE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,SAAS,EACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,KAC9B,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7D,QAAQ,CAAC,YAAY,EAAE,CACtB,CAAC,SAAS,MAAM,CAAC,QAAQ,CAAC,EAC1B,MAAM,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EACpE,KAAK,GAAG,OAAO,EACf,YAAY,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAE1E,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,KAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC3D;;;;AAED,qBAAa,aAAc,SAAQ,kBAGhC;IACF,MAAM,CAAC,IAAI,GAAI,QAAQ,mBAAmB,8CA8CzC;CACD;AAED,eAAO,MAAM,mBAAmB,GAAI,QAAQ,mBAAmB,wDACf,CAAC"}
@@ -1,133 +1,29 @@
1
1
  import { Effect, Layer, ManagedRuntime } from "effect";
2
2
  import { PluginLoggerTag } from "../plugin";
3
- import { PluginRuntimeError } from "./errors";
4
- import {
5
- ModuleFederationService,
6
- PluginService,
7
- SecretsService,
8
- } from "./services";
9
- import { createSourceStream } from "./streaming";
10
- import { validate } from "./validation";
11
-
3
+ import { ModuleFederationService, PluginService, SecretsService, } from "./services";
12
4
  // Default logger implementation
13
5
  const createDefaultLogger = () => ({
14
- logInfo: (message, context) =>
15
- Effect.logInfo(message).pipe(
16
- Effect.annotateLogs({ source: "plugin", context }),
17
- ),
18
- logWarning: (message, context) =>
19
- Effect.logWarning(message).pipe(
20
- Effect.annotateLogs({ source: "plugin", context }),
21
- ),
22
- logError: (message, error, context) =>
23
- Effect.logError(message, error).pipe(
24
- Effect.annotateLogs({ source: "plugin", error, context }),
25
- ),
26
- logDebug: (message, context) =>
27
- Effect.logDebug(message).pipe(
28
- Effect.annotateLogs({ source: "plugin", context }),
29
- ),
6
+ logInfo: (message, context) => Effect.logInfo(message).pipe(Effect.annotateLogs({ source: "plugin", context })),
7
+ logWarning: (message, context) => Effect.logWarning(message).pipe(Effect.annotateLogs({ source: "plugin", context })),
8
+ logError: (message, error, context) => Effect.logError(message, error).pipe(Effect.annotateLogs({ source: "plugin", error, context })),
9
+ logDebug: (message, context) => Effect.logDebug(message).pipe(Effect.annotateLogs({ source: "plugin", context })),
30
10
  });
31
11
  export class PluginRuntime extends Effect.Tag("PluginRuntime")() {
32
- static Live = (config) => {
33
- const secrets = config.secrets || {};
34
- const logger = config.logger || createDefaultLogger();
35
- return Layer.effect(
36
- PluginRuntime,
37
- Effect.gen(function* () {
38
- const pluginService = yield* PluginService;
39
- return {
40
- loadPlugin: pluginService.loadPlugin,
41
- instantiatePlugin: pluginService.instantiatePlugin,
42
- initializePlugin: pluginService.initializePlugin,
43
- executePlugin: pluginService.executePlugin,
44
- usePlugin: (pluginId, config) =>
45
- pluginService.usePlugin(pluginId, config),
46
- streamPlugin: (pluginId, config, input, options) =>
47
- Effect.gen(function* () {
48
- // Get initialized plugin (benefits from caching)
49
- const initializedPlugin = yield* pluginService.usePlugin(
50
- pluginId,
51
- config,
52
- );
53
- // Validate plugin type
54
- if (initializedPlugin.plugin.type !== "source") {
55
- return yield* Effect.fail(
56
- new PluginRuntimeError({
57
- pluginId,
58
- operation: "stream-plugin-validate",
59
- cause: new Error(
60
- `Plugin ${pluginId} is not a source plugin (type: ${initializedPlugin.plugin.type})`,
61
- ),
62
- retryable: false,
63
- }),
64
- );
65
- }
66
- // Check if procedure is streamable and validate state
67
- const procedureName = input.procedure;
68
- const isStreamable =
69
- initializedPlugin.plugin.isStreamable(procedureName);
70
- if (isStreamable) {
71
- // Check stateSchema exists
72
- if (
73
- !("stateSchema" in initializedPlugin.plugin) ||
74
- !initializedPlugin.plugin.stateSchema
75
- ) {
76
- return yield* Effect.fail(
77
- new PluginRuntimeError({
78
- pluginId: initializedPlugin.plugin.id,
79
- operation: "validate-state",
80
- cause: new Error(
81
- `Streamable plugin ${initializedPlugin.plugin.id} must have a stateSchema`,
82
- ),
83
- retryable: false,
84
- }),
85
- );
86
- }
87
- // Validate initial state
88
- yield* validate(
89
- initializedPlugin.plugin.stateSchema,
90
- input.state,
91
- initializedPlugin.plugin.id,
92
- "state",
93
- ).pipe(
94
- Effect.mapError(
95
- (validationError) =>
96
- new PluginRuntimeError({
97
- pluginId: initializedPlugin.plugin.id,
98
- operation: "validate-state",
99
- cause: validationError.zodError,
100
- retryable: false,
101
- }),
102
- ),
103
- );
104
- }
105
- // Create and return the stream
106
- return createSourceStream(
107
- initializedPlugin,
108
- pluginService.executePlugin,
109
- input,
110
- options,
111
- isStreamable,
112
- );
113
- }),
114
- shutdown: () => pluginService.cleanup(),
115
- };
116
- }),
117
- ).pipe(
118
- Layer.provide(
119
- PluginService.Live(config.registry, secrets).pipe(
120
- Layer.provide(
121
- Layer.mergeAll(
122
- ModuleFederationService.Live,
123
- SecretsService.Live(secrets),
124
- Layer.succeed(PluginLoggerTag, logger),
125
- ),
126
- ),
127
- ),
128
- ),
129
- );
130
- };
12
+ static Live = (config) => {
13
+ const secrets = config.secrets || {};
14
+ const logger = config.logger || createDefaultLogger();
15
+ return Layer.effect(PluginRuntime, Effect.gen(function* () {
16
+ const pluginService = yield* PluginService;
17
+ return {
18
+ loadPlugin: pluginService.loadPlugin,
19
+ instantiatePlugin: pluginService.instantiatePlugin,
20
+ initializePlugin: pluginService.initializePlugin,
21
+ executePlugin: pluginService.executePlugin,
22
+ usePlugin: (pluginId, config) => pluginService.usePlugin(pluginId, config),
23
+ streamPlugin: (pluginId, config, input, options) => pluginService.streamPlugin(pluginId, config, input, options),
24
+ shutdown: () => pluginService.cleanup(),
25
+ };
26
+ })).pipe(Layer.provide(PluginService.Live(config.registry, secrets).pipe(Layer.provide(Layer.mergeAll(ModuleFederationService.Live, SecretsService.Live(secrets), Layer.succeed(PluginLoggerTag, logger))))));
27
+ };
131
28
  }
132
- export const createPluginRuntime = (config) =>
133
- ManagedRuntime.make(PluginRuntime.Live(config));
29
+ export const createPluginRuntime = (config) => ManagedRuntime.make(PluginRuntime.Live(config));