PageSourceSearch

https://wuhenba-webos.hf.space/webos-sdk.js

js wuhenba-webos.hf.space collected 2026-10-03 10:24:23 UTC 3,164 bytes, 100 lines download raw bytes

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.