diff --git a/lib/DataSubscriber.js b/lib/DataSubscriber.js index ca2dc97..9d31c39 100644 --- a/lib/DataSubscriber.js +++ b/lib/DataSubscriber.js @@ -91,13 +91,22 @@ class DataSubscriber { } }); } - sendRecord(entity, filter, record, sid) { + sendRecord(entity, filter, record, sid, isCreate) { if (this.filterMap[entity]) { Object.keys(this.filterMap[entity]).forEach(async (room) => { const context = await this.contextBuilder(); const filter2 = this.filterMap[entity][room]; - const repeled = await (0, oak_domain_1.checkFilterRepel)(entity, context, filter, filter2, true); - if (!repeled) { + let needSend = false; + if (isCreate) { + // 如果是插入数据肯定是单行,使用相容性检测 + const contained = await (0, oak_domain_1.checkFilterContains)(entity, context, filter, filter2, true); + needSend = contained; + } + else { + const repeled = await (0, oak_domain_1.checkFilterRepel)(entity, context, filter, filter2, true); + needSend = !repeled; + } + if (needSend) { if (sid) { this.ns.to(room).except(sid).emit('data', [record], [room]); } @@ -116,7 +125,7 @@ class DataSubscriber { switch (a) { case 'c': { const { e, d } = record; - this.sendRecord(e, d, record, sid); + this.sendRecord(e, d, record, sid, true); break; } case 'u': { diff --git a/src/DataSubscriber.ts b/src/DataSubscriber.ts index f0dbdd9..bbf7314 100644 --- a/src/DataSubscriber.ts +++ b/src/DataSubscriber.ts @@ -4,7 +4,7 @@ import { EntityDict, SubDataDef, OpRecord, CreateOpResult, UpdateOpResult, Remov import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain'; import { BackendRuntimeContext } from 'oak-frontend-base'; import { Namespace } from 'socket.io'; -import { checkFilterRepel } from 'oak-domain'; +import { checkFilterContains, checkFilterRepel } from 'oak-domain'; export default class DataSubscriber> { @@ -113,14 +113,23 @@ export default class DataSubscriber, sid?: string) { + private sendRecord(entity: keyof ED, filter: ED[keyof ED]['Selection']['filter'], record: OpRecord, sid?: string, isCreate?: boolean) { if (this.filterMap[entity]) { Object.keys(this.filterMap[entity]!).forEach( async (room) => { const context = await this.contextBuilder(); const filter2 = this.filterMap[entity]![room]; - const repeled = await checkFilterRepel(entity, context, filter, filter2, true) - if (!repeled) { + let needSend = false; + if (isCreate) { + // 如果是插入数据肯定是单行,使用相容性检测 + const contained = await checkFilterContains(entity, context, filter, filter2, true); + needSend = contained; + } + else { + const repeled = await checkFilterRepel(entity, context, filter, filter2, true); + needSend = !repeled; + } + if (needSend) { if (sid) { this.ns.to(room).except(sid).emit('data', [record], [room]); } @@ -142,7 +151,7 @@ export default class DataSubscriber; - this.sendRecord(e, d, record, sid); + this.sendRecord(e, d, record, sid, true); break; } case 'u': {