@buddhilive/sandbox-sw 0.1.0-beta.1 → 0.1.0-beta.3

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.
Files changed (2) hide show
  1. package/dist/sw.js +90 -54
  2. package/package.json +1 -1
package/dist/sw.js CHANGED
@@ -1,14 +1,14 @@
1
- var f = Object.defineProperty;
2
- var w = (e, t, s) => t in e ? f(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s;
3
- var d = (e, t, s) => w(e, typeof t != "symbol" ? t + "" : t, s);
4
- class P {
1
+ var T = Object.defineProperty;
2
+ var O = (e, t, r) => t in e ? T(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
3
+ var g = (e, t, r) => O(e, typeof t != "symbol" ? t + "" : t, r);
4
+ class C {
5
5
  constructor() {
6
- d(this, "ports", /* @__PURE__ */ new Map());
6
+ g(this, "ports", /* @__PURE__ */ new Map());
7
7
  }
8
- register(t, s) {
8
+ register(t, r) {
9
9
  this.ports.set(t, {
10
10
  port: t,
11
- messagePort: s,
11
+ messagePort: r,
12
12
  lastActive: Date.now()
13
13
  });
14
14
  }
@@ -25,10 +25,10 @@ class P {
25
25
  return Array.from(this.ports.keys());
26
26
  }
27
27
  }
28
- const o = new P();
29
- async function b(e, t, s) {
30
- const r = o.get(e);
31
- if (!r)
28
+ const h = new C();
29
+ async function v(e, t, r) {
30
+ const n = h.get(e);
31
+ if (!n)
32
32
  return new Response(
33
33
  `<html><body><h2>503 Service Unavailable</h2><p>No virtual HTTP server listening on port ${e}.</p></body></html>`,
34
34
  {
@@ -41,49 +41,85 @@ async function b(e, t, s) {
41
41
  }
42
42
  }
43
43
  );
44
- if (r.messagePort) {
45
- const n = new MessageChannel(), p = {};
46
- t.headers.forEach((i, a) => {
47
- p[a] = i;
44
+ if (n.messagePort) {
45
+ const i = new MessageChannel(), f = {};
46
+ t.headers.forEach((d, a) => {
47
+ f[a] = d;
48
48
  });
49
- const h = t.method !== "GET" && t.method !== "HEAD" ? await t.arrayBuffer() : null;
50
- return new Promise((i) => {
51
- const a = setTimeout(() => {
52
- i(
49
+ const m = t.method !== "GET" && t.method !== "HEAD" ? await t.arrayBuffer() : null;
50
+ return new Promise((d) => {
51
+ let a = null, o = !1, c = 200, y = "OK";
52
+ const u = new Headers({
53
+ "Cross-Origin-Opener-Policy": "same-origin",
54
+ "Cross-Origin-Embedder-Policy": "require-corp"
55
+ }), w = setTimeout(() => {
56
+ o || (o = !0, d(
53
57
  new Response(
54
58
  `<html><body><h2>504 Gateway Timeout</h2><p>Port ${e} timed out responding.</p></body></html>`,
55
59
  { status: 504, headers: { "Content-Type": "text/html" } }
56
60
  )
57
- );
58
- }, 1e4);
59
- n.port1.onmessage = (l) => {
60
- clearTimeout(a);
61
- const { status: c, statusText: u, headers: g, body: y } = l.data, m = new Response(y, {
62
- status: c || 200,
63
- statusText: u || "OK",
64
- headers: {
65
- ...g,
66
- "Cross-Origin-Opener-Policy": "same-origin",
67
- "Cross-Origin-Embedder-Policy": "require-corp"
61
+ ));
62
+ }, 15e3);
63
+ i.port1.onmessage = (b) => {
64
+ clearTimeout(w);
65
+ const s = b.data;
66
+ if (s.type === "headers") {
67
+ if (c = s.status || 200, y = s.statusText || "OK", s.headers)
68
+ for (const [p, l] of Object.entries(s.headers))
69
+ u.set(p, String(l));
70
+ return;
71
+ }
72
+ if (s.type === "chunk") {
73
+ if (o)
74
+ a && a.enqueue(new Uint8Array(s.data));
75
+ else {
76
+ o = !0;
77
+ const p = new ReadableStream({
78
+ start(l) {
79
+ a = l, l.enqueue(new Uint8Array(s.data));
80
+ }
81
+ });
82
+ d(
83
+ new Response(p, {
84
+ status: c,
85
+ statusText: y,
86
+ headers: u
87
+ })
88
+ );
68
89
  }
69
- });
70
- i(m);
71
- }, r.messagePort.postMessage(
90
+ return;
91
+ }
92
+ if (s.type === "end" || !s.type) {
93
+ if (a)
94
+ s.body && s.body.byteLength > 0 && a.enqueue(new Uint8Array(s.body)), a.close();
95
+ else if (!o) {
96
+ if (o = !0, s.headers)
97
+ for (const [l, P] of Object.entries(s.headers))
98
+ u.set(l, String(P));
99
+ const p = new Response(s.body || null, {
100
+ status: s.status || c,
101
+ statusText: s.statusText || y,
102
+ headers: u
103
+ });
104
+ d(p);
105
+ }
106
+ }
107
+ }, n.messagePort.postMessage(
72
108
  {
73
109
  type: "http:request",
74
110
  port: e,
75
- path: s,
111
+ path: r,
76
112
  method: t.method,
77
- headers: p,
78
- body: h,
79
- replyPort: n.port2
113
+ headers: f,
114
+ body: m,
115
+ replyPort: i.port2
80
116
  },
81
- [n.port2]
117
+ [i.port2]
82
118
  );
83
119
  });
84
120
  }
85
121
  return new Response(
86
- `<!DOCTYPE html><html><head><title>Preview ${e}</title></head><body><h1>Preview Server on Port ${e}</h1><p>Status: Active</p><p>Path: ${s}</p></body></html>`,
122
+ `<!DOCTYPE html><html><head><title>Preview ${e}</title></head><body><h1>Preview Server on Port ${e}</h1><p>Status: Active</p><p>Path: ${r}</p></body></html>`,
87
123
  {
88
124
  status: 200,
89
125
  headers: {
@@ -94,18 +130,18 @@ async function b(e, t, s) {
94
130
  }
95
131
  );
96
132
  }
97
- function C() {
133
+ function R() {
98
134
  if (typeof BroadcastChannel > "u") return;
99
135
  const e = new BroadcastChannel("buddhilive-sandbox-sw");
100
136
  e.onmessage = (t) => {
101
- const { type: s, port: r } = t.data;
102
- s === "port:register" && typeof r == "number" ? (o.register(r), e.postMessage({ type: "port:registered", port: r })) : s === "port:unregister" && typeof r == "number" ? o.unregister(r) : s === "sw:ping" && e.postMessage({
137
+ const { type: r, port: n } = t.data;
138
+ r === "port:register" && typeof n == "number" ? (h.register(n), e.postMessage({ type: "port:registered", port: n })) : r === "port:unregister" && typeof n == "number" ? h.unregister(n) : r === "sw:ping" && e.postMessage({
103
139
  type: "sw:pong",
104
- ports: o.list()
140
+ ports: h.list()
105
141
  });
106
142
  }, e.postMessage({
107
143
  type: "sw:ready",
108
- ports: o.list()
144
+ ports: h.list()
109
145
  });
110
146
  }
111
147
  self.addEventListener("install", (e) => {
@@ -114,24 +150,24 @@ self.addEventListener("install", (e) => {
114
150
  self.addEventListener("activate", (e) => {
115
151
  e.waitUntil(
116
152
  (async () => {
117
- await self.clients.claim(), C();
153
+ await self.clients.claim(), R();
118
154
  })()
119
155
  );
120
156
  });
121
157
  self.addEventListener("fetch", (e) => {
122
- const t = new URL(e.request.url), s = t.pathname.match(/^\/__preview\/(\d+)(.*)/);
123
- if (s) {
124
- const r = parseInt(s[1], 10), n = s[2] || "/";
125
- e.respondWith(b(r, e.request, n));
158
+ const t = new URL(e.request.url), r = t.pathname.match(/^\/__preview\/(\d+)(.*)/);
159
+ if (r) {
160
+ const n = parseInt(r[1], 10), i = r[2] || "/";
161
+ e.respondWith(v(n, e.request, i));
126
162
  return;
127
163
  }
128
164
  t.origin === self.location.origin && e.respondWith(
129
165
  (async () => {
130
- const r = await fetch(e.request), n = new Headers(r.headers);
131
- return n.set("Cross-Origin-Opener-Policy", "same-origin"), n.set("Cross-Origin-Embedder-Policy", "require-corp"), new Response(r.body, {
132
- status: r.status,
133
- statusText: r.statusText,
134
- headers: n
166
+ const n = await fetch(e.request), i = new Headers(n.headers);
167
+ return i.set("Cross-Origin-Opener-Policy", "same-origin"), i.set("Cross-Origin-Embedder-Policy", "require-corp"), new Response(n.body, {
168
+ status: n.status,
169
+ statusText: n.statusText,
170
+ headers: i
135
171
  });
136
172
  })()
137
173
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buddhilive/sandbox-sw",
3
- "version": "0.1.0-beta.1",
3
+ "version": "0.1.0-beta.3",
4
4
  "description": "Service Worker HTTP preview bridge for client-side Node.js sandbox",
5
5
  "main": "./dist/sw.js",
6
6
  "module": "./dist/sw.js",