UNPKG

2.61 kBTypeScriptView Raw
1export namespace SharedWorker {
2 export type ProtocolIdentifier = 'experimental';
3
4 export type FactoryOptions = {
5 negotiateProtocol <Data = unknown>(supported: readonly ['experimental']): Experimental.Protocol<Data>;
6 // Add overloads for additional protocols.
7 };
8
9 export type Factory = (options: FactoryOptions) => void;
10
11 export namespace Experimental {
12 export type Protocol<Data = unknown> = {
13 readonly initialData: Data;
14 readonly protocol: 'experimental';
15 broadcast: (data: Data) => BroadcastMessage<Data>;
16 ready: () => Protocol<Data>;
17 subscribe: () => AsyncIterableIterator<ReceivedMessage<Data>>;
18 testWorkers: () => AsyncIterableIterator<TestWorker<Data>>;
19 };
20
21 export type BroadcastMessage<Data = unknown> = {
22 readonly id: string;
23 replies: () => AsyncIterableIterator<ReceivedMessage<Data>>;
24 };
25
26 export type PublishedMessage<Data = unknown> = {
27 readonly id: string;
28 replies: () => AsyncIterableIterator<ReceivedMessage<Data>>;
29 };
30
31 export type ReceivedMessage<Data = unknown> = {
32 readonly data: Data;
33 readonly id: string;
34 readonly testWorker: TestWorker;
35 reply: (data: Data) => PublishedMessage<Data>;
36 };
37
38 export type TestWorker<Data = unknown> = {
39 readonly id: string;
40 readonly file: string;
41 publish: (data: Data) => PublishedMessage<Data>;
42 subscribe: () => AsyncIterableIterator<ReceivedMessage<Data>>;
43 teardown: <TeardownFn extends () => void> (fn: TeardownFn) => TeardownFn;
44 };
45 }
46
47 export namespace Plugin {
48 export type RegistrationOptions<Identifier extends ProtocolIdentifier, Data = unknown> = {
49 readonly filename: string;
50 readonly initialData?: Data;
51 readonly supportedProtocols: readonly Identifier[];
52 readonly teardown?: () => void;
53 };
54
55 export namespace Experimental {
56 export type Protocol<Data = unknown> = {
57 readonly available: Promise<void>;
58 readonly currentlyAvailable: boolean;
59 readonly protocol: 'experimental';
60 publish: (data: Data) => PublishedMessage<Data>;
61 subscribe: () => AsyncIterableIterator<ReceivedMessage<Data>>;
62 };
63
64 export type PublishedMessage<Data = unknown> = {
65 readonly id: string;
66 replies: () => AsyncIterableIterator<ReceivedMessage<Data>>;
67 };
68
69 export type ReceivedMessage<Data = unknown> = {
70 readonly data: Data;
71 readonly id: string;
72 reply: (data: Data) => PublishedMessage<Data>;
73 };
74 }
75 }
76}
77
78export function registerSharedWorker<Data = unknown>(options: SharedWorker.Plugin.RegistrationOptions<'experimental', Data>): SharedWorker.Plugin.Experimental.Protocol<Data>;
79// Add overloads for additional protocols.