如何监听思源关闭操作

目的:实现在思源关闭前执行某些代码

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25206 引用 • 103954 回帖 • 1 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9634 引用 • 43808 回帖 • 95 关注

相关帖子

被采纳的回答
  • 没太懂,日程不是你自己实现的插件吗?什么时候触发编辑,你自己不是可控的吗?

    还是你的日程在文档中编辑的?建议描述下你的日程是什么?怎样操作的?

    触发频繁,我没试过通过插件开发的方式监听,但我看官方源码大概率是 ws-main 里有很多情况被触发,你通过 data 参数里的 transactions 应该可以判断为更新操作的。

    另外,通过源码可知,这个事件就是官方 ws 的 onmessage 的回调,所以,通过 onmessage 监听也应该是一样的。

    比如:

    siyuan.ws.ws.addEventListener('message', (e) => { const msg = JSON.parse(e.data); if(msg.cmd === "transactions") { // 这里获取更新后的数据 console.log(msg); } });

    可参考 https://github.com/siyuan-note/siyuan/issues/13313#issuecomment-2515402535


    如果非要关闭时生成一次的话,下面这个代码可以满足需求,该代码会拦截思源退出事件,当退出时,先执行回调代码,当完成后再继续退出。

    但注意,该代码仅支持 electron 客户端,由于浏览器和手机端不好拦截暂不支持。

    如果有兴趣研究,可以参考源码 https://github.com/siyuan-note/siyuan/blob/5129ad926a21176a352cf5f630e0651011bf9c83/app/src/dialog/processSystem.ts#L287

    Demo 代码如下(仅支持 electron 客户端):

    // 调用示例,当callback返回true时退出 listenExit(async () => { console.log('waiting'); await sleep(30000); return true; }); // 监听思源退出事件,退出前执行callback,当callback返回true时退出(仅支持electron客户端) // see https://github.com/siyuan-note/siyuan/blob/5129ad926a21176a352cf5f630e0651011bf9c83/app/src/dialog/processSystem.ts#L287 function listenExit(callback) { if(!navigator.userAgent.includes('Electron')) return; // 内核是否已退出 let isKernelExited = false; // 监听内核退出 const originalFetch = window.fetch; window.fetch = async function (url, ...args) { try { if(url.endsWith('/api/system/exit')) { for(;;) { if(await callback()) { isKernelExited = true; break; } await sleep(200); } } const response = await originalFetch(url, ...args); return response; } catch (error) { throw error; } }; // 监听客户端退出 // 保存原始方法 const ipcRenderer = require('electron').ipcRenderer; const originalSend = ipcRenderer.send; // 重写 ipcRenderer.send 方法 ipcRenderer.send = async function (...args) { if(args[0] === 'siyuan-quit'){ for(;;) { if(isKernelExited) { await sleep(400); break; } await sleep(200); } originalSend.apply(ipcRenderer, args); } else { originalSend.apply(ipcRenderer, args); } }; } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }

    虽然这个方法可行,但还是推荐之前的建议,即缩小生成时间间隔和监听日程修改事件。

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 我之前理解有误,去网上了解了下,生成 ics 和手机端同步是相互独立的。

    既然这样,我觉得生成 ics 文件的过程可以适当的小些,比如 1 分钟,然后如果检测到日历没变化就不用生成,也不会太占用资源。

    当然最好的方式,是监听日历修改事件,日历修改后就生成文件,不修改不生成,这样就不用担心关闭问题了。

    1 回复
  • 其他回帖
  • 即使监听到,也无法保证代码执行完就退出了,如果执行速度很快可以。长时间执行估计只能调用思源外的命令执行了。

    建议说说实际需求和场景,说不定是 XY 问题。

    1 回复
  • stevehfut via Android

    感谢回复,场景:我开发日程同步插件时,想实现自动生成 ics 文件,考虑到手机日历订阅日历的同步时间最小为 15 分钟,故设定为 15 分钟同步一次,但代码在前端运行,若添加了日程,还没等到 15 分钟就关闭了思源,会导致无法生成新的 ics 文件,故想监听思源关闭事件,在关闭之前生成一次(就像思源关闭时同步一样)

    在此之前也想过监听相关文件的读写或指定数据库的写入(因为 ics 文件是靠数据库的值生成的),但没有实现。

    本人尝试开发思源 插件刚三个左右还算小白,若大佬有什么其他方式可以实现此需求,不胜感激!

    1 回复
  • 没太懂,日程不是你自己实现的插件吗?什么时候触发编辑,你自己不是可控的吗?

    还是你的日程在文档中编辑的?建议描述下你的日程是什么?怎样操作的?

    触发频繁,我没试过通过插件开发的方式监听,但我看官方源码大概率是 ws-main 里有很多情况被触发,你通过 data 参数里的 transactions 应该可以判断为更新操作的。

    另外,通过源码可知,这个事件就是官方 ws 的 onmessage 的回调,所以,通过 onmessage 监听也应该是一样的。

    比如:

    siyuan.ws.ws.addEventListener('message', (e) => { const msg = JSON.parse(e.data); if(msg.cmd === "transactions") { // 这里获取更新后的数据 console.log(msg); } });

    可参考 https://github.com/siyuan-note/siyuan/issues/13313#issuecomment-2515402535


    如果非要关闭时生成一次的话,下面这个代码可以满足需求,该代码会拦截思源退出事件,当退出时,先执行回调代码,当完成后再继续退出。

    但注意,该代码仅支持 electron 客户端,由于浏览器和手机端不好拦截暂不支持。

    如果有兴趣研究,可以参考源码 https://github.com/siyuan-note/siyuan/blob/5129ad926a21176a352cf5f630e0651011bf9c83/app/src/dialog/processSystem.ts#L287

    Demo 代码如下(仅支持 electron 客户端):

    // 调用示例,当callback返回true时退出 listenExit(async () => { console.log('waiting'); await sleep(30000); return true; }); // 监听思源退出事件,退出前执行callback,当callback返回true时退出(仅支持electron客户端) // see https://github.com/siyuan-note/siyuan/blob/5129ad926a21176a352cf5f630e0651011bf9c83/app/src/dialog/processSystem.ts#L287 function listenExit(callback) { if(!navigator.userAgent.includes('Electron')) return; // 内核是否已退出 let isKernelExited = false; // 监听内核退出 const originalFetch = window.fetch; window.fetch = async function (url, ...args) { try { if(url.endsWith('/api/system/exit')) { for(;;) { if(await callback()) { isKernelExited = true; break; } await sleep(200); } } const response = await originalFetch(url, ...args); return response; } catch (error) { throw error; } }; // 监听客户端退出 // 保存原始方法 const ipcRenderer = require('electron').ipcRenderer; const originalSend = ipcRenderer.send; // 重写 ipcRenderer.send 方法 ipcRenderer.send = async function (...args) { if(args[0] === 'siyuan-quit'){ for(;;) { if(isKernelExited) { await sleep(400); break; } await sleep(200); } originalSend.apply(ipcRenderer, args); } else { originalSend.apply(ipcRenderer, args); } }; } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }

    虽然这个方法可行,但还是推荐之前的建议,即缩小生成时间间隔和监听日程修改事件。

    1 回复
  • 查看全部回帖
stevehfut
望天空云卷云舒,看庭前花开花落 淮南

推荐标签 标签

  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 115 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖 • 1 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 668 关注
  • 自由行
    6 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    170 引用 • 1529 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    124 引用 • 74 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 169 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 740 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 5 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 121 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 1 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 759 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 6 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 55 关注
  • abitmean

    有点意思就行了

    37 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 75 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 4 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    173 引用 • 3849 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 157 回帖 • 1 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    184 引用 • 1015 回帖 • 1 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 1 关注