@relayfile/adapter-core 0.1.18 → 0.1.20
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/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/pubsub/index.d.ts +2 -0
- package/dist/src/pubsub/index.d.ts.map +1 -0
- package/dist/src/pubsub/index.js +2 -0
- package/dist/src/pubsub/index.js.map +1 -0
- package/dist/src/pubsub/storage-bridge.d.ts +3 -0
- package/dist/src/pubsub/storage-bridge.d.ts.map +1 -0
- package/dist/src/pubsub/storage-bridge.js +2 -0
- package/dist/src/pubsub/storage-bridge.js.map +1 -0
- package/dist/src/storage-bridge/adapter-worker.d.ts +98 -0
- package/dist/src/storage-bridge/adapter-worker.d.ts.map +1 -0
- package/dist/src/storage-bridge/adapter-worker.js +169 -0
- package/dist/src/storage-bridge/adapter-worker.js.map +1 -0
- package/dist/src/storage-bridge/discovery.d.ts +32 -0
- package/dist/src/storage-bridge/discovery.d.ts.map +1 -0
- package/dist/src/storage-bridge/discovery.js +53 -0
- package/dist/src/storage-bridge/discovery.js.map +1 -0
- package/dist/src/storage-bridge/event.d.ts +70 -0
- package/dist/src/storage-bridge/event.d.ts.map +1 -0
- package/dist/src/storage-bridge/event.js +178 -0
- package/dist/src/storage-bridge/event.js.map +1 -0
- package/dist/src/storage-bridge/index.d.ts +7 -0
- package/dist/src/storage-bridge/index.d.ts.map +1 -0
- package/dist/src/storage-bridge/index.js +7 -0
- package/dist/src/storage-bridge/index.js.map +1 -0
- package/dist/src/storage-bridge/nango-fallback.d.ts +36 -0
- package/dist/src/storage-bridge/nango-fallback.d.ts.map +1 -0
- package/dist/src/storage-bridge/nango-fallback.js +194 -0
- package/dist/src/storage-bridge/nango-fallback.js.map +1 -0
- package/dist/src/storage-bridge/publisher.d.ts +54 -0
- package/dist/src/storage-bridge/publisher.d.ts.map +1 -0
- package/dist/src/storage-bridge/publisher.js +90 -0
- package/dist/src/storage-bridge/publisher.js.map +1 -0
- package/dist/src/storage-bridge/writeback.d.ts +41 -0
- package/dist/src/storage-bridge/writeback.d.ts.map +1 -0
- package/dist/src/storage-bridge/writeback.js +85 -0
- package/dist/src/storage-bridge/writeback.js.map +1 -0
- package/dist/src/writeback/index.d.ts +2 -0
- package/dist/src/writeback/index.d.ts.map +1 -0
- package/dist/src/writeback/index.js +2 -0
- package/dist/src/writeback/index.js.map +1 -0
- package/dist/src/writeback/storage-bridge.d.ts +5 -0
- package/dist/src/writeback/storage-bridge.d.ts.map +1 -0
- package/dist/src/writeback/storage-bridge.js +3 -0
- package/dist/src/writeback/storage-bridge.js.map +1 -0
- package/dist/tests/storage-bridge/all-priority-adapters.test.d.ts +2 -0
- package/dist/tests/storage-bridge/all-priority-adapters.test.d.ts.map +1 -0
- package/dist/tests/storage-bridge/all-priority-adapters.test.js +1014 -0
- package/dist/tests/storage-bridge/all-priority-adapters.test.js.map +1 -0
- package/dist/tests/storage-bridge/storage-bridge.test.d.ts +2 -0
- package/dist/tests/storage-bridge/storage-bridge.test.d.ts.map +1 -0
- package/dist/tests/storage-bridge/storage-bridge.test.js +212 -0
- package/dist/tests/storage-bridge/storage-bridge.test.js.map +1 -0
- package/package.json +1 -1
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC"}
|
package/dist/src/index.js
CHANGED
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pubsub/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pubsub/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { InMemoryIdempotencyStore, InMemoryStorageBridgeEventPublisher, publishStorageBridgeEvent, } from "../storage-bridge/publisher.js";
|
|
2
|
+
export type { IdempotencyStore, InMemoryPublisherOptions, PublishStorageBridgeEventOptions, StorageBridgeEventPublisher, StorageBridgeEventPublisherForSource, StorageBridgeEventSubscriber, StorageBridgePublishResult, StorageBridgeSubscription, } from "../storage-bridge/publisher.js";
|
|
3
|
+
//# sourceMappingURL=storage-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-bridge.d.ts","sourceRoot":"","sources":["../../../src/pubsub/storage-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AAExC,YAAY,EACV,gBAAgB,EAChB,wBAAwB,EACxB,gCAAgC,EAChC,2BAA2B,EAC3B,oCAAoC,EACpC,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-bridge.js","sourceRoot":"","sources":["../../../src/pubsub/storage-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { type JsonValue, type StorageBridgeEvent } from "./event.js";
|
|
2
|
+
import { type IdempotencyStore, type StorageBridgeEventPublisher, type StorageBridgeSubscription } from "./publisher.js";
|
|
3
|
+
export type StorageBridgeContentBody = string | Uint8Array | ArrayBuffer | Buffer | null;
|
|
4
|
+
export interface StorageBridgeFetchedContent {
|
|
5
|
+
readonly body: StorageBridgeContentBody;
|
|
6
|
+
readonly contentType?: string;
|
|
7
|
+
readonly headers?: Record<string, string>;
|
|
8
|
+
readonly metadata?: Record<string, JsonValue>;
|
|
9
|
+
}
|
|
10
|
+
export interface StorageBridgeFetchContentContext<Config = unknown> {
|
|
11
|
+
readonly config: Config;
|
|
12
|
+
readonly signal?: AbortSignal;
|
|
13
|
+
}
|
|
14
|
+
export interface StorageBridgeContentFetcher<Config = unknown> {
|
|
15
|
+
(event: StorageBridgeEvent, context: StorageBridgeFetchContentContext<Config>): Promise<StorageBridgeFetchedContent> | StorageBridgeFetchedContent;
|
|
16
|
+
}
|
|
17
|
+
export interface StorageBridgeRelayFileClient {
|
|
18
|
+
ingestWebhook(input: StorageBridgeWebhookEnvelope): Promise<unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface StorageBridgeWebhookEnvelope {
|
|
21
|
+
readonly workspaceId: string;
|
|
22
|
+
readonly provider: string;
|
|
23
|
+
readonly event_type: "file.created" | "file.updated" | "file.deleted";
|
|
24
|
+
readonly path: string;
|
|
25
|
+
readonly delivery_id: string;
|
|
26
|
+
readonly timestamp: string;
|
|
27
|
+
readonly data: {
|
|
28
|
+
readonly contentBase64: string | null;
|
|
29
|
+
readonly contentType: string | null;
|
|
30
|
+
readonly sizeBytes: number | null;
|
|
31
|
+
readonly fingerprint: string | null;
|
|
32
|
+
readonly resourceId: string;
|
|
33
|
+
readonly metadata: Record<string, JsonValue>;
|
|
34
|
+
};
|
|
35
|
+
readonly headers: Record<string, string>;
|
|
36
|
+
readonly semantics: {
|
|
37
|
+
readonly properties: Record<string, JsonValue>;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export interface RetryPolicy {
|
|
41
|
+
readonly maxAttempts: number;
|
|
42
|
+
readonly baseDelayMs: number;
|
|
43
|
+
readonly maxDelayMs?: number;
|
|
44
|
+
readonly jitterRatio?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface DeadLetterRecord {
|
|
47
|
+
readonly event: StorageBridgeEvent;
|
|
48
|
+
readonly envelope?: StorageBridgeWebhookEnvelope;
|
|
49
|
+
readonly attempts: number;
|
|
50
|
+
readonly error: string;
|
|
51
|
+
readonly failedAt: string;
|
|
52
|
+
}
|
|
53
|
+
export interface DeadLetterSink {
|
|
54
|
+
push(record: DeadLetterRecord): Promise<void> | void;
|
|
55
|
+
}
|
|
56
|
+
export declare class InMemoryDeadLetterSink implements DeadLetterSink {
|
|
57
|
+
readonly records: DeadLetterRecord[];
|
|
58
|
+
push(record: DeadLetterRecord): void;
|
|
59
|
+
}
|
|
60
|
+
export interface StorageBridgeAdapterWorkerOptions<Config = unknown> {
|
|
61
|
+
readonly provider: string;
|
|
62
|
+
readonly workspaceId?: string;
|
|
63
|
+
readonly config: Config;
|
|
64
|
+
readonly publisher: StorageBridgeEventPublisher;
|
|
65
|
+
readonly client: StorageBridgeRelayFileClient;
|
|
66
|
+
readonly fetchContent: StorageBridgeContentFetcher<Config>;
|
|
67
|
+
readonly idempotencyStore?: IdempotencyStore;
|
|
68
|
+
readonly retryPolicy?: Partial<RetryPolicy>;
|
|
69
|
+
readonly deadLetterSink?: DeadLetterSink;
|
|
70
|
+
readonly sleep?: (ms: number) => Promise<void>;
|
|
71
|
+
readonly signal?: AbortSignal;
|
|
72
|
+
}
|
|
73
|
+
export interface StorageBridgeWorkerResult {
|
|
74
|
+
readonly eventId: string;
|
|
75
|
+
readonly delivered: boolean;
|
|
76
|
+
readonly duplicate: boolean;
|
|
77
|
+
readonly attempts: number;
|
|
78
|
+
readonly envelope?: StorageBridgeWebhookEnvelope;
|
|
79
|
+
}
|
|
80
|
+
export declare class StorageBridgeAdapterWorker<Config = unknown> {
|
|
81
|
+
private readonly options;
|
|
82
|
+
private readonly idempotencyStore;
|
|
83
|
+
private readonly retryPolicy;
|
|
84
|
+
private readonly deadLetterSink;
|
|
85
|
+
private readonly sleep;
|
|
86
|
+
private subscription?;
|
|
87
|
+
constructor(options: StorageBridgeAdapterWorkerOptions<Config>);
|
|
88
|
+
start(): StorageBridgeSubscription;
|
|
89
|
+
stop(): void;
|
|
90
|
+
handleEvent(event: StorageBridgeEvent): Promise<StorageBridgeWorkerResult>;
|
|
91
|
+
}
|
|
92
|
+
export declare function buildStorageBridgeWebhookEnvelope(input: {
|
|
93
|
+
readonly event: StorageBridgeEvent;
|
|
94
|
+
readonly provider?: string;
|
|
95
|
+
readonly workspaceId?: string;
|
|
96
|
+
readonly content?: StorageBridgeFetchedContent;
|
|
97
|
+
}): StorageBridgeWebhookEnvelope;
|
|
98
|
+
//# sourceMappingURL=adapter-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-worker.d.ts","sourceRoot":"","sources":["../../../src/storage-bridge/adapter-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,kBAAkB,EAGxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC/B,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,wBAAwB,GAChC,MAAM,GACN,UAAU,GACV,WAAW,GACX,MAAM,GACN,IAAI,CAAC;AAET,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,gCAAgC,CAAC,MAAM,GAAG,OAAO;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,2BAA2B,CAAC,MAAM,GAAG,OAAO;IAC3D,CACE,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,gCAAgC,CAAC,MAAM,CAAC,GAChD,OAAO,CAAC,2BAA2B,CAAC,GAAG,2BAA2B,CAAC;CACvE;AAED,MAAM,WAAW,4BAA4B;IAC3C,aAAa,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;KAC9C,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;KAChD,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtD;AAED,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAM;IAE1C,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;CAGrC;AAED,MAAM,WAAW,iCAAiC,CAAC,MAAM,GAAG,OAAO;IACjE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,2BAA2B,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;CAClD;AASD,qBAAa,0BAA0B,CAAC,MAAM,GAAG,OAAO;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IACpE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,YAAY,CAAC,CAA4B;gBAErC,OAAO,EAAE,iCAAiC,CAAC,MAAM,CAAC;IAS9D,KAAK,IAAI,yBAAyB;IAQlC,IAAI,IAAI,IAAI;IAKN,WAAW,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,yBAAyB,CAAC;CA0DjF;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,2BAA2B,CAAC;CAChD,GAAG,4BAA4B,CAuC/B"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { storageBridgeWebhookEventType, validateStorageBridgeEvent, } from "./event.js";
|
|
2
|
+
import { InMemoryIdempotencyStore, } from "./publisher.js";
|
|
3
|
+
export class InMemoryDeadLetterSink {
|
|
4
|
+
records = [];
|
|
5
|
+
push(record) {
|
|
6
|
+
this.records.push(record);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
const DEFAULT_RETRY_POLICY = {
|
|
10
|
+
maxAttempts: 3,
|
|
11
|
+
baseDelayMs: 250,
|
|
12
|
+
maxDelayMs: 5_000,
|
|
13
|
+
jitterRatio: 0,
|
|
14
|
+
};
|
|
15
|
+
export class StorageBridgeAdapterWorker {
|
|
16
|
+
options;
|
|
17
|
+
idempotencyStore;
|
|
18
|
+
retryPolicy;
|
|
19
|
+
deadLetterSink;
|
|
20
|
+
sleep;
|
|
21
|
+
subscription;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.options = options;
|
|
24
|
+
this.idempotencyStore =
|
|
25
|
+
options.idempotencyStore ?? new InMemoryIdempotencyStore();
|
|
26
|
+
this.retryPolicy = { ...DEFAULT_RETRY_POLICY, ...options.retryPolicy };
|
|
27
|
+
this.deadLetterSink = options.deadLetterSink ?? new InMemoryDeadLetterSink();
|
|
28
|
+
this.sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
29
|
+
}
|
|
30
|
+
start() {
|
|
31
|
+
if (this.subscription)
|
|
32
|
+
return this.subscription;
|
|
33
|
+
this.subscription = this.options.publisher.subscribe(async (event) => {
|
|
34
|
+
await this.handleEvent(event);
|
|
35
|
+
});
|
|
36
|
+
return this.subscription;
|
|
37
|
+
}
|
|
38
|
+
stop() {
|
|
39
|
+
this.subscription?.unsubscribe();
|
|
40
|
+
this.subscription = undefined;
|
|
41
|
+
}
|
|
42
|
+
async handleEvent(event) {
|
|
43
|
+
const validEvent = validateStorageBridgeEvent(event);
|
|
44
|
+
const deliveryKey = `storage-bridge:ingest:${validEvent.eventId}`;
|
|
45
|
+
const claimed = await this.idempotencyStore.claim(deliveryKey);
|
|
46
|
+
if (!claimed) {
|
|
47
|
+
return {
|
|
48
|
+
eventId: validEvent.eventId,
|
|
49
|
+
delivered: false,
|
|
50
|
+
duplicate: true,
|
|
51
|
+
attempts: 0,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
let envelope;
|
|
55
|
+
let attempts = 0;
|
|
56
|
+
try {
|
|
57
|
+
const content = validEvent.changeType === "deleted"
|
|
58
|
+
? { body: null }
|
|
59
|
+
: await this.options.fetchContent(validEvent, {
|
|
60
|
+
config: this.options.config,
|
|
61
|
+
signal: this.options.signal,
|
|
62
|
+
});
|
|
63
|
+
envelope = buildStorageBridgeWebhookEnvelope({
|
|
64
|
+
event: validEvent,
|
|
65
|
+
provider: this.options.provider,
|
|
66
|
+
workspaceId: this.options.workspaceId,
|
|
67
|
+
content,
|
|
68
|
+
});
|
|
69
|
+
await retry(async () => {
|
|
70
|
+
attempts += 1;
|
|
71
|
+
if (!envelope)
|
|
72
|
+
throw new Error("Storage bridge webhook envelope missing");
|
|
73
|
+
await this.options.client.ingestWebhook(envelope);
|
|
74
|
+
}, this.retryPolicy, this.sleep);
|
|
75
|
+
return {
|
|
76
|
+
eventId: validEvent.eventId,
|
|
77
|
+
delivered: true,
|
|
78
|
+
duplicate: false,
|
|
79
|
+
attempts,
|
|
80
|
+
envelope,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
await this.deadLetterSink.push({
|
|
85
|
+
event: validEvent,
|
|
86
|
+
envelope,
|
|
87
|
+
attempts,
|
|
88
|
+
error: toErrorMessage(error),
|
|
89
|
+
failedAt: new Date().toISOString(),
|
|
90
|
+
});
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export function buildStorageBridgeWebhookEnvelope(input) {
|
|
96
|
+
const event = validateStorageBridgeEvent(input.event);
|
|
97
|
+
const body = input.content?.body ?? null;
|
|
98
|
+
const bodyBase64 = body === null ? null : bodyToBuffer(body).toString("base64");
|
|
99
|
+
const metadata = {
|
|
100
|
+
...event.metadata,
|
|
101
|
+
...(input.content?.metadata ?? {}),
|
|
102
|
+
};
|
|
103
|
+
return {
|
|
104
|
+
workspaceId: event.workspaceId ?? input.workspaceId ?? "",
|
|
105
|
+
provider: input.provider ?? event.source,
|
|
106
|
+
event_type: storageBridgeWebhookEventType(event.changeType),
|
|
107
|
+
path: event.relayfilePath,
|
|
108
|
+
delivery_id: event.eventId,
|
|
109
|
+
timestamp: event.occurredAt,
|
|
110
|
+
data: {
|
|
111
|
+
contentBase64: bodyBase64,
|
|
112
|
+
contentType: input.content?.contentType ?? null,
|
|
113
|
+
sizeBytes: event.sizeBytes,
|
|
114
|
+
fingerprint: event.fingerprint,
|
|
115
|
+
resourceId: event.resourceId,
|
|
116
|
+
metadata,
|
|
117
|
+
},
|
|
118
|
+
headers: {
|
|
119
|
+
"x-relayfile-storage-bridge-source": event.source,
|
|
120
|
+
"x-relayfile-storage-bridge-event-id": event.eventId,
|
|
121
|
+
...(input.content?.headers ?? {}),
|
|
122
|
+
},
|
|
123
|
+
semantics: {
|
|
124
|
+
properties: {
|
|
125
|
+
"storage_bridge.source": event.source,
|
|
126
|
+
"storage_bridge.change_type": event.changeType,
|
|
127
|
+
"storage_bridge.resource_id": event.resourceId,
|
|
128
|
+
"storage_bridge.fingerprint": event.fingerprint,
|
|
129
|
+
"storage_bridge.delivery_id": event.eventId,
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
async function retry(fn, policy, sleep) {
|
|
135
|
+
let lastError;
|
|
136
|
+
for (let attempt = 1; attempt <= policy.maxAttempts; attempt += 1) {
|
|
137
|
+
try {
|
|
138
|
+
await fn();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
lastError = error;
|
|
143
|
+
if (attempt >= policy.maxAttempts)
|
|
144
|
+
break;
|
|
145
|
+
await sleep(computeRetryDelay(policy, attempt));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
throw lastError;
|
|
149
|
+
}
|
|
150
|
+
function computeRetryDelay(policy, attempt) {
|
|
151
|
+
const capped = Math.min(policy.maxDelayMs ?? Number.POSITIVE_INFINITY, policy.baseDelayMs * 2 ** Math.max(0, attempt - 1));
|
|
152
|
+
if (!policy.jitterRatio)
|
|
153
|
+
return capped;
|
|
154
|
+
const spread = capped * policy.jitterRatio;
|
|
155
|
+
return Math.max(0, capped - spread + Math.random() * spread * 2);
|
|
156
|
+
}
|
|
157
|
+
function bodyToBuffer(body) {
|
|
158
|
+
if (Buffer.isBuffer(body))
|
|
159
|
+
return body;
|
|
160
|
+
if (typeof body === "string")
|
|
161
|
+
return Buffer.from(body);
|
|
162
|
+
if (body instanceof ArrayBuffer)
|
|
163
|
+
return Buffer.from(body);
|
|
164
|
+
return Buffer.from(body);
|
|
165
|
+
}
|
|
166
|
+
function toErrorMessage(error) {
|
|
167
|
+
return error instanceof Error ? error.message : String(error);
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=adapter-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-worker.js","sourceRoot":"","sources":["../../../src/storage-bridge/adapter-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { JsonValue } from "./event.js";
|
|
2
|
+
export interface AdapterResourceConfig {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly pathPattern: RegExp;
|
|
6
|
+
readonly idPattern: RegExp;
|
|
7
|
+
readonly schema: string;
|
|
8
|
+
readonly createExample: string;
|
|
9
|
+
readonly operations?: readonly AdapterResourceOperation[];
|
|
10
|
+
}
|
|
11
|
+
export type AdapterResourceOperation = "create" | "update" | "delete";
|
|
12
|
+
export interface JsonSchemaObject {
|
|
13
|
+
readonly $schema?: string;
|
|
14
|
+
readonly type?: string | readonly string[];
|
|
15
|
+
readonly readOnly?: boolean;
|
|
16
|
+
readonly properties?: Record<string, JsonSchemaObject>;
|
|
17
|
+
readonly items?: JsonSchemaObject;
|
|
18
|
+
readonly anyOf?: readonly JsonSchemaObject[];
|
|
19
|
+
readonly oneOf?: readonly JsonSchemaObject[];
|
|
20
|
+
readonly allOf?: readonly JsonSchemaObject[];
|
|
21
|
+
readonly additionalProperties?: boolean | JsonSchemaObject;
|
|
22
|
+
readonly [key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
export declare class ReadOnlyFieldError extends Error {
|
|
25
|
+
readonly fields: readonly string[];
|
|
26
|
+
constructor(fields: readonly string[]);
|
|
27
|
+
}
|
|
28
|
+
export declare function findResourceByPath(resources: readonly AdapterResourceConfig[], path: string): AdapterResourceConfig | undefined;
|
|
29
|
+
export declare function assertReadOnlyFieldsRejected(schema: JsonSchemaObject, patch: Record<string, unknown>): void;
|
|
30
|
+
export declare function collectReadOnlyFields(schema: JsonSchemaObject, prefix?: string): string[];
|
|
31
|
+
export declare function isJsonRecord(value: unknown): value is Record<string, JsonValue>;
|
|
32
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/storage-bridge/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC3D;AAED,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC7C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAC3D,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;gBAEvB,MAAM,EAAE,SAAS,MAAM,EAAE;CAKtC;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,qBAAqB,EAAE,EAC3C,IAAI,EAAE,MAAM,GACX,qBAAqB,GAAG,SAAS,CAGnC;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,CAMN;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,EACxB,MAAM,SAAK,GACV,MAAM,EAAE,CAeV;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAE/E"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export class ReadOnlyFieldError extends Error {
|
|
2
|
+
fields;
|
|
3
|
+
constructor(fields) {
|
|
4
|
+
super(`Writeback attempted to modify read-only fields: ${fields.join(", ")}`);
|
|
5
|
+
this.name = "ReadOnlyFieldError";
|
|
6
|
+
this.fields = fields;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function findResourceByPath(resources, path) {
|
|
10
|
+
const normalizedPath = path.endsWith(".json") ? path : path.replace(/\/$/, "");
|
|
11
|
+
return resources.find((resource) => resource.pathPattern.test(normalizedPath));
|
|
12
|
+
}
|
|
13
|
+
export function assertReadOnlyFieldsRejected(schema, patch) {
|
|
14
|
+
const readOnlyFields = collectReadOnlyFields(schema);
|
|
15
|
+
const rejected = readOnlyFields.filter((field) => hasPath(patch, field));
|
|
16
|
+
if (rejected.length > 0) {
|
|
17
|
+
throw new ReadOnlyFieldError(rejected);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function collectReadOnlyFields(schema, prefix = "") {
|
|
21
|
+
const fields = [];
|
|
22
|
+
for (const [name, child] of Object.entries(schema.properties ?? {})) {
|
|
23
|
+
const path = prefix ? `${prefix}.${name}` : name;
|
|
24
|
+
if (child.readOnly)
|
|
25
|
+
fields.push(path);
|
|
26
|
+
fields.push(...collectReadOnlyFields(child, path));
|
|
27
|
+
}
|
|
28
|
+
for (const branch of [
|
|
29
|
+
...(schema.anyOf ?? []),
|
|
30
|
+
...(schema.oneOf ?? []),
|
|
31
|
+
...(schema.allOf ?? []),
|
|
32
|
+
]) {
|
|
33
|
+
fields.push(...collectReadOnlyFields(branch, prefix));
|
|
34
|
+
}
|
|
35
|
+
return [...new Set(fields)];
|
|
36
|
+
}
|
|
37
|
+
export function isJsonRecord(value) {
|
|
38
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
39
|
+
}
|
|
40
|
+
function hasPath(value, path) {
|
|
41
|
+
const parts = path.split(".");
|
|
42
|
+
let cursor = value;
|
|
43
|
+
for (const part of parts) {
|
|
44
|
+
if (!isPlainRecord(cursor) || !(part in cursor))
|
|
45
|
+
return false;
|
|
46
|
+
cursor = cursor[part];
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
function isPlainRecord(value) {
|
|
51
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/storage-bridge/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export declare const STORAGE_BRIDGE_SOURCES: readonly ["google-drive", "gcs", "sharepoint", "onedrive", "azure-blob", "dropbox", "gmail", "s3", "box", "postgres", "redis"];
|
|
2
|
+
export type StorageBridgeSource = (typeof STORAGE_BRIDGE_SOURCES)[number];
|
|
3
|
+
export declare const STORAGE_BRIDGE_CHANGE_TYPES: readonly ["created", "updated", "deleted"];
|
|
4
|
+
export type StorageBridgeChangeType = (typeof STORAGE_BRIDGE_CHANGE_TYPES)[number];
|
|
5
|
+
export type JsonPrimitive = string | number | boolean | null;
|
|
6
|
+
export type JsonObject = {
|
|
7
|
+
readonly [key: string]: JsonValue;
|
|
8
|
+
};
|
|
9
|
+
export type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];
|
|
10
|
+
export type StorageBridgeMetadata = Record<string, JsonValue>;
|
|
11
|
+
export interface StorageBridgeEvent {
|
|
12
|
+
readonly eventId: string;
|
|
13
|
+
readonly occurredAt: string;
|
|
14
|
+
readonly detectedAt: string;
|
|
15
|
+
readonly source: StorageBridgeSource;
|
|
16
|
+
readonly changeType: StorageBridgeChangeType;
|
|
17
|
+
readonly relayfilePath: string;
|
|
18
|
+
readonly resourceId: string;
|
|
19
|
+
readonly sizeBytes: number | null;
|
|
20
|
+
readonly fingerprint: string | null;
|
|
21
|
+
readonly metadata: StorageBridgeMetadata;
|
|
22
|
+
readonly workspaceId: string | null;
|
|
23
|
+
}
|
|
24
|
+
export type StorageBridgeEventForSource<Source extends StorageBridgeSource> = StorageBridgeEvent & {
|
|
25
|
+
readonly source: Source;
|
|
26
|
+
};
|
|
27
|
+
export interface StorageBridgeSourceMetadata {
|
|
28
|
+
readonly source: StorageBridgeSource;
|
|
29
|
+
readonly providerConfigKey?: string;
|
|
30
|
+
readonly accountId?: string;
|
|
31
|
+
readonly connectionId?: string;
|
|
32
|
+
readonly subscriptionId?: string;
|
|
33
|
+
readonly nativeEventId?: string;
|
|
34
|
+
readonly cursor?: string;
|
|
35
|
+
readonly raw?: JsonValue;
|
|
36
|
+
}
|
|
37
|
+
export interface CreateStorageBridgeEventInput<Source extends StorageBridgeSource = StorageBridgeSource> {
|
|
38
|
+
readonly eventId?: string;
|
|
39
|
+
readonly occurredAt?: string | Date;
|
|
40
|
+
readonly detectedAt?: string | Date;
|
|
41
|
+
readonly source: Source;
|
|
42
|
+
readonly changeType: StorageBridgeChangeType;
|
|
43
|
+
readonly relayfilePath: string;
|
|
44
|
+
readonly resourceId: string;
|
|
45
|
+
readonly sizeBytes?: number | null;
|
|
46
|
+
readonly fingerprint?: string | null;
|
|
47
|
+
readonly metadata?: StorageBridgeMetadata;
|
|
48
|
+
readonly workspaceId?: string | null;
|
|
49
|
+
readonly sourceMetadata?: Omit<StorageBridgeSourceMetadata, "source">;
|
|
50
|
+
}
|
|
51
|
+
export declare class StorageBridgeEventValidationError extends Error {
|
|
52
|
+
readonly issues: readonly string[];
|
|
53
|
+
constructor(issues: readonly string[]);
|
|
54
|
+
}
|
|
55
|
+
export declare function createStorageBridgeEvent<Source extends StorageBridgeSource>(input: CreateStorageBridgeEventInput<Source>): StorageBridgeEventForSource<Source>;
|
|
56
|
+
export declare function createStorageBridgeSourceMetadata(source: StorageBridgeSource, metadata?: Omit<StorageBridgeSourceMetadata, "source">): StorageBridgeSourceMetadata;
|
|
57
|
+
export declare function storageBridgeSourceMetadataToJson(metadata: StorageBridgeSourceMetadata): Record<string, JsonValue>;
|
|
58
|
+
export declare function storageBridgeWebhookEventType(changeType: StorageBridgeChangeType): "file.created" | "file.updated" | "file.deleted";
|
|
59
|
+
export declare function validateStorageBridgeEvent(value: unknown): StorageBridgeEvent;
|
|
60
|
+
export declare function isStorageBridgeEvent(value: unknown): value is StorageBridgeEvent;
|
|
61
|
+
export declare function buildStorageBridgeEventId(input: {
|
|
62
|
+
readonly source: StorageBridgeSource;
|
|
63
|
+
readonly changeType: StorageBridgeChangeType;
|
|
64
|
+
readonly relayfilePath: string;
|
|
65
|
+
readonly resourceId: string;
|
|
66
|
+
readonly occurredAt: string;
|
|
67
|
+
readonly fingerprint?: string | null;
|
|
68
|
+
}): string;
|
|
69
|
+
export declare function toIsoTimestamp(value: string | Date): string;
|
|
70
|
+
//# sourceMappingURL=event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../../src/storage-bridge/event.ts"],"names":[],"mappings":"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"}
|