UNPKG

2.84 kBJavaScriptView Raw
1// @flow
2"use strict";
3export type Primitive = string | number | boolean | null;
4export type JsonValue = Primitive | JsonMap | JsonValue[];
5export type JsonMap = { [key: string]: JsonValue | void };
6
7export type Key = Primitive;
8export type KeyRangeTo = { from?: number, to: number, +length?: empty };
9export type KeyRangeLength = { from?: number, length: number, +to?: empty };
10export type KeyRange = KeyRangeTo | KeyRangeLength;
11export type Path = Key[];
12export type KeySet = Key | KeyRange | Array<Key | KeyRange>;
13export type PathSet = KeySet[];
14
15export type JsonGraph = { [key: string]: JsonGraphNode | void, +$type?: empty };
16export type JsonGraphNode = JsonGraph | JsonGraphLeaf;
17export type JsonGraphLeaf =
18 | JsonGraphAtom
19 | JsonGraphError
20 | JsonGraphRef
21 | Primitive;
22
23export type JsonGraphAtomDefined<T: ?JsonValue> = JsonGraphMetadata & {
24 +$type: "atom",
25 +value: T
26};
27
28export type JsonGraphAtomUndefined = JsonGraphMetadata & {
29 +$type: "atom",
30 +value?: void
31};
32
33export type JsonGraphAtom = JsonGraphMetadata & {
34 +$type: "atom",
35 +value?: ?JsonValue
36};
37
38export type JsonGraphError = JsonGraphMetadata & {
39 +$type: "error",
40 +value: JsonValue
41};
42export type JsonGraphRef = JsonGraphMetadata & {
43 +$type: "ref",
44 +value: Path
45};
46
47export type JsonGraphMetadata = {
48 +$expires?: number,
49 +$size?: number,
50 +$timestamp?: number
51};
52
53export type JsonGraphEnvelope = {
54 jsonGraph: JsonGraph,
55 paths?: PathSet[],
56 invalidated?: PathSet[],
57 context?: JsonGraph
58};
59
60export type PathValue = {
61 path: PathSet,
62 value: JsonGraphLeaf,
63 invalidated?: empty,
64 jsonGraph?: empty
65};
66
67export type PathInvalidation = {
68 path: PathSet,
69 value?: empty,
70 invalidated: true,
71 jsonGraph?: empty
72};
73
74export interface IDisposable {
75 dispose(): void;
76 +isDisposed: boolean;
77}
78
79export type PartialObserver<T> = {
80 +onNext?: (value: T) => void,
81 +onError?: (error: Error) => void,
82 +onCompleted?: () => void
83};
84
85export interface IObservable<T> {
86 subscribe(
87 onNext: ?PartialObserver<T> | ((value: T) => void),
88 onError: ?(error: Error) => void,
89 onCompleted: ?() => void
90 ): IDisposable;
91}
92
93export interface IDataSource {
94 get(paths: PathSet[]): IObservable<JsonGraphEnvelope>;
95 set(jsonGraphEnvelope: JsonGraphEnvelope): IObservable<JsonGraphEnvelope>;
96 call(
97 functionPath: Path,
98 args?: JsonGraphNode[],
99 refSuffixes?: PathSet[],
100 thisPaths?: PathSet[]
101 ): IObservable<JsonGraphEnvelope>;
102}
103
104const {
105 ref,
106 atom,
107 undefinedAtom,
108 error,
109 pathValue,
110 pathInvalidation
111} = require("./factories");
112
113const {
114 mergeJsonGraph,
115 mergeJsonGraphEnvelope,
116 mergeJsonGraphNode
117} = require("./merge");
118
119module.exports = {
120 ref,
121 atom,
122 undefinedAtom,
123 undefined: undefinedAtom,
124 error,
125 pathValue,
126 pathInvalidation,
127 mergeJsonGraph,
128 mergeJsonGraphEnvelope,
129 mergeJsonGraphNode
130};