@@ -4,6 +4,7 @@ import wslink from "./core/wslink";
44import { handlePageResources , loadScript } from "./core/trame/setup" ;
55import { createTrameInstance } from "./core/trame" ;
66import { registerUserScripts } from "./user_script_handler" ;
7+ import { createMessageChannelWSFactory } from "./messageChannel" ;
78import TrameUse from "./use" ;
89
910const { createApp } = window . Vue ;
@@ -12,7 +13,7 @@ async function start() {
1213 // Check if we need to override websocket
1314 try {
1415 // Can throw exception if parent is cross-origin
15- if ( window ?. parent ?. trameJupyter ?. init ) {
16+ if ( ! window . WSLINK && window ?. parent ?. trameJupyter ?. init ) {
1617 window . WSLINK = window . parent . trameJupyter . init ( window ) ;
1718 }
1819 } catch ( e ) {
@@ -123,11 +124,31 @@ async function start() {
123124 registerUserScripts ( ) ;
124125}
125126
127+ const urlParams = vtkURLExtract . extractURLParameters ( ) ;
126128// Initialize service worker to override headers for SharedArrayBuffer
127129// > Cross-Origin-Opener-Policy: same-origin
128130// > Cross-Origin-Embedder-Policy: require-corp
129- if ( vtkURLExtract . extractURLParameters ( ) . enableSharedArrayBufferServiceWorker ) {
131+ if ( urlParams . enableSharedArrayBufferServiceWorker ) {
130132 loadScript ( "coi-serviceworker.min.js" ) ;
131133}
132134
133- start ( ) ;
135+ if ( urlParams . wsChannel ) {
136+ window . addEventListener ( "message" , ( event ) => {
137+ // Waiting for message initializing channel communication
138+ // for websocket proxying
139+ if ( event . data !== "trame-ws-channel-init" ) {
140+ // not for us! skip
141+ return ;
142+ }
143+
144+ // Grab communication port and register fake WebSocket
145+ window . WSLINK = {
146+ createWebSocket : createMessageChannelWSFactory ( event . ports [ 0 ] ) ,
147+ } ;
148+
149+ // Start trame client
150+ start ( ) ;
151+ } ) ;
152+ } else {
153+ start ( ) ;
154+ }
0 commit comments