observable-diff-operator
this is fromDiff / toDiff logic implementation for observables.
those operators are meant for sending observables over network:
Wrapping observers for Examples
to use the logic, you will need to simply wrap observables using your observables implementation, for example, RxJs:
;;
NOTE: for rxjs
, rxjs-diff-operator will give the same result but as embeded operator
instead of converting observables.
Operators:
toDiff
toDiffObserver<T>(Observer<IObservableDiff>): Observer<T>
signature: Description
toDiff operator is used to convert output of an obsersvable stream, into a stream that contains diff information. this operator is inteded to be used on the server.
Example
//emit (1,2,3,4,5);//add 10 to each value;//output: { type: "init", payload: 1, isObject: false }, { type: "update", payload: 2 }, ...;
fromDiff
fromDiffObserver<T>(Observer<T>): Observable<IObservableDiff>
signature: Description
fromDiff operator is used to convert output of an diff obsersvable stream (see toDiff above), into a stream that contains diff information. this operator is inteded to be used on the client.
Example
//emit diff information;//add 10 to each value;//output: 1, 2;
Deep-Dive:
Protocol
the protocol contains 4 message types:
- init
- must be the first message on the line.
- contains isObject property which represents the payload type on the stream.
- contains intial payload (not a diff)
- update
- sent for each next on the original observable
- contains payload property as raw value (simple values) or diff object (objects/arrays)
- error
- sent for errors on the original observable
- contains payload of error message
- complete
- sent when original observable is complete.
Handling Objects:
diffing simple values is not efficient, the real power of this operator comes when dealing with array or objects. for that, deep-diff is being used.
Object example:
given the input of:
,,,,,
this output will be emitted:
, , , , ,
Observable with an error example:
given the input of:
.map;
this output will be emitted:
, ,
Contributions
Contributions, issues and feature requests are very welcome. If you are using this package and fixed a bug for yourself, please consider submitting a PR!