1/** 2 * WebOS Static App SDK v3 â JSON-RPC 2.0 3 * 4 * FM.request('domain.action', params) â call any backend method 5 * FM.on(event, handler) / FM.off(event, handler) â listen for push events 6 * 7 * Wire format: 8 * Request: { jsonrpc: "2.0", method: "fs.list", params: { nodeId, path }, id: "sdk_1" } 9 * Response: { jsonrpc: "2.0", result: [...], id: "sdk_1" } 10 * Error: { jsonrpc: "2.0", error: { code: -32000, message: "..." }, id: "sdk_1" } 11 * Notification: { jsonrpc: "2.0", method: "fs.watch", params: { ... } } 12 */ 13(function () { 14 'use strict'; 15 16 var SOURCE = 'webos-static-app'; 17 var RESPONSE_SOURCE = 'webos-host'; 18 var TIMEOUT = 30000; 19 var reqSeq = 0; 20 var pending = {}; 21 var eventHandlers = {}; 22 23 function genId() { 24 return 'sdk_' + (++reqSeq) + '_' + Date.now(); 25 } 26 27 function request(method, params) { 28 return new Promise(function (resolve, reject) { 29 var id = genId(); 30 var timer = setTimeout(function () { 31 delete pending[id]; 32 reject(new Error('FM SDK request timeout: ' + method)); 33 }, TIMEOUT); 34 pending[id] = { 35 resolve: function (data) { clearTimeout(timer); delete pending[id]; resolve(data); }, 36 reject: function (err) { clearTimeout(timer); delete pending[id]; reject(err); } 37 }; 38 window.parent.postMessage({ 39 source: SOURCE, 40 jsonrpc: '2.0', 41 method: method, 42 params: params || {}, 43 id: id 44 }, '*'); 45 }); 46 } 47 48 window.addEventListener('message', function (event) { 49 var msg = event.data; 50 if (!msg || msg.source !== RESPONSE_SOURCE || msg.jsonrpc !== '2.0') return; 51 52 // Response (has id) 53 if (msg.id && pending[msg.id]) { 54 if (msg.error) { 55 pending[msg.id].reject(new Error(msg.error.message || 'Request failed')); 56 } else { 57 pending[msg.id].resolve(msg.result); 58 } 59 return; 60 } 61 62 // Notification (has method, no id) 63 if (msg.method && !msg.id) { 64 var handlers = eventHandlers[msg.method]; 65 if (handlers) { 66 for (var i = 0; i < handlers.length; i++) { 67 try { handlers[i](msg.params); } catch (e) { console.error('FM event handler error:', e); } 68 } 69 } 70 var wildcard = eventHandlers['*']; 71 if (wildcard) { 72 for (var j = 0; j < wildcard.length; j++) { 73 try { wildcard[j](msg.method, msg.params); } catch (e) { console.error('FM event handler error:', e); } 74 } 75 } 76 } 77 }); 78 79 window.FM = { 80 request: request, 81 on: function (event, handler) { 82 if (!eventHandlers[event]) eventHandlers[event] = []; 83 eventHandlers[event].push(handler); 84 return function () { 85 var arr = eventHandlers[event]; 86 if (arr) { var idx = arr.indexOf(handler); if (idx >= 0) arr.splice(idx, 1); } 87 }; 88 }, 89 off: function (event, handler) { 90 var arr = eventHandlers[event]; 91 if (arr) { 92 if (handler) { var idx = arr.indexOf(handler); if (idx >= 0) arr.splice(idx, 1); } 93 else delete eventHandlers[event]; 94 } 95 }, 96 version: '3.0.0' 97 }; 98 99 window.parent.postMessage({ source: SOURCE, type: 'sdk_ready' }, '*'); 100})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.