You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-11 22:42:42 +03:00
* refactor pubsub, add support for sharded pub sub * run tests in redis 7 only, fix PUBSUB SHARDCHANNELS test * add some comments and fix some bugs * PubSubType, not PubSubTypes 🤦♂️ * remove test.txt * fix some bugs, add tests * add some tests * fix #2345 - allow PING in PubSub mode (remove client side validation) * remove .only * revert changes in cluster/index.ts * fix tests minimum version * handle server sunsubscribe * add 'sharded-channel-moved' event to docs, improve the events section in the main README (fix #2302) * exit "resubscribe" if pubsub not active * Update commands-queue.ts * Release client@1.5.0-rc.0 * WIP * use `node:util` instead of `node:util/types` (to support node 14) * run PubSub resharding test with Redis 7+ * fix inconsistency in live resharding test * add some tests * fix iterateAllNodes when starting from a replica * fix iterateAllNodes random * fix slotNodesIterator * fix slotNodesIterator * clear pubSubNode when node in use * wait for all nodes cluster state to be ok before testing * `cluster.minimizeConections` tests * `client.reconnectStrategry = false | 0` tests * sharded pubsub + cluster 🎉 * add minimum version to sharded pubsub tests * add cluster sharded pubsub live reshard test, use stable dockers for tests, make sure to close pubsub clients when a node disconnects from the cluster * fix "ssubscribe & sunsubscribe" test * lock search docker to 2.4.9 * change numberOfMasters default to 2 * use edge for bloom * add tests * add back getMasters and getSlotMaster as deprecated functions * add some tests * fix reconnect strategy + docs * sharded pubsub docs * Update pub-sub.md * some jsdoc, docs, cluster topology test * clean pub-sub docs Co-authored-by: Simon Prickett <simon@redislabs.com> * reconnect startegy docs and bug fix Co-authored-by: Simon Prickett <simon@redislabs.com> * refine jsdoc and some docs Co-authored-by: Simon Prickett <simon@redislabs.com> * I'm stupid * fix cluster topology test * fix cluster topology test * Update README.md * Update clustering.md * Update pub-sub.md Co-authored-by: Simon Prickett <simon@redislabs.com>
152 lines
4.7 KiB
TypeScript
152 lines
4.7 KiB
TypeScript
import { strict as assert } from 'assert';
|
|
import { PubSub, PubSubType } from './pub-sub';
|
|
|
|
describe('PubSub', () => {
|
|
const TYPE = PubSubType.CHANNELS,
|
|
CHANNEL = 'channel',
|
|
LISTENER = () => {};
|
|
|
|
describe('subscribe to new channel', () => {
|
|
function createAndSubscribe() {
|
|
const pubSub = new PubSub(),
|
|
command = pubSub.subscribe(TYPE, CHANNEL, LISTENER);
|
|
|
|
assert.equal(pubSub.isActive, true);
|
|
assert.ok(command);
|
|
assert.equal(command.channelsCounter, 1);
|
|
|
|
return {
|
|
pubSub,
|
|
command
|
|
};
|
|
}
|
|
|
|
it('resolve', () => {
|
|
const { pubSub, command } = createAndSubscribe();
|
|
|
|
command.resolve();
|
|
|
|
assert.equal(pubSub.isActive, true);
|
|
});
|
|
|
|
it('reject', () => {
|
|
const { pubSub, command } = createAndSubscribe();
|
|
|
|
assert.ok(command.reject);
|
|
command.reject();
|
|
|
|
assert.equal(pubSub.isActive, false);
|
|
});
|
|
});
|
|
|
|
it('subscribe to already subscribed channel', () => {
|
|
const pubSub = new PubSub(),
|
|
firstSubscribe = pubSub.subscribe(TYPE, CHANNEL, LISTENER);
|
|
assert.ok(firstSubscribe);
|
|
|
|
const secondSubscribe = pubSub.subscribe(TYPE, CHANNEL, LISTENER);
|
|
assert.ok(secondSubscribe);
|
|
|
|
firstSubscribe.resolve();
|
|
|
|
assert.equal(
|
|
pubSub.subscribe(TYPE, CHANNEL, LISTENER),
|
|
undefined
|
|
);
|
|
});
|
|
|
|
it('unsubscribe all', () => {
|
|
const pubSub = new PubSub();
|
|
|
|
const subscribe = pubSub.subscribe(TYPE, CHANNEL, LISTENER);
|
|
assert.ok(subscribe);
|
|
subscribe.resolve();
|
|
assert.equal(pubSub.isActive, true);
|
|
|
|
const unsubscribe = pubSub.unsubscribe(TYPE);
|
|
assert.equal(pubSub.isActive, true);
|
|
assert.ok(unsubscribe);
|
|
unsubscribe.resolve();
|
|
assert.equal(pubSub.isActive, false);
|
|
});
|
|
|
|
describe('unsubscribe from channel', () => {
|
|
it('when not subscribed', () => {
|
|
const pubSub = new PubSub(),
|
|
unsubscribe = pubSub.unsubscribe(TYPE, CHANNEL);
|
|
assert.ok(unsubscribe);
|
|
unsubscribe.resolve();
|
|
assert.equal(pubSub.isActive, false);
|
|
});
|
|
|
|
it('when already subscribed', () => {
|
|
const pubSub = new PubSub(),
|
|
subscribe = pubSub.subscribe(TYPE, CHANNEL, LISTENER);
|
|
assert.ok(subscribe);
|
|
subscribe.resolve();
|
|
assert.equal(pubSub.isActive, true);
|
|
|
|
const unsubscribe = pubSub.unsubscribe(TYPE, CHANNEL);
|
|
assert.equal(pubSub.isActive, true);
|
|
assert.ok(unsubscribe);
|
|
unsubscribe.resolve();
|
|
assert.equal(pubSub.isActive, false);
|
|
});
|
|
});
|
|
|
|
describe('unsubscribe from listener', () => {
|
|
it('when it\'s the only listener', () => {
|
|
const pubSub = new PubSub(),
|
|
subscribe = pubSub.subscribe(TYPE, CHANNEL, LISTENER);
|
|
assert.ok(subscribe);
|
|
subscribe.resolve();
|
|
assert.equal(pubSub.isActive, true);
|
|
|
|
const unsubscribe = pubSub.unsubscribe(TYPE, CHANNEL, LISTENER);
|
|
assert.ok(unsubscribe);
|
|
unsubscribe.resolve();
|
|
assert.equal(pubSub.isActive, false);
|
|
});
|
|
|
|
it('when there are more listeners', () => {
|
|
const pubSub = new PubSub(),
|
|
subscribe = pubSub.subscribe(TYPE, CHANNEL, LISTENER);
|
|
assert.ok(subscribe);
|
|
subscribe.resolve();
|
|
assert.equal(pubSub.isActive, true);
|
|
|
|
assert.equal(
|
|
pubSub.subscribe(TYPE, CHANNEL, () => {}),
|
|
undefined
|
|
);
|
|
|
|
assert.equal(
|
|
pubSub.unsubscribe(TYPE, CHANNEL, LISTENER),
|
|
undefined
|
|
);
|
|
});
|
|
|
|
describe('non-existing listener', () => {
|
|
it('on subscribed channel', () => {
|
|
const pubSub = new PubSub(),
|
|
subscribe = pubSub.subscribe(TYPE, CHANNEL, LISTENER);
|
|
assert.ok(subscribe);
|
|
subscribe.resolve();
|
|
assert.equal(pubSub.isActive, true);
|
|
|
|
assert.equal(
|
|
pubSub.unsubscribe(TYPE, CHANNEL, () => {}),
|
|
undefined
|
|
);
|
|
assert.equal(pubSub.isActive, true);
|
|
});
|
|
|
|
it('on unsubscribed channel', () => {
|
|
const pubSub = new PubSub();
|
|
assert.ok(pubSub.unsubscribe(TYPE, CHANNEL, () => {}));
|
|
assert.equal(pubSub.isActive, false);
|
|
});
|
|
});
|
|
});
|
|
});
|