webview.io 1.0.0 → 1.0.1
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.
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/src/index.ts +28 -21
package/dist/index.js
CHANGED
|
@@ -504,7 +504,7 @@ var WIO = /** @class */ (function () {
|
|
|
504
504
|
* Sets up the EMBEDDED side of the bridge
|
|
505
505
|
*/
|
|
506
506
|
WIO.prototype.getInjectedJavaScript = function () {
|
|
507
|
-
return "\n (function() {\n const RESERVED_EVENTS = ['ping', 'pong', '__heartbeat', '__heartbeat_response'];\n \n window._wio = {\n type: 'EMBEDDED',\n connected: false,\n Events: {},\n messageQueue: [],\n \n ackId: function(){\n const\n rmin = 100000,\n rmax = 999999,\n timestamp = Date.now(),\n random = Math.floor( Math.random() * ( rmax - rmin + 1 ) + rmin );\n\n return timestamp + '_' + random;\n },\n \n fire: function( _event, payload, cid ){\n if( !this.Events[_event] && !this.Events[_event + '--@once'] ) return;\n \n const ackFn = cid\n ? ( error, ...args ) => {\n this.emit( _event + '--' + cid + '--@ack', { error: error || false, args } );\n }\n : undefined;\n \n let listeners = [];\n if( this.Events[_event + '--@once'] ){\n _event += '--@once';\n listeners = this.Events[_event];\n delete this.Events[_event];\n }\n else listeners = this.Events[_event] || [];\n \n listeners.forEach( fn => {\n try { payload !== undefined ? fn( payload, ackFn ) : fn( ackFn ); }\n catch( error ){ console.error('[EMBEDDED] Listener error:', error); }\n });\n },\n \n emit: function( _event, payload, fn ){\n if( typeof payload === 'function' ){\n fn = payload;\n payload = undefined;\n }\n \n if( !this.connected && !RESERVED_EVENTS.includes(_event) ){\n this.messageQueue.push({ _event, payload, fn, timestamp: Date.now() });\n return;\n }\n \n try {\n let cid;\n if( typeof fn === 'function' ){\n cid = this.ackId();\n this.once( _event + '--' + cid + '--@ack', ({ error, args }) => fn( error, ...args ) );\n }\n \n const messageData = {\n _event,\n payload,\n cid,\n timestamp: Date.now()\n };\n \n window.ReactNativeWebView.postMessage( JSON.stringify( messageData ) );\n }\n catch( error ){\n console.error('[EMBEDDED] Emit error:', error);\n typeof fn === 'function' && fn( String(error) );\n }\n },\n \n on: function( _event, fn ){\n if( !this.Events[_event] ) this.Events[_event] = [];\n this.Events[_event].push( fn );\n },\n \n once: function( _event, fn ){\n _event += '--@once';\n if( !this.Events[_event] ) this.Events[_event] = [];\n this.Events[_event].push( fn );\n },\n \n off: function( _event, fn ){\n if( fn && this.Events[_event] ){\n const index = this.Events[_event].indexOf( fn );\n if( index > -1 ){\n this.Events[_event].splice( index, 1 );\n if( this.Events[_event].length === 0 ) delete this.Events[_event];\n }\n }\n else delete this.Events[_event];\n },\n \n processMessageQueue: function(){\n if( !this.connected || this.messageQueue.length === 0 ) return;\n \n const queue = [...this.messageQueue];\n this.messageQueue = [];\n \n queue.forEach( msg => {\n try { this.emit( msg._event, msg.payload, msg.fn ); }\n catch( error ){ console.error('[EMBEDDED] Queue process error:', error); }\n });\n },\n \n handleMessage: function( data ){\n if( !data || !data._event ) return;\n \n const { _event, payload, cid } = data;\n \n if( _event === '__heartbeat_response' ) return;\n \n if( _event === '__heartbeat' ){\n this.emit('__heartbeat_response', { timestamp: Date.now() });\n return;\n }\n \n if( _event === 'ping' ){\n this.emit('pong');\n this.connected = true;\n this.processMessageQueue();\n return;\n }\n \n this.fire( _event, payload, cid );\n }\n };\n
|
|
507
|
+
return "\n (function() {\n alert('[EMBEDDED] Injected JavaScript')\n const RESERVED_EVENTS = ['ping', 'pong', '__heartbeat', '__heartbeat_response'];\n \n window._wio = {\n type: 'EMBEDDED',\n connected: false,\n Events: {},\n messageQueue: [],\n\n listen: function(){\n console.log('[EMBEDDED] Listening for messages...')\n\n // Listen to messages from React Native\n window.addEventListener('message', function( event ){\n try {\n console.log('[EMBEDDED] Received message:', event.data);\n const message = JSON.parse( event.data );\n window._wio.handleMessage( message );\n }\n catch( error ){ console.error('[EMBEDDED] Parse error:', error); }\n });\n \n // Android support\n if( typeof document !== 'undefined' ){\n document.addEventListener('message', function( event ){\n try {\n console.log('[EMBEDDED] Received message:', event.data);\n const message = JSON.parse( event.data );\n window._wio.handleMessage( message );\n }\n catch( error ){ console.error('[EMBEDDED] Parse error:', error); }\n });\n }\n },\n \n ackId: function(){\n const\n rmin = 100000,\n rmax = 999999,\n timestamp = Date.now(),\n random = Math.floor( Math.random() * ( rmax - rmin + 1 ) + rmin );\n\n return timestamp + '_' + random;\n },\n \n fire: function( _event, payload, cid ){\n if( !this.Events[_event] && !this.Events[_event + '--@once'] ) return;\n \n const ackFn = cid\n ? ( error, ...args ) => {\n this.emit( _event + '--' + cid + '--@ack', { error: error || false, args } );\n }\n : undefined;\n \n let listeners = [];\n if( this.Events[_event + '--@once'] ){\n _event += '--@once';\n listeners = this.Events[_event];\n delete this.Events[_event];\n }\n else listeners = this.Events[_event] || [];\n \n listeners.forEach( fn => {\n try { payload !== undefined ? fn( payload, ackFn ) : fn( ackFn ); }\n catch( error ){ console.error('[EMBEDDED] Listener error:', error); }\n });\n },\n \n emit: function( _event, payload, fn ){\n if( typeof payload === 'function' ){\n fn = payload;\n payload = undefined;\n }\n \n if( !this.connected && !RESERVED_EVENTS.includes(_event) ){\n this.messageQueue.push({ _event, payload, fn, timestamp: Date.now() });\n return;\n }\n \n try {\n let cid;\n if( typeof fn === 'function' ){\n cid = this.ackId();\n this.once( _event + '--' + cid + '--@ack', ({ error, args }) => fn( error, ...args ) );\n }\n \n const messageData = {\n _event,\n payload,\n cid,\n timestamp: Date.now()\n };\n \n window.ReactNativeWebView.postMessage( JSON.stringify( messageData ) );\n }\n catch( error ){\n console.error('[EMBEDDED] Emit error:', error);\n typeof fn === 'function' && fn( String(error) );\n }\n },\n \n on: function( _event, fn ){\n if( !this.Events[_event] ) this.Events[_event] = [];\n this.Events[_event].push( fn );\n },\n \n once: function( _event, fn ){\n _event += '--@once';\n if( !this.Events[_event] ) this.Events[_event] = [];\n this.Events[_event].push( fn );\n },\n \n off: function( _event, fn ){\n if( fn && this.Events[_event] ){\n const index = this.Events[_event].indexOf( fn );\n if( index > -1 ){\n this.Events[_event].splice( index, 1 );\n if( this.Events[_event].length === 0 ) delete this.Events[_event];\n }\n }\n else delete this.Events[_event];\n },\n \n processMessageQueue: function(){\n if( !this.connected || this.messageQueue.length === 0 ) return;\n \n const queue = [...this.messageQueue];\n this.messageQueue = [];\n \n queue.forEach( msg => {\n try { this.emit( msg._event, msg.payload, msg.fn ); }\n catch( error ){ console.error('[EMBEDDED] Queue process error:', error); }\n });\n },\n \n handleMessage: function( data ){\n if( !data || !data._event ) return;\n \n const { _event, payload, cid } = data;\n \n if( _event === '__heartbeat_response' ) return;\n \n if( _event === '__heartbeat' ){\n this.emit('__heartbeat_response', { timestamp: Date.now() });\n return;\n }\n \n if( _event === 'ping' ){\n this.emit('pong');\n this.connected = true;\n this.processMessageQueue();\n return;\n }\n \n this.fire( _event, payload, cid );\n }\n };\n\n true;\n })();\n ";
|
|
508
508
|
};
|
|
509
509
|
return WIO;
|
|
510
510
|
}());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webview.io",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Easy and friendly API to connect and interact between React Native and WebView with enhanced security, reliability, and modern async/await support.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"prepack": "yarn run compile"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@types/node": "^24.6.0",
|
|
17
16
|
"events": "^3.3.0"
|
|
18
17
|
},
|
|
19
18
|
"peerDependencies": {
|
|
@@ -22,6 +21,7 @@
|
|
|
22
21
|
},
|
|
23
22
|
"devDependencies": {
|
|
24
23
|
"@types/mocha": "^9.1.0",
|
|
24
|
+
"@types/node": "^24.6.0",
|
|
25
25
|
"@types/react": "^18.0.0",
|
|
26
26
|
"expect.js": "^0.3.1",
|
|
27
27
|
"mocha": "^9.2.0",
|
package/src/index.ts
CHANGED
|
@@ -610,6 +610,7 @@ export default class WIO {
|
|
|
610
610
|
getInjectedJavaScript(): string {
|
|
611
611
|
return `
|
|
612
612
|
(function() {
|
|
613
|
+
alert('[EMBEDDED] Injected JavaScript')
|
|
613
614
|
const RESERVED_EVENTS = ['ping', 'pong', '__heartbeat', '__heartbeat_response'];
|
|
614
615
|
|
|
615
616
|
window._wio = {
|
|
@@ -617,6 +618,32 @@ export default class WIO {
|
|
|
617
618
|
connected: false,
|
|
618
619
|
Events: {},
|
|
619
620
|
messageQueue: [],
|
|
621
|
+
|
|
622
|
+
listen: function(){
|
|
623
|
+
console.log('[EMBEDDED] Listening for messages...')
|
|
624
|
+
|
|
625
|
+
// Listen to messages from React Native
|
|
626
|
+
window.addEventListener('message', function( event ){
|
|
627
|
+
try {
|
|
628
|
+
console.log('[EMBEDDED] Received message:', event.data);
|
|
629
|
+
const message = JSON.parse( event.data );
|
|
630
|
+
window._wio.handleMessage( message );
|
|
631
|
+
}
|
|
632
|
+
catch( error ){ console.error('[EMBEDDED] Parse error:', error); }
|
|
633
|
+
});
|
|
634
|
+
|
|
635
|
+
// Android support
|
|
636
|
+
if( typeof document !== 'undefined' ){
|
|
637
|
+
document.addEventListener('message', function( event ){
|
|
638
|
+
try {
|
|
639
|
+
console.log('[EMBEDDED] Received message:', event.data);
|
|
640
|
+
const message = JSON.parse( event.data );
|
|
641
|
+
window._wio.handleMessage( message );
|
|
642
|
+
}
|
|
643
|
+
catch( error ){ console.error('[EMBEDDED] Parse error:', error); }
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
},
|
|
620
647
|
|
|
621
648
|
ackId: function(){
|
|
622
649
|
const
|
|
@@ -740,27 +767,7 @@ export default class WIO {
|
|
|
740
767
|
this.fire( _event, payload, cid );
|
|
741
768
|
}
|
|
742
769
|
};
|
|
743
|
-
|
|
744
|
-
// Listen to messages from React Native
|
|
745
|
-
window.addEventListener('message', function( event ){
|
|
746
|
-
try {
|
|
747
|
-
const message = JSON.parse( event.data );
|
|
748
|
-
window._wio.handleMessage( message );
|
|
749
|
-
}
|
|
750
|
-
catch( error ){ console.error('[EMBEDDED] Parse error:', error); }
|
|
751
|
-
});
|
|
752
|
-
|
|
753
|
-
// Android support
|
|
754
|
-
if( typeof document !== 'undefined' ){
|
|
755
|
-
document.addEventListener('message', function( event ){
|
|
756
|
-
try {
|
|
757
|
-
const message = JSON.parse( event.data );
|
|
758
|
-
window._wio.handleMessage( message );
|
|
759
|
-
}
|
|
760
|
-
catch( error ){ console.error('[EMBEDDED] Parse error:', error); }
|
|
761
|
-
});
|
|
762
|
-
}
|
|
763
|
-
|
|
770
|
+
|
|
764
771
|
true;
|
|
765
772
|
})();
|
|
766
773
|
`;
|