{"push_id":2394595721,"size":3,"distinct_size":1,"ref":"refs/heads/feat/socket-middleware","head":"ee43b54ca7dfaadd5d0510f91c76e3052f84cdc9","before":"28fb8d1d98b4750c98fa462835836d4acc59c828","commits":[{"sha":"a0cb90aab3f3b8676ba0bb537286662b8160c4c9","author":{"name":"chuan6","email":"04e953825c554948ebc309983f23a589209fcf9b@gmail.com"},"message":"chore(package.json): 在 scripts/test 里添加循环引用检查\n\n...以减少等到上了 circleci 跑失败了才发现循环引用错误。","distinct":false,"url":"https://api.github.com/repos/teambition/teambition-sdk/commits/a0cb90aab3f3b8676ba0bb537286662b8160c4c9"},{"sha":"3ec88748545bee7442cb75048a344612f3a07feb","author":{"name":"chuan6","email":"ccd87fe219c75f2fa1f13d631d7b4e65e0207dcb@users.noreply.github.com"},"message":"Merge pull request #428 from teambition/chore/commit-tool-chain\n\nchore(package.json): 在 scripts/test 里添加循环引用检查","distinct":false,"url":"https://api.github.com/repos/teambition/teambition-sdk/commits/3ec88748545bee7442cb75048a344612f3a07feb"},{"sha":"ee43b54ca7dfaadd5d0510f91c76e3052f84cdc9","author":{"name":"miloas","email":"330fd36ac5f2d7d161396f9eeec2c0c2b5b9e08e@gmail.com"},"message":"feat(socket-middleware): 添加 socket 中间件机制\n\n...包含供底层使用的拦截器（Interceptors）和供应用层使用的代理器\n（Proxy）。\n\nfeat: 实现拦截器\n\n...在异步载入 db 的情况下，重用 handleMsgToDb，而不再自己重写一份代码\n\n...添加关于 shortcircuit 有效性的测试\n\n...添加高层测试\n\n...补充对 UserFunc 返回值的运行时过滤，确保其行为符合声明时使用的\nFlags，防范其通过某些返回值，达到动态改变 ControlFlow 的行为。如：事先\n声明时并没有打开 shortCircuit flag，却通过在函数中返回\nControlFlow.ShortCircuit 来达到 shortCircuit 的效果。\n\n...为 UserFunc 和 Interceptor 提供 DB 相关参数：db, tabName, pkName\n\n...将 mutateMessage 选项改名为 mutate，并添加注释\n\n...减少直接接触中间件的模块，将中间件藏在动态生成的 msgToDB 对象变量里\n\n...该变量（msgToDB）存在于 SocketClient 和 Net。\n\n...把 Sequence 作为内部实现，向外暴露 ProxyToDB 和 Proxy\n\n...分别作为 SocketClient 用户对可能需要过数据库的消息和对不需要过数据\n库的消息进行自定义处理的接口。\n\n...为 Proxy 添加测试。\n\n...SocketInterceptor -> Middleware, ProxyToDB -> Interceptors\n\n...移除 Dirty 模块中的中间件\n\nfeat: 在开发环境下代理 socket 的对象, 以保证拦截器被正确使用\n\nfeat: 增加 `publish` & `unpublish` 方法\n\nrefactor(Proxy): 对接实际使用场景的同时调整设计\n\nfix(EventMaps): 避免传递给 handleMsgToDB 冗余的 tableName 和 pkName\n\n...参数。解决中间件通过修改 msg 内容希望将推送导入到另一张表时无效的问\n题（因为 tableName 和 pkName 参数时进入中间件之前就决定了的）。\n\n...这么做简化了 handleMsgToDB 的参数列表，并加强了中间件不直接操作而是\n通过更改 msg 达到间接控制数据库操作的能力。\n\nrefactor: 令拦截器通过返回 Observable 而不是 IgnoreDefaultDBOps\n\n...来针对某一 ws 消息避免其进入正常 DB 操作流程。\n\n...并将默认 DB 操作的函数作为最后一个拦截器，简化拦截器序列与默认数据\n库操作的衔接，并将拦截器运行的规则完全定义在 Sequence 里。\n\nfix(EventMaps): 将 refresh 推送消息导入非 DB 相关 WS 消息处理流程\n\nfeat(Middleware): 为 WSProxy 添加 getRefreshStream() 方法\n\n...以表达激活时积极触发回调、挂起时记忆最后一次匹配并等下次激活再触发\n回调的行为。\n\n...该行为对应部分 refresh 消息的处理机制。\n\n...为 WSProxy 的 onRefreshMethod() 方法添加测试\n\n...并引入 rxjs-marbles 以更声明式地实现测试内容。\n\n...为 onRefreshMethod 添加 appNamespace 参数\n\n...便于应用代码通过提供该参数，避免受监听同样 pattern 的应用影响。\n\n...用返回 Observable 的 getRefreshStream() 代替注册回调的\nonRefreshMethod()。利用已经熟知的 Observable 接口，以便于使用和管理。\n\nrefactor(sockets/): 添加 index.ts 并整理相关命名\n\nrefactor(简化接口): 移除 proxy 上的 off()，用 on() 的返回值代替\n\n...为用户提供取消 handler 的逻辑。\n\nrefactor(proxy.publish): 简化其行为，不再 replay\n\n...因为原来对 replay 的需求仅来自某些 refresh 消息的处理，而这部分需求\n已经被 getRefreshStream 满足。\n\n...移除 replay 功能后，publish(pattern) 就是匹配某一 pattern 的广播消\n息流，当订阅数降到 0，就移除相关资源。如果再次 publish 同一个 pattern，\n会重新创建相关资源。用户除了 unsubscribe 自己的订阅，无需做额外的资源\n管理。\n\n...publish() 这个方法可以作为 on() 这种回调式接口之外的一个补充，便于\n在流管理代码中使用。\n\nfix(EventMaps): 令 proxy 能接收到所有消息，而不只是不通往 db 的消息\n\n...一个额外的好处时，调试 ws 消息时，用户可以在 proxy 上使用 on() 方法\n注册自己关注的消息，并以自己需要的格式呈现在 console 里。","distinct":true,"url":"https://api.github.com/repos/teambition/teambition-sdk/commits/ee43b54ca7dfaadd5d0510f91c76e3052f84cdc9"}]}
{"actor":{"display_login":"chuan6"}}