From 0bfb9f21c4982cfc0720991bc9d1b5c63a8b835b Mon Sep 17 00:00:00 2001 From: Erick Pintor Date: Wed, 19 Jan 2022 11:21:55 -0300 Subject: [PATCH] introduce set streaming support --- src/stream.js | 5 +++-- src/types/Client.d.ts | 2 +- src/types/Stream.d.ts | 8 ++++++++ test/stream.test.js | 30 ++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/stream.js b/src/stream.js index e2e0e3aba..037755f15 100644 --- a/src/stream.js +++ b/src/stream.js @@ -19,7 +19,7 @@ var http = require('./_http') var q = require('./query') var util = require('./_util') -var DefaultEvents = ['start', 'error', 'version', 'history_rewrite'] +var DefaultEvents = ['start', 'error', 'version', 'history_rewrite', 'set'] var DocumentStreamEvents = DefaultEvents.concat(['snapshot']) /** @@ -285,13 +285,14 @@ EventDispatcher.prototype.dispatch = function(event) { /** * @typedef {Object} Options - * @property {string[]} [fields=['action', 'document', 'diff', 'prev']] + * @property {string[]} [fields=['action', 'document', 'diff', 'prev', 'index']] * The fields event fields to opt-in during stream subscription. Possible * options: * * 'action': The action type * * 'document': The document's data * * 'diff': The difference between 'document' and 'prev' * * 'prev': The event's previous data + * * 'index': The event's source index, if a set event */ /** diff --git a/src/types/Client.d.ts b/src/types/Client.d.ts index e1d2d05d0..ea9a9e1e2 100644 --- a/src/types/Client.d.ts +++ b/src/types/Client.d.ts @@ -6,7 +6,7 @@ import { ExprArg } from './query' import RequestResult from './RequestResult' import { Subscription, SubscriptionEventHandlers } from './Stream' -type StreamEventFields = 'action' | 'document' | 'diff' | 'prev' +type StreamEventFields = 'action' | 'document' | 'diff' | 'prev' | 'index' export interface ClientConfig { secret: string diff --git a/src/types/Stream.d.ts b/src/types/Stream.d.ts index 7aaaaec62..26dbd4d89 100644 --- a/src/types/Stream.d.ts +++ b/src/types/Stream.d.ts @@ -28,6 +28,14 @@ export type SubscriptionEventHandlers = { prev?: object } > + set: Handler< + 'set', + { + action: 'add' | 'remove' + document?: object + index?: object + } + > history_rewrite: Handler< 'history_rewrite', { diff --git a/test/stream.test.js b/test/stream.test.js index ad42f73de..d19e508a0 100644 --- a/test/stream.test.js +++ b/test/stream.test.js @@ -362,4 +362,34 @@ describe('StreamAPI', () => { assertActiveSessions(0) }) }) + + describe('set', () => { + test('can listen to set adds', done => { + stream = client.stream(q.Documents(coll.ref)) + .on('start', () => { + client.query( + q.Create(coll.ref, { + data: { name: "foo" } + }) + ) + }) + .on('set', event => { + expect(event.action).toEqual('add') + done() + }) + .start() + }) + + test('can listen to set removes', done => { + stream = client.stream(q.Documents(coll.ref)) + .on('start', () => { + client.query(q.Delete(doc.ref)) + }) + .on('set', event => { + expect(event.action).toEqual('remove') + done() + }) + .start() + }) + }) })