@dual-os/sdk 0.0.0-stage → 0.8.0-next.0
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/LICENSE +4 -0
- package/README.md +19 -2
- package/dist/Action.d.ts +201 -0
- package/dist/Action.d.ts.map +1 -0
- package/dist/Action.js +172 -0
- package/dist/Action.js.map +1 -0
- package/dist/AgentChannel.d.ts +1717 -0
- package/dist/AgentChannel.d.ts.map +1 -0
- package/dist/AgentChannel.js +708 -0
- package/dist/AgentChannel.js.map +1 -0
- package/dist/AgentChannelConformance.d.ts +1543 -0
- package/dist/AgentChannelConformance.d.ts.map +1 -0
- package/dist/AgentChannelConformance.js +163 -0
- package/dist/AgentChannelConformance.js.map +1 -0
- package/dist/AgentChannelRuntime.d.ts +78 -0
- package/dist/AgentChannelRuntime.d.ts.map +1 -0
- package/dist/AgentChannelRuntime.js +270 -0
- package/dist/AgentChannelRuntime.js.map +1 -0
- package/dist/AiProvider.d.ts +132 -0
- package/dist/AiProvider.d.ts.map +1 -0
- package/dist/AiProvider.js +100 -0
- package/dist/AiProvider.js.map +1 -0
- package/dist/AuthMethod.d.ts +381 -0
- package/dist/AuthMethod.d.ts.map +1 -0
- package/dist/AuthMethod.js +225 -0
- package/dist/AuthMethod.js.map +1 -0
- package/dist/AuthMethodBinding.d.ts +77 -0
- package/dist/AuthMethodBinding.d.ts.map +1 -0
- package/dist/AuthMethodBinding.js +31 -0
- package/dist/AuthMethodBinding.js.map +1 -0
- package/dist/AuthMethodExecution.d.ts +223 -0
- package/dist/AuthMethodExecution.d.ts.map +1 -0
- package/dist/AuthMethodExecution.js +277 -0
- package/dist/AuthMethodExecution.js.map +1 -0
- package/dist/ConnectionResolver.d.ts +219 -0
- package/dist/ConnectionResolver.d.ts.map +1 -0
- package/dist/ConnectionResolver.js +153 -0
- package/dist/ConnectionResolver.js.map +1 -0
- package/dist/DefinitionError.d.ts +67 -0
- package/dist/DefinitionError.d.ts.map +1 -0
- package/dist/DefinitionError.js +82 -0
- package/dist/DefinitionError.js.map +1 -0
- package/dist/DualRegistry.d.ts +71 -0
- package/dist/DualRegistry.d.ts.map +1 -0
- package/dist/DualRegistry.js +96 -0
- package/dist/DualRegistry.js.map +1 -0
- package/dist/DualRuntime.d.ts +279 -0
- package/dist/DualRuntime.d.ts.map +1 -0
- package/dist/DualRuntime.js +311 -0
- package/dist/DualRuntime.js.map +1 -0
- package/dist/Files.d.ts +80 -0
- package/dist/Files.d.ts.map +1 -0
- package/dist/Files.js +66 -0
- package/dist/Files.js.map +1 -0
- package/dist/Group.d.ts +106 -0
- package/dist/Group.d.ts.map +1 -0
- package/dist/Group.js +86 -0
- package/dist/Group.js.map +1 -0
- package/dist/Http.d.ts +342 -0
- package/dist/Http.d.ts.map +1 -0
- package/dist/Http.js +677 -0
- package/dist/Http.js.map +1 -0
- package/dist/Mcp.d.ts +109 -0
- package/dist/Mcp.d.ts.map +1 -0
- package/dist/Mcp.js +176 -0
- package/dist/Mcp.js.map +1 -0
- package/dist/OAuth2TokenRefresher.d.ts +18 -0
- package/dist/OAuth2TokenRefresher.d.ts.map +1 -0
- package/dist/OAuth2TokenRefresher.js +19 -0
- package/dist/OAuth2TokenRefresher.js.map +1 -0
- package/dist/OAuthFlow.d.ts +71 -0
- package/dist/OAuthFlow.d.ts.map +1 -0
- package/dist/OAuthFlow.js +488 -0
- package/dist/OAuthFlow.js.map +1 -0
- package/dist/Plugin.d.ts +383 -0
- package/dist/Plugin.d.ts.map +1 -0
- package/dist/Plugin.js +249 -0
- package/dist/Plugin.js.map +1 -0
- package/dist/PluginRuntime.d.ts +3186 -0
- package/dist/PluginRuntime.d.ts.map +1 -0
- package/dist/PluginRuntime.js +331 -0
- package/dist/PluginRuntime.js.map +1 -0
- package/dist/Runner.d.ts +1 -0
- package/dist/Runner.js +124 -0
- package/dist/Runner.js.map +1 -0
- package/dist/ToolFile.d.ts +23 -0
- package/dist/ToolFile.d.ts.map +1 -0
- package/dist/ToolFile.js +33 -0
- package/dist/ToolFile.js.map +1 -0
- package/dist/Trigger.d.ts +358 -0
- package/dist/Trigger.d.ts.map +1 -0
- package/dist/Trigger.js +287 -0
- package/dist/Trigger.js.map +1 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +24 -0
- package/dist/internal/auth-context.d.ts +23 -0
- package/dist/internal/auth-context.d.ts.map +1 -0
- package/dist/internal/auth-context.js +1 -0
- package/dist/internal/auth-execution.d.ts +27 -0
- package/dist/internal/auth-execution.d.ts.map +1 -0
- package/dist/internal/auth-execution.js +66 -0
- package/dist/internal/auth-execution.js.map +1 -0
- package/dist/internal/auth-runtime.d.ts +5 -0
- package/dist/internal/auth-runtime.d.ts.map +1 -0
- package/dist/internal/auth-runtime.js +16 -0
- package/dist/internal/auth-runtime.js.map +1 -0
- package/dist/internal/capabilities.d.ts +24 -0
- package/dist/internal/capabilities.d.ts.map +1 -0
- package/dist/internal/capabilities.js +22 -0
- package/dist/internal/capabilities.js.map +1 -0
- package/dist/internal/children.d.ts +34 -0
- package/dist/internal/children.d.ts.map +1 -0
- package/dist/internal/children.js +53 -0
- package/dist/internal/children.js.map +1 -0
- package/dist/internal/collection-utils.d.ts +4 -0
- package/dist/internal/collection-utils.d.ts.map +1 -0
- package/dist/internal/collection-utils.js +6 -0
- package/dist/internal/collection-utils.js.map +1 -0
- package/dist/internal/dual/actions.d.ts +33 -0
- package/dist/internal/dual/actions.d.ts.map +1 -0
- package/dist/internal/dual/actions.js +26 -0
- package/dist/internal/dual/actions.js.map +1 -0
- package/dist/internal/dual/invoke.d.ts +63 -0
- package/dist/internal/dual/invoke.d.ts.map +1 -0
- package/dist/internal/dual/invoke.js +75 -0
- package/dist/internal/dual/invoke.js.map +1 -0
- package/dist/internal/dual/registry.d.ts +125 -0
- package/dist/internal/dual/registry.d.ts.map +1 -0
- package/dist/internal/dual/registry.js +172 -0
- package/dist/internal/dual/registry.js.map +1 -0
- package/dist/internal/dual/triggers.d.ts +29 -0
- package/dist/internal/dual/triggers.d.ts.map +1 -0
- package/dist/internal/dual/triggers.js +26 -0
- package/dist/internal/dual/triggers.js.map +1 -0
- package/dist/internal/handler-context.d.ts +9 -0
- package/dist/internal/handler-context.d.ts.map +1 -0
- package/dist/internal/handler-context.js +31 -0
- package/dist/internal/handler-context.js.map +1 -0
- package/dist/internal/identifier.d.ts +6 -0
- package/dist/internal/identifier.d.ts.map +1 -0
- package/dist/internal/identifier.js +28 -0
- package/dist/internal/identifier.js.map +1 -0
- package/dist/internal/plugin-handlers.d.ts +38 -0
- package/dist/internal/plugin-handlers.d.ts.map +1 -0
- package/dist/internal/plugin-handlers.js +52 -0
- package/dist/internal/plugin-handlers.js.map +1 -0
- package/dist/internal/proto.d.ts +7 -0
- package/dist/internal/proto.d.ts.map +1 -0
- package/dist/internal/proto.js +10 -0
- package/dist/internal/proto.js.map +1 -0
- package/dist/internal/schema-runtime.d.ts +6 -0
- package/dist/internal/schema-runtime.d.ts.map +1 -0
- package/dist/internal/schema-runtime.js +10 -0
- package/dist/internal/schema-runtime.js.map +1 -0
- package/dist/internal/trigger-runtime-shared.d.ts +41 -0
- package/dist/internal/trigger-runtime-shared.d.ts.map +1 -0
- package/dist/internal/trigger-runtime-shared.js +132 -0
- package/dist/internal/trigger-runtime-shared.js.map +1 -0
- package/dist/internal/trigger-runtime.d.ts +12 -0
- package/dist/internal/trigger-runtime.d.ts.map +1 -0
- package/dist/internal/trigger-runtime.js +95 -0
- package/dist/internal/trigger-runtime.js.map +1 -0
- package/dist/internal/types.d.ts +7 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/internal/types.js +1 -0
- package/dist/remote-runtime.d.ts +585 -0
- package/dist/remote-runtime.d.ts.map +1 -0
- package/dist/remote-runtime.js +367 -0
- package/dist/remote-runtime.js.map +1 -0
- package/package.json +55 -4
- package/src/Action.ts +370 -0
- package/src/AgentChannel.ts +860 -0
- package/src/AgentChannelConformance.ts +124 -0
- package/src/AgentChannelRuntime.ts +616 -0
- package/src/AiProvider.ts +255 -0
- package/src/AuthMethod.ts +954 -0
- package/src/AuthMethodBinding.ts +112 -0
- package/src/AuthMethodExecution.ts +542 -0
- package/src/ConnectionResolver.ts +265 -0
- package/src/DefinitionError.ts +115 -0
- package/src/DualRegistry.ts +152 -0
- package/src/DualRuntime.ts +1081 -0
- package/src/Files.ts +89 -0
- package/src/Group.ts +292 -0
- package/src/Http.ts +1205 -0
- package/src/Mcp.ts +299 -0
- package/src/OAuth2TokenRefresher.ts +22 -0
- package/src/OAuthFlow.ts +874 -0
- package/src/Plugin.ts +912 -0
- package/src/PluginRuntime.ts +414 -0
- package/src/Runner.ts +248 -0
- package/src/ToolFile.ts +28 -0
- package/src/Trigger.ts +722 -0
- package/src/index.ts +158 -0
- package/src/internal/auth-context.ts +27 -0
- package/src/internal/auth-execution.ts +241 -0
- package/src/internal/auth-runtime.ts +20 -0
- package/src/internal/capabilities.ts +55 -0
- package/src/internal/children.ts +126 -0
- package/src/internal/collection-utils.ts +8 -0
- package/src/internal/dual/actions.ts +116 -0
- package/src/internal/dual/invoke.ts +307 -0
- package/src/internal/dual/registry.ts +340 -0
- package/src/internal/dual/triggers.ts +128 -0
- package/src/internal/handler-context.ts +57 -0
- package/src/internal/identifier.ts +27 -0
- package/src/internal/plugin-handlers.ts +146 -0
- package/src/internal/proto.ts +8 -0
- package/src/internal/schema-runtime.ts +15 -0
- package/src/internal/trigger-runtime-shared.ts +449 -0
- package/src/internal/trigger-runtime.ts +223 -0
- package/src/internal/types.ts +12 -0
- package/src/remote-runtime.ts +469 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { Any as Any$1 } from "./AuthMethod.js";
|
|
2
|
+
import { ContextForMethods } from "./internal/auth-context.js";
|
|
3
|
+
import { ConnectionResolutionContext } from "./ConnectionResolver.js";
|
|
4
|
+
import { RuntimeConnectionErrorsFor } from "./internal/auth-execution.js";
|
|
5
|
+
import { EntryAuthMethods, EntryTrigger, TriggerAppError, TriggerEncodedOutput, TriggerEncodedState, TriggerIdOf, TriggerRuntimeRequirements } from "./internal/trigger-runtime-shared.js";
|
|
6
|
+
import { Context, Effect, Pipeable, Schema } from "effect";
|
|
7
|
+
declare namespace Trigger_d_exports {
|
|
8
|
+
export { ActivateSuccess, ActivationResult, Any, Config, ConfigSchema, Constructor, ContractOptions, DeactivateSuccess, EmitResult, EmittedEventsSuccess, Handler, InvalidTriggerConfigError, InvalidTriggerOutputError, InvalidTriggerStateError, KeyedEvent, LifecycleInput, LifecycleRequest, Output, OutputSchema, PollExecutionRequest, PollingInput, PollingRuntime, RuntimeContext, RuntimeContract, RuntimeMeta, RuntimePhase, RuntimeTriggerEntry, State, StateSchema, StateValue, Trigger, TriggerKind, TriggerOptions, TypeId, UnsupportedTriggerRuntimeError, VerifyResult, VerifySuccess, WebhookActivationInput, WebhookActivationRequest, WebhookExecutionRequest, WebhookLifecycleInput, WebhookRequest, WebhookResponse, WebhookRuntime, activate, bodyDigest, deactivate, handlerKey, isTrigger, parse, poll, polling, verify, verifyEcdsaP256, verifyHmac, verifyHmacSha256, verifyStandardWebhook, verifyToken, webhook };
|
|
9
|
+
}
|
|
10
|
+
/** @since 0.0.0 @category type ids */
|
|
11
|
+
export declare const TypeId: "@dual-os/sdk/Trigger";
|
|
12
|
+
/** @since 0.0.0 @category type ids */
|
|
13
|
+
export type TypeId = typeof TypeId;
|
|
14
|
+
/** @since 0.0.0 @category models */
|
|
15
|
+
export type TriggerKind = "webhook" | "polling";
|
|
16
|
+
/** @since 0.0.0 @category models */
|
|
17
|
+
export type RuntimePhase = "activate" | "deactivate" | "verify" | "parse" | "poll";
|
|
18
|
+
/** @since 0.0.0 @category models */
|
|
19
|
+
export interface WebhookRequest {
|
|
20
|
+
readonly body: unknown;
|
|
21
|
+
/** Header names are lowercase: the runtime lowercases them before `verify` and `parse`. */
|
|
22
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
23
|
+
readonly rawBody?: string | Uint8Array;
|
|
24
|
+
readonly method?: string;
|
|
25
|
+
readonly url?: string;
|
|
26
|
+
readonly query?: Readonly<Record<string, string | readonly string[]>>;
|
|
27
|
+
}
|
|
28
|
+
/** @since 0.0.0 @category models */
|
|
29
|
+
export interface WebhookResponse {
|
|
30
|
+
readonly status: number;
|
|
31
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
32
|
+
readonly body?: unknown;
|
|
33
|
+
}
|
|
34
|
+
type MessagePart = string | Uint8Array;
|
|
35
|
+
declare const hmacHashes: {
|
|
36
|
+
readonly sha1: "SHA-1";
|
|
37
|
+
readonly sha256: "SHA-256";
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* The hex SHA-256 of a delivery's raw body. Use it as the event key when the provider signs the
|
|
41
|
+
* body but not its delivery identifier header, so a replayed delivery keeps one identity.
|
|
42
|
+
*
|
|
43
|
+
* @since 0.0.0
|
|
44
|
+
* @category webhooks
|
|
45
|
+
*/
|
|
46
|
+
export declare const bodyDigest: (rawBody: string | Uint8Array<ArrayBufferLike>) => Effect.Effect<string, never, never>;
|
|
47
|
+
/**
|
|
48
|
+
* Whether `signature` is the HMAC-SHA256 of `message` keyed with `secret`, the way most webhook
|
|
49
|
+
* providers sign their deliveries. The comparison runs in constant time.
|
|
50
|
+
*
|
|
51
|
+
* @since 0.0.0
|
|
52
|
+
* @category webhooks
|
|
53
|
+
*/
|
|
54
|
+
export declare const verifyHmacSha256: (secret: string, message: string | Uint8Array<ArrayBufferLike>, signature: Uint8Array<ArrayBufferLike>) => Effect.Effect<boolean, never, never>;
|
|
55
|
+
/**
|
|
56
|
+
* Whether `signature`, written in `encoding`, is the HMAC of `message` keyed with `secret`, given
|
|
57
|
+
* as text or as raw key bytes such as a decoded `whsec_` secret. A message given as parts is signed
|
|
58
|
+
* as their concatenation, such as a timestamp followed by the raw body. Given several signatures,
|
|
59
|
+
* such as one per rotated secret, it verifies when any of them matches and hashes the message once.
|
|
60
|
+
* A missing secret, or signatures none of which is valid `encoding`, never verifies. The comparison
|
|
61
|
+
* runs in constant time.
|
|
62
|
+
*
|
|
63
|
+
* @since 0.0.0
|
|
64
|
+
* @category webhooks
|
|
65
|
+
*/
|
|
66
|
+
export declare const verifyHmac: (options: {
|
|
67
|
+
readonly algorithm: keyof typeof hmacHashes;
|
|
68
|
+
readonly encoding: "hex" | "base64";
|
|
69
|
+
readonly message: MessagePart | readonly MessagePart[];
|
|
70
|
+
readonly secret: MessagePart;
|
|
71
|
+
readonly signature: string | readonly string[];
|
|
72
|
+
}) => Effect.Effect<boolean, never, never>;
|
|
73
|
+
/**
|
|
74
|
+
* Whether a [Standard Webhooks](https://www.standardwebhooks.com) delivery is signed with `secret`:
|
|
75
|
+
* one `v1,<base64>` entry of its `webhook-signature` header (`svix-signature` from Svix) must be the
|
|
76
|
+
* HMAC-SHA256 of `id.timestamp.body` keyed with the bytes of the `whsec_` secret, and its timestamp
|
|
77
|
+
* must be within five minutes of now. Header names are lowercase, as in `WebhookRequest`. Missing
|
|
78
|
+
* headers or secret never verify.
|
|
79
|
+
*
|
|
80
|
+
* @since 0.0.0
|
|
81
|
+
* @category webhooks
|
|
82
|
+
*/
|
|
83
|
+
export declare const verifyStandardWebhook: (options: {
|
|
84
|
+
readonly body: MessagePart;
|
|
85
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
86
|
+
readonly secret: string;
|
|
87
|
+
}) => Effect.Effect<boolean, never, never>;
|
|
88
|
+
/**
|
|
89
|
+
* Whether `actual` equals the shared secret `expected`, for providers that send the secret itself
|
|
90
|
+
* back with each delivery. An empty or missing secret never verifies. The comparison runs in
|
|
91
|
+
* constant time.
|
|
92
|
+
*
|
|
93
|
+
* @since 0.0.0
|
|
94
|
+
* @category webhooks
|
|
95
|
+
*/
|
|
96
|
+
export declare const verifyToken: (expected: string, actual: string | undefined) => Effect.Effect<boolean, never, never>;
|
|
97
|
+
/**
|
|
98
|
+
* Whether `signature`, a base64 DER ECDSA signature, signs `message` with the ECDSA P-256 key
|
|
99
|
+
* `publicKey`, a base64 DER SubjectPublicKeyInfo, hashed with SHA-256. A message given as parts is
|
|
100
|
+
* signed as their concatenation, such as a timestamp followed by the raw body. A missing key or a
|
|
101
|
+
* key or signature that is not valid never verifies.
|
|
102
|
+
*
|
|
103
|
+
* @since 0.0.0
|
|
104
|
+
* @category webhooks
|
|
105
|
+
*/
|
|
106
|
+
export declare const verifyEcdsaP256: (options: {
|
|
107
|
+
readonly message: MessagePart | readonly MessagePart[];
|
|
108
|
+
readonly publicKey: string;
|
|
109
|
+
readonly signature: string;
|
|
110
|
+
}) => Effect.Effect<boolean, never, never>;
|
|
111
|
+
/** @since 0.0.0 @category models */
|
|
112
|
+
export type RuntimeContext<EffectiveAuthMethods extends readonly Any$1[]> = ContextForMethods<EffectiveAuthMethods> & ConnectionResolutionContext;
|
|
113
|
+
/** @since 0.0.0 @category type-level */
|
|
114
|
+
export type StateValue<State extends Schema.Top | undefined> = [State] extends [Schema.Top] ? Schema.Schema.Type<Exclude<State, undefined>> | undefined : undefined;
|
|
115
|
+
/** @since 0.0.0 @category models */
|
|
116
|
+
export interface RuntimeMeta<TriggerId extends string = string, Phase extends RuntimePhase = RuntimePhase> {
|
|
117
|
+
readonly triggerId: TriggerId;
|
|
118
|
+
readonly phase: Phase;
|
|
119
|
+
}
|
|
120
|
+
/** @since 0.0.0 @category models */
|
|
121
|
+
export interface ActivateSuccess<TriggerId extends string = string, State = unknown> {
|
|
122
|
+
readonly state: State;
|
|
123
|
+
readonly meta: RuntimeMeta<TriggerId, "activate">;
|
|
124
|
+
}
|
|
125
|
+
/** @since 0.0.0 @category models */
|
|
126
|
+
export interface DeactivateSuccess<TriggerId extends string = string> {
|
|
127
|
+
readonly meta: RuntimeMeta<TriggerId, "deactivate">;
|
|
128
|
+
}
|
|
129
|
+
/** @since 0.0.0 @category models */
|
|
130
|
+
export interface VerifySuccess<TriggerId extends string = string, State = unknown> {
|
|
131
|
+
readonly verified: true;
|
|
132
|
+
readonly response?: WebhookResponse;
|
|
133
|
+
readonly state?: State;
|
|
134
|
+
readonly meta: RuntimeMeta<TriggerId, "verify">;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* What `verify` returns when the delivery is more than an authenticated event: the `response` the
|
|
138
|
+
* host sends back to the provider, such as a handshake answer, and the new trigger `state`, such as
|
|
139
|
+
* a secret the handshake delivered.
|
|
140
|
+
*
|
|
141
|
+
* @since 0.0.0
|
|
142
|
+
* @category models
|
|
143
|
+
*/
|
|
144
|
+
export interface VerifyResult<State> {
|
|
145
|
+
readonly response?: WebhookResponse;
|
|
146
|
+
readonly state?: State;
|
|
147
|
+
}
|
|
148
|
+
/** @since 0.0.0 @category models */
|
|
149
|
+
export interface KeyedEvent<Payload = unknown> {
|
|
150
|
+
readonly key: string;
|
|
151
|
+
readonly payload: Payload;
|
|
152
|
+
}
|
|
153
|
+
/** @since 0.0.0 @category models */
|
|
154
|
+
export interface EmittedEventsSuccess<TriggerId extends string = string, Phase extends "parse" | "poll" = "parse" | "poll", Output = unknown, State = unknown> {
|
|
155
|
+
readonly events: readonly KeyedEvent<Output>[];
|
|
156
|
+
readonly state: State;
|
|
157
|
+
readonly meta: RuntimeMeta<TriggerId, Phase>;
|
|
158
|
+
}
|
|
159
|
+
/** @since 0.0.0 @category models */
|
|
160
|
+
export interface LifecycleInput<Config, State> {
|
|
161
|
+
readonly config: Config;
|
|
162
|
+
readonly state: State;
|
|
163
|
+
}
|
|
164
|
+
/** @since 0.0.0 @category models */
|
|
165
|
+
export interface WebhookActivationInput<Config, State> extends LifecycleInput<Config, State> {
|
|
166
|
+
/** The absolute URL the host serves this trigger's deliveries on. */
|
|
167
|
+
readonly webhookUrl: string;
|
|
168
|
+
}
|
|
169
|
+
/** @since 0.0.0 @category models */
|
|
170
|
+
export interface WebhookLifecycleInput<Config, State> extends WebhookActivationInput<Config, State> {
|
|
171
|
+
readonly request: WebhookRequest;
|
|
172
|
+
}
|
|
173
|
+
/** @since 0.0.0 @category models */
|
|
174
|
+
export interface PollingInput<Config, State> extends LifecycleInput<Config, State> {}
|
|
175
|
+
/** @since 0.0.0 @category models */
|
|
176
|
+
export interface ActivationResult<State> {
|
|
177
|
+
readonly state: State;
|
|
178
|
+
}
|
|
179
|
+
/** @since 0.0.0 @category models */
|
|
180
|
+
export interface EmitResult<Output, State> {
|
|
181
|
+
readonly events: readonly KeyedEvent<Output>[];
|
|
182
|
+
readonly state: State;
|
|
183
|
+
}
|
|
184
|
+
/** @since 0.0.0 @category models */
|
|
185
|
+
export interface WebhookRuntime<Config extends Schema.Top, Output extends Schema.Top, State extends Schema.Top | undefined, AppError = never, Requirements = never, EffectiveAuthMethods extends readonly Any$1[] = readonly Any$1[]> {
|
|
186
|
+
readonly activate?: (input: WebhookActivationInput<Schema.Schema.Type<Config>, StateValue<State>>, context: RuntimeContext<EffectiveAuthMethods>) => Effect.Effect<ActivationResult<StateValue<State>>, AppError, Requirements>;
|
|
187
|
+
readonly deactivate?: (input: WebhookActivationInput<Schema.Schema.Type<Config>, StateValue<State>>, context: RuntimeContext<EffectiveAuthMethods>) => Effect.Effect<void, AppError, Requirements>;
|
|
188
|
+
readonly verify?: (input: WebhookLifecycleInput<Schema.Schema.Type<Config>, StateValue<State>>, context: RuntimeContext<EffectiveAuthMethods>) => Effect.Effect<void | VerifyResult<StateValue<State>>, AppError, Requirements>;
|
|
189
|
+
/**
|
|
190
|
+
* Parses one accepted webhook delivery.
|
|
191
|
+
*
|
|
192
|
+
* The Dual runtime may retry `parse` for the same delivery until the delivery
|
|
193
|
+
* reaches a durable final status. Implementations must be idempotent and
|
|
194
|
+
* tolerate at-least-once calls for the same request/context.
|
|
195
|
+
*
|
|
196
|
+
* @since 0.0.0 @category handlers
|
|
197
|
+
*/
|
|
198
|
+
readonly parse?: (input: WebhookLifecycleInput<Schema.Schema.Type<Config>, StateValue<State>>, context: RuntimeContext<EffectiveAuthMethods>) => Effect.Effect<EmitResult<Schema.Schema.Type<Output>, StateValue<State>>, AppError, Requirements>;
|
|
199
|
+
}
|
|
200
|
+
/** @since 0.0.0 @category models */
|
|
201
|
+
export interface PollingRuntime<Config extends Schema.Top, Output extends Schema.Top, State extends Schema.Top | undefined, AppError = never, Requirements = never, EffectiveAuthMethods extends readonly Any$1[] = readonly Any$1[]> {
|
|
202
|
+
/**
|
|
203
|
+
* Polls one scheduled trigger occurrence.
|
|
204
|
+
*
|
|
205
|
+
* The Dual runtime may retry `poll` for the same occurrence until its cursor
|
|
206
|
+
* and emitted events commit. Implementations must be idempotent and tolerate
|
|
207
|
+
* at-least-once calls for the same occurrence metadata.
|
|
208
|
+
*
|
|
209
|
+
* @since 0.0.0 @category handlers
|
|
210
|
+
*/
|
|
211
|
+
readonly poll?: (input: PollingInput<Schema.Schema.Type<Config>, StateValue<State>>, context: RuntimeContext<EffectiveAuthMethods>) => Effect.Effect<EmitResult<Schema.Schema.Type<Output>, StateValue<State>>, AppError, Requirements>;
|
|
212
|
+
}
|
|
213
|
+
/** @since 0.0.0 @category models */
|
|
214
|
+
export type RuntimeContract<Kind extends TriggerKind, Config extends Schema.Top, Output extends Schema.Top, State extends Schema.Top | undefined, AppError = never, Requirements = never, EffectiveAuthMethods extends readonly Any$1[] = readonly Any$1[]> = Kind extends "webhook" ? WebhookRuntime<Config, Output, State, AppError, Requirements, EffectiveAuthMethods> : PollingRuntime<Config, Output, State, AppError, Requirements, EffectiveAuthMethods>;
|
|
215
|
+
/** @since 0.0.0 @category models */
|
|
216
|
+
export interface Handler<TriggerId extends string = string> {
|
|
217
|
+
readonly _: unique symbol;
|
|
218
|
+
readonly triggerId: TriggerId;
|
|
219
|
+
readonly context: Context.Context<never>;
|
|
220
|
+
readonly runtime: RuntimeContract<any, any, any, any, any, any, any>;
|
|
221
|
+
}
|
|
222
|
+
/** @since 0.0.0 @category handlers */
|
|
223
|
+
export declare const handlerKey: (triggerId: string) => string;
|
|
224
|
+
/** @since 0.0.0 @category type-level */
|
|
225
|
+
export interface Any extends Pipeable.Pipeable {
|
|
226
|
+
readonly [TypeId]: TypeId;
|
|
227
|
+
readonly identifier: string;
|
|
228
|
+
readonly name: string | undefined;
|
|
229
|
+
readonly description: string | undefined;
|
|
230
|
+
readonly kind: TriggerKind;
|
|
231
|
+
readonly config: Schema.Top;
|
|
232
|
+
readonly output: Schema.Top;
|
|
233
|
+
readonly state: Schema.Top | undefined;
|
|
234
|
+
readonly requireAuth: boolean;
|
|
235
|
+
}
|
|
236
|
+
/** @since 0.0.0 @category models */
|
|
237
|
+
export interface TriggerOptions {
|
|
238
|
+
readonly name?: string | undefined;
|
|
239
|
+
readonly description?: string | undefined;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Options used to declare a trigger contract.
|
|
243
|
+
*
|
|
244
|
+
* @since 0.6.0
|
|
245
|
+
* @category models
|
|
246
|
+
*/
|
|
247
|
+
export interface ContractOptions<Config extends Schema.Top, Output extends Schema.Top, State extends Schema.Top | undefined, RequireAuth extends boolean> extends TriggerOptions {
|
|
248
|
+
readonly config: Config;
|
|
249
|
+
readonly output: Output;
|
|
250
|
+
readonly state?: State;
|
|
251
|
+
/** Set to `false` to make a connection optional for this trigger. */
|
|
252
|
+
readonly requireAuth?: RequireAuth;
|
|
253
|
+
}
|
|
254
|
+
/** @since 0.0.0 @category models */
|
|
255
|
+
export interface Trigger<out Identifier extends string = string, out Kind extends TriggerKind = TriggerKind, out Config extends Schema.Top = Schema.Top, out Output extends Schema.Top = Schema.Top, out State extends Schema.Top | undefined = Schema.Top | undefined, out RequireAuth extends boolean = boolean> extends Pipeable.Pipeable {
|
|
256
|
+
readonly [TypeId]: TypeId;
|
|
257
|
+
readonly identifier: Identifier;
|
|
258
|
+
readonly name: string | undefined;
|
|
259
|
+
readonly description: string | undefined;
|
|
260
|
+
readonly kind: Kind;
|
|
261
|
+
readonly config: Config;
|
|
262
|
+
readonly output: Output;
|
|
263
|
+
readonly state: State;
|
|
264
|
+
readonly requireAuth: RequireAuth;
|
|
265
|
+
}
|
|
266
|
+
export type ConfigSchema<TriggerDef extends Any> = TriggerDef["config"];
|
|
267
|
+
export type OutputSchema<TriggerDef extends Any> = TriggerDef["output"];
|
|
268
|
+
export type StateSchema<TriggerDef extends Any> = TriggerDef["state"];
|
|
269
|
+
export type Config<TriggerDef extends Any> = Schema.Schema.Type<ConfigSchema<TriggerDef>>;
|
|
270
|
+
export type Output<TriggerDef extends Any> = Schema.Schema.Type<OutputSchema<TriggerDef>>;
|
|
271
|
+
export type State<TriggerDef extends Any> = StateValue<StateSchema<TriggerDef>>;
|
|
272
|
+
/** @since 0.0.0 @category models */
|
|
273
|
+
export interface RuntimeTriggerEntry<out TriggerDef extends Any = Any, out AllowedMethods extends readonly Any$1[] = readonly Any$1[], out TriggerId extends string = string, out ProviderId extends string = string> {
|
|
274
|
+
readonly providerId: ProviderId;
|
|
275
|
+
readonly triggerId: TriggerId;
|
|
276
|
+
readonly pluginVersion: string | undefined;
|
|
277
|
+
readonly trigger: TriggerDef;
|
|
278
|
+
readonly authMethods: AllowedMethods;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Constructor for one trigger kind.
|
|
282
|
+
*
|
|
283
|
+
* @since 0.6.0
|
|
284
|
+
* @category constructors
|
|
285
|
+
*/
|
|
286
|
+
export type Constructor<Kind extends TriggerKind> = <const Identifier extends string, Config extends Schema.Top, Output extends Schema.Top, State extends Schema.Top | undefined = undefined, const RequireAuth extends boolean = true>(identifier: Identifier, options: ContractOptions<Config, Output, State, RequireAuth>) => Trigger<Identifier, Kind, Config, Output, State, RequireAuth>;
|
|
287
|
+
/**
|
|
288
|
+
* Provider webhook triggers must own isolated per-trigger/per-deploy-version
|
|
289
|
+
* ingress/subscription state, or no external provider resource at all.
|
|
290
|
+
* Activating or deactivating one Dual trigger must never mutate provider state
|
|
291
|
+
* that another trigger, deploy version, mailbox, account, or app-level
|
|
292
|
+
* subscription depends on. Shared provider watches must be modeled as polling.
|
|
293
|
+
*
|
|
294
|
+
* @since 0.0.0 @category constructors
|
|
295
|
+
*/
|
|
296
|
+
export declare const webhook: Constructor<"webhook">;
|
|
297
|
+
/** @since 0.0.0 @category constructors */
|
|
298
|
+
export declare const polling: Constructor<"polling">;
|
|
299
|
+
/** @since 0.0.0 @category guards */
|
|
300
|
+
export declare const isTrigger: (u: unknown) => u is Any;
|
|
301
|
+
declare const InvalidTriggerConfigError_base: Schema.Class<InvalidTriggerConfigError, Schema.TaggedStruct<"InvalidTriggerConfigError", {
|
|
302
|
+
readonly description: Schema.String;
|
|
303
|
+
readonly triggerId: Schema.String;
|
|
304
|
+
}>, import("effect/Cause").YieldableError>;
|
|
305
|
+
/** @since 0.0.0 @category errors */
|
|
306
|
+
export declare class InvalidTriggerConfigError extends InvalidTriggerConfigError_base {}
|
|
307
|
+
declare const InvalidTriggerStateError_base: Schema.Class<InvalidTriggerStateError, Schema.TaggedStruct<"InvalidTriggerStateError", {
|
|
308
|
+
readonly description: Schema.String;
|
|
309
|
+
readonly location: Schema.Literals<readonly ["input", "result"]>;
|
|
310
|
+
readonly phase: Schema.Literals<readonly ["activate", "deactivate", "verify", "parse", "poll"]>;
|
|
311
|
+
readonly triggerId: Schema.String;
|
|
312
|
+
}>, import("effect/Cause").YieldableError>;
|
|
313
|
+
/** @since 0.0.0 @category errors */
|
|
314
|
+
export declare class InvalidTriggerStateError extends InvalidTriggerStateError_base {}
|
|
315
|
+
declare const InvalidTriggerOutputError_base: Schema.Class<InvalidTriggerOutputError, Schema.TaggedStruct<"InvalidTriggerOutputError", {
|
|
316
|
+
readonly description: Schema.String;
|
|
317
|
+
readonly phase: Schema.Literals<readonly ["parse", "poll"]>;
|
|
318
|
+
readonly triggerId: Schema.String;
|
|
319
|
+
}>, import("effect/Cause").YieldableError>;
|
|
320
|
+
/** @since 0.0.0 @category errors */
|
|
321
|
+
export declare class InvalidTriggerOutputError extends InvalidTriggerOutputError_base {}
|
|
322
|
+
declare const UnsupportedTriggerRuntimeError_base: Schema.Class<UnsupportedTriggerRuntimeError, Schema.TaggedStruct<"UnsupportedTriggerRuntimeError", {
|
|
323
|
+
readonly kind: Schema.Literals<readonly ["webhook", "polling"]>;
|
|
324
|
+
readonly phase: Schema.Literals<readonly ["activate", "deactivate", "verify", "parse", "poll"]>;
|
|
325
|
+
readonly triggerId: Schema.String;
|
|
326
|
+
}>, import("effect/Cause").YieldableError>;
|
|
327
|
+
/** @since 0.0.0 @category errors */
|
|
328
|
+
export declare class UnsupportedTriggerRuntimeError extends UnsupportedTriggerRuntimeError_base {}
|
|
329
|
+
/** @since 0.0.0 @category models */
|
|
330
|
+
export interface LifecycleRequest {
|
|
331
|
+
readonly config: unknown;
|
|
332
|
+
readonly state?: unknown;
|
|
333
|
+
readonly connectionId?: string;
|
|
334
|
+
readonly context?: ConnectionResolutionContext;
|
|
335
|
+
}
|
|
336
|
+
/** @since 0.0.0 @category models */
|
|
337
|
+
export interface WebhookActivationRequest extends LifecycleRequest {
|
|
338
|
+
readonly webhookUrl: string;
|
|
339
|
+
}
|
|
340
|
+
/** @since 0.0.0 @category models */
|
|
341
|
+
export interface WebhookExecutionRequest extends WebhookActivationRequest {
|
|
342
|
+
readonly request: WebhookRequest;
|
|
343
|
+
}
|
|
344
|
+
/** @since 0.0.0 @category models */
|
|
345
|
+
export interface PollExecutionRequest extends LifecycleRequest {}
|
|
346
|
+
/** @since 0.0.0 @category execution */
|
|
347
|
+
export declare const activate: <Entry extends RuntimeTriggerEntry<any, any, any, any>>(entry: Entry, request: WebhookActivationRequest) => Effect.Effect<ActivateSuccess<TriggerIdOf<Entry>, TriggerEncodedState<EntryTrigger<Entry>>>, InvalidTriggerConfigError | InvalidTriggerStateError | UnsupportedTriggerRuntimeError | RuntimeConnectionErrorsFor<EntryAuthMethods<Entry>> | TriggerAppError<EntryTrigger<Entry>>, TriggerRuntimeRequirements<Entry, "activate">>;
|
|
348
|
+
/** @since 0.0.0 @category execution */
|
|
349
|
+
export declare const deactivate: <Entry extends RuntimeTriggerEntry<any, any, any, any>>(entry: Entry, request: WebhookActivationRequest) => Effect.Effect<DeactivateSuccess<TriggerIdOf<Entry>>, InvalidTriggerConfigError | InvalidTriggerStateError | UnsupportedTriggerRuntimeError | RuntimeConnectionErrorsFor<EntryAuthMethods<Entry>> | TriggerAppError<EntryTrigger<Entry>>, TriggerRuntimeRequirements<Entry, "deactivate">>;
|
|
350
|
+
/** @since 0.0.0 @category execution */
|
|
351
|
+
export declare const verify: <Entry extends RuntimeTriggerEntry<any, any, any, any>>(entry: Entry, request: WebhookExecutionRequest) => Effect.Effect<VerifySuccess<TriggerIdOf<Entry>, TriggerEncodedState<EntryTrigger<Entry>>>, InvalidTriggerConfigError | InvalidTriggerStateError | UnsupportedTriggerRuntimeError | RuntimeConnectionErrorsFor<EntryAuthMethods<Entry>> | TriggerAppError<EntryTrigger<Entry>>, TriggerRuntimeRequirements<Entry, "verify">>;
|
|
352
|
+
/** @since 0.0.0 @category execution */
|
|
353
|
+
export declare const parse: <Entry extends RuntimeTriggerEntry<any, any, any, any>>(entry: Entry, request: WebhookExecutionRequest) => Effect.Effect<EmittedEventsSuccess<TriggerIdOf<Entry>, "parse", TriggerEncodedOutput<EntryTrigger<Entry>>, TriggerEncodedState<EntryTrigger<Entry>>>, InvalidTriggerConfigError | InvalidTriggerStateError | InvalidTriggerOutputError | UnsupportedTriggerRuntimeError | RuntimeConnectionErrorsFor<EntryAuthMethods<Entry>> | TriggerAppError<EntryTrigger<Entry>>, TriggerRuntimeRequirements<Entry, "parse">>;
|
|
354
|
+
/** @since 0.0.0 @category execution */
|
|
355
|
+
export declare const poll: <Entry extends RuntimeTriggerEntry<any, any, any, any>>(entry: Entry, request: PollExecutionRequest) => Effect.Effect<EmittedEventsSuccess<TriggerIdOf<Entry>, "poll", TriggerEncodedOutput<EntryTrigger<Entry>>, TriggerEncodedState<EntryTrigger<Entry>>>, InvalidTriggerConfigError | InvalidTriggerStateError | InvalidTriggerOutputError | UnsupportedTriggerRuntimeError | RuntimeConnectionErrorsFor<EntryAuthMethods<Entry>> | TriggerAppError<EntryTrigger<Entry>>, TriggerRuntimeRequirements<Entry, "poll">>;
|
|
356
|
+
//#endregion
|
|
357
|
+
export { Trigger_d_exports };
|
|
358
|
+
//# sourceMappingURL=Trigger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Trigger.d.ts","names":["AuthMethod.Any","_$__internal_trigger_runtime_shared_ts0.TriggerIdOf","_$__internal_trigger_runtime_shared_ts0.EntryTrigger","_$__internal_trigger_runtime_shared_ts0.TriggerEncodedState","_$__internal_trigger_runtime_shared_ts0.EntryAuthMethods","_$__internal_auth_execution_ts0.RuntimeConnectionErrorsFor","_$__internal_trigger_runtime_shared_ts0.TriggerAppError","_$__internal_trigger_runtime_shared_ts0.TriggerRuntimeRequirements","_$__internal_trigger_runtime_shared_ts0.TriggerEncodedOutput"],"sources":["../src/Trigger.ts"],"mappings":"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"}
|
package/dist/Trigger.js
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { validateIdentifier } from "./internal/identifier.js";
|
|
3
|
+
import { PipeableProto } from "./internal/proto.js";
|
|
4
|
+
import { activate as activate$1, deactivate as deactivate$1, parse as parse$1, poll as poll$1, verify as verify$1 } from "./internal/trigger-runtime.js";
|
|
5
|
+
import { Array, Clock, Duration, Effect, Match, Number, Option, Predicate, Record, Result, Schema, String, pipe } from "effect";
|
|
6
|
+
import { Base64, Hex } from "effect/encoding";
|
|
7
|
+
//#region src/Trigger.ts
|
|
8
|
+
var Trigger_exports = /* @__PURE__ */ __exportAll({
|
|
9
|
+
InvalidTriggerConfigError: () => InvalidTriggerConfigError,
|
|
10
|
+
InvalidTriggerOutputError: () => InvalidTriggerOutputError,
|
|
11
|
+
InvalidTriggerStateError: () => InvalidTriggerStateError,
|
|
12
|
+
TypeId: () => TypeId,
|
|
13
|
+
UnsupportedTriggerRuntimeError: () => UnsupportedTriggerRuntimeError,
|
|
14
|
+
activate: () => activate,
|
|
15
|
+
bodyDigest: () => bodyDigest,
|
|
16
|
+
deactivate: () => deactivate,
|
|
17
|
+
handlerKey: () => handlerKey,
|
|
18
|
+
isTrigger: () => isTrigger,
|
|
19
|
+
parse: () => parse,
|
|
20
|
+
poll: () => poll,
|
|
21
|
+
polling: () => polling,
|
|
22
|
+
verify: () => verify,
|
|
23
|
+
verifyEcdsaP256: () => verifyEcdsaP256,
|
|
24
|
+
verifyHmac: () => verifyHmac,
|
|
25
|
+
verifyHmacSha256: () => verifyHmacSha256,
|
|
26
|
+
verifyStandardWebhook: () => verifyStandardWebhook,
|
|
27
|
+
verifyToken: () => verifyToken,
|
|
28
|
+
webhook: () => webhook
|
|
29
|
+
});
|
|
30
|
+
/** @since 0.0.0 @category type ids */
|
|
31
|
+
const TypeId = "@dual-os/sdk/Trigger";
|
|
32
|
+
function encoded(part) {
|
|
33
|
+
return Predicate.isString(part) ? new TextEncoder().encode(part) : part;
|
|
34
|
+
}
|
|
35
|
+
function bytes(value) {
|
|
36
|
+
if (Predicate.isString(value)) return new TextEncoder().encode(value);
|
|
37
|
+
if (value instanceof Uint8Array) return new Uint8Array(value);
|
|
38
|
+
const parts = Array.map(value, encoded);
|
|
39
|
+
const joined = new Uint8Array(Number.sumAll(Array.map(parts, (part) => part.length)));
|
|
40
|
+
Array.reduce(parts, 0, (offset, part) => {
|
|
41
|
+
joined.set(part, offset);
|
|
42
|
+
return offset + part.length;
|
|
43
|
+
});
|
|
44
|
+
return joined;
|
|
45
|
+
}
|
|
46
|
+
function sameBytes(left, right) {
|
|
47
|
+
return left.length === right.length && Number.sumAll(Array.zipWith(left, right, (a, b) => a ^ b)) === 0;
|
|
48
|
+
}
|
|
49
|
+
const hmacHashes = {
|
|
50
|
+
sha1: "SHA-1",
|
|
51
|
+
sha256: "SHA-256"
|
|
52
|
+
};
|
|
53
|
+
const matchesAny = Effect.fnUntraced(function* (algorithm, secret, message, signatures) {
|
|
54
|
+
if (secret.length === 0 || signatures.length === 0) return false;
|
|
55
|
+
const key = yield* Effect.promise(() => crypto.subtle.importKey("raw", bytes(secret), {
|
|
56
|
+
hash: hmacHashes[algorithm],
|
|
57
|
+
name: "HMAC"
|
|
58
|
+
}, false, ["sign"]));
|
|
59
|
+
const expected = new Uint8Array(yield* Effect.promise(() => crypto.subtle.sign("HMAC", key, bytes(message))));
|
|
60
|
+
return Array.contains(Array.map(signatures, (signature) => sameBytes(signature, expected)), true);
|
|
61
|
+
});
|
|
62
|
+
/**
|
|
63
|
+
* The hex SHA-256 of a delivery's raw body. Use it as the event key when the provider signs the
|
|
64
|
+
* body but not its delivery identifier header, so a replayed delivery keeps one identity.
|
|
65
|
+
*
|
|
66
|
+
* @since 0.0.0
|
|
67
|
+
* @category webhooks
|
|
68
|
+
*/
|
|
69
|
+
const bodyDigest = Effect.fn("Trigger.bodyDigest")(function* (rawBody) {
|
|
70
|
+
const digest = yield* Effect.promise(() => crypto.subtle.digest("SHA-256", bytes(rawBody)));
|
|
71
|
+
return Hex.encode(new Uint8Array(digest));
|
|
72
|
+
});
|
|
73
|
+
/**
|
|
74
|
+
* Whether `signature` is the HMAC-SHA256 of `message` keyed with `secret`, the way most webhook
|
|
75
|
+
* providers sign their deliveries. The comparison runs in constant time.
|
|
76
|
+
*
|
|
77
|
+
* @since 0.0.0
|
|
78
|
+
* @category webhooks
|
|
79
|
+
*/
|
|
80
|
+
const verifyHmacSha256 = Effect.fn("Trigger.verifyHmacSha256")(function* (secret, message, signature) {
|
|
81
|
+
return yield* matchesAny("sha256", secret, message, [signature]);
|
|
82
|
+
});
|
|
83
|
+
/**
|
|
84
|
+
* Whether `signature`, written in `encoding`, is the HMAC of `message` keyed with `secret`, given
|
|
85
|
+
* as text or as raw key bytes such as a decoded `whsec_` secret. A message given as parts is signed
|
|
86
|
+
* as their concatenation, such as a timestamp followed by the raw body. Given several signatures,
|
|
87
|
+
* such as one per rotated secret, it verifies when any of them matches and hashes the message once.
|
|
88
|
+
* A missing secret, or signatures none of which is valid `encoding`, never verifies. The comparison
|
|
89
|
+
* runs in constant time.
|
|
90
|
+
*
|
|
91
|
+
* @since 0.0.0
|
|
92
|
+
* @category webhooks
|
|
93
|
+
*/
|
|
94
|
+
const verifyHmac = Effect.fn("Trigger.verifyHmac")(function* (options) {
|
|
95
|
+
const decode = pipe(Match.value(options.encoding), Match.when("hex", () => Hex.decode), Match.when("base64", () => Base64.decode), Match.exhaustive);
|
|
96
|
+
return yield* matchesAny(options.algorithm, options.secret, options.message, Array.filterMap(Array.ensure(options.signature), (signature) => decode(signature)));
|
|
97
|
+
});
|
|
98
|
+
/**
|
|
99
|
+
* Whether a [Standard Webhooks](https://www.standardwebhooks.com) delivery is signed with `secret`:
|
|
100
|
+
* one `v1,<base64>` entry of its `webhook-signature` header (`svix-signature` from Svix) must be the
|
|
101
|
+
* HMAC-SHA256 of `id.timestamp.body` keyed with the bytes of the `whsec_` secret, and its timestamp
|
|
102
|
+
* must be within five minutes of now. Header names are lowercase, as in `WebhookRequest`. Missing
|
|
103
|
+
* headers or secret never verify.
|
|
104
|
+
*
|
|
105
|
+
* @since 0.0.0
|
|
106
|
+
* @category webhooks
|
|
107
|
+
*/
|
|
108
|
+
const verifyStandardWebhook = Effect.fn("Trigger.verifyStandardWebhook")(function* (options) {
|
|
109
|
+
const now = yield* Clock.currentTimeMillis;
|
|
110
|
+
function header(name) {
|
|
111
|
+
return Option.orElse(Record.get(options.headers, `webhook-${name}`), () => Record.get(options.headers, `svix-${name}`));
|
|
112
|
+
}
|
|
113
|
+
const signed = Option.all({
|
|
114
|
+
id: header("id"),
|
|
115
|
+
key: Result.getSuccess(Base64.decode(pipe(options.secret, String.replace(/^whsec_/u, "")))),
|
|
116
|
+
signature: header("signature"),
|
|
117
|
+
timestamp: Option.filter(header("timestamp"), (timestamp) => Option.exists(Number.parse(timestamp), (seconds) => Number.between(seconds * 1e3, {
|
|
118
|
+
maximum: now + Duration.toMillis(Duration.minutes(5)),
|
|
119
|
+
minimum: now - Duration.toMillis(Duration.minutes(5))
|
|
120
|
+
})))
|
|
121
|
+
});
|
|
122
|
+
return yield* Option.match(signed, {
|
|
123
|
+
onNone: () => Effect.succeed(false),
|
|
124
|
+
onSome: (delivery) => verifyHmac({
|
|
125
|
+
algorithm: "sha256",
|
|
126
|
+
encoding: "base64",
|
|
127
|
+
message: [`${delivery.id}.${delivery.timestamp}.`, options.body],
|
|
128
|
+
secret: delivery.key,
|
|
129
|
+
signature: pipe(delivery.signature, String.split(" "), Array.filter(String.startsWith("v1,")), Array.map(String.slice(3)))
|
|
130
|
+
})
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
/**
|
|
134
|
+
* Whether `actual` equals the shared secret `expected`, for providers that send the secret itself
|
|
135
|
+
* back with each delivery. An empty or missing secret never verifies. The comparison runs in
|
|
136
|
+
* constant time.
|
|
137
|
+
*
|
|
138
|
+
* @since 0.0.0
|
|
139
|
+
* @category webhooks
|
|
140
|
+
*/
|
|
141
|
+
const verifyToken = Effect.fn("Trigger.verifyToken")(function* (expected, actual) {
|
|
142
|
+
if (expected === "" || actual === void 0) return false;
|
|
143
|
+
const key = yield* Effect.promise(() => crypto.subtle.importKey("raw", crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(32)), {
|
|
144
|
+
hash: "SHA-256",
|
|
145
|
+
name: "HMAC"
|
|
146
|
+
}, false, ["sign", "verify"]));
|
|
147
|
+
const reference = yield* Effect.promise(() => crypto.subtle.sign("HMAC", key, bytes(expected)));
|
|
148
|
+
return yield* Effect.promise(() => crypto.subtle.verify("HMAC", key, reference, bytes(actual)));
|
|
149
|
+
});
|
|
150
|
+
const p256ScalarLength = 32;
|
|
151
|
+
function paddedScalar(integer) {
|
|
152
|
+
const trimmed = Array.dropWhile(integer, (byte) => byte === 0);
|
|
153
|
+
return Option.liftPredicate(Array.appendAll(Array.take(Array.replicate(0, p256ScalarLength), p256ScalarLength - trimmed.length), trimmed), (scalar) => scalar.length === p256ScalarLength);
|
|
154
|
+
}
|
|
155
|
+
function derInteger(der, offset) {
|
|
156
|
+
return Option.gen(function* () {
|
|
157
|
+
yield* Option.liftPredicate(yield* Array.get(der, offset), (tag) => tag === 2);
|
|
158
|
+
const length = yield* Array.get(der, offset + 1);
|
|
159
|
+
const value = Array.take(Array.drop(der, offset + 2), length);
|
|
160
|
+
yield* Option.liftPredicate(value, (taken) => taken.length === length);
|
|
161
|
+
return {
|
|
162
|
+
next: offset + 2 + length,
|
|
163
|
+
value
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function derToP1363(signature) {
|
|
168
|
+
return Option.gen(function* () {
|
|
169
|
+
const der = Array.fromIterable(signature);
|
|
170
|
+
yield* Option.liftPredicate(yield* Array.get(der, 0), (tag) => tag === 48);
|
|
171
|
+
yield* Option.liftPredicate(yield* Array.get(der, 1), (length) => length === der.length - 2);
|
|
172
|
+
const r = yield* derInteger(der, 2);
|
|
173
|
+
const s = yield* derInteger(der, r.next);
|
|
174
|
+
yield* Option.liftPredicate(s.next, (next) => next === der.length);
|
|
175
|
+
return new Uint8Array(Array.appendAll(yield* paddedScalar(r.value), yield* paddedScalar(s.value)));
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Whether `signature`, a base64 DER ECDSA signature, signs `message` with the ECDSA P-256 key
|
|
180
|
+
* `publicKey`, a base64 DER SubjectPublicKeyInfo, hashed with SHA-256. A message given as parts is
|
|
181
|
+
* signed as their concatenation, such as a timestamp followed by the raw body. A missing key or a
|
|
182
|
+
* key or signature that is not valid never verifies.
|
|
183
|
+
*
|
|
184
|
+
* @since 0.0.0
|
|
185
|
+
* @category webhooks
|
|
186
|
+
*/
|
|
187
|
+
const verifyEcdsaP256 = Effect.fn("Trigger.verifyEcdsaP256")(function* (options) {
|
|
188
|
+
const decoded = Option.all({
|
|
189
|
+
publicKey: Result.getSuccess(Base64.decode(options.publicKey)),
|
|
190
|
+
signature: Option.flatMap(Result.getSuccess(Base64.decode(options.signature)), derToP1363)
|
|
191
|
+
});
|
|
192
|
+
return yield* Option.match(decoded, {
|
|
193
|
+
onNone: () => Effect.succeed(false),
|
|
194
|
+
onSome: Effect.fnUntraced(function* (keys) {
|
|
195
|
+
return yield* pipe(Effect.tryPromise(async () => crypto.subtle.verify({
|
|
196
|
+
hash: "SHA-256",
|
|
197
|
+
name: "ECDSA"
|
|
198
|
+
}, await crypto.subtle.importKey("spki", bytes(keys.publicKey), {
|
|
199
|
+
name: "ECDSA",
|
|
200
|
+
namedCurve: "P-256"
|
|
201
|
+
}, false, ["verify"]), keys.signature, bytes(options.message))), Effect.orElseSucceed(() => false));
|
|
202
|
+
})
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
/** @since 0.0.0 @category handlers */
|
|
206
|
+
const handlerKey = (triggerId) => `@dual-os/sdk/Trigger/Handler/${triggerId}`;
|
|
207
|
+
const Proto = {
|
|
208
|
+
...PipeableProto,
|
|
209
|
+
[TypeId]: TypeId
|
|
210
|
+
};
|
|
211
|
+
const constructor = (kind) => (identifier, options) => {
|
|
212
|
+
validateIdentifier("trigger", identifier);
|
|
213
|
+
return Object.assign(Object.create(Proto), {
|
|
214
|
+
config: options.config,
|
|
215
|
+
description: options.description,
|
|
216
|
+
identifier,
|
|
217
|
+
kind,
|
|
218
|
+
name: options.name,
|
|
219
|
+
output: options.output,
|
|
220
|
+
requireAuth: options.requireAuth ?? true,
|
|
221
|
+
state: options.state
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
/**
|
|
225
|
+
* Provider webhook triggers must own isolated per-trigger/per-deploy-version
|
|
226
|
+
* ingress/subscription state, or no external provider resource at all.
|
|
227
|
+
* Activating or deactivating one Dual trigger must never mutate provider state
|
|
228
|
+
* that another trigger, deploy version, mailbox, account, or app-level
|
|
229
|
+
* subscription depends on. Shared provider watches must be modeled as polling.
|
|
230
|
+
*
|
|
231
|
+
* @since 0.0.0 @category constructors
|
|
232
|
+
*/
|
|
233
|
+
const webhook = constructor("webhook");
|
|
234
|
+
/** @since 0.0.0 @category constructors */
|
|
235
|
+
const polling = constructor("polling");
|
|
236
|
+
/** @since 0.0.0 @category guards */
|
|
237
|
+
const isTrigger = (u) => Predicate.hasProperty(u, TypeId);
|
|
238
|
+
/** @since 0.0.0 @category errors */
|
|
239
|
+
var InvalidTriggerConfigError = class extends Schema.TaggedError()("InvalidTriggerConfigError", {
|
|
240
|
+
description: Schema.String,
|
|
241
|
+
triggerId: Schema.String
|
|
242
|
+
}) {};
|
|
243
|
+
/** @since 0.0.0 @category errors */
|
|
244
|
+
var InvalidTriggerStateError = class extends Schema.TaggedError()("InvalidTriggerStateError", {
|
|
245
|
+
description: Schema.String,
|
|
246
|
+
location: Schema.Literals(["input", "result"]),
|
|
247
|
+
phase: Schema.Literals([
|
|
248
|
+
"activate",
|
|
249
|
+
"deactivate",
|
|
250
|
+
"verify",
|
|
251
|
+
"parse",
|
|
252
|
+
"poll"
|
|
253
|
+
]),
|
|
254
|
+
triggerId: Schema.String
|
|
255
|
+
}) {};
|
|
256
|
+
/** @since 0.0.0 @category errors */
|
|
257
|
+
var InvalidTriggerOutputError = class extends Schema.TaggedError()("InvalidTriggerOutputError", {
|
|
258
|
+
description: Schema.String,
|
|
259
|
+
phase: Schema.Literals(["parse", "poll"]),
|
|
260
|
+
triggerId: Schema.String
|
|
261
|
+
}) {};
|
|
262
|
+
/** @since 0.0.0 @category errors */
|
|
263
|
+
var UnsupportedTriggerRuntimeError = class extends Schema.TaggedError()("UnsupportedTriggerRuntimeError", {
|
|
264
|
+
kind: Schema.Literals(["webhook", "polling"]),
|
|
265
|
+
phase: Schema.Literals([
|
|
266
|
+
"activate",
|
|
267
|
+
"deactivate",
|
|
268
|
+
"verify",
|
|
269
|
+
"parse",
|
|
270
|
+
"poll"
|
|
271
|
+
]),
|
|
272
|
+
triggerId: Schema.String
|
|
273
|
+
}) {};
|
|
274
|
+
/** @since 0.0.0 @category execution */
|
|
275
|
+
const activate = activate$1;
|
|
276
|
+
/** @since 0.0.0 @category execution */
|
|
277
|
+
const deactivate = deactivate$1;
|
|
278
|
+
/** @since 0.0.0 @category execution */
|
|
279
|
+
const verify = verify$1;
|
|
280
|
+
/** @since 0.0.0 @category execution */
|
|
281
|
+
const parse = parse$1;
|
|
282
|
+
/** @since 0.0.0 @category execution */
|
|
283
|
+
const poll = poll$1;
|
|
284
|
+
//#endregion
|
|
285
|
+
export { InvalidTriggerConfigError, InvalidTriggerOutputError, InvalidTriggerStateError, Trigger_exports, TypeId, UnsupportedTriggerRuntimeError, activate, bodyDigest, deactivate, handlerKey, isTrigger, parse, poll, polling, verify, verifyEcdsaP256, verifyHmac, verifyHmacSha256, verifyStandardWebhook, verifyToken, webhook };
|
|
286
|
+
|
|
287
|
+
//# sourceMappingURL=Trigger.js.map
|