@datafn/extfn 0.1.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/README.md +143 -0
- package/dist/authority.d.ts +44 -0
- package/dist/authority.d.ts.map +1 -0
- package/dist/authority.js +242 -0
- package/dist/authority.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +22 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +25 -0
- package/dist/plugin.js.map +1 -0
- package/dist/proxyClient.d.ts +16 -0
- package/dist/proxyClient.d.ts.map +1 -0
- package/dist/proxyClient.js +192 -0
- package/dist/proxyClient.js.map +1 -0
- package/dist/routes.d.ts +5 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +33 -0
- package/dist/routes.js.map +1 -0
- package/dist/shared.d.ts +45 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +137 -0
- package/dist/shared.js.map +1 -0
- package/dist/subscriptions.d.ts +34 -0
- package/dist/subscriptions.d.ts.map +1 -0
- package/dist/subscriptions.js +95 -0
- package/dist/subscriptions.js.map +1 -0
- package/package.json +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# @datafn/extfn
|
|
2
|
+
|
|
3
|
+
`@datafn/extfn` is the DataFn integration layer for `extfn`.
|
|
4
|
+
|
|
5
|
+
It keeps DataFn authority in the extension background context and gives popup, options, sidepanel, and content code a proxy client surface that stays aligned with the public `@datafn/client` API.
|
|
6
|
+
|
|
7
|
+
## What this package owns
|
|
8
|
+
|
|
9
|
+
- background authority setup
|
|
10
|
+
- background request routing for DataFn RPC methods
|
|
11
|
+
- cross-context proxy client creation
|
|
12
|
+
- subscription fanout and cleanup for extension contexts
|
|
13
|
+
|
|
14
|
+
It does not move DataFn semantics into `extfn` core.
|
|
15
|
+
|
|
16
|
+
## Public surface
|
|
17
|
+
|
|
18
|
+
The package exports:
|
|
19
|
+
|
|
20
|
+
- `createDatafnExtfnAuthority(...)`
|
|
21
|
+
- `createDatafnExtfnProxyClient(...)`
|
|
22
|
+
- `createBrowserDatafnExtfnBridge(...)`
|
|
23
|
+
- `datafnExtfn(...)`
|
|
24
|
+
- `createDatafnExtfnRoutes(...)`
|
|
25
|
+
|
|
26
|
+
## Options
|
|
27
|
+
|
|
28
|
+
`DatafnExtfnOptions` is based on the current public `DatafnClientConfig` shape.
|
|
29
|
+
|
|
30
|
+
Supported keys:
|
|
31
|
+
|
|
32
|
+
- `schema`
|
|
33
|
+
- `clientId`
|
|
34
|
+
- `namespace`
|
|
35
|
+
- `sync`
|
|
36
|
+
- `storage`
|
|
37
|
+
- `plugins`
|
|
38
|
+
- `searchProvider`
|
|
39
|
+
- `requestTimeoutMs`
|
|
40
|
+
|
|
41
|
+
Not supported:
|
|
42
|
+
|
|
43
|
+
- `authContext`
|
|
44
|
+
|
|
45
|
+
If you need auth/session behavior, keep that in consumer code or another package-owned layer and pass DataFn the resulting configuration or storage behavior explicitly.
|
|
46
|
+
|
|
47
|
+
## Background authority
|
|
48
|
+
|
|
49
|
+
Create the authority in background code only.
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
import { createDatafnExtfnAuthority } from "@datafn/extfn";
|
|
53
|
+
import { demoNamespace, demoSchema } from "./demoSchema.js";
|
|
54
|
+
|
|
55
|
+
const authority = createDatafnExtfnAuthority(
|
|
56
|
+
{
|
|
57
|
+
schema: demoSchema,
|
|
58
|
+
clientId: "authority:demo",
|
|
59
|
+
namespace: demoNamespace,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
address: {
|
|
63
|
+
context: "background",
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
authority.attachBrowserRuntimeBridge();
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The authority:
|
|
72
|
+
|
|
73
|
+
- rejects non-background startup
|
|
74
|
+
- reuses `@datafn/client` storage adapters
|
|
75
|
+
- owns subscription lifecycle
|
|
76
|
+
- speaks extfn-compatible request/response/event envelopes to extension contexts
|
|
77
|
+
|
|
78
|
+
## Popup, options, sidepanel, and content clients
|
|
79
|
+
|
|
80
|
+
Create a proxy client in any non-background context.
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
import { createDatafnExtfnProxyClient } from "@datafn/extfn";
|
|
84
|
+
|
|
85
|
+
const client = createDatafnExtfnProxyClient({
|
|
86
|
+
schema: demoSchema,
|
|
87
|
+
clientId: "popup:demo",
|
|
88
|
+
namespace: demoNamespace,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const notes = await client.query({
|
|
92
|
+
resource: "note",
|
|
93
|
+
version: 1,
|
|
94
|
+
select: ["id", "title"],
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
You can also pass explicit runtime options:
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
const client = createDatafnExtfnProxyClient(
|
|
102
|
+
{
|
|
103
|
+
schema: demoSchema,
|
|
104
|
+
clientId: "content:demo",
|
|
105
|
+
namespace: demoNamespace,
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
address: {
|
|
109
|
+
context: "content",
|
|
110
|
+
contentScriptId: "highlights",
|
|
111
|
+
tabId: 12,
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
);
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Using the plugin helper
|
|
118
|
+
|
|
119
|
+
`datafnExtfn(...)` returns a runtime plugin plus convenience accessors.
|
|
120
|
+
|
|
121
|
+
Use it when your package wants to bundle:
|
|
122
|
+
|
|
123
|
+
- a stable plugin id
|
|
124
|
+
- background route registration
|
|
125
|
+
- a reusable proxy-client factory
|
|
126
|
+
|
|
127
|
+
Keep in mind that background authority startup is still package-owned logic.
|
|
128
|
+
|
|
129
|
+
## Example in this repo
|
|
130
|
+
|
|
131
|
+
See:
|
|
132
|
+
|
|
133
|
+
- `extfn/examples/svelte-datafn-demo/extfn.config.ts`
|
|
134
|
+
- `extfn/examples/svelte-datafn-demo/src/background/index.ts`
|
|
135
|
+
- `extfn/examples/svelte-datafn-demo/src/demoClient.ts`
|
|
136
|
+
|
|
137
|
+
## Validation from repo root
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
npm run test -- --filter=@datafn/extfn
|
|
141
|
+
npm run build -- --filter=svelte-datafn-demo
|
|
142
|
+
npm exec extfn scan -- --config extfn/examples/svelte-datafn-demo/extfn.config.ts
|
|
143
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createDatafnClient, type DatafnClient, type DatafnClientConfig } from "@datafn/client";
|
|
2
|
+
import type { DatafnSchema } from "@datafn/core";
|
|
3
|
+
import type { RuntimeAddress } from "@extfn/core";
|
|
4
|
+
import type { DatafnExtfnOptions } from "./plugin.js";
|
|
5
|
+
import { DatafnExtfnSubscriptions } from "./subscriptions.js";
|
|
6
|
+
import { type RuntimeEventEnvelope, type RuntimeRequestEnvelope, type RuntimeResponseEnvelope } from "./shared.js";
|
|
7
|
+
type DatafnRpcMethod = "query" | "mutation" | "transact" | "seed" | "clone" | "pull" | "push" | "reconcile" | "subscribe" | "unsubscribe";
|
|
8
|
+
export interface BrowserRuntimeLike {
|
|
9
|
+
sendMessage?: (message: unknown, callback?: (response: unknown) => void) => Promise<unknown> | void;
|
|
10
|
+
onMessage?: {
|
|
11
|
+
addListener(handler: BrowserRuntimeMessageHandler): void;
|
|
12
|
+
removeListener(handler: BrowserRuntimeMessageHandler): void;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
type BrowserRuntimeMessageHandler = (message: unknown, sender: unknown, sendResponse: (response: unknown) => void) => boolean | void;
|
|
16
|
+
export interface DatafnExtfnRequestContext {
|
|
17
|
+
proxyId: string;
|
|
18
|
+
emitEvent?: (eventEnvelope: RuntimeEventEnvelope) => void | Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export interface DatafnExtfnBridge {
|
|
21
|
+
proxyId: string;
|
|
22
|
+
request(envelope: RuntimeRequestEnvelope): Promise<RuntimeResponseEnvelope>;
|
|
23
|
+
onEvent(handler: (eventEnvelope: RuntimeEventEnvelope) => void): () => void;
|
|
24
|
+
}
|
|
25
|
+
export interface CreateDatafnExtfnAuthorityOptions<S extends DatafnSchema> {
|
|
26
|
+
address?: RuntimeAddress;
|
|
27
|
+
clientFactory?: typeof createDatafnClient<S>;
|
|
28
|
+
storage?: DatafnClientConfig<S>["storage"];
|
|
29
|
+
autoStartSync?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface DatafnExtfnAuthority<S extends DatafnSchema> {
|
|
32
|
+
readonly address: RuntimeAddress;
|
|
33
|
+
readonly client: DatafnClient<S>;
|
|
34
|
+
readonly options: DatafnExtfnOptions<S>;
|
|
35
|
+
readonly subscriptions: DatafnExtfnSubscriptions;
|
|
36
|
+
requestMethod(method: DatafnRpcMethod, payload: unknown, context?: DatafnExtfnRequestContext): Promise<unknown>;
|
|
37
|
+
handleRequest(envelope: RuntimeRequestEnvelope, context?: DatafnExtfnRequestContext): Promise<RuntimeResponseEnvelope>;
|
|
38
|
+
createBridge(proxyId?: string): DatafnExtfnBridge;
|
|
39
|
+
attachBrowserRuntimeBridge(runtime?: BrowserRuntimeLike): () => void;
|
|
40
|
+
destroy(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
export declare function createDatafnExtfnAuthority<S extends DatafnSchema>(options: DatafnExtfnOptions<S>, init?: CreateDatafnExtfnAuthorityOptions<S>): DatafnExtfnAuthority<S>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=authority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../src/authority.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { createDatafnClient, IndexedDbStorageAdapter, MemoryStorageAdapter, } from "@datafn/client";
|
|
2
|
+
import { DatafnExtfnSubscriptions } from "./subscriptions.js";
|
|
3
|
+
import { assertValidDatafnExtfnOptionShape, assertValidRequestEnvelope, createErrorResponseEnvelope, createEventEnvelope, createExtfnLikeError, createSuccessResponseEnvelope, normalizeExtfnLikeError, toProxyId, } from "./shared.js";
|
|
4
|
+
export function createDatafnExtfnAuthority(options, init = {}) {
|
|
5
|
+
assertValidDatafnExtfnOptionShape(options);
|
|
6
|
+
const address = init.address ?? { context: "background" };
|
|
7
|
+
if (address.context !== "background") {
|
|
8
|
+
throw createExtfnLikeError("E_CONTEXT_UNAVAILABLE", "DataFn authority mode is only available in background context.", {
|
|
9
|
+
context: address.context,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
const clientFactory = init.clientFactory ?? createDatafnClient;
|
|
13
|
+
const storage = resolveAuthorityStorage(options, init.storage);
|
|
14
|
+
const sync = {
|
|
15
|
+
offlinability: options.sync?.offlinability ?? true,
|
|
16
|
+
mode: options.sync?.mode ??
|
|
17
|
+
(options.sync?.remote || options.sync?.remoteAdapter
|
|
18
|
+
? "sync"
|
|
19
|
+
: "local-only"),
|
|
20
|
+
...options.sync,
|
|
21
|
+
};
|
|
22
|
+
const client = clientFactory({
|
|
23
|
+
...options,
|
|
24
|
+
sync,
|
|
25
|
+
storage,
|
|
26
|
+
});
|
|
27
|
+
const subscriptions = new DatafnExtfnSubscriptions({
|
|
28
|
+
subscribe: (handler, filter) => client.subscribe(handler, filter),
|
|
29
|
+
});
|
|
30
|
+
const runtimeBridgeCleanups = new Set();
|
|
31
|
+
if (init.autoStartSync && sync.mode === "sync") {
|
|
32
|
+
void client.sync.start();
|
|
33
|
+
}
|
|
34
|
+
const authority = {
|
|
35
|
+
address,
|
|
36
|
+
client,
|
|
37
|
+
options,
|
|
38
|
+
subscriptions,
|
|
39
|
+
async requestMethod(method, payload, context) {
|
|
40
|
+
switch (method) {
|
|
41
|
+
case "query":
|
|
42
|
+
return client.query(payload);
|
|
43
|
+
case "mutation":
|
|
44
|
+
return client.mutate(payload);
|
|
45
|
+
case "transact":
|
|
46
|
+
return client.transact(payload);
|
|
47
|
+
case "seed":
|
|
48
|
+
return client.sync.seed(payload);
|
|
49
|
+
case "clone":
|
|
50
|
+
return client.sync.clone(payload);
|
|
51
|
+
case "pull":
|
|
52
|
+
return client.sync.pull(payload);
|
|
53
|
+
case "push":
|
|
54
|
+
return client.sync.push(payload);
|
|
55
|
+
case "reconcile":
|
|
56
|
+
await client.sync.reconcileNow();
|
|
57
|
+
return { reconciled: true };
|
|
58
|
+
case "subscribe":
|
|
59
|
+
return handleSubscribeRequest(subscriptions, address, payload, context);
|
|
60
|
+
case "unsubscribe":
|
|
61
|
+
return handleUnsubscribeRequest(subscriptions, payload);
|
|
62
|
+
default:
|
|
63
|
+
throw createExtfnLikeError("E_HANDLER_NOT_FOUND", `No handler registered for datafn/${method}`);
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
async handleRequest(envelope, context) {
|
|
67
|
+
try {
|
|
68
|
+
assertValidRequestEnvelope(envelope);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return createErrorResponseEnvelope(envelope.requestId, normalizeExtfnLikeError(error));
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const result = await authority.requestMethod(envelope.method, envelope.payload, context);
|
|
75
|
+
return createSuccessResponseEnvelope(envelope.requestId, result);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
return createErrorResponseEnvelope(envelope.requestId, normalizeExtfnLikeError(error));
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
createBridge(proxyId = `proxy_${Math.random().toString(36).slice(2, 10)}`) {
|
|
82
|
+
const listeners = new Set();
|
|
83
|
+
return {
|
|
84
|
+
proxyId,
|
|
85
|
+
request(envelope) {
|
|
86
|
+
return authority.handleRequest(envelope, {
|
|
87
|
+
proxyId,
|
|
88
|
+
emitEvent: async (eventEnvelope) => {
|
|
89
|
+
for (const listener of listeners) {
|
|
90
|
+
listener(eventEnvelope);
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
onEvent(handler) {
|
|
96
|
+
listeners.add(handler);
|
|
97
|
+
return () => {
|
|
98
|
+
listeners.delete(handler);
|
|
99
|
+
};
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
attachBrowserRuntimeBridge(runtime = resolveBrowserRuntime()) {
|
|
104
|
+
if (!runtime?.onMessage?.addListener) {
|
|
105
|
+
return () => { };
|
|
106
|
+
}
|
|
107
|
+
const listener = (message, _sender, sendResponse) => {
|
|
108
|
+
if (!isDatafnRequestEnvelope(message)) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
const envelope = message;
|
|
112
|
+
const proxyId = toProxyId(envelope.source);
|
|
113
|
+
void authority
|
|
114
|
+
.handleRequest(envelope, {
|
|
115
|
+
proxyId,
|
|
116
|
+
emitEvent: async (eventEnvelope) => {
|
|
117
|
+
await sendBrowserRuntimeMessage(runtime, eventEnvelope);
|
|
118
|
+
},
|
|
119
|
+
})
|
|
120
|
+
.then(sendResponse);
|
|
121
|
+
return true;
|
|
122
|
+
};
|
|
123
|
+
runtime.onMessage.addListener(listener);
|
|
124
|
+
const cleanup = () => {
|
|
125
|
+
runtime.onMessage?.removeListener(listener);
|
|
126
|
+
runtimeBridgeCleanups.delete(cleanup);
|
|
127
|
+
};
|
|
128
|
+
runtimeBridgeCleanups.add(cleanup);
|
|
129
|
+
return cleanup;
|
|
130
|
+
},
|
|
131
|
+
async destroy() {
|
|
132
|
+
for (const cleanup of runtimeBridgeCleanups) {
|
|
133
|
+
cleanup();
|
|
134
|
+
}
|
|
135
|
+
await subscriptions.closeAll();
|
|
136
|
+
await client.destroy();
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
return authority;
|
|
140
|
+
}
|
|
141
|
+
function handleSubscribeRequest(subscriptions, address, payload, context) {
|
|
142
|
+
if (!context?.emitEvent) {
|
|
143
|
+
throw createExtfnLikeError("E_CONTEXT_UNAVAILABLE", "DataFn subscription fanout requires an active proxy bridge.");
|
|
144
|
+
}
|
|
145
|
+
const input = typeof payload === "object" && payload !== null
|
|
146
|
+
? payload
|
|
147
|
+
: {};
|
|
148
|
+
return subscriptions.subscribe({
|
|
149
|
+
filter: input.filter,
|
|
150
|
+
...(typeof input.subscriptionId === "string"
|
|
151
|
+
? { resumeSubscriptionId: input.subscriptionId }
|
|
152
|
+
: {}),
|
|
153
|
+
deliver: async (delivery) => {
|
|
154
|
+
await context.emitEvent?.(createEventEnvelope({
|
|
155
|
+
namespace: "datafn",
|
|
156
|
+
event: "subscription",
|
|
157
|
+
source: address,
|
|
158
|
+
payload: delivery,
|
|
159
|
+
}));
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
async function handleUnsubscribeRequest(subscriptions, payload) {
|
|
164
|
+
if (typeof payload !== "object" ||
|
|
165
|
+
payload === null ||
|
|
166
|
+
typeof payload.subscriptionId !== "string") {
|
|
167
|
+
throw createExtfnLikeError("E_RUNTIME_PROTOCOL", "Unsubscribe payload is missing subscriptionId.");
|
|
168
|
+
}
|
|
169
|
+
await subscriptions.unsubscribe(payload.subscriptionId);
|
|
170
|
+
return { unsubscribed: true };
|
|
171
|
+
}
|
|
172
|
+
function resolveAuthorityStorage(options, override) {
|
|
173
|
+
const configuredStorage = override ?? options.storage;
|
|
174
|
+
if (configuredStorage) {
|
|
175
|
+
if (typeof configuredStorage === "function") {
|
|
176
|
+
if (!options.namespace) {
|
|
177
|
+
throw createExtfnLikeError("E_CONFIG_INVALID", "DataFn extfn namespace is required when storage is a factory.");
|
|
178
|
+
}
|
|
179
|
+
return configuredStorage(options.namespace);
|
|
180
|
+
}
|
|
181
|
+
return configuredStorage;
|
|
182
|
+
}
|
|
183
|
+
const namespace = options.namespace ?? options.clientId;
|
|
184
|
+
if (typeof indexedDB !== "undefined") {
|
|
185
|
+
return IndexedDbStorageAdapter.createForNamespace("datafn_extfn", namespace, undefined, options.schema);
|
|
186
|
+
}
|
|
187
|
+
return new MemoryStorageAdapter(options.schema.resources.map((resource) => resource.name));
|
|
188
|
+
}
|
|
189
|
+
function isDatafnRequestEnvelope(message) {
|
|
190
|
+
return (typeof message === "object" &&
|
|
191
|
+
message !== null &&
|
|
192
|
+
message.kind === "request" &&
|
|
193
|
+
message.namespace === "datafn");
|
|
194
|
+
}
|
|
195
|
+
function resolveBrowserRuntime() {
|
|
196
|
+
const globalRuntime = globalThis;
|
|
197
|
+
return globalRuntime.browser?.runtime ?? globalRuntime.chrome?.runtime;
|
|
198
|
+
}
|
|
199
|
+
function sendBrowserRuntimeMessage(runtime, message) {
|
|
200
|
+
if (typeof runtime.sendMessage !== "function") {
|
|
201
|
+
throw createExtfnLikeError("E_CONTEXT_UNAVAILABLE", "Browser runtime messaging is unavailable.");
|
|
202
|
+
}
|
|
203
|
+
const sendMessage = runtime.sendMessage.bind(runtime);
|
|
204
|
+
return new Promise((resolve, reject) => {
|
|
205
|
+
let settled = false;
|
|
206
|
+
const resolveOnce = (value) => {
|
|
207
|
+
if (settled) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
settled = true;
|
|
211
|
+
resolve(value);
|
|
212
|
+
};
|
|
213
|
+
const rejectOnce = (error) => {
|
|
214
|
+
if (settled) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
settled = true;
|
|
218
|
+
reject(normalizeExtfnLikeError(error));
|
|
219
|
+
};
|
|
220
|
+
try {
|
|
221
|
+
if (sendMessage.length >= 2) {
|
|
222
|
+
const maybePromise = sendMessage(message, (response) => {
|
|
223
|
+
resolveOnce(response);
|
|
224
|
+
});
|
|
225
|
+
if (maybePromise && typeof maybePromise.then === "function") {
|
|
226
|
+
void maybePromise.then(resolveOnce, rejectOnce);
|
|
227
|
+
}
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const maybePromise = sendMessage(message);
|
|
231
|
+
if (maybePromise && typeof maybePromise.then === "function") {
|
|
232
|
+
void maybePromise.then(resolveOnce, rejectOnce);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
resolveOnce(undefined);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
rejectOnce(error);
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=authority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authority.js","sourceRoot":"","sources":["../src/authority.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createDatafnExtfnAuthority, type BrowserRuntimeLike, type CreateDatafnExtfnAuthorityOptions, type DatafnExtfnAuthority, type DatafnExtfnBridge, type DatafnExtfnRequestContext, } from "./authority.js";
|
|
2
|
+
export { datafnExtfn, assertValidDatafnExtfnOptions, type DatafnExtfnOptions, type DatafnExtfnPlugin, type DatafnExtfnPluginInit, } from "./plugin.js";
|
|
3
|
+
export { createDatafnExtfnProxyClient, createBrowserDatafnExtfnBridge, type DatafnExtfnProxyClientOptions, } from "./proxyClient.js";
|
|
4
|
+
export { createDatafnExtfnRoutes, } from "./routes.js";
|
|
5
|
+
export { DatafnExtfnSubscriptions, type DatafnExtfnSubscriptionDelivery, type DatafnExtfnSubscriptionOptions, type DatafnExtfnSubscriptionRegistration, } from "./subscriptions.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,KAAK,kBAAkB,EACvB,KAAK,iCAAiC,EACtC,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,WAAW,EACX,6BAA6B,EAC7B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,KAAK,6BAA6B,GACnC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,mCAAmC,GACzC,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createDatafnExtfnAuthority, } from "./authority.js";
|
|
2
|
+
export { datafnExtfn, assertValidDatafnExtfnOptions, } from "./plugin.js";
|
|
3
|
+
export { createDatafnExtfnProxyClient, createBrowserDatafnExtfnBridge, } from "./proxyClient.js";
|
|
4
|
+
export { createDatafnExtfnRoutes, } from "./routes.js";
|
|
5
|
+
export { DatafnExtfnSubscriptions, } from "./subscriptions.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,GAM3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,WAAW,EACX,6BAA6B,GAI9B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,GAE/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,GAIzB,MAAM,oBAAoB,CAAC"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DatafnClient, DatafnClientConfig } from "@datafn/client";
|
|
2
|
+
import type { DatafnSchema } from "@datafn/core";
|
|
3
|
+
import type { RuntimePlugin } from "@extfn/core";
|
|
4
|
+
import { type CreateDatafnExtfnAuthorityOptions, type DatafnExtfnAuthority } from "./authority.js";
|
|
5
|
+
import { type DatafnExtfnProxyClientOptions } from "./proxyClient.js";
|
|
6
|
+
type PublicDatafnExtfnConfig<S extends DatafnSchema> = Pick<DatafnClientConfig<S>, "schema" | "clientId" | "namespace" | "sync" | "storage" | "plugins" | "searchProvider"> & {
|
|
7
|
+
requestTimeoutMs?: number;
|
|
8
|
+
};
|
|
9
|
+
export interface DatafnExtfnOptions<S extends DatafnSchema> extends PublicDatafnExtfnConfig<S> {
|
|
10
|
+
}
|
|
11
|
+
export interface DatafnExtfnPlugin<S extends DatafnSchema> extends RuntimePlugin {
|
|
12
|
+
readonly authority: DatafnExtfnAuthority<S>;
|
|
13
|
+
createProxyClient(runtimeOptions?: DatafnExtfnProxyClientOptions): DatafnClient<S>;
|
|
14
|
+
}
|
|
15
|
+
export interface DatafnExtfnPluginInit<S extends DatafnSchema> {
|
|
16
|
+
authority?: DatafnExtfnAuthority<S>;
|
|
17
|
+
authorityOptions?: CreateDatafnExtfnAuthorityOptions<S>;
|
|
18
|
+
}
|
|
19
|
+
export declare function assertValidDatafnExtfnOptions<S extends DatafnSchema>(options: DatafnExtfnOptions<S>): void;
|
|
20
|
+
export declare function datafnExtfn<S extends DatafnSchema>(options: DatafnExtfnOptions<S>, init?: DatafnExtfnPluginInit<S>): DatafnExtfnPlugin<S>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EACV,aAAa,EACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,iCAAiC,EACtC,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,kBAAkB,CAAC;AAI1B,KAAK,uBAAuB,CAAC,CAAC,SAAS,YAAY,IAAI,IAAI,CACzD,kBAAkB,CAAC,CAAC,CAAC,EACnB,QAAQ,GACR,UAAU,GACV,WAAW,GACX,MAAM,GACN,SAAS,GACT,SAAS,GACT,gBAAgB,CACnB,GAAG;IACF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,YAAY,CACxD,SAAQ,uBAAuB,CAAC,CAAC,CAAC;CAAG;AAEvC,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,YAAY,CACvD,SAAQ,aAAa;IACrB,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC5C,iBAAiB,CACf,cAAc,CAAC,EAAE,6BAA6B,GAC7C,YAAY,CAAC,CAAC,CAAC,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,YAAY;IAC3D,SAAS,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACpC,gBAAgB,CAAC,EAAE,iCAAiC,CAAC,CAAC,CAAC,CAAC;CACzD;AAED,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,YAAY,EAClE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC7B,IAAI,CAEN;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,EAChD,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC9B,IAAI,GAAE,qBAAqB,CAAC,CAAC,CAAM,GAClC,iBAAiB,CAAC,CAAC,CAAC,CAkBtB"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createDatafnExtfnAuthority, } from "./authority.js";
|
|
2
|
+
import { createDatafnExtfnProxyClient, } from "./proxyClient.js";
|
|
3
|
+
import { createDatafnExtfnRoutes } from "./routes.js";
|
|
4
|
+
import { assertValidDatafnExtfnOptionShape } from "./shared.js";
|
|
5
|
+
export function assertValidDatafnExtfnOptions(options) {
|
|
6
|
+
assertValidDatafnExtfnOptionShape(options);
|
|
7
|
+
}
|
|
8
|
+
export function datafnExtfn(options, init = {}) {
|
|
9
|
+
assertValidDatafnExtfnOptions(options);
|
|
10
|
+
const authority = init.authority ??
|
|
11
|
+
createDatafnExtfnAuthority(options, init.authorityOptions);
|
|
12
|
+
return {
|
|
13
|
+
id: "datafn-extfn",
|
|
14
|
+
registerBackgroundHandlers() {
|
|
15
|
+
return createDatafnExtfnRoutes(authority);
|
|
16
|
+
},
|
|
17
|
+
get authority() {
|
|
18
|
+
return authority;
|
|
19
|
+
},
|
|
20
|
+
createProxyClient(runtimeOptions) {
|
|
21
|
+
return createDatafnExtfnProxyClient(options, runtimeOptions);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,0BAA0B,GAG3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,4BAA4B,GAE7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAC;AA+BhE,MAAM,UAAU,6BAA6B,CAC3C,OAA8B;IAE9B,iCAAiC,CAAC,OAAkB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAA8B,EAC9B,OAAiC,EAAE;IAEnC,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,SAAS,GACb,IAAI,CAAC,SAAS;QACd,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAE7D,OAAO;QACL,EAAE,EAAE,cAAc;QAClB,0BAA0B;YACxB,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,SAAS;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,iBAAiB,CAAC,cAAc;YAC9B,OAAO,4BAA4B,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/D,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type DatafnClient } from "@datafn/client";
|
|
2
|
+
import type { DatafnSchema } from "@datafn/core";
|
|
3
|
+
import type { RuntimeAddress } from "@extfn/core";
|
|
4
|
+
import type { BrowserRuntimeLike, DatafnExtfnBridge } from "./authority.js";
|
|
5
|
+
import type { DatafnExtfnOptions } from "./plugin.js";
|
|
6
|
+
export interface DatafnExtfnProxyClientOptions {
|
|
7
|
+
bridge?: DatafnExtfnBridge;
|
|
8
|
+
address?: RuntimeAddress;
|
|
9
|
+
browserRuntime?: BrowserRuntimeLike;
|
|
10
|
+
}
|
|
11
|
+
export declare function createDatafnExtfnProxyClient<S extends DatafnSchema>(options: DatafnExtfnOptions<S>, runtimeOptions?: DatafnExtfnProxyClientOptions): DatafnClient<S>;
|
|
12
|
+
export declare function createBrowserDatafnExtfnBridge(options: {
|
|
13
|
+
address: RuntimeAddress;
|
|
14
|
+
browserRuntime?: BrowserRuntimeLike;
|
|
15
|
+
}): DatafnExtfnBridge;
|
|
16
|
+
//# sourceMappingURL=proxyClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxyClient.d.ts","sourceRoot":"","sources":["../src/proxyClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAUtD,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,cAAc,CAAC,EAAE,kBAAkB,CAAC;CACrC;AAED,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,YAAY,EACjE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC9B,cAAc,GAAE,6BAAkC,GACjD,YAAY,CAAC,CAAC,CAAC,CAuBjB;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE;IACtD,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,CAAC,EAAE,kBAAkB,CAAC;CACrC,GAAG,iBAAiB,CA+BpB"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { createDatafnClient, createExtensionTransport, } from "@datafn/client";
|
|
2
|
+
import { assertValidDatafnExtfnOptionShape, createExtfnLikeError, createRequestEnvelope, normalizeExtfnLikeError, } from "./shared.js";
|
|
3
|
+
export function createDatafnExtfnProxyClient(options, runtimeOptions = {}) {
|
|
4
|
+
assertValidDatafnExtfnOptionShape(options);
|
|
5
|
+
const bridge = runtimeOptions.bridge ??
|
|
6
|
+
createBrowserDatafnExtfnBridge({
|
|
7
|
+
address: runtimeOptions.address ?? { context: "popup" },
|
|
8
|
+
browserRuntime: runtimeOptions.browserRuntime,
|
|
9
|
+
});
|
|
10
|
+
const transport = createExtensionTransport(createMessageBus(bridge, runtimeOptions.address ?? { context: "popup" }), {
|
|
11
|
+
timeout: options.requestTimeoutMs,
|
|
12
|
+
});
|
|
13
|
+
return createDatafnClient({
|
|
14
|
+
...options,
|
|
15
|
+
sync: {
|
|
16
|
+
...options.sync,
|
|
17
|
+
mode: "sync",
|
|
18
|
+
remoteAdapter: transport,
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function createBrowserDatafnExtfnBridge(options) {
|
|
23
|
+
const browserRuntime = options.browserRuntime ?? resolveBrowserRuntime();
|
|
24
|
+
if (!browserRuntime) {
|
|
25
|
+
throw createExtfnLikeError("E_CONTEXT_UNAVAILABLE", "Browser runtime messaging is unavailable.");
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
proxyId: createBrowserProxyId(options.address),
|
|
29
|
+
async request(envelope) {
|
|
30
|
+
const response = await sendBrowserRuntimeMessage(browserRuntime, envelope);
|
|
31
|
+
return normalizeRuntimeResponse(response, envelope.requestId);
|
|
32
|
+
},
|
|
33
|
+
onEvent(handler) {
|
|
34
|
+
if (!browserRuntime.onMessage?.addListener) {
|
|
35
|
+
return () => { };
|
|
36
|
+
}
|
|
37
|
+
const listener = (message) => {
|
|
38
|
+
if (isDatafnEventEnvelope(message)) {
|
|
39
|
+
handler(message);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
browserRuntime.onMessage.addListener(listener);
|
|
43
|
+
return () => {
|
|
44
|
+
browserRuntime.onMessage?.removeListener(listener);
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function createMessageBus(bridge, address) {
|
|
50
|
+
const listeners = new Set();
|
|
51
|
+
bridge.onEvent((eventEnvelope) => {
|
|
52
|
+
const payload = eventEnvelope.payload;
|
|
53
|
+
if (typeof payload.subscriptionId === "string" &&
|
|
54
|
+
"event" in payload) {
|
|
55
|
+
const eventMessage = {
|
|
56
|
+
type: "event",
|
|
57
|
+
subscriptionId: payload.subscriptionId,
|
|
58
|
+
event: payload.event,
|
|
59
|
+
};
|
|
60
|
+
for (const listener of listeners) {
|
|
61
|
+
listener(eventMessage);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
postMessage(message) {
|
|
67
|
+
const request = message;
|
|
68
|
+
const envelope = createRequestEnvelope({
|
|
69
|
+
requestId: request.id,
|
|
70
|
+
namespace: "datafn",
|
|
71
|
+
method: request.method,
|
|
72
|
+
source: address,
|
|
73
|
+
target: { context: "background" },
|
|
74
|
+
payload: request.payload,
|
|
75
|
+
});
|
|
76
|
+
void bridge
|
|
77
|
+
.request(envelope)
|
|
78
|
+
.then((responseEnvelope) => {
|
|
79
|
+
const responseMessage = {
|
|
80
|
+
id: request.id,
|
|
81
|
+
envelope: toDatafnEnvelope(responseEnvelope),
|
|
82
|
+
};
|
|
83
|
+
for (const listener of listeners) {
|
|
84
|
+
listener(responseMessage);
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
.catch((error) => {
|
|
88
|
+
const responseMessage = {
|
|
89
|
+
id: request.id,
|
|
90
|
+
envelope: {
|
|
91
|
+
ok: false,
|
|
92
|
+
error: normalizeExtfnLikeError(error),
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
for (const listener of listeners) {
|
|
96
|
+
listener(responseMessage);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
onMessage(handler) {
|
|
101
|
+
listeners.add(handler);
|
|
102
|
+
return () => {
|
|
103
|
+
listeners.delete(handler);
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function toDatafnEnvelope(responseEnvelope) {
|
|
109
|
+
if (responseEnvelope.ok) {
|
|
110
|
+
return {
|
|
111
|
+
ok: true,
|
|
112
|
+
result: responseEnvelope.result,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
ok: false,
|
|
117
|
+
error: responseEnvelope.error ??
|
|
118
|
+
createExtfnLikeError("E_RUNTIME_PROTOCOL", "Runtime response did not include an error payload."),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function normalizeRuntimeResponse(response, requestId) {
|
|
122
|
+
if (typeof response === "object" &&
|
|
123
|
+
response !== null &&
|
|
124
|
+
response.kind === "response") {
|
|
125
|
+
return response;
|
|
126
|
+
}
|
|
127
|
+
throw createExtfnLikeError("E_RUNTIME_PROTOCOL", "Runtime response did not match the extfn response envelope shape.", { requestId });
|
|
128
|
+
}
|
|
129
|
+
function isDatafnEventEnvelope(message) {
|
|
130
|
+
return (typeof message === "object" &&
|
|
131
|
+
message !== null &&
|
|
132
|
+
message.kind === "event" &&
|
|
133
|
+
message.namespace === "datafn" &&
|
|
134
|
+
message.event === "subscription");
|
|
135
|
+
}
|
|
136
|
+
function createBrowserProxyId(address) {
|
|
137
|
+
return [
|
|
138
|
+
address.context,
|
|
139
|
+
address.surfaceId ?? "surface",
|
|
140
|
+
address.contentScriptId ?? "content",
|
|
141
|
+
address.tabId ?? "tab",
|
|
142
|
+
address.frameId ?? "frame",
|
|
143
|
+
].join(":");
|
|
144
|
+
}
|
|
145
|
+
function resolveBrowserRuntime() {
|
|
146
|
+
const globalRuntime = globalThis;
|
|
147
|
+
return globalRuntime.browser?.runtime ?? globalRuntime.chrome?.runtime;
|
|
148
|
+
}
|
|
149
|
+
function sendBrowserRuntimeMessage(runtime, message) {
|
|
150
|
+
if (typeof runtime.sendMessage !== "function") {
|
|
151
|
+
throw createExtfnLikeError("E_CONTEXT_UNAVAILABLE", "Browser runtime messaging is unavailable.");
|
|
152
|
+
}
|
|
153
|
+
const sendMessage = runtime.sendMessage.bind(runtime);
|
|
154
|
+
return new Promise((resolve, reject) => {
|
|
155
|
+
let settled = false;
|
|
156
|
+
const resolveOnce = (value) => {
|
|
157
|
+
if (settled) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
settled = true;
|
|
161
|
+
resolve(value);
|
|
162
|
+
};
|
|
163
|
+
const rejectOnce = (error) => {
|
|
164
|
+
if (settled) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
settled = true;
|
|
168
|
+
reject(normalizeExtfnLikeError(error));
|
|
169
|
+
};
|
|
170
|
+
try {
|
|
171
|
+
if (sendMessage.length >= 2) {
|
|
172
|
+
const maybePromise = sendMessage(message, (response) => {
|
|
173
|
+
resolveOnce(response);
|
|
174
|
+
});
|
|
175
|
+
if (maybePromise && typeof maybePromise.then === "function") {
|
|
176
|
+
void maybePromise.then(resolveOnce, rejectOnce);
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const maybePromise = sendMessage(message);
|
|
181
|
+
if (maybePromise && typeof maybePromise.then === "function") {
|
|
182
|
+
void maybePromise.then(resolveOnce, rejectOnce);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
resolveOnce(undefined);
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
rejectOnce(error);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=proxyClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxyClient.js","sourceRoot":"","sources":["../src/proxyClient.ts"],"names":[],"mappings":"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"}
|
package/dist/routes.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BackgroundHandlerDefinition } from "@extfn/core";
|
|
2
|
+
import type { DatafnSchema } from "@datafn/core";
|
|
3
|
+
import type { DatafnExtfnAuthority } from "./authority.js";
|
|
4
|
+
export declare function createDatafnExtfnRoutes<S extends DatafnSchema>(authority: DatafnExtfnAuthority<S>): readonly BackgroundHandlerDefinition[];
|
|
5
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAmB3D,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,YAAY,EAC5D,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC,GACjC,SAAS,2BAA2B,EAAE,CA0BxC"}
|
package/dist/routes.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createExtfnLikeError, toProxyId, } from "./shared.js";
|
|
2
|
+
const DATAFN_ROUTE_METHODS = [
|
|
3
|
+
"query",
|
|
4
|
+
"mutation",
|
|
5
|
+
"transact",
|
|
6
|
+
"seed",
|
|
7
|
+
"clone",
|
|
8
|
+
"pull",
|
|
9
|
+
"push",
|
|
10
|
+
"reconcile",
|
|
11
|
+
"subscribe",
|
|
12
|
+
"unsubscribe",
|
|
13
|
+
];
|
|
14
|
+
export function createDatafnExtfnRoutes(authority) {
|
|
15
|
+
return DATAFN_ROUTE_METHODS.map((method) => ({
|
|
16
|
+
namespace: "datafn",
|
|
17
|
+
method,
|
|
18
|
+
handle: async (...args) => {
|
|
19
|
+
const payload = args[1];
|
|
20
|
+
const envelope = args[2];
|
|
21
|
+
const proxyId = envelope?.source
|
|
22
|
+
? toProxyId(envelope.source)
|
|
23
|
+
: "datafn-route";
|
|
24
|
+
if (method === "subscribe") {
|
|
25
|
+
throw createExtfnLikeError("E_CONTEXT_UNAVAILABLE", "DataFn subscription routes require a live proxy bridge for event fanout.", { proxyId });
|
|
26
|
+
}
|
|
27
|
+
return authority.requestMethod(method, payload, {
|
|
28
|
+
proxyId,
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,oBAAoB,EACpB,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,MAAM,oBAAoB,GAAG;IAC3B,OAAO;IACP,UAAU;IACV,UAAU;IACV,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;IACX,aAAa;CACL,CAAC;AAEX,MAAM,UAAU,uBAAuB,CACrC,SAAkC;IAElC,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,SAAS,EAAE,QAAQ;QACnB,MAAM;QACN,MAAM,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAEV,CAAC;YACd,MAAM,OAAO,GAAG,QAAQ,EAAE,MAAM;gBAC9B,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC5B,CAAC,CAAC,cAAc,CAAC;YAEnB,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC3B,MAAM,oBAAoB,CACxB,uBAAuB,EACvB,0EAA0E,EAC1E,EAAE,OAAO,EAAE,CACZ,CAAC;YACJ,CAAC;YAED,OAAO,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE;gBAC9C,OAAO;aACR,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/shared.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { RuntimeAddress } from "@extfn/core";
|
|
2
|
+
export interface RuntimeRequestEnvelope {
|
|
3
|
+
v: 1;
|
|
4
|
+
kind: "request";
|
|
5
|
+
requestId: string;
|
|
6
|
+
namespace: string;
|
|
7
|
+
method: string;
|
|
8
|
+
source: RuntimeAddress;
|
|
9
|
+
target: RuntimeAddress;
|
|
10
|
+
payload: unknown;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface RuntimeResponseEnvelope {
|
|
14
|
+
v: 1;
|
|
15
|
+
kind: "response";
|
|
16
|
+
requestId: string;
|
|
17
|
+
ok: boolean;
|
|
18
|
+
result?: unknown;
|
|
19
|
+
error?: ExtfnLikeError;
|
|
20
|
+
}
|
|
21
|
+
export interface RuntimeEventEnvelope {
|
|
22
|
+
v: 1;
|
|
23
|
+
kind: "event";
|
|
24
|
+
namespace: string;
|
|
25
|
+
event: string;
|
|
26
|
+
source: RuntimeAddress;
|
|
27
|
+
payload: unknown;
|
|
28
|
+
}
|
|
29
|
+
export interface ExtfnLikeError {
|
|
30
|
+
code: string;
|
|
31
|
+
message: string;
|
|
32
|
+
status: number;
|
|
33
|
+
retryable: boolean;
|
|
34
|
+
details?: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
export declare function createExtfnLikeError(code: string, message: string, details?: Record<string, unknown>): ExtfnLikeError;
|
|
37
|
+
export declare function normalizeExtfnLikeError(error: unknown): ExtfnLikeError;
|
|
38
|
+
export declare function assertValidDatafnExtfnOptionShape(options: unknown): void;
|
|
39
|
+
export declare function createRequestEnvelope(input: Omit<RuntimeRequestEnvelope, "v" | "kind">): RuntimeRequestEnvelope;
|
|
40
|
+
export declare function createSuccessResponseEnvelope(requestId: string, result: unknown): RuntimeResponseEnvelope;
|
|
41
|
+
export declare function createErrorResponseEnvelope(requestId: string, error: ExtfnLikeError): RuntimeResponseEnvelope;
|
|
42
|
+
export declare function createEventEnvelope(input: Omit<RuntimeEventEnvelope, "v" | "kind">): RuntimeEventEnvelope;
|
|
43
|
+
export declare function assertValidRequestEnvelope(envelope: RuntimeRequestEnvelope): RuntimeRequestEnvelope;
|
|
44
|
+
export declare function toProxyId(address: RuntimeAddress): string;
|
|
45
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAaD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,cAAc,CAQhB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CA4BtE;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwBxE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,CAAC,sBAAsB,EAAE,GAAG,GAAG,MAAM,CAAC,GAChD,sBAAsB,CASxB;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,GACd,uBAAuB,CAQzB;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,cAAc,GACpB,uBAAuB,CAQzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,GAAG,GAAG,MAAM,CAAC,GAC9C,oBAAoB,CAMtB;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,sBAAsB,GAC/B,sBAAsB,CA6BxB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAQzD"}
|
package/dist/shared.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
const ALLOWED_DATAFN_EXTFN_OPTION_KEYS = new Set([
|
|
2
|
+
"schema",
|
|
3
|
+
"clientId",
|
|
4
|
+
"namespace",
|
|
5
|
+
"sync",
|
|
6
|
+
"storage",
|
|
7
|
+
"plugins",
|
|
8
|
+
"searchProvider",
|
|
9
|
+
"requestTimeoutMs",
|
|
10
|
+
]);
|
|
11
|
+
export function createExtfnLikeError(code, message, details) {
|
|
12
|
+
return {
|
|
13
|
+
code,
|
|
14
|
+
message,
|
|
15
|
+
status: defaultStatusForCode(code),
|
|
16
|
+
retryable: false,
|
|
17
|
+
details,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function normalizeExtfnLikeError(error) {
|
|
21
|
+
if (typeof error === "object" &&
|
|
22
|
+
error !== null &&
|
|
23
|
+
"code" in error &&
|
|
24
|
+
"message" in error) {
|
|
25
|
+
const candidate = error;
|
|
26
|
+
return {
|
|
27
|
+
code: candidate.code,
|
|
28
|
+
message: candidate.message,
|
|
29
|
+
status: candidate.status ?? defaultStatusForCode(candidate.code),
|
|
30
|
+
retryable: candidate.retryable ?? false,
|
|
31
|
+
...(candidate.details ? { details: candidate.details } : {}),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return createExtfnLikeError("E_RUNTIME_PROTOCOL", error instanceof Error ? error.message : "Runtime protocol failure.");
|
|
35
|
+
}
|
|
36
|
+
export function assertValidDatafnExtfnOptionShape(options) {
|
|
37
|
+
if (typeof options !== "object" || options === null) {
|
|
38
|
+
throw createExtfnLikeError("E_CONFIG_INVALID", "@datafn/extfn options must be an object.");
|
|
39
|
+
}
|
|
40
|
+
const optionRecord = options;
|
|
41
|
+
for (const key of Object.keys(optionRecord)) {
|
|
42
|
+
if (key === "authContext") {
|
|
43
|
+
throw createExtfnLikeError("E_CONFIG_INVALID", "@datafn/extfn option authContext is not part of the current public @datafn/client API.");
|
|
44
|
+
}
|
|
45
|
+
if (!ALLOWED_DATAFN_EXTFN_OPTION_KEYS.has(key)) {
|
|
46
|
+
throw createExtfnLikeError("E_CONFIG_INVALID", `Unsupported @datafn/extfn option: ${key}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function createRequestEnvelope(input) {
|
|
51
|
+
const envelope = {
|
|
52
|
+
v: 1,
|
|
53
|
+
kind: "request",
|
|
54
|
+
...input,
|
|
55
|
+
};
|
|
56
|
+
assertValidRequestEnvelope(envelope);
|
|
57
|
+
return envelope;
|
|
58
|
+
}
|
|
59
|
+
export function createSuccessResponseEnvelope(requestId, result) {
|
|
60
|
+
return {
|
|
61
|
+
v: 1,
|
|
62
|
+
kind: "response",
|
|
63
|
+
requestId,
|
|
64
|
+
ok: true,
|
|
65
|
+
result,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function createErrorResponseEnvelope(requestId, error) {
|
|
69
|
+
return {
|
|
70
|
+
v: 1,
|
|
71
|
+
kind: "response",
|
|
72
|
+
requestId,
|
|
73
|
+
ok: false,
|
|
74
|
+
error,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function createEventEnvelope(input) {
|
|
78
|
+
return {
|
|
79
|
+
v: 1,
|
|
80
|
+
kind: "event",
|
|
81
|
+
...input,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function assertValidRequestEnvelope(envelope) {
|
|
85
|
+
assertField(envelope.v === 1, "Request envelope is missing required field: v");
|
|
86
|
+
assertField(envelope.kind === "request", "Request envelope is missing required field: kind");
|
|
87
|
+
assertField(typeof envelope.requestId === "string" && envelope.requestId.length > 0, "Request envelope is missing required field: requestId");
|
|
88
|
+
assertField(typeof envelope.namespace === "string" && envelope.namespace.length > 0, "Request envelope is missing required field: namespace");
|
|
89
|
+
assertField(typeof envelope.method === "string" && envelope.method.length > 0, "Request envelope is missing required field: method");
|
|
90
|
+
assertField(Boolean(envelope.source), "Request envelope is missing required field: source");
|
|
91
|
+
assertField(Boolean(envelope.target), "Request envelope is missing required field: target");
|
|
92
|
+
if (!("payload" in envelope)) {
|
|
93
|
+
throw createExtfnLikeError("E_RUNTIME_PROTOCOL", "Request envelope is missing required field: payload");
|
|
94
|
+
}
|
|
95
|
+
return envelope;
|
|
96
|
+
}
|
|
97
|
+
export function toProxyId(address) {
|
|
98
|
+
return [
|
|
99
|
+
address.context,
|
|
100
|
+
address.surfaceId ?? "surface",
|
|
101
|
+
address.contentScriptId ?? "content",
|
|
102
|
+
address.tabId ?? "tab",
|
|
103
|
+
address.frameId ?? "frame",
|
|
104
|
+
].join(":");
|
|
105
|
+
}
|
|
106
|
+
function assertField(condition, message) {
|
|
107
|
+
if (!condition) {
|
|
108
|
+
throw createExtfnLikeError("E_RUNTIME_PROTOCOL", message);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function defaultStatusForCode(code) {
|
|
112
|
+
switch (code) {
|
|
113
|
+
case "E_ENTRY_NOT_FOUND":
|
|
114
|
+
return 404;
|
|
115
|
+
case "E_HANDLER_NOT_FOUND":
|
|
116
|
+
return 404;
|
|
117
|
+
case "E_CONTEXT_UNAVAILABLE":
|
|
118
|
+
return 503;
|
|
119
|
+
case "E_TARGET_UNSUPPORTED":
|
|
120
|
+
return 422;
|
|
121
|
+
case "E_TIMEOUT":
|
|
122
|
+
return 504;
|
|
123
|
+
case "E_PAYLOAD_TOO_LARGE":
|
|
124
|
+
return 413;
|
|
125
|
+
case "E_PLUGIN_CONFLICT":
|
|
126
|
+
return 409;
|
|
127
|
+
case "E_RUNTIME_PROTOCOL":
|
|
128
|
+
return 500;
|
|
129
|
+
case "E_ANCHOR_RESOLUTION":
|
|
130
|
+
return 500;
|
|
131
|
+
case "E_MANIFEST_COLLISION":
|
|
132
|
+
case "E_CONFIG_INVALID":
|
|
133
|
+
default:
|
|
134
|
+
return 400;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { EventFilter } from "@datafn/client";
|
|
2
|
+
import type { DatafnEvent } from "@datafn/core";
|
|
3
|
+
import { type ExtfnLikeError } from "./shared.js";
|
|
4
|
+
export interface DatafnExtfnSubscriptionDelivery {
|
|
5
|
+
subscriptionId: string;
|
|
6
|
+
event: DatafnEvent;
|
|
7
|
+
}
|
|
8
|
+
export interface DatafnExtfnSubscriptionRegistration {
|
|
9
|
+
subscriptionId: string;
|
|
10
|
+
resumed: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface DatafnExtfnSubscriptionOptions {
|
|
13
|
+
filter?: EventFilter;
|
|
14
|
+
resumeSubscriptionId?: string;
|
|
15
|
+
deliver: (delivery: DatafnExtfnSubscriptionDelivery) => void | Promise<void>;
|
|
16
|
+
onFailure?: (error: ExtfnLikeError, subscriptionId: string) => void | Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export interface DatafnExtfnSubscriptionsOptions {
|
|
19
|
+
subscribe: (handler: (event: DatafnEvent) => void, filter?: EventFilter) => () => void;
|
|
20
|
+
}
|
|
21
|
+
export declare class DatafnExtfnSubscriptions {
|
|
22
|
+
private readonly options;
|
|
23
|
+
private active;
|
|
24
|
+
private recoverable;
|
|
25
|
+
private nextId;
|
|
26
|
+
constructor(options: DatafnExtfnSubscriptionsOptions);
|
|
27
|
+
subscribe(options: DatafnExtfnSubscriptionOptions): Promise<DatafnExtfnSubscriptionRegistration>;
|
|
28
|
+
unsubscribe(subscriptionId: string): Promise<void>;
|
|
29
|
+
handleBackgroundRestart(): Promise<void>;
|
|
30
|
+
closeAll(): Promise<void>;
|
|
31
|
+
getActiveSubscriptionCount(): number;
|
|
32
|
+
getRecoverableSubscriptionCount(): number;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=subscriptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../src/subscriptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,+BAA+B;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,mCAAmC;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,EAAE,CACP,QAAQ,EAAE,+BAA+B,KACtC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,CACV,KAAK,EAAE,cAAc,EACrB,cAAc,EAAE,MAAM,KACnB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,CACT,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,EACrC,MAAM,CAAC,EAAE,WAAW,KACjB,MAAM,IAAI,CAAC;CACjB;AAaD,qBAAa,wBAAwB;IAKvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,MAAM,CAAK;gBAEU,OAAO,EAAE,+BAA+B;IAE/D,SAAS,CACb,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,mCAAmC,CAAC;IAgEzC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlD,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBxC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAS/B,0BAA0B,IAAI,MAAM;IAIpC,+BAA+B,IAAI,MAAM;CAG1C"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { createExtfnLikeError, } from "./shared.js";
|
|
2
|
+
export class DatafnExtfnSubscriptions {
|
|
3
|
+
options;
|
|
4
|
+
active = new Map();
|
|
5
|
+
recoverable = new Map();
|
|
6
|
+
nextId = 1;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
async subscribe(options) {
|
|
11
|
+
const resumable = options.resumeSubscriptionId !== undefined;
|
|
12
|
+
const subscriptionId = options.resumeSubscriptionId ?? `sub_${this.nextId++}`;
|
|
13
|
+
if (this.active.has(subscriptionId)) {
|
|
14
|
+
throw createExtfnLikeError("E_RUNTIME_PROTOCOL", "Duplicate DataFn subscription registration detected after reconnect.", { subscriptionId });
|
|
15
|
+
}
|
|
16
|
+
const recovered = resumable
|
|
17
|
+
? this.recoverable.get(subscriptionId)
|
|
18
|
+
: undefined;
|
|
19
|
+
if (resumable && !recovered) {
|
|
20
|
+
throw createExtfnLikeError("E_RUNTIME_PROTOCOL", "Cannot resume unknown DataFn subscription.", { subscriptionId });
|
|
21
|
+
}
|
|
22
|
+
const filter = recovered?.filter ?? options.filter;
|
|
23
|
+
const unsubscribeAuthority = this.options.subscribe((event) => {
|
|
24
|
+
void Promise.resolve(options.deliver({
|
|
25
|
+
subscriptionId,
|
|
26
|
+
event,
|
|
27
|
+
})).catch(async (error) => {
|
|
28
|
+
if (options.onFailure) {
|
|
29
|
+
try {
|
|
30
|
+
await options.onFailure(normalizeDeliveryError(error, subscriptionId), subscriptionId);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Ignore onFailure handler errors so detached delivery work does not
|
|
34
|
+
// surface unhandled rejections when callers use a best-effort hook.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}, filter);
|
|
39
|
+
this.active.set(subscriptionId, {
|
|
40
|
+
filter,
|
|
41
|
+
deliver: options.deliver,
|
|
42
|
+
onFailure: options.onFailure,
|
|
43
|
+
unsubscribeAuthority,
|
|
44
|
+
});
|
|
45
|
+
if (recovered) {
|
|
46
|
+
this.recoverable.delete(subscriptionId);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
subscriptionId,
|
|
50
|
+
resumed: Boolean(recovered),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async unsubscribe(subscriptionId) {
|
|
54
|
+
const activeSubscription = this.active.get(subscriptionId);
|
|
55
|
+
if (activeSubscription) {
|
|
56
|
+
this.active.delete(subscriptionId);
|
|
57
|
+
activeSubscription.unsubscribeAuthority();
|
|
58
|
+
}
|
|
59
|
+
this.recoverable.delete(subscriptionId);
|
|
60
|
+
}
|
|
61
|
+
async handleBackgroundRestart() {
|
|
62
|
+
const activeSubscriptions = Array.from(this.active.entries());
|
|
63
|
+
this.active.clear();
|
|
64
|
+
await Promise.all(activeSubscriptions.map(async ([subscriptionId, subscription]) => {
|
|
65
|
+
subscription.unsubscribeAuthority();
|
|
66
|
+
this.recoverable.set(subscriptionId, {
|
|
67
|
+
filter: subscription.filter,
|
|
68
|
+
});
|
|
69
|
+
if (subscription.onFailure) {
|
|
70
|
+
await subscription.onFailure(createExtfnLikeError("E_RUNTIME_PROTOCOL", "DataFn background subscription state was reset.", { subscriptionId }), subscriptionId);
|
|
71
|
+
}
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
async closeAll() {
|
|
75
|
+
for (const subscription of this.active.values()) {
|
|
76
|
+
subscription.unsubscribeAuthority();
|
|
77
|
+
}
|
|
78
|
+
this.active.clear();
|
|
79
|
+
this.recoverable.clear();
|
|
80
|
+
}
|
|
81
|
+
getActiveSubscriptionCount() {
|
|
82
|
+
return this.active.size;
|
|
83
|
+
}
|
|
84
|
+
getRecoverableSubscriptionCount() {
|
|
85
|
+
return this.recoverable.size;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function normalizeDeliveryError(error, subscriptionId) {
|
|
89
|
+
return error && typeof error === "object" && "code" in error && "message" in error
|
|
90
|
+
? error
|
|
91
|
+
: createExtfnLikeError("E_RUNTIME_PROTOCOL", error instanceof Error
|
|
92
|
+
? error.message
|
|
93
|
+
: "DataFn subscription delivery failed.", { subscriptionId });
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=subscriptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../src/subscriptions.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@datafn/extfn",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "DataFn integration plugin and proxy client surface for extfn consumers",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"test": "vitest",
|
|
21
|
+
"test:watch": "vitest --watch",
|
|
22
|
+
"lint": "echo 'lint not configured'",
|
|
23
|
+
"clean": "rm -rf dist"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"datafn",
|
|
27
|
+
"extfn",
|
|
28
|
+
"browser-extension",
|
|
29
|
+
"superfunctions"
|
|
30
|
+
],
|
|
31
|
+
"author": "21n",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@datafn/client": "0.0.3",
|
|
35
|
+
"@datafn/core": "0.0.3",
|
|
36
|
+
"@extfn/core": "0.1.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^22.0.0",
|
|
40
|
+
"typescript": "^5.6.0",
|
|
41
|
+
"vitest": "^3.2.4"
|
|
42
|
+
},
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "git+https://github.com/21nCo/super-functions.git",
|
|
46
|
+
"directory": "datafn/extfn"
|
|
47
|
+
},
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
}
|
|
51
|
+
}
|