diff --git a/app/nose/bin/share.ts b/app/nose/bin/share.ts index 144d50b..fc7b8e1 100644 --- a/app/nose/bin/share.ts +++ b/app/nose/bin/share.ts @@ -1,14 +1,14 @@ import { apps } from "app/src/webapp" import { connectSneaker } from "app/src/sneaker" -export default async function (app: string) { +export default async function (app: string, subdomain = "") { if (!app) { - return `usage: share ` + return `usage: share [subdomain]` } if (!apps().includes(app)) { return { error: `${app} not found` } } - return await connectSneaker(app) + return await connectSneaker(app, subdomain) } \ No newline at end of file diff --git a/app/src/sneaker.ts b/app/src/sneaker.ts index 0907f20..f5e356c 100644 --- a/app/src/sneaker.ts +++ b/app/src/sneaker.ts @@ -9,19 +9,25 @@ type Connection = { subdomain: string ws: any } -const connections: Record = {} +const conns: Record = {} // returns the sneaker subdomain if successful -export async function connectSneaker(app: string): Promise { - if (connections[app]) { - return connections[app].subdomain +export async function connectSneaker(app: string, subdomain = ""): Promise { + if (conns[app]) { + return conns[app].subdomain } - const ws = new WebSocket(`ws${SNEAKER_TLS ? "s" : ""}://${SNEAKER_URL}/tunnel?app=${app}`) + let url = `ws${SNEAKER_TLS ? "s" : ""}://${SNEAKER_URL}/tunnel?app=${app}` + if (subdomain) url += `&subdomain=${subdomain}` + + const ws = new WebSocket(url) let resolve: (v: string) => void let promise = new Promise(res => resolve = res) - ws.onclose = (e) => delete connections[app] + ws.onclose = e => { + delete conns[app] + setTimeout(() => connectSneaker(app, subdomain), 1000) // simple retry + } ws.onerror = e => console.error("sneaker error", e) @@ -29,7 +35,8 @@ export async function connectSneaker(app: string): Promise { const msg = JSON.parse(event.data.toString()) if (msg.subdomain) { - connections[app] = { subdomain: "", ws } + conns[app] = { subdomain: msg.subdomain, ws } + subdomain = msg.subdomain resolve(msg.subdomain) return }