diff --git a/src/js/src/js/MessageBus.js b/src/js/src/js/MessageBus.js new file mode 100644 index 0000000..3b178da --- /dev/null +++ b/src/js/src/js/MessageBus.js @@ -0,0 +1,33 @@ +export class MessageBus { + #global; + + constructor(global) { + this.#global = global; + } + + fire(message) { + const enveloped = { + h: { + origin: "solitude" + }, + b: message + }; + this.#global.postMessage(enveloped); + } + + addListener(listener) { + const handler = event => { + // 送信元チェック + if (event.data?.h?.origin !== "solitude") { + return; + } + listener(event.data.b); + }; + this.#global.addEventListener("message", handler, false); + return handler; + } + + removeListener(handler) { + this.#global.removeEventListener("message", handler); + } +} diff --git a/src/js/src/js/SolitudeMessage.js b/src/js/src/js/SolitudeMessage.js new file mode 100644 index 0000000..7686a9f --- /dev/null +++ b/src/js/src/js/SolitudeMessage.js @@ -0,0 +1,20 @@ +/** + * メッセージの基底クラス(共通処理や識別用) + */ +export class SolitudeMessage { + constructor(type) { + this.type = type; + } + + static filter(callback) { + const expectedType = this.TYPE; + const filtered = function (message) { + if (message.type === expectedType) { + callback(message) + } + } + + return filtered; + + } +} \ No newline at end of file diff --git a/src/js/src/js/SyslogStmt.js b/src/js/src/js/SyslogStmt.js index ae17e0b..dcbb20d 100644 --- a/src/js/src/js/SyslogStmt.js +++ b/src/js/src/js/SyslogStmt.js @@ -97,10 +97,11 @@ sd(structuredData) { this.#structuredData = structuredData; + return this; } toRFC5424() { - const msg = this.#msg ? " " + "\uFEFF" + this.#msg : ""; + const msg = this.#msg ? " ".concat("\uFEFF", this.#msg) : ""; return `${this.#header()} ${this.#structuredData}${msg}`; } diff --git a/src/js/src/js/solitude.js b/src/js/src/js/solitude.js index e35dfb6..c01fbc4 100644 --- a/src/js/src/js/solitude.js +++ b/src/js/src/js/solitude.js @@ -1,13 +1,16 @@ import { File } from "/solitude/resources/js/File.js" +import { LogMessage } from "../simplelog/shared/LogMessage.js" +import { MessageBus } from "./MessageBus.js" export function graftSolitude(global) { var solitude; + const messageBus = new MessageBus(global); (function dismantleGlobal() { global.solitude = solitude = global.solitude || { "variant": "web", get global() { return global; }, //ネイティブ関数は別名つけられないらしいのでラップする - get postMessage() { return message => global.postMessage(message)}, + get postMessage() { return message => global.postMessage(message) }, get createURL() { return global.URL.createObjectURL }, get main() { return global.parent }, get origin() { return global.parent.location.origin }, @@ -16,17 +19,12 @@ get message() { return message }, get persistence() { return persistenceFunc }, get log() { return log }, - }; - - const message = { - get fire() { return fireMessage}, - get addListener() { return addMessageListener }, - get removeListener() { return removeMessageListener } + get message() { return messageBus } }; const log = { - get debug() {return msg => logging("debug", msg)}, - get info() {return msg => logging("info", msg)}, + get debug() { return msg => logging("debug", msg) }, + get info() { return msg => logging("info", msg) }, } })(); @@ -68,7 +66,7 @@ throw error; } ); - } + } function download(filename, content, mimeType) { const blob = new Blob([content], { "type": mimeType }); @@ -103,46 +101,12 @@ } } - /* - * solitude.message - */ - function fireMessage(message) { - const enveloped = { - h: { - origin: "solitude" - }, - b: message - }; - - solitude.postMessage(enveloped); - } - - function addMessageListener(listener) { - const handler = event => { - if (event.data.h.origin != "solitude") { - return; - } - - listener(event.data.b); - } - //JSONシリアライズ可能なオブジェクトが送信できれば十分 - global.addEventListener("message", handler, false); - return handler; - } - - function removeMessageListener(listener) { - global.removeEventListener("message", listener) - } /* * solitude.log */ function logging(level, message) { - solitude.message.fire({ - type: "log", - level: level, - msg: message - }) + solitude.message.fire(new LogMessage(level, message)); } diff --git a/src/js/src/main/WebConfig.js b/src/js/src/main/WebConfig.js new file mode 100644 index 0000000..8aa41bc --- /dev/null +++ b/src/js/src/main/WebConfig.js @@ -0,0 +1,53 @@ +import { config } from "./web-conf.js"; + +class App { + /** @type {string} */ + type; + /** @type {string} */ + src; + + constructor() { + this.type = ""; + this.src = ""; + } +} + +export function webconfig(global) { + global.tmp = global.tmp || {}; + const target = global.tmp.solitudeapps = {}; + let currentApp = null; + + const base = { + set new(val) { + target[val] = new App();; + currentApp = val; + } + } + + configurator = new Proxy(base, { + set(obj, prop, value) { + if (prop in obj) { + obj[prop] = value; + return true; + } else if (currentApp) { + target[currentApp][prop] = value; + return true; + } + + return false; + }, + + get(obj, prop) { + if (prop in obj) { + return obj[prop]; + } else if (currentApp) { + return target[currentApp][prop]; + } + + return undefined; + } + }); + + config(configurator); +} + diff --git a/src/js/src/main/app.html b/src/js/src/main/app.html index f61d22f..b8b4571 100644 --- a/src/js/src/main/app.html +++ b/src/js/src/main/app.html @@ -121,7 +121,6 @@ - diff --git a/src/js/src/main/app.js b/src/js/src/main/app.js index c5696d4..53aae40 100644 --- a/src/js/src/main/app.js +++ b/src/js/src/main/app.js @@ -1,6 +1,8 @@ import { Que } from "../js/Que.js"; -import { graftSolitude } from "..//js/solitude.js" +import { graftSolitude } from "..//js/solitude.js"; import { SyslogStmt } from "../js/SyslogStmt.js"; +import { LogReceiverReadyMessage } from "./shared/LogReceiverReadyMessage.js"; +import { webconfig } from "./WebConfig.js"; window.addEventListener('load', main(document)); @@ -36,30 +38,28 @@ // app.js の main 関数内など - mysolitude.message.addListener(function (message) { - if (message.type === "log_receiver_ready") { - // kernelLoggerにログを引き渡すレシーバーを設定 - kernelLogger.takeover({ - receive: receive, - }); + mysolitude.message.addListener(LogReceiverReadyMessage.filter((message) => { + // kernelLoggerにログを引き渡すレシーバーを設定 + kernelLogger.takeover({ + receive: receive, + }); - function receive(msg) { - mysolitude.message.fire({ - type: "log", - message: msg - }) - } + // 溜まっていたログをフラッシュする + kernelLogger.debug("flush !"); + kernelLogger.flush(); - // 溜まっていたログをフラッシュする - kernelLogger.flush(); + function receive(msg) { + mysolitude.message.fire({ + type: "log", + message: msg + }) } - }); + })); const b = new SyslogStmt(); - kernelLogger.log(b.gen("SyslogStmt test2").str); - kernelLogger.debug("flush !"); + kernelLogger.log(b.fac(20).gen("SyslogStmt test2").str); // 以下、宣言 function toggleMenuItem(element) { diff --git a/src/js/src/main/web-conf.js b/src/js/src/main/web-conf.js index b99530c..cf86b0f 100644 --- a/src/js/src/main/web-conf.js +++ b/src/js/src/main/web-conf.js @@ -1,65 +1,26 @@ -function webconfig(global) { - global.tmp = global.tmp || {}; - global.tmp.solitudeapps = {}; - const configurator = createAppConfigurator(global.tmp.solitudeapps); - loadTo(configurator); -} +export const config = app => { + app.new = "main"; + app.type = "mainType"; -function createAppConfigurator(target) { - const app = ((writeback)=> { - const apps = writeback; - let currentApp = {}; + app.new = "logger"; + app.type = "staticpage"; + app.src = "../simplelog/app.html" - const result = { - set new(val) { - apps[val] = {}; - currentApp = val; - }, + app.new = "mdeditor"; + app.type = "iframe"; + app.src = "../mdeditor/app.html" - set type(val) { - apps[currentApp].type = val; - }, + app.new = "example" + app.type = "staticpage" + app.src = "../example/app.html" + app.loader = fetch; - set src(val) { - apps[currentApp].src = val; - }, + app.new = "bookmark"; + app.type = "iframe"; + app.src = "../bookmark/app.html" - get prop() { - return apps[currentApp]; - } + app.new = "logData"; + app.type = "batch"; + app.src = "../logData/app.js" - } - - return result; - })(target); - - return app -} - - -function loadTo(app) { - app.new = "main"; - app.type = "mainType"; - - app.new = "logger"; - app.type = "staticpage"; - app.src = "../simplelog/app.html" - - app.new = "mdeditor"; - app.type = "iframe"; - app.src = "../mdeditor/app.html" - - app.new = "example" - app.type = "staticpage" - app.src = "../example/app.html" - app.prop.loader = fetch; - - app.new = "bookmark"; - app.type = "iframe"; - app.src = "../bookmark/app.html" - - app.new = "logData"; - app.type = "batch"; - app.src = "../logData/app.js" - -} \ No newline at end of file +}; \ No newline at end of file