-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Preliminary Scopes Implementation #102
Open
aidanm3341
wants to merge
11
commits into
morganstanley:main
Choose a base branch
from
aidanm3341:scopes
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 4 commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
cbb6b90
preliminary scopes implementation
aidanm3341 67c01ed
added an initial doc explaining scopes
aidanm3341 e376e31
refactored scopes, added more tests and scope disposal
aidanm3341 75fe872
improved documentation
aidanm3341 0389a8b
renamed scopes to children
aidanm3341 22422cd
added an isRoot method to the messagebroker
aidanm3341 5a36780
improved destruction of scopes
aidanm3341 3e5b2bc
added tests around name field
aidanm3341 5622030
added docs to destroy function
aidanm3341 795a10a
removed confusing logic around root node
aidanm3341 12a6b90
minor version bump in package.json
aidanm3341 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
--- | ||
order: 5 | ||
title: Scopes | ||
--- | ||
|
||
Message scoping is a mechanism for restricting which subscribers will receive a given message. | ||
You can create a new scope on a messagebroker by calling `createScope`. | ||
|
||
```typescript | ||
const parent: IMessageBroker<IContract> | ||
= messagebroker<IContract>(); | ||
|
||
const child: IMessageBroker<IContract> | ||
= parent.createScope('my-scope'); | ||
``` | ||
|
||
A scope is just another instance of an `IMessageBroker` on which you can perform all of the same operations that you'd expect on the base messagebroker. | ||
The main thing to note about this feature is how messages are shared across scopes. | ||
|
||
### Scope Hierarchies | ||
|
||
Any message that is published to a broker is also published down through the hierarchy of children scopes belonging that broker. | ||
|
||
```typescript | ||
parent.get('x').subscribe(message => console.log('parent received')); | ||
child.get('x').subscribe(message => console.log('child received')); | ||
|
||
parent.create('x').publish({}); | ||
|
||
// expect: child received | ||
// expect: parent received | ||
``` | ||
|
||
However messages are not sent **up** the hierarchy to the parent of that broker. | ||
|
||
```typescript | ||
parent.get('x').subscribe(message => console.log('parent received')); | ||
child.get('x').subscribe(message => console.log('child received')); | ||
|
||
child.create('x').publish({}); | ||
|
||
// expect: child received | ||
``` | ||
|
||
Messages are also not published to "sibling" scopes, where the brokers share a parent. | ||
|
||
```typescript | ||
const sibling: IMessageBroker<IContract> | ||
= parent.createScope('sibling-scope'); | ||
|
||
parent.get('x').subscribe(message => console.log('parent received')); | ||
child.get('x').subscribe(message => console.log('child received')); | ||
sibling.get('x').subscribe(message => console.log('sibling received')); | ||
|
||
sibling.create('x').publish({}); | ||
|
||
// expect: sibling received | ||
``` | ||
|
||
### Scope Depth | ||
|
||
Scope hierarchies can be arbitrarily deep, and messages will make their way all the way down to the bottom. | ||
|
||
```typescript | ||
const distantChild = parent | ||
.createScope('scope1') | ||
.createScope('scope2') | ||
... | ||
.createScope('scopeX'); | ||
|
||
distantChild.get('x').subscribe(message => console.log('child received')); | ||
|
||
parent.create('x').publish({}); | ||
|
||
// expect: child received | ||
``` | ||
|
||
### Naming | ||
|
||
Scopes under the same parent cannot have the same name. | ||
An attempt to create a scope with a name that already exists on a broker will just return the original scope. | ||
|
||
If they are different parts of the hierarchy (i.e. don't share a parent), then you can have multiple scopes with the same name. | ||
|
||
### Disposal | ||
|
||
Disposing of a channel in a broker will also dispose of that channel in its children scopes. | ||
|
||
```typescript | ||
const parentChannel = parent.create('x'); | ||
const childChannel = child.create('x'); | ||
parentChannel.subscribe(message => console.log('parent received')); | ||
childChannel.subscribe(message => console.log('child received')); | ||
|
||
parentChannel.dispose('x'); // cleans up child subscription too | ||
parentChannel.publish({}); | ||
|
||
// expect: nothing... | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the parent may have different generic params. We are assuming all the tree is uniform. Its fine but something to considerr.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If I'm understand right, do you mean supporting something like this?
in this case, would Contract2 be required to extend Contract 1? Otherwise a message sent to broker1 could not necessarily be passed down to broker2.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah so I think this is governed by the propergation logic you plan to implement. For example say create scope and that scope extends the parents channels type, then it would mean my scope would essentially be a superset of the parent and messages subsribed or publishes essentially propergate upwards.
However if you do not extend the parents type then you could it this way
I prefer the extended types option as it makes more sense that channels delegate upwards