From 9770bddd5a6514d9f1ecb4b59aa0ef448b3ee2cc Mon Sep 17 00:00:00 2001 From: Robert Long Date: Wed, 8 Mar 2023 11:14:38 -0800 Subject: [PATCH 1/2] Add IPSME Module --- package.json | 2 + src/engine/config.main.ts | 2 + src/engine/ipsme/ipsme.main.ts | 52 ++++++++++++++++++++++++ src/ui/views/session/world/WorldView.tsx | 5 +++ yarn.lock | 34 ++++++++++++++++ 5 files changed, 95 insertions(+) create mode 100644 src/engine/ipsme/ipsme.main.ts diff --git a/package.json b/package.json index 3635c6db3..5c822bb77 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,8 @@ "@gltf-transform/core": "^2.4.3", "@gltf-transform/extensions": "^2.4.3", "@gltf-transform/functions": "^2.4.3", + "@ipsme/msgenv-broadcastchannel": "^0.3.8", + "@ipsme/reflector-webbr-ws": "^0.4.4", "@radix-ui/react-checkbox": "^1.0.1", "@radix-ui/react-dialog": "^0.1.7", "@radix-ui/react-dropdown-menu": "^0.1.6", diff --git a/src/engine/config.main.ts b/src/engine/config.main.ts index db8d005c1..b3000f3c3 100644 --- a/src/engine/config.main.ts +++ b/src/engine/config.main.ts @@ -13,6 +13,7 @@ import { OutgoingMainThreadTripleBufferSystem, } from "./MainThreadTripleBufferSystems"; import { MatrixModule } from "./matrix/matrix.main"; +import { IPSMEModule } from "./ipsme/ipsme.main"; export default defineConfig({ modules: [ @@ -25,6 +26,7 @@ export default defineConfig({ RendererModule, ThirdroomModule, MatrixModule, + IPSMEModule, ], systems: [ IncomingMainThreadTripleBufferSystem, diff --git a/src/engine/ipsme/ipsme.main.ts b/src/engine/ipsme/ipsme.main.ts new file mode 100644 index 000000000..92c3842a8 --- /dev/null +++ b/src/engine/ipsme/ipsme.main.ts @@ -0,0 +1,52 @@ +import { publish, subscribe, unsubscribe } from "@ipsme/msgenv-broadcastchannel"; + +import { + InteractableAction, + InteractionMessage, + InteractionMessageType, +} from "../../plugins/interaction/interaction.common"; +import { IMainThreadContext } from "../MainThread"; +import { defineModule, getModule, registerMessageHandler } from "../module/module.common"; +import { createDisposables } from "../utils/createDisposables"; +import { InteractableType } from "../resource/schema"; + +interface IPSMEModuleState { + worker?: SharedWorker; +} + +export const IPSMEModule = defineModule({ + name: "ipsme", + create(ctx) { + return {}; + }, + init(ctx) { + const ipsmeModule = getModule(ctx, IPSMEModule); + + ipsmeModule.worker = new SharedWorker( + new URL("@ipsme/reflector-webbr-ws/dist/reflector-bc-ws-client.js", import.meta.url) + ); + ipsmeModule.worker.port.start(); + ipsmeModule.worker.port.postMessage({}); + + subscribe(onIPSMEMessage); + + return createDisposables([ + registerMessageHandler(ctx, InteractionMessageType, onInteraction), + () => unsubscribe(onIPSMEMessage), + ]); + }, +}); + +function onInteraction(_ctx: IMainThreadContext, message: InteractionMessage) { + if (message.interactableType === InteractableType.Portal && message.action === InteractableAction.Grab) { + publish({ + action: "OMI_link", + uri: message.uri, + }); + location.href = "/"; + } +} + +function onIPSMEMessage(message: unknown) { + console.info(`Received IPSME Message: ${message}`); +} diff --git a/src/ui/views/session/world/WorldView.tsx b/src/ui/views/session/world/WorldView.tsx index d2b14bbd1..0aec2c93c 100644 --- a/src/ui/views/session/world/WorldView.tsx +++ b/src/ui/views/session/world/WorldView.tsx @@ -217,7 +217,12 @@ export function WorldView({ world }: WorldViewProps) { if (!message.uri) throw Error("Portal does not have valid matrix id/alias"); const parsedUri = parseMatrixUri(message.uri); + if (parsedUri instanceof URL) { + if (parsedUri.protocol === "ipsme:") { + return; + } + window.location.href = parsedUri.href; return; } diff --git a/yarn.lock b/yarn.lock index 1f47b65b5..e81494056 100644 --- a/yarn.lock +++ b/yarn.lock @@ -662,6 +662,30 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@ipsme/msgcache-dedup@^0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@ipsme/msgcache-dedup/-/msgcache-dedup-0.1.16.tgz#028fae9a0d907c4a21a0589b0474cc97c7f5ad9f" + integrity sha512-pfZjc6GoFkm+wK0Cdcf64bPvH+L7+tCn4WR5C2LWtKDtc3erFpO8VwZtdBXEVJC/BcJdo7DWLFHVG0aRX2Eh4w== + dependencies: + "@knev/bitlogr" "^0.2.1" + +"@ipsme/msgenv-broadcastchannel@^0.3.2", "@ipsme/msgenv-broadcastchannel@^0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@ipsme/msgenv-broadcastchannel/-/msgenv-broadcastchannel-0.3.8.tgz#93a75ac3f834082b7b2dca16c96492c230a73edf" + integrity sha512-HBNcwXR5ffXFjkHvOT2jxPeBsCjAX2Cn5F2ASh/s9Q1xQ0evcBnHqJGuDwEQwbQZZJGzergptiyBAt+YHTLxQQ== + dependencies: + "@knev/bitlogr" "^0.2.1" + +"@ipsme/reflector-webbr-ws@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@ipsme/reflector-webbr-ws/-/reflector-webbr-ws-0.4.4.tgz#947cf1b25716183ae7bc2ee6b678623107d7d906" + integrity sha512-N5bR7hFPZfPJeS6t3xD6saLM2FuqtsIzPsyeqCGAnEoTWJImFecE4IoB9dxvpKeRMX6MPzh31FgdbuNdho1wcQ== + dependencies: + "@ipsme/msgcache-dedup" "^0.1.16" + "@ipsme/msgenv-broadcastchannel" "^0.3.2" + "@knev/bitlogr" "^0.2.2" + reconnecting-websocket "^4.4.0" + "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" @@ -741,6 +765,11 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@knev/bitlogr@^0.2.1", "@knev/bitlogr@^0.2.2": + version "0.2.12" + resolved "https://registry.yarnpkg.com/@knev/bitlogr/-/bitlogr-0.2.12.tgz#cf1197109ddce297d9d198a01bcaf0ce823f3411" + integrity sha512-AocpUk7s2MsV6/a1haYk8qTct/9EXCuuCMa6gPmX02GNLVnkat+zRIAuEANSFejX93cGHgKbgUVTLPAfAy7v8g== + "@matrix-org/olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz": version "3.2.8" resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz#8d53636d045e1776e2a2ec6613e57330dd9ce856" @@ -5531,6 +5560,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +reconnecting-websocket@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz#3b0e5b96ef119e78a03135865b8bb0af1b948783" + integrity sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng== + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" From 3c7e32cf3acef0c1eaef953a0b9e907a3058ca0f Mon Sep 17 00:00:00 2001 From: Robert Long Date: Wed, 8 Mar 2023 11:19:47 -0800 Subject: [PATCH 2/2] Format URI --- src/engine/ipsme/ipsme.main.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/engine/ipsme/ipsme.main.ts b/src/engine/ipsme/ipsme.main.ts index 92c3842a8..1749cc5b4 100644 --- a/src/engine/ipsme/ipsme.main.ts +++ b/src/engine/ipsme/ipsme.main.ts @@ -38,11 +38,15 @@ export const IPSMEModule = defineModule({ }); function onInteraction(_ctx: IMainThreadContext, message: InteractionMessage) { - if (message.interactableType === InteractableType.Portal && message.action === InteractableAction.Grab) { - publish({ - action: "OMI_link", - uri: message.uri, - }); + if ( + message.interactableType === InteractableType.Portal && + message.action === InteractableAction.Grab && + message.uri + ) { + const url = new URL(message.uri); + url.searchParams.set("referer", location.origin); + url.searchParams.set("dt", Date.now().toString()); + publish(url.href); location.href = "/"; } }