chore(管理端): 初始化工程仓库
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import {RealtimeLink} from '../src/notifications/realtime.ts'
|
||||
function harness(){
|
||||
let sockets:any[]=[],states:string[]=[],syncs=0,expired=0,timers=new Map<any,{fn:()=>void,ms:number}>(),id=0
|
||||
let link=new RealtimeLink({socket(){let s:any={onopen:null,onmessage:null,onclose:null,onerror:null,sent:[],send(data:string){this.sent.push(JSON.parse(data))},close(){}};sockets.push(s);return s},token:()=> 'test-token',state:s=>states.push(s),sync:()=>syncs++,expired:()=>expired++,later(fn,ms){let key=++id as any;timers.set(key,{fn,ms});return key},clear(key){timers.delete(key)}})
|
||||
return {link,sockets,states,timers,get syncs(){return syncs},get expired(){return expired}}
|
||||
}
|
||||
test('首帧鉴权,就绪与推送都触发补查,心跳不重复拉取',()=>{let h=harness();h.link.start();let s=h.sockets[0];s.onopen({});assert.deepEqual(s.sent,[{type:'auth',token:'test-token'}]);s.onmessage({data:'{"type":"tasks.changed"}'});assert.equal(h.syncs,0);s.onmessage({data:'{"type":"ready"}'});s.onmessage({data:'{"type":"tasks.changed"}'});s.onmessage({data:'{"type":"heartbeat"}'});assert.equal(h.syncs,2);assert.equal(h.states.at(-1),'online');h.link.stop();assert.equal(h.timers.size,0)})
|
||||
test('网络断线退避重连;认证失效停止连接',()=>{let h=harness();h.link.start();h.sockets[0].onclose({code:1006});let retry=[...h.timers.values()].find(t=>t.ms===1000)!;assert.ok(retry);retry.fn();assert.equal(h.sockets.length,2);h.sockets[1].onclose({code:4403});assert.equal(h.expired,1);assert.equal(h.states.at(-1),'closed');assert.equal(h.timers.size,0)})
|
||||
test('未收到心跳时主动重连,关闭后不残留监听',()=>{let h=harness();h.link.start();let s=h.sockets[0];s.onmessage({data:'{"type":"ready"}'});[...h.timers.values()].find(t=>t.ms===45000)!.fn();assert.equal(h.states.at(-1),'retrying');assert.equal(s.onmessage,null);h.link.stop();assert.equal(h.timers.size,0)})
|
||||
Reference in New Issue
Block a user