osra 0.0.11 → 0.0.12

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/build/call.d.ts CHANGED
@@ -9,3 +9,9 @@ export declare const call: <T2 extends Resolvers>(target: Target, { key }?: {
9
9
  * Make a listener for a call
10
10
  */
11
11
  export declare const makeCallListener: <T extends (data: any, extra: ApiResolverOptions) => unknown>(func: T) => T;
12
+ /**
13
+ * Make a listener for a call
14
+ */
15
+ export declare const makeProxyCallListener: <T extends (data: any, extra: ApiResolverOptions) => unknown>(target: Target, { key }?: {
16
+ key?: string | undefined;
17
+ }) => T;
package/build/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export type { ApiMessageData, ApiResolverOptions, Resolvers, StructuredCloneTran
3
3
  export * from './register';
4
4
  export * from './call';
5
5
  export * from './webextension';
6
+ export * from './utils';
package/build/index.js CHANGED
@@ -1,70 +1,87 @@
1
- const g = "osra-message", l = ({
2
- target: e,
3
- resolvers: t,
4
- filter: r,
5
- map: n,
6
- key: a = g
7
- }) => {
8
- const o = (s) => {
9
- if (!s.data || typeof s.data != "object" || s.data?.source !== a || r && !r(s))
10
- return;
11
- const { type: c, data: i, port: d } = s.data, m = t[c];
12
- if (!m)
13
- throw new Error(`Osra received a message of type "${String(c)}" but no resolver was found for type.`);
14
- n ? m(...n(i, { event: s, type: c, port: d })) : m(i, { event: s, type: c, port: d });
15
- };
16
- return e.addEventListener("message", o), {
17
- listener: o,
18
- resolvers: t
19
- };
20
- }, b = (e) => !!(globalThis.SharedArrayBuffer && e instanceof globalThis.SharedArrayBuffer), y = (e) => globalThis.ArrayBuffer && e instanceof globalThis.ArrayBuffer || globalThis.MessagePort && e instanceof globalThis.MessagePort || globalThis.ReadableStream && e instanceof globalThis.ReadableStream || globalThis.WritableStream && e instanceof globalThis.WritableStream || globalThis.TransformStream && e instanceof globalThis.TransformStream ? !0 : !!(globalThis.ImageBitmap && e instanceof globalThis.ImageBitmap), h = (e) => {
21
- const t = [], r = (n) => b(n) ? void 0 : y(n) ? t.push(n) : Array.isArray(n) ? n.map(r) : n && typeof n == "object" ? Object.values(n).map(r) : void 0;
22
- return r(e), t;
23
- }, p = "__proxyFunctionPort__", M = "__proxyMessageChannelPort__", j = (e) => {
24
- const { port1: t, port2: r } = new MessageChannel();
25
- return t.addEventListener("message", async (n) => {
1
+ const f = "osra-message", P = (t) => !!(globalThis.SharedArrayBuffer && t instanceof globalThis.SharedArrayBuffer), h = (t) => globalThis.ArrayBuffer && t instanceof globalThis.ArrayBuffer || globalThis.MessagePort && t instanceof globalThis.MessagePort || globalThis.ReadableStream && t instanceof globalThis.ReadableStream || globalThis.WritableStream && t instanceof globalThis.WritableStream || globalThis.TransformStream && t instanceof globalThis.TransformStream ? !0 : !!(globalThis.ImageBitmap && t instanceof globalThis.ImageBitmap), b = (t) => {
2
+ const e = [], s = (r) => P(r) ? void 0 : h(r) ? e.push(r) : Array.isArray(r) ? r.map(s) : r && typeof r == "object" ? Object.values(r).map(s) : void 0;
3
+ return s(t), e;
4
+ }, p = "__proxyFunctionPort__", L = "__proxyMessageChannelPort__", A = (t) => {
5
+ const { port1: e, port2: s } = new MessageChannel();
6
+ return e.addEventListener("message", async (r) => {
26
7
  try {
27
- const a = await e(...n.data), o = f(a), s = h(o);
28
- t.postMessage({ result: o }, { transfer: s });
8
+ const a = await t(...r.data), n = m(a), o = b(n);
9
+ e.postMessage({ result: n }, { transfer: o });
29
10
  } catch (a) {
30
- t.postMessage({ error: a });
11
+ e.postMessage({ error: a });
31
12
  }
32
- }), t.start(), r;
33
- }, f = (e) => b(e) || y(e) ? e : typeof e == "function" ? { [p]: j(e) } : Array.isArray(e) ? e.map(f) : e && typeof e == "object" ? Object.fromEntries(
34
- Object.entries(e).map(([t, r]) => [
35
- t,
36
- f(r)
13
+ }), e.start(), s;
14
+ }, m = (t) => P(t) || h(t) ? t : typeof t == "function" ? { [p]: A(t) } : Array.isArray(t) ? t.map(m) : t && typeof t == "object" ? Object.fromEntries(
15
+ Object.entries(t).map(([e, s]) => [
16
+ e,
17
+ m(s)
37
18
  ])
38
- ) : e, x = (e) => (...t) => new Promise((r, n) => {
39
- const a = f(t), o = h(a), s = (c) => {
40
- c.data.error ? n(c.data.error) : r(E(c.data.result)), e.removeEventListener("message", s);
19
+ ) : t, _ = (t) => (...e) => new Promise((s, r) => {
20
+ const a = m(e), n = b(a), o = (c) => {
21
+ c.data.error ? r(c.data.error) : s(M(c.data.result)), t.removeEventListener("message", o);
41
22
  };
42
- e.addEventListener("message", s), e.start(), e.postMessage(a, { transfer: o });
43
- }), E = (e) => b(e) || y(e) ? e : e && typeof e == "object" && e[p] ? x(e[p]) : Array.isArray(e) ? e.map(f) : e && typeof e == "object" ? Object.fromEntries(
44
- Object.entries(e).map(([t, r]) => [
45
- t,
46
- E(r)
23
+ t.addEventListener("message", o), t.start(), t.postMessage(a, { transfer: n });
24
+ }), M = (t) => P(t) || h(t) ? t : t && typeof t == "object" && t[p] ? _(t[p]) : Array.isArray(t) ? t.map(m) : t && typeof t == "object" ? Object.fromEntries(
25
+ Object.entries(t).map(([e, s]) => [
26
+ e,
27
+ M(s)
47
28
  ])
48
- ) : e, A = (e, { key: t = g } = { key: g }) => (r, n) => new Promise((a, o) => {
49
- const { port1: s, port2: c } = new MessageChannel();
50
- s.addEventListener(
29
+ ) : t, C = ({
30
+ target: t,
31
+ resolvers: e,
32
+ filter: s,
33
+ map: r,
34
+ key: a = f,
35
+ proxyTarget: n
36
+ }) => {
37
+ const o = (c) => {
38
+ if (!c.data || typeof c.data != "object" || c.data?.source !== a || s && !s(c))
39
+ return;
40
+ if (n) {
41
+ const { type: l, data: O, port: T } = c.data, x = b(O);
42
+ n.postMessage(
43
+ {
44
+ source: a,
45
+ type: l,
46
+ data: O,
47
+ port: T
48
+ },
49
+ {
50
+ targetOrigin: "*",
51
+ transfer: [T, ...x ?? []]
52
+ }
53
+ );
54
+ return;
55
+ }
56
+ const { type: i, data: d, port: g } = c.data, y = e[i];
57
+ if (!y)
58
+ throw new Error(`Osra received a message of type "${String(i)}" but no resolver was found for type.`);
59
+ r ? y(...r(d, { event: c, type: i, port: g })) : y(d, { event: c, type: i, port: g });
60
+ };
61
+ return t.addEventListener("message", o), {
62
+ listener: o,
63
+ resolvers: e
64
+ };
65
+ }, R = (t, { key: e = f } = { key: f }) => (s, r) => new Promise((a, n) => {
66
+ const { port1: o, port2: c } = new MessageChannel();
67
+ o.addEventListener(
51
68
  "message",
52
- ({ data: m }) => {
53
- if (m.error)
54
- o(m.error);
69
+ ({ data: g }) => {
70
+ if (g.error)
71
+ n(g.error);
55
72
  else {
56
- const L = E(m.result);
57
- a(L);
73
+ const y = M(g.result);
74
+ a(y);
58
75
  }
59
- s.close(), c.close();
76
+ o.close(), c.close();
60
77
  },
61
78
  { once: !0 }
62
- ), s.start();
63
- const i = f(n), d = h(i);
64
- e.postMessage(
79
+ ), o.start();
80
+ const i = m(r), d = b(i);
81
+ t.postMessage(
65
82
  {
66
- source: t,
67
- type: r,
83
+ source: e,
84
+ type: s,
68
85
  data: i,
69
86
  port: c
70
87
  },
@@ -73,109 +90,133 @@ const g = "osra-message", l = ({
73
90
  transfer: [c, ...d ?? []]
74
91
  }
75
92
  );
76
- }), _ = (e) => async (t, r) => {
77
- const { port: n } = r, a = E(t);
93
+ }), D = (t) => async (e, s) => {
94
+ const { port: r } = s, a = M(e);
78
95
  try {
79
- const o = await e(a, r), s = f(o), c = h(s);
80
- return n.postMessage({ result: s }, { transfer: c }), n.close(), o;
81
- } catch (o) {
82
- throw n.postMessage({ error: o }), n.close(), o;
96
+ const n = await t(a, s), o = m(n), c = b(o);
97
+ return r.postMessage({ result: o }, { transfer: c }), r.close(), n;
98
+ } catch (n) {
99
+ throw r.postMessage({ error: n }), r.close(), n;
83
100
  }
84
- }, w = ({ key: e = g }) => {
85
- const t = /* @__PURE__ */ new Map(), r = async (a) => t.get(a) ?? new Promise((o, s) => {
101
+ }, $ = (t, { key: e = f } = { key: f }) => (s, r) => {
102
+ const { type: a, port: n } = r, o = b(s);
103
+ t.postMessage(
104
+ {
105
+ source: e,
106
+ type: a,
107
+ data: s,
108
+ port: n
109
+ },
110
+ {
111
+ targetOrigin: "*",
112
+ transfer: [n, ...o ?? []]
113
+ }
114
+ );
115
+ }, j = ({ key: t = f }) => {
116
+ const e = /* @__PURE__ */ new Map(), s = async (a) => e.get(a) ?? new Promise((n, o) => {
86
117
  let c = !1;
87
118
  setTimeout(() => {
88
- c || s(new Error(`Osra getPort for "${a}" timed out`));
119
+ c || o(new Error(`Osra getPort for "${a}" timed out`));
89
120
  }, 1e3), chrome.runtime.onConnect.addListener((i) => {
90
- i.name === `${e}:${a}` && (t.set(a, i), o(i), c = !0);
121
+ i.name === `${t}:${a}` && (e.set(a, i), n(i), c = !0);
91
122
  });
92
- }), n = {
93
- addPort: (a, o) => t.set(a, o),
123
+ }), r = {
124
+ addPort: (a, n) => e.set(a, n),
94
125
  proxyPort: (a) => {
95
- const o = self.crypto.randomUUID(), s = chrome.runtime.connect({ name: `${e}:${o}` });
96
- return t.set(o, s), s.onDisconnect.addListener(() => {
97
- t.delete(o);
98
- }), s.onMessage.addListener((c) => {
126
+ const n = self.crypto.randomUUID(), o = chrome.runtime.connect({ name: `${t}:${n}` });
127
+ return e.set(n, o), o.onDisconnect.addListener(() => {
128
+ e.delete(n);
129
+ }), o.onMessage.addListener((c) => {
99
130
  a.postMessage(c);
100
131
  }), a.addEventListener("message", async (c) => {
101
- s.postMessage(c.data);
132
+ o.postMessage(c.data);
102
133
  }), a.addEventListener("close", () => {
103
- s.disconnect();
134
+ o.disconnect();
104
135
  }), {
105
- [M]: o
136
+ [L]: n
106
137
  };
107
138
  },
108
- proxiedPort: async ({ [M]: a }) => {
109
- const { port1: o, port2: s } = new MessageChannel(), c = await r(a);
139
+ proxiedPort: async ({ [L]: a }) => {
140
+ const { port1: n, port2: o } = new MessageChannel(), c = await s(a);
110
141
  c.onMessage.addListener((d) => {
111
- o.postMessage(d);
142
+ n.postMessage(d);
112
143
  }), c.onDisconnect.addListener(() => {
113
- o.close();
114
- }), o.addEventListener("close", () => {
144
+ n.close();
145
+ }), n.addEventListener("close", () => {
115
146
  c.disconnect();
116
- }), o.addEventListener("message", async (d) => {
147
+ }), n.addEventListener("message", async (d) => {
117
148
  c.postMessage(d.data);
118
- }), o.start(), s.addEventListener("message", async (d) => {
149
+ }), n.start(), o.addEventListener("message", async (d) => {
119
150
  c.postMessage(d.data);
120
- }), s.start();
121
- const i = O(n, s);
151
+ }), o.start();
152
+ const i = S(r, o);
122
153
  return i.uuid = a, i;
123
154
  }
124
155
  };
125
- return n;
126
- }, P = (e, t) => t instanceof MessagePort ? e.proxyPort(t) : b(t) || y(t) ? t : typeof t == "object" && p in t ? { [p]: e.proxyPort(t[p]) } : Array.isArray(t) ? t.map((r) => P(e, r)) : t && typeof t == "object" ? Object.fromEntries(
127
- Object.entries(t).map(([r, n]) => [
128
- r,
129
- P(e, n)
156
+ return r;
157
+ }, E = (t, e) => e instanceof MessagePort ? t.proxyPort(e) : P(e) || h(e) ? e : typeof e == "object" && p in e ? { [p]: t.proxyPort(e[p]) } : Array.isArray(e) ? e.map((s) => E(t, s)) : e && typeof e == "object" ? Object.fromEntries(
158
+ Object.entries(e).map(([s, r]) => [
159
+ s,
160
+ E(t, r)
130
161
  ])
131
- ) : t, T = async (e, t) => b(t) || y(t) ? t : typeof t == "object" && M in t ? await e.proxiedPort(t) : typeof t == "object" && p in t ? { [p]: await e.proxiedPort(t[p]) } : Array.isArray(t) ? await Promise.all(t.map((r) => T(e, r))) : t && typeof t == "object" ? Object.fromEntries(
162
+ ) : e, w = async (t, e) => P(e) || h(e) ? e : typeof e == "object" && L in e ? await t.proxiedPort(e) : typeof e == "object" && p in e ? { [p]: await t.proxiedPort(e[p]) } : Array.isArray(e) ? await Promise.all(e.map((s) => w(t, s))) : e && typeof e == "object" ? Object.fromEntries(
132
163
  await Promise.all(
133
- Object.entries(t).map(async ([r, n]) => [
134
- r,
135
- await T(e, n)
164
+ Object.entries(e).map(async ([s, r]) => [
165
+ s,
166
+ await w(t, r)
136
167
  ])
137
168
  )
138
- ) : t, O = (e, t) => {
139
- const r = t.postMessage;
140
- return t.postMessage = (n) => {
141
- r.apply(t, [P(e, n)]);
142
- }, t;
143
- }, S = ({
144
- target: e,
145
- key: t = g
169
+ ) : e, S = (t, e) => {
170
+ const s = e.postMessage;
171
+ return e.postMessage = (r) => {
172
+ s.apply(e, [E(t, r)]);
173
+ }, e;
174
+ }, B = ({
175
+ target: t,
176
+ key: e = f
146
177
  }) => {
147
- const r = w({ key: t });
178
+ const s = j({ key: e });
148
179
  return {
149
- ...e,
150
- postMessage: (n) => {
151
- e.runtime.sendMessage(P(r, n));
180
+ ...t,
181
+ postMessage: (r) => {
182
+ t.runtime.sendMessage(E(s, r));
152
183
  }
153
184
  };
154
- }, C = ({
155
- target: e,
156
- key: t = g
185
+ }, F = ({
186
+ target: t,
187
+ key: e = f
157
188
  }) => {
158
- const r = w({ key: t });
189
+ const s = j({ key: e });
159
190
  return {
160
- ...e,
161
- addEventListener: (n, a, o) => {
162
- if (n !== "message")
163
- return e.addEventListener(n, a, o);
164
- chrome.runtime.onMessage.addListener((s, c, i) => {
165
- T(r, s).then((d) => a({ data: d }));
166
- }), chrome.runtime.onConnect.addListener((s) => {
167
- s.name.startsWith(`${t}:`) && r.addPort(s.name.split(":")[1], s);
191
+ ...t,
192
+ addEventListener: (r, a, n) => {
193
+ if (r !== "message")
194
+ return t.addEventListener(r, a, n);
195
+ chrome.runtime.onMessage.addListener((o, c, i) => {
196
+ w(s, o).then((d) => a({ data: d }));
197
+ }), chrome.runtime.onConnect.addListener((o) => {
198
+ o.name.startsWith(`${e}:`) && s.addPort(o.name.split(":")[1], o);
168
199
  });
169
200
  }
170
201
  };
171
202
  };
172
203
  export {
173
- A as call,
174
- _ as makeCallListener,
175
- l as registerListener,
176
- T as replaceProxied,
177
- P as replaceProxies,
178
- S as wrapExtensionTarget,
179
- C as wrapListenerExtensionTarget,
180
- O as wrapPort
204
+ p as PROXY_FUNCTION_PROPERTY,
205
+ L as PROXY_MESSAGE_CHANNEL_PROPERTY,
206
+ R as call,
207
+ b as getTransferableObjects,
208
+ P as isClonable,
209
+ h as isTransferable,
210
+ D as makeCallListener,
211
+ M as makeObjectProxiedFunctions,
212
+ _ as makeProxiedFunction,
213
+ $ as makeProxyCallListener,
214
+ A as makeProxyFunction,
215
+ m as proxyObjectFunctions,
216
+ C as registerListener,
217
+ w as replaceProxied,
218
+ E as replaceProxies,
219
+ B as wrapExtensionTarget,
220
+ F as wrapListenerExtensionTarget,
221
+ S as wrapPort
181
222
  };
@@ -1,5 +1,5 @@
1
- import type { ApiMessageData, ApiResolverOptions, Resolvers, ValidateResolvers } from './types';
2
- export declare const registerListener: <T extends Record<PropertyKey, (data: any, extra: ApiResolverOptions) => unknown>>({ target, resolvers, filter, map, key }: {
1
+ import type { ApiMessageData, ApiResolverOptions, Resolvers, Target, ValidateResolvers } from './types';
2
+ export declare const registerListener: <T extends Record<PropertyKey, (data: any, extra: ApiResolverOptions) => unknown>>({ target, resolvers, filter, map, key, proxyTarget }: {
3
3
  target: WindowEventHandlers | ServiceWorkerContainer | Worker | SharedWorker;
4
4
  resolvers: ValidateResolvers<T>;
5
5
  filter?: ((event: MessageEvent<any>) => boolean) | undefined;
@@ -13,6 +13,7 @@ export declare const registerListener: <T extends Record<PropertyKey, (data: any
13
13
  port: MessagePort;
14
14
  }]) | undefined;
15
15
  key?: string | undefined;
16
+ proxyTarget?: Target | undefined;
16
17
  }) => {
17
18
  listener: (event: MessageEvent<ApiMessageData<Resolvers>>) => void;
18
19
  resolvers: ValidateResolvers<T>;
package/build/types.d.ts CHANGED
@@ -8,7 +8,7 @@ export type StructuredCloneTransferableObject = {
8
8
  };
9
9
  export type ProxiedType = (...args: StructuredCloneTransferableType[]) => StructuredCloneTransferableType | Promise<StructuredCloneTransferableType>;
10
10
  export type StructuredCloneTransferableType = StructuredCloneType | TransferableObject | Array<StructuredCloneTransferableType> | StructuredCloneTransferableObject | Map<StructuredCloneTransferableType, StructuredCloneTransferableType> | Set<StructuredCloneTransferableType> | ProxiedType;
11
- export type Target = Window | ServiceWorker | Worker;
11
+ export type Target = Window | ServiceWorker | Worker | MessagePort;
12
12
  type NormalizeRecord<T> = T extends Record<any, any> ? {
13
13
  [K in keyof T]: NormalizeRecord<T[K]>;
14
14
  } : T;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "osra",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "description": "Easy communication between workers",
5
5
  "files": [
6
6
  "build"