@fluid-app/droplet-bridge 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -2
- package/dist/index.cjs +1248 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +243 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +243 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1214 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +43 -3
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
//#region src/errors.d.ts
|
|
2
|
+
type FluidBridgeErrorCode = "configuration_error" | "host_unavailable" | "handshake_timeout" | "incompatible_version" | "token_mint_failed" | "unauthorized" | "forbidden_origin" | "invalid_context" | "request_timeout" | "fetch_target_not_allowed" | "network_error" | "failed_authentication";
|
|
3
|
+
declare class FluidBridgeError extends Error {
|
|
4
|
+
readonly code: FluidBridgeErrorCode;
|
|
5
|
+
readonly details?: unknown;
|
|
6
|
+
constructor(code: FluidBridgeErrorCode, message: string, details?: unknown);
|
|
7
|
+
}
|
|
8
|
+
declare class FluidBridgeConfigurationError extends FluidBridgeError {
|
|
9
|
+
constructor(message: string, details?: unknown);
|
|
10
|
+
}
|
|
11
|
+
declare class FluidBridgeHostUnavailableError extends FluidBridgeError {
|
|
12
|
+
constructor(message?: string, details?: unknown);
|
|
13
|
+
}
|
|
14
|
+
declare class FluidBridgeHandshakeTimeoutError extends FluidBridgeError {
|
|
15
|
+
constructor(message?: string, details?: unknown);
|
|
16
|
+
}
|
|
17
|
+
declare class FluidBridgeIncompatibleVersionError extends FluidBridgeError {
|
|
18
|
+
constructor(message?: string, details?: unknown);
|
|
19
|
+
}
|
|
20
|
+
declare class FluidBridgeTokenMintError extends FluidBridgeError {
|
|
21
|
+
constructor(message?: string, details?: unknown);
|
|
22
|
+
}
|
|
23
|
+
declare class FluidBridgeUnauthorizedError extends FluidBridgeError {
|
|
24
|
+
constructor(message?: string, details?: unknown);
|
|
25
|
+
}
|
|
26
|
+
declare class FluidBridgeForbiddenOriginError extends FluidBridgeError {
|
|
27
|
+
constructor(message?: string, details?: unknown);
|
|
28
|
+
}
|
|
29
|
+
declare class FluidBridgeInvalidContextError extends FluidBridgeError {
|
|
30
|
+
constructor(message?: string, details?: unknown);
|
|
31
|
+
}
|
|
32
|
+
declare class FluidBridgeRequestTimeoutError extends FluidBridgeError {
|
|
33
|
+
constructor(message?: string, details?: unknown);
|
|
34
|
+
}
|
|
35
|
+
declare class FluidBridgeFetchTargetError extends FluidBridgeError {
|
|
36
|
+
constructor(message?: string, details?: unknown);
|
|
37
|
+
}
|
|
38
|
+
declare class FluidBridgeNetworkError extends FluidBridgeError {
|
|
39
|
+
constructor(message?: string, details?: unknown);
|
|
40
|
+
}
|
|
41
|
+
declare class FluidBridgeFailedAuthenticationError extends FluidBridgeError {
|
|
42
|
+
constructor(message?: string, details?: unknown);
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
//#region src/protocol.d.ts
|
|
46
|
+
declare const FLUID_BRIDGE_PROTOCOL_VERSION = "2026-07";
|
|
47
|
+
declare const APP_BRIDGE_SDK_NAME = "@fluid-app/droplet-bridge";
|
|
48
|
+
declare const APP_BRIDGE_SDK_VERSION = "0.1.0";
|
|
49
|
+
declare const FluidBridgeMessageType: {
|
|
50
|
+
readonly SessionTokenRequest: "FLUID::SESSION_TOKEN_REQUEST";
|
|
51
|
+
readonly SessionTokenRespond: "FLUID::SESSION_TOKEN_RESPOND";
|
|
52
|
+
readonly ContextRequest: "FLUID::CONTEXT_REQUEST";
|
|
53
|
+
readonly ContextRespond: "FLUID::CONTEXT_RESPOND";
|
|
54
|
+
readonly FailedAuthentication: "FLUID::ERROR::FAILED_AUTHENTICATION";
|
|
55
|
+
readonly Unauthorized: "FLUID::ERROR::UNAUTHORIZED";
|
|
56
|
+
readonly IncompatibleVersion: "FLUID::ERROR::INCOMPATIBLE_VERSION";
|
|
57
|
+
readonly TokenMintFailed: "FLUID::ERROR::TOKEN_MINT_FAILED";
|
|
58
|
+
readonly InvalidContext: "FLUID::ERROR::INVALID_CONTEXT";
|
|
59
|
+
};
|
|
60
|
+
type FluidBridgeMessageTypeValue = (typeof FluidBridgeMessageType)[keyof typeof FluidBridgeMessageType];
|
|
61
|
+
type BridgeActorType = "admin" | "member" | "customer" | "anonymous";
|
|
62
|
+
type BridgeEntryType = "droplet" | "drop_zone" | "mobile_embed" | "portal_embed" | "app_extension";
|
|
63
|
+
interface BridgeResource {
|
|
64
|
+
type: string;
|
|
65
|
+
id: string;
|
|
66
|
+
}
|
|
67
|
+
interface BridgeContext {
|
|
68
|
+
protocol: typeof FLUID_BRIDGE_PROTOCOL_VERSION;
|
|
69
|
+
app: {
|
|
70
|
+
clientId: string;
|
|
71
|
+
};
|
|
72
|
+
store: {
|
|
73
|
+
subdomain: string;
|
|
74
|
+
url: string;
|
|
75
|
+
uuid?: string;
|
|
76
|
+
name?: string;
|
|
77
|
+
};
|
|
78
|
+
actor?: {
|
|
79
|
+
type: BridgeActorType;
|
|
80
|
+
uuid?: string;
|
|
81
|
+
roles?: string[];
|
|
82
|
+
permissions?: string[];
|
|
83
|
+
memberType?: string;
|
|
84
|
+
};
|
|
85
|
+
entry: {
|
|
86
|
+
type: BridgeEntryType;
|
|
87
|
+
name?: string;
|
|
88
|
+
};
|
|
89
|
+
resources: BridgeResource[];
|
|
90
|
+
fetch: {
|
|
91
|
+
allowedOrigins: string[];
|
|
92
|
+
};
|
|
93
|
+
sdk: {
|
|
94
|
+
minVersion: string;
|
|
95
|
+
recommendedVersion?: string;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
interface BridgeEnvelope<TType extends string, TPayload> {
|
|
99
|
+
id: string;
|
|
100
|
+
type: TType;
|
|
101
|
+
payload: TPayload;
|
|
102
|
+
}
|
|
103
|
+
//#endregion
|
|
104
|
+
//#region src/host.d.ts
|
|
105
|
+
interface CreateFluidBridgeHostOptions {
|
|
106
|
+
iframe: HTMLIFrameElement;
|
|
107
|
+
appOrigin: string;
|
|
108
|
+
clientId: string;
|
|
109
|
+
getContext: () => BridgeContext | Promise<BridgeContext>;
|
|
110
|
+
getSessionToken: (context: BridgeContext) => string | Promise<string>;
|
|
111
|
+
targetWindow?: Window;
|
|
112
|
+
}
|
|
113
|
+
interface FluidBridgeHost {
|
|
114
|
+
destroy: () => void;
|
|
115
|
+
}
|
|
116
|
+
declare function createFluidBridgeHost(options: CreateFluidBridgeHostOptions): FluidBridgeHost;
|
|
117
|
+
//#endregion
|
|
118
|
+
//#region src/canonical-protocol.d.ts
|
|
119
|
+
declare const protocolVersion: "1";
|
|
120
|
+
declare const BRIDGE_PROTOCOL_VERSION: typeof protocolVersion;
|
|
121
|
+
type CanonicalBridgeActorType = "store_admin" | "store_member";
|
|
122
|
+
type CanonicalBridgeEntryType = "droplet" | "drop_zone" | "mobile_embed" | "portal_embed" | "app_extension";
|
|
123
|
+
interface CanonicalBridgeResource {
|
|
124
|
+
type: string;
|
|
125
|
+
id: string;
|
|
126
|
+
}
|
|
127
|
+
interface CanonicalBridgeContext {
|
|
128
|
+
protocolVersion: typeof BRIDGE_PROTOCOL_VERSION;
|
|
129
|
+
app: {
|
|
130
|
+
clientId: string;
|
|
131
|
+
};
|
|
132
|
+
store: {
|
|
133
|
+
subdomain: string;
|
|
134
|
+
url: string;
|
|
135
|
+
uuid?: string;
|
|
136
|
+
name?: string; /** Authenticated viewer’s active language. Present when the host provides one. */
|
|
137
|
+
locale?: string;
|
|
138
|
+
};
|
|
139
|
+
actor: {
|
|
140
|
+
type: CanonicalBridgeActorType;
|
|
141
|
+
uuid?: string;
|
|
142
|
+
roles?: string[];
|
|
143
|
+
permissions?: string[];
|
|
144
|
+
memberType?: string;
|
|
145
|
+
};
|
|
146
|
+
entry: {
|
|
147
|
+
type: CanonicalBridgeEntryType;
|
|
148
|
+
name?: string;
|
|
149
|
+
};
|
|
150
|
+
resources: CanonicalBridgeResource[];
|
|
151
|
+
fetch: {
|
|
152
|
+
allowedOrigins: string[];
|
|
153
|
+
};
|
|
154
|
+
sdk: {
|
|
155
|
+
minVersion: string;
|
|
156
|
+
recommendedVersion?: string;
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//#endregion
|
|
160
|
+
//#region src/canonical-host.d.ts
|
|
161
|
+
/** Trusted host inputs, fixed for one document load. Never populate from iframe messages. */
|
|
162
|
+
interface BridgeMount {
|
|
163
|
+
clientId: string;
|
|
164
|
+
storeUuid: string;
|
|
165
|
+
actor: {
|
|
166
|
+
type: CanonicalBridgeContext["actor"]["type"];
|
|
167
|
+
uuid: string;
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* Advisory/informational only. Required so the shell cannot omit it, but
|
|
171
|
+
* the host never compares it against anything — it is not an
|
|
172
|
+
* authorization input. Carry it for logging/telemetry only.
|
|
173
|
+
*/
|
|
174
|
+
installationId: string;
|
|
175
|
+
entry: {
|
|
176
|
+
type: CanonicalBridgeContext["entry"]["type"];
|
|
177
|
+
name: string;
|
|
178
|
+
};
|
|
179
|
+
/** Generated once by the shell, shared with the URL-bootstrap mint. */
|
|
180
|
+
sid: string;
|
|
181
|
+
}
|
|
182
|
+
interface CanonicalHostOptions {
|
|
183
|
+
iframe: HTMLIFrameElement;
|
|
184
|
+
/** Exact origin derived by the shell from the server's registered embed URL. */
|
|
185
|
+
appOrigin: string;
|
|
186
|
+
mount: BridgeMount;
|
|
187
|
+
/** Endpoint adapter for the context request. Returns the inner bridge_context unchanged. */
|
|
188
|
+
getContext: (signal: AbortSignal) => Promise<unknown>;
|
|
189
|
+
/** Endpoint adapter for the session-token request. Uses host auth; returns the compact token. */
|
|
190
|
+
getSessionToken: (mount: Readonly<BridgeMount>, signal: AbortSignal) => Promise<string>;
|
|
191
|
+
targetWindow?: Window;
|
|
192
|
+
}
|
|
193
|
+
interface CanonicalBridgeHost {
|
|
194
|
+
/** Unmount or identity/context change must destroy this host before mounting another. */
|
|
195
|
+
destroy: () => void;
|
|
196
|
+
}
|
|
197
|
+
/** Push handshake and correlated refresh on the single canonical envelope. */
|
|
198
|
+
declare function createCanonicalBridgeHost(options: CanonicalHostOptions): CanonicalBridgeHost;
|
|
199
|
+
//#endregion
|
|
200
|
+
//#region src/session-token-api.d.ts
|
|
201
|
+
interface AppBridgeSessionTokenRequest {
|
|
202
|
+
clientId: string;
|
|
203
|
+
entry: BridgeContext["entry"];
|
|
204
|
+
resources?: BridgeContext["resources"];
|
|
205
|
+
allowedOrigins?: string[];
|
|
206
|
+
sessionId?: string;
|
|
207
|
+
}
|
|
208
|
+
interface MintAppBridgeSessionTokenOptions {
|
|
209
|
+
request: AppBridgeSessionTokenRequest;
|
|
210
|
+
apiBaseUrl?: string;
|
|
211
|
+
authToken?: string;
|
|
212
|
+
fetch?: typeof fetch;
|
|
213
|
+
}
|
|
214
|
+
declare function mintAppBridgeSessionToken({
|
|
215
|
+
request,
|
|
216
|
+
apiBaseUrl,
|
|
217
|
+
authToken,
|
|
218
|
+
fetch: fetchImplementation
|
|
219
|
+
}: MintAppBridgeSessionTokenOptions): Promise<string>;
|
|
220
|
+
declare function sessionTokenRequestFromContext(context: BridgeContext, sessionId?: string): AppBridgeSessionTokenRequest;
|
|
221
|
+
//#endregion
|
|
222
|
+
//#region src/canonical-client.d.ts
|
|
223
|
+
interface CreateFluidBridgeOptions {
|
|
224
|
+
clientId: string;
|
|
225
|
+
/** Exact host-shell origin, supplied by the shell. Never inferred from referrer. */
|
|
226
|
+
hostOrigin: string;
|
|
227
|
+
disableFetchPatch?: boolean;
|
|
228
|
+
timeoutMs?: number;
|
|
229
|
+
/** Document window; parent remains the only permitted sender. Primarily for testing. */
|
|
230
|
+
targetWindow?: Window;
|
|
231
|
+
fetch?: typeof fetch;
|
|
232
|
+
}
|
|
233
|
+
interface FluidBridge {
|
|
234
|
+
getContext(): Promise<CanonicalBridgeContext>;
|
|
235
|
+
getSessionToken(): Promise<string>;
|
|
236
|
+
fetch: typeof fetch;
|
|
237
|
+
destroy(): void;
|
|
238
|
+
}
|
|
239
|
+
/** One canonical client per iframe document. Tokens are decoded for delivery binding only. */
|
|
240
|
+
declare function createFluidBridge(options: CreateFluidBridgeOptions): FluidBridge;
|
|
241
|
+
//#endregion
|
|
242
|
+
export { APP_BRIDGE_SDK_NAME, APP_BRIDGE_SDK_VERSION, type AppBridgeSessionTokenRequest, type BridgeActorType, type BridgeContext, type BridgeEntryType, type BridgeEnvelope, type BridgeMount, type BridgeResource, type CanonicalBridgeContext, type CanonicalBridgeHost, type CanonicalHostOptions, FluidBridgeConfigurationError as ConfigurationError, FluidBridgeConfigurationError, type CreateFluidBridgeHostOptions, type CreateFluidBridgeOptions, FLUID_BRIDGE_PROTOCOL_VERSION, FluidBridgeFailedAuthenticationError as FailedAuthenticationError, FluidBridgeFailedAuthenticationError, FluidBridgeFetchTargetError as FetchTargetNotAllowedError, FluidBridgeFetchTargetError, type FluidBridge, FluidBridgeError, type FluidBridgeErrorCode, FluidBridgeForbiddenOriginError, FluidBridgeForbiddenOriginError as ForbiddenOriginError, FluidBridgeHandshakeTimeoutError, FluidBridgeHandshakeTimeoutError as HandshakeTimeoutError, type FluidBridgeHost, FluidBridgeHostUnavailableError, FluidBridgeHostUnavailableError as HostUnavailableError, FluidBridgeIncompatibleVersionError, FluidBridgeIncompatibleVersionError as IncompatibleVersionError, FluidBridgeInvalidContextError, FluidBridgeInvalidContextError as InvalidContextError, FluidBridgeMessageType, type FluidBridgeMessageTypeValue, FluidBridgeNetworkError, FluidBridgeNetworkError as NetworkError, FluidBridgeRequestTimeoutError, FluidBridgeRequestTimeoutError as RequestTimeoutError, FluidBridgeTokenMintError, FluidBridgeTokenMintError as TokenMintFailedError, FluidBridgeUnauthorizedError, FluidBridgeUnauthorizedError as UnauthorizedError, type MintAppBridgeSessionTokenOptions, createCanonicalBridgeHost, createFluidBridge, createFluidBridgeHost, mintAppBridgeSessionToken, sessionTokenRequestFromContext };
|
|
243
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/protocol.ts","../src/host.ts","../src/canonical-protocol.ts","../src/canonical-host.ts","../src/session-token-api.ts","../src/canonical-client.ts"],"mappings":"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"}
|