@@ -5,11 +5,12 @@ keepassClient.keySize = 24;
55keepassClient . messageTimeout = 500 ; // Milliseconds
66keepassClient . nativeHostName = 'org.keepassxc.keepassxc_browser' ;
77keepassClient . nativePort = null ;
8+ keepassClient . webSocket = null ;
89
910const kpErrors = {
1011 UNKNOWN_ERROR : 0 ,
1112 DATABASE_NOT_OPENED : 1 ,
12- DATABASE_HASH_NOT_RECEIVED : 2 ,
13+ DATABASE_HASH_NOT_RECEIVED : 2 ,
1314 CLIENT_PUBLIC_KEY_NOT_RECEIVED : 3 ,
1415 CANNOT_DECRYPT_MESSAGE : 4 ,
1516 TIMEOUT_OR_NOT_CONNECTED : 5 ,
@@ -157,7 +158,10 @@ class Message {
157158//--------------------------------------------------------------------------
158159
159160keepassClient . sendNativeMessage = async function ( request , enableTimeout = false , timeoutValue ) {
160- if ( ! keepassClient . nativePort ) {
161+ if ( page ?. settings ?. connectionMethod === ConnectionMethod . WEBSOCKET && ! keepassClient . webSocket ) {
162+ logError ( 'No WebSocket defined.' ) ;
163+ return ;
164+ } else if ( page ?. settings ?. connectionMethod === ConnectionMethod . NATIVE_MESSAGING && ! keepassClient . nativePort ) {
161165 logError ( 'No native messaging port defined.' ) ;
162166 return ;
163167 }
@@ -167,7 +171,11 @@ keepassClient.sendNativeMessage = async function(request, enableTimeout = false,
167171 messageBuffer . addMessage ( message ) ;
168172 } ) ;
169173
170- keepassClient . nativePort . postMessage ( request ) ;
174+ if ( page ?. settings ?. connectionMethod === ConnectionMethod . WEBSOCKET ) {
175+ keepassClient . webSocket . send ( JSON . stringify ( request ) ) ;
176+ } else {
177+ keepassClient . nativePort . postMessage ( request ) ;
178+ }
171179
172180 const response = await message . promise ;
173181
@@ -400,7 +408,7 @@ function onDisconnected() {
400408 page . clearAllLogins ( ) ;
401409 keepass . updatePopup ( 'cross' ) ;
402410 keepass . updateDatabaseHashToContent ( ) ;
403- logError ( `Failed to connect: ${ ( browser . runtime . lastError === null ? 'Unknown error' : browser . runtime . lastError . message ) } ` ) ;
411+ logError ( `Failed to connect: ${ ( browser . runtime . lastError === null ? 'Unknown error' : browser . runtime . lastError ? .message ) } ` ) ;
404412}
405413
406414keepassClient . onNativeMessage = function ( response ) {
@@ -413,3 +421,42 @@ keepassClient.onNativeMessage = function(response) {
413421 // Generic response handling
414422 keepassClient . handleNativeMessage ( response ) ;
415423} ;
424+
425+ //--------------------------------------------------------------------------
426+ // WebSocket related
427+ //--------------------------------------------------------------------------
428+
429+ keepassClient . connectToWebSocket = async function ( ) {
430+ return new Promise ( ( resolve , reject ) => {
431+ if ( keepassClient . webSocket ) {
432+ keepassClient . webSocket . close ( ) ;
433+ }
434+
435+ console . log ( `${ EXTENSION_NAME } : Connecting to WebSocket` ) ;
436+
437+ try {
438+ keepassClient . webSocket = new WebSocket ( 'ws://localhost:7580' ) ;
439+ keepassClient . webSocket . addEventListener ( 'close' , ( event ) => {
440+ logError ( 'Close WebSocket:' , event ) ;
441+ onDisconnected ( ) ;
442+ reject ( ) ;
443+ } ) ;
444+ keepassClient . webSocket . addEventListener ( 'error' , ( event ) => {
445+ logError ( 'WebSocket error:' , event ) ;
446+ onDisconnected ( ) ;
447+ reject ( ) ;
448+ } ) ;
449+ keepassClient . webSocket . addEventListener ( 'message' , ( event ) => {
450+ keepassClient . onNativeMessage ( JSON . parse ( event ?. data ) ) ;
451+ } ) ;
452+ keepassClient . webSocket . addEventListener ( 'open' , ( event ) => {
453+ console . log ( `${ EXTENSION_NAME } : WebSocket connected` ) ;
454+ keepass . isConnected = true ;
455+ resolve ( ) ;
456+ } ) ;
457+ } catch ( e ) {
458+ keepassClient . webSocket = null ;
459+ onDisconnected ( ) ;
460+ }
461+ } ) ;
462+ } ;
0 commit comments