@bobfrankston/msger 0.1.74 → 0.1.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/KNOWN-BUGS.md +121 -0
  2. package/MSGER-API-SUMMARY.md +162 -0
  3. package/MSGER-API.md +376 -0
  4. package/README.md +93 -0
  5. package/SESSION-2025-11-06.md +191 -0
  6. package/SESSION-NOTES.md +678 -0
  7. package/clihandler.d.ts.map +1 -1
  8. package/clihandler.js +62 -2
  9. package/clihandler.js.map +1 -1
  10. package/clihandler.ts +60 -2
  11. package/icon.png +0 -0
  12. package/icon1.png +0 -0
  13. package/msger-native/Cargo.toml +1 -0
  14. package/msger-native/bin/msgernative.exe +0 -0
  15. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Breadcrumbs +12 -118
  16. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/BrowserMetrics/{BrowserMetrics-690552AF-DCD4.pma → BrowserMetrics-690B9AD3-657C.pma} +0 -0
  17. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/BrowserMetrics/{BrowserMetrics-69055373-F88C.pma → BrowserMetrics-690BA05A-501C.pma} +0 -0
  18. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Crashpad/settings.dat +0 -0
  19. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/BrowsingTopicsState +1 -1
  20. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/data_0 +0 -0
  21. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/data_1 +0 -0
  22. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/{BrowserMetrics/BrowserMetrics-69055587-A65C.pma → Default/Cache/Cache_Data/data_2} +0 -0
  23. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/data_3 +0 -0
  24. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000001 +383 -0
  25. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000002 +1091 -0
  26. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000003 +2153 -0
  27. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000004 +0 -0
  28. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000005 +626 -0
  29. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/f_000006 +393 -0
  30. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Cache/Cache_Data/index +0 -0
  31. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/01241693cfdc32b9_0 +0 -0
  32. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/0ba1eea781f3552c_0 +0 -0
  33. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/323aa210eebefe2c_0 +0 -0
  34. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/4608446ac118e77a_0 +0 -0
  35. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/6938205dc2f77841_0 +0 -0
  36. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/6de12299dc89e5f3_0 +0 -0
  37. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/8f403c112eaa455b_0 +0 -0
  38. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/9a3aceb491137f07_0 +0 -0
  39. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/aedb266cbaf9c28f_0 +0 -0
  40. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/ca526fdda86d0b9d_0 +0 -0
  41. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/f5d11d783c9fdf69_0 +0 -0
  42. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Code Cache/js/index-dir/the-real-index +0 -0
  43. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Collections/collectionsSQLite +0 -0
  44. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Collections/collectionsSQLite-journal +0 -0
  45. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DIPS +0 -0
  46. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnGraphiteCache/data_1 +0 -0
  47. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnGraphiteCache/index +0 -0
  48. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnWebGPUCache/data_1 +0 -0
  49. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnWebGPUCache/index +0 -0
  50. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Extension State/LOG +3 -3
  51. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Extension State/LOG.old +3 -3
  52. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Favicons +0 -0
  53. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/data_0 +0 -0
  54. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/data_1 +0 -0
  55. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/data_2 +0 -0
  56. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/index +0 -0
  57. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/History +0 -0
  58. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Local Storage/leveldb/000003.log +0 -0
  59. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Local Storage/leveldb/LOG +3 -3
  60. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Local Storage/leveldb/LOG.old +3 -3
  61. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/MediaDeviceSalts +0 -0
  62. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/MediaDeviceSalts-journal +0 -0
  63. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Network/Network Persistent State +1 -1
  64. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Network/TransportSecurity +1 -0
  65. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Preferences +1 -1
  66. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/CacheStorage/14e849fa8522d406112ea607cf7fd6342b71b987/249ee9af-c3df-4a86-89a8-2c51f3370ee0/index +0 -0
  67. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/CacheStorage/14e849fa8522d406112ea607cf7fd6342b71b987/249ee9af-c3df-4a86-89a8-2c51f3370ee0/index-dir/the-real-index +0 -0
  68. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/CacheStorage/14e849fa8522d406112ea607cf7fd6342b71b987/index.txt +0 -0
  69. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/000003.log +0 -0
  70. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/CURRENT +1 -0
  71. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/LOCK +0 -0
  72. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/LOG +3 -0
  73. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/LOG.old +3 -0
  74. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/Database/MANIFEST-000001 +0 -0
  75. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_0 +0 -0
  76. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_1 +0 -0
  77. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/ScriptCache/index +0 -0
  78. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Service Worker/ScriptCache/index-dir/the-real-index +0 -0
  79. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/000003.log +0 -0
  80. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/LOG +3 -3
  81. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/LOG.old +3 -3
  82. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Site Characteristics Database/000003.log +0 -0
  83. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Site Characteristics Database/LOG +3 -3
  84. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Site Characteristics Database/LOG.old +3 -3
  85. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/LOG +3 -3
  86. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/LOG.old +3 -3
  87. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/WebStorage/QuotaManager +0 -0
  88. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/WebStorage/QuotaManager-journal +0 -0
  89. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/favorites_diagnostic.log +27 -0
  90. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/000003.log +0 -0
  91. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/LOG +3 -3
  92. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/LOG.old +3 -3
  93. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/000003.log +0 -0
  94. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/LOG +3 -3
  95. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/LOG.old +3 -3
  96. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_0 +0 -0
  97. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_1 +0 -0
  98. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_3 +0 -0
  99. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/f_000003 +0 -0
  100. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/f_000004 +0 -0
  101. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/index +0 -0
  102. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GraphiteDawnCache/data_1 +0 -0
  103. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GraphiteDawnCache/index +0 -0
  104. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Local State +1 -1
  105. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/RevisitationBloomfilter +0 -0
  106. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/ShaderCache/data_1 +0 -0
  107. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/ShaderCache/index +0 -0
  108. package/msger-native/src/main.rs +343 -37
  109. package/msger-native/src/template.html +103 -28
  110. package/msger-storage-demo.html +290 -0
  111. package/msger.code-workspace +3 -0
  112. package/msgerdefs/README.md +122 -0
  113. package/msgerdefs/msgerdefs.d.ts +322 -0
  114. package/msgerdefs/msgerdefs.d.ts.map +1 -0
  115. package/msgerdefs/msgerdefs.js +110 -0
  116. package/msgerdefs/msgerdefs.js.map +1 -0
  117. package/msgerdefs/msgerdefs.ts +427 -0
  118. package/msgerdefs/package.json +38 -0
  119. package/msgerdefs/samples.html +431 -0
  120. package/msgerdefs/test1.cmd +1 -0
  121. package/msgerdefs/tsconfig.json +17 -0
  122. package/msgernative-linux-x64 +0 -0
  123. package/package.json +5 -1
  124. package/shower.d.ts +2 -0
  125. package/shower.d.ts.map +1 -1
  126. package/shower.js +17 -0
  127. package/shower.js.map +1 -1
  128. package/shower.ts +24 -0
  129. package/test-data-persistence.html +315 -0
  130. package/test-htmlfrom.html +29 -0
  131. package/test-ipc-reach.html +113 -0
  132. package/test-msger-api.html +120 -0
  133. package/test-msger-functions.html +325 -0
  134. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/BrowserMetrics/BrowserMetrics-69055419-C8A0.pma +0 -0
@@ -0,0 +1,431 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>msger Storage API Demo</title>
6
+ <style>
7
+ body {
8
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
9
+ padding: 30px;
10
+ max-width: 800px;
11
+ margin: 0 auto;
12
+ background: #f5f5f5;
13
+ }
14
+ h1 { color: #333; }
15
+ .info {
16
+ background: #e3f2fd;
17
+ border-left: 4px solid #0066cc;
18
+ padding: 15px;
19
+ margin: 20px 0;
20
+ border-radius: 4px;
21
+ }
22
+ .warning {
23
+ background: #fff3cd;
24
+ border-left: 4px solid #ffc107;
25
+ padding: 15px;
26
+ margin: 20px 0;
27
+ border-radius: 4px;
28
+ }
29
+ .section {
30
+ background: white;
31
+ padding: 20px;
32
+ margin: 20px 0;
33
+ border-radius: 8px;
34
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
35
+ }
36
+ input, textarea {
37
+ width: 100%;
38
+ padding: 10px;
39
+ margin: 5px 0;
40
+ border: 1px solid #ddd;
41
+ border-radius: 4px;
42
+ font-family: inherit;
43
+ box-sizing: border-box;
44
+ }
45
+ button {
46
+ padding: 10px 20px;
47
+ margin: 5px;
48
+ background: #0066cc;
49
+ color: white;
50
+ border: none;
51
+ border-radius: 4px;
52
+ cursor: pointer;
53
+ font-size: 14px;
54
+ }
55
+ button:hover { background: #0052a3; }
56
+ button.secondary { background: #6c757d; }
57
+ button.secondary:hover { background: #5a6268; }
58
+ .output {
59
+ background: #f8f9fa;
60
+ border: 1px solid #dee2e6;
61
+ border-radius: 4px;
62
+ padding: 15px;
63
+ margin: 10px 0;
64
+ font-family: 'Courier New', monospace;
65
+ font-size: 13px;
66
+ white-space: pre-wrap;
67
+ min-height: 60px;
68
+ }
69
+ code {
70
+ background: #f4f4f4;
71
+ padding: 2px 6px;
72
+ border-radius: 3px;
73
+ font-family: 'Courier New', monospace;
74
+ }
75
+ </style>
76
+ </head>
77
+ <body>
78
+ <h1>msger Storage API Demo</h1>
79
+
80
+ <div class="info">
81
+ <strong>✅ What Works:</strong> localStorage-based persistence API, F11 fullscreen toggle<br>
82
+ <strong>❌ What's Broken:</strong> All window controls via JavaScript (IPC crashes)<br>
83
+ <strong>🔧 How to Close:</strong> Click the X button (top-right corner) or press Alt+F4
84
+ </div>
85
+
86
+ <div class="warning">
87
+ <strong>⚠️ Window Controls Disabled</strong><br>
88
+ Due to a wry library bug, all window operations via JavaScript crash the app.
89
+ Configure window at startup using CLI flags: <code>-size 800,600 -title "My App"</code><br>
90
+ <strong>F11 Note:</strong> F11 now works using HTML5 Fullscreen API (press F11 to toggle, Esc to exit)
91
+ </div>
92
+
93
+ <!-- Data Storage -->
94
+ <div class="section">
95
+ <h2>Data Storage (Native localStorage)</h2>
96
+ <p><strong>Recommendation:</strong> Use native <code>localStorage</code> for compatibility. Works in any browser context, not just msger.</p>
97
+ <p>The msger storage API is just a thin convenience wrapper around localStorage - native API is preferred.</p>
98
+ <input type="text" id="key" value="myData" placeholder="Storage key">
99
+ <textarea id="value" rows="3" placeholder="Enter text, JSON, numbers...">Hello from msger!</textarea>
100
+ <div>
101
+ <button onclick="saveData()">Save (using native localStorage)</button>
102
+ <button onclick="saveComplexData()">Save Complex Object</button>
103
+ <button onclick="loadData()">Load Data</button>
104
+ <button onclick="removeData()" class="secondary">Remove Data</button>
105
+ </div>
106
+ <div id="output1" class="output">Try saving simple text or complex objects</div>
107
+ </div>
108
+
109
+ <!-- List All Data -->
110
+ <div class="section">
111
+ <h2>Manage Storage</h2>
112
+ <button onclick="listAll()">List All Saved Data</button>
113
+ <button onclick="clearAll()" class="secondary">Clear All msger Data</button>
114
+ <div id="output3" class="output">Click to list or clear data</div>
115
+ </div>
116
+
117
+ <!-- Window Controls (Broken) -->
118
+ <div class="section">
119
+ <h2>Window Controls (⚠️ Currently Broken)</h2>
120
+ <p>These buttons demonstrate the broken IPC window controls. They will log errors but not crash.</p>
121
+ <button onclick="tryOK()" style="background: #dc3545;">Try OK (Logs Error)</button>
122
+ <button onclick="tryCancel()" style="background: #dc3545;" class="secondary">Try Cancel (Logs Error)</button>
123
+ <button onclick="tryClose()" style="background: #dc3545;" class="secondary">Try Close (Logs Error)</button>
124
+ <div id="outputControls" class="output">Click any button to see why window controls don't work</div>
125
+ <p style="font-size: 12px; color: #666; margin-top: 10px;">
126
+ <strong>Why broken:</strong> wry 0.47.2 has a bug where window.ipc.postMessage() crashes with "InvalidUri" error.<br>
127
+ <strong>Workarounds:</strong> Use CLI flags (-size, -title), F11 for fullscreen, X button to close, or Alt+F4.
128
+ </p>
129
+ </div>
130
+
131
+ <!-- Download Files -->
132
+ <div class="section">
133
+ <h2>Download Files (Browser Blob API)</h2>
134
+ <p>Download content as a file using the browser's standard Blob + download API. No msger API needed - this is just a standard web feature!</p>
135
+ <input type="text" id="filename" value="document.txt" placeholder="Filename">
136
+ <textarea id="filecontent" rows="5" placeholder="Content to download...">This is sample text that can be downloaded to your file system.</textarea>
137
+ <div>
138
+ <button onclick="downloadFile()">Download File</button>
139
+ </div>
140
+ <div id="output4" class="output">Click to download as a file to your computer</div>
141
+ </div>
142
+
143
+ <!-- Storage Location Info -->
144
+ <div class="section">
145
+ <h2>Storage Location & PWA Support</h2>
146
+ <p><strong>localStorage is saved to:</strong></p>
147
+ <code>%LOCALAPPDATA%\Microsoft\Edge\User Data\WebView2\Default\Local Storage\leveldb\</code>
148
+ <p style="margin-top: 10px; font-size: 13px;">
149
+ Data persists across sessions and survives app restarts.
150
+ Each URL origin has its own storage partition.
151
+ </p>
152
+ <button onclick="showStorageInfo()">Show Storage Info</button>
153
+ <div id="output5" class="output">Click to see current storage info</div>
154
+
155
+ <h3 style="margin-top: 20px;">PWA Support ✅</h3>
156
+ <p style="font-size: 13px;">
157
+ msger supports Progressive Web Apps loaded via <code>-url</code>:
158
+ </p>
159
+ <ul style="font-size: 13px;">
160
+ <li>✅ <strong>Service Workers</strong> - Background sync, offline support</li>
161
+ <li>✅ <strong>IndexedDB</strong> - Large data storage (GBs)</li>
162
+ <li>✅ <strong>Cache API</strong> - Offline assets</li>
163
+ <li>✅ <strong>localStorage/sessionStorage</strong> - Simple key-value storage</li>
164
+ <li>✅ <strong>Web Manifest</strong> - App metadata</li>
165
+ <li>❌ <strong>Push Notifications</strong> - Platform dependent</li>
166
+ <li>❌ <strong>"Install" UI</strong> - Already native window</li>
167
+ </ul>
168
+ <p style="font-size: 12px; color: #666;">
169
+ Example: <code>node cli.js -url https://your-pwa.app -detach</code>
170
+ </p>
171
+ </div>
172
+
173
+ <script>
174
+ // Check if msger API is available (wait for it to be injected)
175
+ window.addEventListener('DOMContentLoaded', function() {
176
+ const hasMsger = typeof window.msger !== 'undefined';
177
+ console.log('msger API available:', hasMsger);
178
+ if (!hasMsger) {
179
+ console.error('WARNING: msger API not found!');
180
+ console.error('Try opening DevTools (F12) and check if window.msger exists');
181
+ } else {
182
+ console.log('msger API methods:', Object.keys(window.msger));
183
+ }
184
+ });
185
+
186
+ // F11 key handler - use HTML5 Fullscreen API
187
+ // WebView2 intercepts keyboard before Rust window handler, so we handle it here
188
+ document.addEventListener('keydown', function(e) {
189
+ console.log('Key pressed:', e.key, 'Code:', e.code);
190
+
191
+ if (e.key === 'F11' || e.code === 'F11') {
192
+ console.log('F11 detected! Current fullscreen element:', document.fullscreenElement);
193
+ console.log('Fullscreen API available:', !!document.documentElement.requestFullscreen);
194
+ e.preventDefault();
195
+
196
+ // Toggle fullscreen using HTML5 API
197
+ if (!document.fullscreenElement) {
198
+ // Enter fullscreen
199
+ console.log('Attempting to enter fullscreen...');
200
+ if (document.documentElement.requestFullscreen) {
201
+ document.documentElement.requestFullscreen().then(() => {
202
+ console.log('✅ Fullscreen entered successfully!');
203
+ }).catch(err => {
204
+ console.error('❌ Failed to enter fullscreen:', err);
205
+ console.error('Error name:', err.name, 'Message:', err.message);
206
+ });
207
+ } else {
208
+ console.error('❌ requestFullscreen() not available in this environment');
209
+ }
210
+ } else {
211
+ // Exit fullscreen
212
+ console.log('Attempting to exit fullscreen...');
213
+ document.exitFullscreen().then(() => {
214
+ console.log('✅ Exited fullscreen successfully!');
215
+ }).catch(err => {
216
+ console.error('❌ Failed to exit fullscreen:', err);
217
+ });
218
+ }
219
+ } else if (e.key === 'Escape' && document.fullscreenElement) {
220
+ // Esc exits fullscreen first
221
+ console.log('Esc in fullscreen - exiting...');
222
+ e.preventDefault();
223
+ document.exitFullscreen();
224
+ }
225
+ });
226
+
227
+ function log(id, msg, color = '#4ec9b0') {
228
+ document.getElementById(id).textContent = msg;
229
+ }
230
+
231
+ // Data Storage
232
+ function saveData() {
233
+ const key = document.getElementById('key').value;
234
+ const value = document.getElementById('value').value;
235
+ const data = {
236
+ value: value,
237
+ savedAt: new Date().toISOString(),
238
+ savedTimestamp: Date.now()
239
+ };
240
+ msger.saveData(key, data);
241
+ log('output1', `✅ Saved Simple Data!\nKey: ${key}\nValue: ${value}\nTime: ${data.savedAt}\n\nData persists across restarts!`);
242
+ }
243
+
244
+ function saveComplexData() {
245
+ const key = document.getElementById('key').value;
246
+ const complexObject = {
247
+ userInput: document.getElementById('value').value,
248
+ metadata: {
249
+ theme: 'dark',
250
+ fontSize: 14,
251
+ language: 'en'
252
+ },
253
+ preferences: {
254
+ notifications: { email: true, push: false },
255
+ recentFiles: ['doc1.txt', 'notes.md', 'data.json']
256
+ },
257
+ savedAt: new Date().toISOString(),
258
+ savedTimestamp: Date.now()
259
+ };
260
+ msger.saveData(key, complexObject);
261
+ log('output1', `✅ Saved Complex Object!\nKey: ${key}\n\n${JSON.stringify(complexObject, null, 2)}\n\nShows you can save nested objects, arrays, etc.`);
262
+ }
263
+
264
+ function loadData() {
265
+ const key = document.getElementById('key').value;
266
+ const data = msger.loadData(key, null);
267
+ if (data) {
268
+ if (data.value) {
269
+ // Simple data
270
+ const age = Math.floor((Date.now() - data.savedTimestamp) / 1000);
271
+ log('output1', `✅ Loaded Simple Data!\nKey: ${key}\nValue: ${data.value}\nSaved: ${data.savedAt}\nAge: ${age} seconds ago`);
272
+ document.getElementById('value').value = data.value;
273
+ } else {
274
+ // Complex data
275
+ const age = Math.floor((Date.now() - data.savedTimestamp) / 1000);
276
+ log('output1', `✅ Loaded Complex Data!\nKey: ${key}\nAge: ${age} seconds ago\n\n${JSON.stringify(data, null, 2)}`);
277
+ document.getElementById('value').value = data.userInput || '(complex object loaded)';
278
+ }
279
+ } else {
280
+ log('output1', `❌ Key "${key}" not found`);
281
+ }
282
+ }
283
+
284
+ function removeData() {
285
+ const key = document.getElementById('key').value;
286
+ msger.removeData(key);
287
+ log('output1', `✅ Removed key: ${key}`);
288
+ }
289
+
290
+ // List All
291
+ function listAll() {
292
+ const allKeys = Object.keys(localStorage);
293
+ const msgerKeys = allKeys.filter(k => k.startsWith('msger_'));
294
+ if (msgerKeys.length === 0) {
295
+ log('output3', `No msger data found. Save something first!`);
296
+ return;
297
+ }
298
+ let output = `Found ${msgerKeys.length} items:\n\n`;
299
+ msgerKeys.forEach(key => {
300
+ const displayKey = key.replace('msger_', '');
301
+ const data = msger.loadData(displayKey, null);
302
+ if (data && data.savedAt) {
303
+ const age = Math.floor((Date.now() - data.savedTimestamp) / 1000);
304
+ output += `📄 ${displayKey} (${age}s ago)\n`;
305
+ } else {
306
+ output += `📄 ${displayKey}\n`;
307
+ }
308
+ });
309
+ log('output3', output);
310
+ }
311
+
312
+ function clearAll() {
313
+ if (confirm('Clear all msger data?')) {
314
+ msger.clearData();
315
+ log('output3', `✅ All msger data cleared!`);
316
+ }
317
+ }
318
+
319
+ // Window Controls (demonstrate broken IPC)
320
+ function tryOK() {
321
+ const outputEl = document.getElementById('outputControls');
322
+ outputEl.textContent = '⏳ Attempting msger.close("OK")...\n\nThis will fail because window.ipc.postMessage() crashes in wry 0.47.2.';
323
+
324
+ console.log('Attempting msger.close("OK")');
325
+ const result = msger.close('OK');
326
+
327
+ if (!result) {
328
+ outputEl.textContent = '❌ msger.close("OK") failed!\n\nThe function returned false and logged an error to console.\nCheck DevTools (F12) → Console to see the error message.\n\n✅ Good news: It didn\'t crash! (Error handling worked)';
329
+ }
330
+ }
331
+
332
+ function tryCancel() {
333
+ const outputEl = document.getElementById('outputControls');
334
+ outputEl.textContent = '⏳ Attempting msger.close("Cancel")...\n\nThis will fail because IPC is broken.';
335
+
336
+ console.log('Attempting msger.close("Cancel")');
337
+ const result = msger.close('Cancel');
338
+
339
+ if (!result) {
340
+ outputEl.textContent = '❌ msger.close("Cancel") failed!\n\nSame issue as OK button - IPC is broken.\nTo actually close the window: Click X button or press Alt+F4.';
341
+ }
342
+ }
343
+
344
+ function tryClose() {
345
+ const outputEl = document.getElementById('outputControls');
346
+ outputEl.textContent = '⏳ Attempting msger.close()...\n\nLet\'s see what happens...';
347
+
348
+ console.log('Attempting msger.close()');
349
+ const result = msger.close();
350
+
351
+ if (!result) {
352
+ outputEl.textContent = '❌ msger.close() failed too!\n\nAll window control methods are disabled due to the wry bug.\n\n📋 Workarounds:\n• X button (top-right)\n• Alt+F4\n• Configure at startup with CLI flags';
353
+ }
354
+ }
355
+
356
+ // Download Files
357
+ function downloadFile() {
358
+ const filename = document.getElementById('filename').value;
359
+ const content = document.getElementById('filecontent').value;
360
+
361
+ // Create a Blob from the content
362
+ const blob = new Blob([content], { type: 'text/plain' });
363
+ const url = URL.createObjectURL(blob);
364
+
365
+ // Create temporary download link and click it
366
+ const a = document.createElement('a');
367
+ a.href = url;
368
+ a.download = filename;
369
+ a.click();
370
+
371
+ // Clean up
372
+ URL.revokeObjectURL(url);
373
+
374
+ log('output4', `✅ Downloaded: ${filename}\nSize: ${content.length} bytes\n\nThis uses the browser's standard Blob + download API.`);
375
+ }
376
+
377
+ // Storage Info
378
+ function showStorageInfo() {
379
+ let info = '=== Storage Information ===\n\n';
380
+ info += `Current URL: ${window.location.href}\n`;
381
+ info += `Origin: ${window.location.origin}\n\n`;
382
+
383
+ // Check available storage APIs
384
+ info += '--- Available APIs ---\n';
385
+ info += `localStorage: ${typeof localStorage !== 'undefined' ? '✅' : '❌'}\n`;
386
+ info += `sessionStorage: ${typeof sessionStorage !== 'undefined' ? '✅' : '❌'}\n`;
387
+ info += `IndexedDB: ${typeof indexedDB !== 'undefined' ? '✅' : '❌'}\n`;
388
+ info += `Service Workers: ${typeof navigator.serviceWorker !== 'undefined' ? '✅' : '❌'}\n`;
389
+ info += `Cache API: ${typeof caches !== 'undefined' ? '✅' : '❌'}\n\n`;
390
+
391
+ // Storage usage
392
+ if (navigator.storage && navigator.storage.estimate) {
393
+ navigator.storage.estimate().then(estimate => {
394
+ const used = (estimate.usage / 1024 / 1024).toFixed(2);
395
+ const quota = (estimate.quota / 1024 / 1024).toFixed(2);
396
+ info += `--- Storage Quota ---\n`;
397
+ info += `Used: ${used} MB\n`;
398
+ info += `Quota: ${quota} MB\n\n`;
399
+
400
+ // Count msger keys
401
+ const msgerKeys = Object.keys(localStorage).filter(k => k.startsWith('msger_'));
402
+ info += `--- msger Data ---\n`;
403
+ info += `Keys: ${msgerKeys.length}\n`;
404
+
405
+ log('output5', info);
406
+ });
407
+ } else {
408
+ // Count msger keys
409
+ const msgerKeys = Object.keys(localStorage).filter(k => k.startsWith('msger_'));
410
+ info += `--- msger Data ---\n`;
411
+ info += `Keys: ${msgerKeys.length}\n`;
412
+ info += `\nStorage location on disk:\n`;
413
+ info += `%LOCALAPPDATA%\\Microsoft\\Edge\\User Data\\WebView2\\Default\\Local Storage\\leveldb\\`;
414
+
415
+ log('output5', info);
416
+ }
417
+ }
418
+
419
+ // Auto-load on startup
420
+ window.addEventListener('load', function() {
421
+ // Check for persisted data
422
+ const testKey = document.getElementById('key').value;
423
+ const data = msger.loadData(testKey, null);
424
+ if (data) {
425
+ log('output1', `✅ Found persisted data! Click "Load Data" to see it.`);
426
+ listAll();
427
+ }
428
+ });
429
+ </script>
430
+ </body>
431
+ </html>
@@ -0,0 +1 @@
1
+ node y:\dev\utils\msger -html "<h1>Hello</h2>"
@@ -0,0 +1,17 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "ES2020",
5
+ "lib": ["ES2020", "DOM"],
6
+ "declaration": true,
7
+ "outDir": ".",
8
+ "rootDir": ".",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "moduleResolution": "node"
14
+ },
15
+ "include": ["msgerdefs.ts"],
16
+ "exclude": ["node_modules"]
17
+ }
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/msger",
3
- "version": "0.1.74",
3
+ "version": "0.1.76",
4
4
  "description": "Fast, lightweight, cross-platform message box - Rust-powered alternative to msgview",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -45,6 +45,10 @@
45
45
  ],
46
46
  "author": "Bob Frankston",
47
47
  "license": "ISC",
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "https://github.com/BobFrankston/msger.git"
51
+ },
48
52
  "publishConfig": {
49
53
  "access": "public"
50
54
  },
package/shower.d.ts CHANGED
@@ -22,6 +22,8 @@ export interface MessageBoxOptions {
22
22
  timeout?: number; /** Auto-close the message box after specified seconds */
23
23
  detach?: boolean; /** Launch the message box detached from parent process */
24
24
  fullscreen?: boolean; /** Start window in fullscreen mode (F11 to toggle, Escape to exit) */
25
+ icon?: string; /** Path to window icon (PNG file). Default: icon.png in current directory */
26
+ dev?: boolean; /** Open DevTools automatically on startup (default: false) */
25
27
  debug?: boolean; /** Return debug information (HTML, size) in result (default: false) */
26
28
  }
27
29
  export interface MessageBoxResult {
package/shower.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shower.d.ts","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAW,uDAAuD;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,8EAA8E;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,iDAAiD;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC,CAAa,0DAA0D;IAEpF,IAAI,CAAC,EAAE;QACH,KAAK,EAAE,MAAM,CAAC,CAAQ,mBAAmB;QACzC,MAAM,EAAE,MAAM,CAAC,CAAO,oBAAoB;KAC7C,CAAC;IACF,GAAG,CAAC,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,MAAM,CAAC,EAAE,MAAM,CAAC,CAAM,8EAA8E;KACvG,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC,CAAK,0EAA0E;IACpG,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAO,kEAAkE;IAC5F,WAAW,CAAC,EAAE,OAAO,CAAC,CAAI,2DAA2D;IACrF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAO,0DAA0D;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC,CAAI,4DAA4D;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,wDAAwD;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,gEAAgE;IAE1F,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,yDAAyD;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC,CAAS,0DAA0D;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,sEAAsE;IAChG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAU,uEAAuE;CACpG;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACrB,CAAC;CACL;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqJ1F"}
1
+ {"version":3,"file":"shower.d.ts","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAW,uDAAuD;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,8EAA8E;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,iDAAiD;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC,CAAa,0DAA0D;IAEpF,IAAI,CAAC,EAAE;QACH,KAAK,EAAE,MAAM,CAAC,CAAQ,mBAAmB;QACzC,MAAM,EAAE,MAAM,CAAC,CAAO,oBAAoB;KAC7C,CAAC;IACF,GAAG,CAAC,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,MAAM,CAAC,EAAE,MAAM,CAAC,CAAM,8EAA8E;KACvG,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC,CAAK,0EAA0E;IACpG,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAO,kEAAkE;IAC5F,WAAW,CAAC,EAAE,OAAO,CAAC,CAAI,2DAA2D;IACrF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAO,0DAA0D;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC,CAAI,4DAA4D;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,wDAAwD;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,gEAAgE;IAE1F,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,yDAAyD;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC,CAAS,0DAA0D;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,sEAAsE;IAChG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,6EAA6E;IACvG,GAAG,CAAC,EAAE,OAAO,CAAC,CAAY,8DAA8D;IACxF,KAAK,CAAC,EAAE,OAAO,CAAC,CAAU,uEAAuE;CACpG;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACrB,CAAC;CACL;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0K1F"}
package/shower.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { spawn } from 'child_process';
2
2
  import { platform } from 'os';
3
3
  import path from 'path';
4
+ import { pathToFileURL } from 'url';
4
5
  import fs from 'fs';
5
6
  import AnsiToHtml from 'ansi-to-html';
6
7
  /**
@@ -112,6 +113,22 @@ export async function showMessageBox(options) {
112
113
  delete optionsToSend.message;
113
114
  }
114
115
  }
116
+ // Convert URL to absolute file:// URL if it's a file path
117
+ if (optionsToSend.url && !optionsToSend.url.startsWith('http://') && !optionsToSend.url.startsWith('https://') && !optionsToSend.url.startsWith('file://')) {
118
+ // It's a file path, convert to absolute file:// URL
119
+ // Resolve to absolute path (handles both / and \ separators)
120
+ const absolutePath = path.resolve(optionsToSend.url);
121
+ // Check if file exists
122
+ if (!fs.existsSync(absolutePath)) {
123
+ throw new Error(`File not found: ${absolutePath}`);
124
+ }
125
+ // Convert to file:// URL and normalize for Windows
126
+ let fileUrl = pathToFileURL(absolutePath).href;
127
+ // Ensure proper URL encoding
128
+ optionsToSend.url = fileUrl;
129
+ // Debug logging (uncomment if needed)
130
+ // console.error(`[DEBUG] Path conversion: ${optionsToSend.url} → ${absolutePath} → ${fileUrl}`);
131
+ }
115
132
  // Flatten size object for Rust binary (expects width/height as top-level fields)
116
133
  const rustOptions = { ...optionsToSend };
117
134
  if (rustOptions.size) {
package/shower.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shower.js","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shower.js","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"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"}
package/shower.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { spawn } from 'child_process';
2
2
  import { platform } from 'os';
3
3
  import path from 'path';
4
+ import { pathToFileURL } from 'url';
4
5
  import fs from 'fs';
5
6
  import AnsiToHtml from 'ansi-to-html';
6
7
 
@@ -31,6 +32,8 @@ export interface MessageBoxOptions {
31
32
  timeout?: number; /** Auto-close the message box after specified seconds */
32
33
  detach?: boolean; /** Launch the message box detached from parent process */
33
34
  fullscreen?: boolean; /** Start window in fullscreen mode (F11 to toggle, Escape to exit) */
35
+ icon?: string; /** Path to window icon (PNG file). Default: icon.png in current directory */
36
+ dev?: boolean; /** Open DevTools automatically on startup (default: false) */
34
37
  debug?: boolean; /** Return debug information (HTML, size) in result (default: false) */
35
38
  }
36
39
 
@@ -173,6 +176,27 @@ export async function showMessageBox(options: MessageBoxOptions): Promise<Messag
173
176
  }
174
177
  }
175
178
 
179
+ // Convert URL to absolute file:// URL if it's a file path
180
+ if (optionsToSend.url && !optionsToSend.url.startsWith('http://') && !optionsToSend.url.startsWith('https://') && !optionsToSend.url.startsWith('file://')) {
181
+ // It's a file path, convert to absolute file:// URL
182
+ // Resolve to absolute path (handles both / and \ separators)
183
+ const absolutePath = path.resolve(optionsToSend.url);
184
+
185
+ // Check if file exists
186
+ if (!fs.existsSync(absolutePath)) {
187
+ throw new Error(`File not found: ${absolutePath}`);
188
+ }
189
+
190
+ // Convert to file:// URL and normalize for Windows
191
+ let fileUrl = pathToFileURL(absolutePath).href;
192
+
193
+ // Ensure proper URL encoding
194
+ optionsToSend.url = fileUrl;
195
+
196
+ // Debug logging (uncomment if needed)
197
+ // console.error(`[DEBUG] Path conversion: ${optionsToSend.url} → ${absolutePath} → ${fileUrl}`);
198
+ }
199
+
176
200
  // Flatten size object for Rust binary (expects width/height as top-level fields)
177
201
  const rustOptions: any = { ...optionsToSend };
178
202
  if (rustOptions.size) {