@@ -120,6 +120,13 @@ function initElements() {
120120 elements . addRelayBtn = $ ( 'add-relay-btn' ) ;
121121 // Permissions view
122122 elements . permissionsList = $ ( 'permissions-list' ) ;
123+ // Bunker server
124+ elements . bunkerSrvReady = $ ( 'bunker-srv-ready' ) ;
125+ elements . bunkerSrvActive = $ ( 'bunker-srv-active' ) ;
126+ elements . bunkerSrvUri = $ ( 'bunker-srv-uri' ) ;
127+ elements . btnBunkerSrvStart = $ ( 'btn-bunker-srv-start' ) ;
128+ elements . btnBunkerSrvCopy = $ ( 'btn-bunker-srv-copy' ) ;
129+ elements . btnBunkerSrvStop = $ ( 'btn-bunker-srv-stop' ) ;
123130 // Settings view buttons
124131 elements . openSettingsBtn = $ ( 'open-settings-btn' ) ;
125132 elements . openHistoryBtn = $ ( 'open-history-btn' ) ;
@@ -1019,6 +1026,7 @@ async function loadPermissionsView() {
10191026 state . permissions = [ ] ;
10201027 renderPermissionsList ( ) ;
10211028 }
1029+ checkBunkerServerStatus ( ) ;
10221030}
10231031
10241032function renderPermissionsList ( ) {
@@ -1035,6 +1043,59 @@ function renderPermissionsList() {
10351043 ` ) . join ( '' ) ;
10361044}
10371045
1046+ // Bunker server UI
1047+ async function checkBunkerServerStatus ( ) {
1048+ try {
1049+ const status = await api . runtime . sendMessage ( { kind : 'bunkerServer.status' } ) ;
1050+ if ( status && status . active ) {
1051+ elements . bunkerSrvReady . style . display = 'none' ;
1052+ elements . bunkerSrvActive . style . display = '' ;
1053+ elements . bunkerSrvUri . textContent = status . uri || '' ;
1054+ } else {
1055+ elements . bunkerSrvReady . style . display = '' ;
1056+ elements . bunkerSrvActive . style . display = 'none' ;
1057+ }
1058+ } catch {
1059+ // Extension may not support it yet
1060+ }
1061+ }
1062+
1063+ async function startBunkerServer ( ) {
1064+ elements . btnBunkerSrvStart . disabled = true ;
1065+ elements . btnBunkerSrvStart . textContent = 'Creating\u2026' ;
1066+ try {
1067+ const result = await api . runtime . sendMessage ( {
1068+ kind : 'bunkerServer.start' ,
1069+ payload : { relayUrls : [ 'wss://relay.nostrkey.com' ] } ,
1070+ } ) ;
1071+ if ( ! result || ! result . success ) throw new Error ( result ?. error || 'Failed' ) ;
1072+ elements . bunkerSrvUri . textContent = result . uri ;
1073+ elements . bunkerSrvReady . style . display = 'none' ;
1074+ elements . bunkerSrvActive . style . display = '' ;
1075+ } catch ( e ) {
1076+ console . error ( 'Bunker start error:' , e ) ;
1077+ }
1078+ elements . btnBunkerSrvStart . disabled = false ;
1079+ elements . btnBunkerSrvStart . textContent = 'Create Bunker URL' ;
1080+ }
1081+
1082+ async function stopBunkerServer ( ) {
1083+ try {
1084+ await api . runtime . sendMessage ( { kind : 'bunkerServer.stop' } ) ;
1085+ } catch { }
1086+ elements . bunkerSrvActive . style . display = 'none' ;
1087+ elements . bunkerSrvReady . style . display = '' ;
1088+ }
1089+
1090+ function copyBunkerUri ( ) {
1091+ const uri = elements . bunkerSrvUri . textContent ;
1092+ if ( ! uri ) return ;
1093+ navigator . clipboard . writeText ( uri ) . then ( ( ) => {
1094+ elements . btnBunkerSrvCopy . textContent = 'Copied!' ;
1095+ setTimeout ( ( ) => { elements . btnBunkerSrvCopy . textContent = 'Copy' ; } , 1500 ) ;
1096+ } ) ;
1097+ }
1098+
10381099// Event bindings
10391100function bindEvents ( ) {
10401101 elements . unlockForm . addEventListener ( 'submit' , async ( e ) => {
@@ -1167,6 +1228,17 @@ function bindEvents() {
11671228 } ) ;
11681229 }
11691230
1231+ // Bunker server
1232+ if ( elements . btnBunkerSrvStart ) {
1233+ elements . btnBunkerSrvStart . addEventListener ( 'click' , startBunkerServer ) ;
1234+ }
1235+ if ( elements . btnBunkerSrvStop ) {
1236+ elements . btnBunkerSrvStop . addEventListener ( 'click' , stopBunkerServer ) ;
1237+ }
1238+ if ( elements . btnBunkerSrvCopy ) {
1239+ elements . btnBunkerSrvCopy . addEventListener ( 'click' , copyBunkerUri ) ;
1240+ }
1241+
11701242 // Vault unlock form
11711243 if ( elements . vaultUnlockForm ) {
11721244 elements . vaultUnlockForm . addEventListener ( 'submit' , async ( e ) => {
0 commit comments