From 64fa1c470f93cda625f529332222f8661aa477c5 Mon Sep 17 00:00:00 2001 From: "Xc@centOs" Date: Sat, 7 Oct 2023 11:17:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E5=88=A4=E6=96=AD=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=BA=94=E8=AF=A5=E5=8F=91=E9=80=81=E6=97=B6?= =?UTF-8?q?,=E5=B0=BD=E9=87=8F=E4=BD=BF=E7=94=A8=E7=9B=B8=E5=AE=B9?= =?UTF-8?q?=E6=80=A7=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/DataSubscriber.js | 17 +++++++++++++---- src/DataSubscriber.ts | 19 ++++++++++++++----- 2 files changed, 27 insertions(+), 9 deletions(-) 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': {