@data-loom/realtime-js 0.0.2-alpha.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main/RealtimeChannel.d.ts +228 -0
- package/dist/main/RealtimeChannel.d.ts.map +1 -0
- package/dist/main/RealtimeChannel.js +528 -0
- package/dist/main/RealtimeChannel.js.map +1 -0
- package/dist/main/RealtimeClient.d.ts +197 -0
- package/dist/main/RealtimeClient.d.ts.map +1 -0
- package/dist/main/RealtimeClient.js +514 -0
- package/dist/main/RealtimeClient.js.map +1 -0
- package/dist/main/RealtimePresence.d.ts +67 -0
- package/dist/main/RealtimePresence.d.ts.map +1 -0
- package/dist/main/RealtimePresence.js +228 -0
- package/dist/main/RealtimePresence.js.map +1 -0
- package/dist/main/index.d.ts +5 -0
- package/dist/main/index.d.ts.map +1 -0
- package/dist/main/index.js +41 -0
- package/dist/main/index.js.map +1 -0
- package/dist/main/utils/constants.d.ts +43 -0
- package/dist/main/utils/constants.d.ts.map +1 -0
- package/dist/main/utils/constants.js +51 -0
- package/dist/main/utils/constants.js.map +1 -0
- package/dist/main/utils/push.d.ts +48 -0
- package/dist/main/utils/push.d.ts.map +1 -0
- package/dist/main/utils/push.js +104 -0
- package/dist/main/utils/push.js.map +1 -0
- package/dist/main/utils/serializer.d.ts +7 -0
- package/dist/main/utils/serializer.d.ts.map +1 -0
- package/dist/main/utils/serializer.js +36 -0
- package/dist/main/utils/serializer.js.map +1 -0
- package/dist/main/utils/timer.d.ts +22 -0
- package/dist/main/utils/timer.d.ts.map +1 -0
- package/dist/main/utils/timer.js +38 -0
- package/dist/main/utils/timer.js.map +1 -0
- package/dist/main/utils/transformers.d.ts +109 -0
- package/dist/main/utils/transformers.d.ts.map +1 -0
- package/dist/main/utils/transformers.js +229 -0
- package/dist/main/utils/transformers.js.map +1 -0
- package/dist/main/utils/version.d.ts +2 -0
- package/dist/main/utils/version.d.ts.map +1 -0
- package/dist/main/utils/version.js +5 -0
- package/dist/main/utils/version.js.map +1 -0
- package/dist/module/RealtimeChannel.d.ts +228 -0
- package/dist/module/RealtimeChannel.d.ts.map +1 -0
- package/dist/module/RealtimeChannel.js +498 -0
- package/dist/module/RealtimeChannel.js.map +1 -0
- package/dist/module/RealtimeClient.d.ts +197 -0
- package/dist/module/RealtimeClient.d.ts.map +1 -0
- package/dist/module/RealtimeClient.js +482 -0
- package/dist/module/RealtimeClient.js.map +1 -0
- package/dist/module/RealtimePresence.d.ts +67 -0
- package/dist/module/RealtimePresence.d.ts.map +1 -0
- package/dist/module/RealtimePresence.js +224 -0
- package/dist/module/RealtimePresence.js.map +1 -0
- package/dist/module/index.d.ts +5 -0
- package/dist/module/index.d.ts.map +1 -0
- package/dist/module/index.js +5 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/utils/constants.d.ts +43 -0
- package/dist/module/utils/constants.d.ts.map +1 -0
- package/dist/module/utils/constants.js +48 -0
- package/dist/module/utils/constants.js.map +1 -0
- package/dist/module/utils/push.d.ts +48 -0
- package/dist/module/utils/push.d.ts.map +1 -0
- package/dist/module/utils/push.js +101 -0
- package/dist/module/utils/push.js.map +1 -0
- package/dist/module/utils/serializer.d.ts +7 -0
- package/dist/module/utils/serializer.d.ts.map +1 -0
- package/dist/module/utils/serializer.js +33 -0
- package/dist/module/utils/serializer.js.map +1 -0
- package/dist/module/utils/timer.d.ts +22 -0
- package/dist/module/utils/timer.d.ts.map +1 -0
- package/dist/module/utils/timer.js +35 -0
- package/dist/module/utils/timer.js.map +1 -0
- package/dist/module/utils/transformers.d.ts +109 -0
- package/dist/module/utils/transformers.d.ts.map +1 -0
- package/dist/module/utils/transformers.js +217 -0
- package/dist/module/utils/transformers.js.map +1 -0
- package/dist/module/utils/version.d.ts +2 -0
- package/dist/module/utils/version.d.ts.map +1 -0
- package/dist/module/utils/version.js +2 -0
- package/dist/module/utils/version.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Creates a timer that accepts a `timerCalc` function to perform calculated timeout retries, such as exponential backoff.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* let reconnectTimer = new Timer(() => this.connect(), function(tries){
|
|
8
|
+
* return [1000, 5000, 10000][tries - 1] || 10000
|
|
9
|
+
* })
|
|
10
|
+
* reconnectTimer.scheduleTimeout() // fires after 1000
|
|
11
|
+
* reconnectTimer.scheduleTimeout() // fires after 5000
|
|
12
|
+
* reconnectTimer.reset()
|
|
13
|
+
* reconnectTimer.scheduleTimeout() // fires after 1000
|
|
14
|
+
*/
|
|
15
|
+
class Timer {
|
|
16
|
+
constructor(callback, timerCalc) {
|
|
17
|
+
this.callback = callback;
|
|
18
|
+
this.timerCalc = timerCalc;
|
|
19
|
+
this.timer = undefined;
|
|
20
|
+
this.tries = 0;
|
|
21
|
+
this.callback = callback;
|
|
22
|
+
this.timerCalc = timerCalc;
|
|
23
|
+
}
|
|
24
|
+
reset() {
|
|
25
|
+
this.tries = 0;
|
|
26
|
+
clearTimeout(this.timer);
|
|
27
|
+
}
|
|
28
|
+
// Cancels any previous scheduleTimeout and schedules callback
|
|
29
|
+
scheduleTimeout() {
|
|
30
|
+
clearTimeout(this.timer);
|
|
31
|
+
this.timer = setTimeout(() => {
|
|
32
|
+
this.tries = this.tries + 1;
|
|
33
|
+
this.callback();
|
|
34
|
+
}, this.timerCalc(this.tries + 1));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.default = Timer;
|
|
38
|
+
//# sourceMappingURL=timer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer.js","sourceRoot":"","sources":["../../../src/utils/timer.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;GAWG;AACH,MAAqB,KAAK;IAIxB,YAAmB,QAAkB,EAAS,SAAmB;QAA9C,aAAQ,GAAR,QAAQ,CAAU;QAAS,cAAS,GAAT,SAAS,CAAU;QAHjE,UAAK,GAAuB,SAAS,CAAA;QACrC,UAAK,GAAW,CAAC,CAAA;QAGf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QACd,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IAED,8DAA8D;IAC9D,eAAe;QACb,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAExB,IAAI,CAAC,KAAK,GAAQ,UAAU,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;YAC3B,IAAI,CAAC,QAAQ,EAAE,CAAA;QACjB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;CACF;AAvBD,wBAuBC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers to convert the change Payload into native JS types.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum PostgresTypes {
|
|
5
|
+
abstime = "abstime",
|
|
6
|
+
bool = "bool",
|
|
7
|
+
date = "date",
|
|
8
|
+
daterange = "daterange",
|
|
9
|
+
float4 = "float4",
|
|
10
|
+
float8 = "float8",
|
|
11
|
+
int2 = "int2",
|
|
12
|
+
int4 = "int4",
|
|
13
|
+
int4range = "int4range",
|
|
14
|
+
int8 = "int8",
|
|
15
|
+
int8range = "int8range",
|
|
16
|
+
json = "json",
|
|
17
|
+
jsonb = "jsonb",
|
|
18
|
+
money = "money",
|
|
19
|
+
numeric = "numeric",
|
|
20
|
+
oid = "oid",
|
|
21
|
+
reltime = "reltime",
|
|
22
|
+
text = "text",
|
|
23
|
+
time = "time",
|
|
24
|
+
timestamp = "timestamp",
|
|
25
|
+
timestamptz = "timestamptz",
|
|
26
|
+
timetz = "timetz",
|
|
27
|
+
tsrange = "tsrange",
|
|
28
|
+
tstzrange = "tstzrange"
|
|
29
|
+
}
|
|
30
|
+
type Columns = {
|
|
31
|
+
name: string;
|
|
32
|
+
type: string;
|
|
33
|
+
flags?: string[];
|
|
34
|
+
type_modifier?: number;
|
|
35
|
+
}[];
|
|
36
|
+
type BaseValue = null | string | number | boolean;
|
|
37
|
+
type RecordValue = BaseValue | BaseValue[];
|
|
38
|
+
type Record = {
|
|
39
|
+
[key: string]: RecordValue;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Takes an array of columns and an object of string values then converts each string value
|
|
43
|
+
* to its mapped type.
|
|
44
|
+
*
|
|
45
|
+
* @param {{name: String, type: String}[]} columns
|
|
46
|
+
* @param {Object} record
|
|
47
|
+
* @param {Object} options The map of various options that can be applied to the mapper
|
|
48
|
+
* @param {Array} options.skipTypes The array of types that should not be converted
|
|
49
|
+
*
|
|
50
|
+
* @example convertChangeData([{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age:'33'}, {})
|
|
51
|
+
* //=>{ first_name: 'Paul', age: 33 }
|
|
52
|
+
*/
|
|
53
|
+
export declare const convertChangeData: (columns: Columns, record: Record, options?: {
|
|
54
|
+
skipTypes?: string[];
|
|
55
|
+
}) => Record;
|
|
56
|
+
/**
|
|
57
|
+
* Converts the value of an individual column.
|
|
58
|
+
*
|
|
59
|
+
* @param {String} columnName The column that you want to convert
|
|
60
|
+
* @param {{name: String, type: String}[]} columns All of the columns
|
|
61
|
+
* @param {Object} record The map of string values
|
|
62
|
+
* @param {Array} skipTypes An array of types that should not be converted
|
|
63
|
+
* @return {object} Useless information
|
|
64
|
+
*
|
|
65
|
+
* @example convertColumn('age', [{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age: '33'}, [])
|
|
66
|
+
* //=> 33
|
|
67
|
+
* @example convertColumn('age', [{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age: '33'}, ['int4'])
|
|
68
|
+
* //=> "33"
|
|
69
|
+
*/
|
|
70
|
+
export declare const convertColumn: (columnName: string, columns: Columns, record: Record, skipTypes: string[]) => RecordValue;
|
|
71
|
+
/**
|
|
72
|
+
* If the value of the cell is `null`, returns null.
|
|
73
|
+
* Otherwise converts the string value to the correct type.
|
|
74
|
+
* @param {String} type A postgres column type
|
|
75
|
+
* @param {String} value The cell value
|
|
76
|
+
*
|
|
77
|
+
* @example convertCell('bool', 't')
|
|
78
|
+
* //=> true
|
|
79
|
+
* @example convertCell('int8', '10')
|
|
80
|
+
* //=> 10
|
|
81
|
+
* @example convertCell('_int4', '{1,2,3,4}')
|
|
82
|
+
* //=> [1,2,3,4]
|
|
83
|
+
*/
|
|
84
|
+
export declare const convertCell: (type: string, value: RecordValue) => RecordValue;
|
|
85
|
+
export declare const toBoolean: (value: RecordValue) => RecordValue;
|
|
86
|
+
export declare const toNumber: (value: RecordValue) => RecordValue;
|
|
87
|
+
export declare const toJson: (value: RecordValue) => RecordValue;
|
|
88
|
+
/**
|
|
89
|
+
* Converts a Postgres Array into a native JS array
|
|
90
|
+
*
|
|
91
|
+
* @example toArray('{}', 'int4')
|
|
92
|
+
* //=> []
|
|
93
|
+
* @example toArray('{"[2021-01-01,2021-12-31)","(2021-01-01,2021-12-32]"}', 'daterange')
|
|
94
|
+
* //=> ['[2021-01-01,2021-12-31)', '(2021-01-01,2021-12-32]']
|
|
95
|
+
* @example toArray([1,2,3,4], 'int4')
|
|
96
|
+
* //=> [1,2,3,4]
|
|
97
|
+
*/
|
|
98
|
+
export declare const toArray: (value: RecordValue, type: string) => RecordValue;
|
|
99
|
+
/**
|
|
100
|
+
* Fixes timestamp to be ISO-8601. Swaps the space between the date and time for a 'T'
|
|
101
|
+
* See https://github.com/supabase/supabase/issues/18
|
|
102
|
+
*
|
|
103
|
+
* @example toTimestampString('2019-09-10 00:00:00')
|
|
104
|
+
* //=> '2019-09-10T00:00:00'
|
|
105
|
+
*/
|
|
106
|
+
export declare const toTimestampString: (value: RecordValue) => RecordValue;
|
|
107
|
+
export declare const httpEndpointURL: (socketUrl: string) => string;
|
|
108
|
+
export {};
|
|
109
|
+
//# sourceMappingURL=transformers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../../../src/utils/transformers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,GAAG,QAAQ;IACX,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,WAAW,gBAAgB;IAC3B,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,SAAS,cAAc;CACxB;AAED,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,EAAE,CAAA;AAEH,KAAK,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AACjD,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,EAAE,CAAA;AAE1C,KAAK,MAAM,GAAG;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAA;CAC3B,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,6BAEpB,MAAM,YACL;IAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,KAChC,MAOF,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,eACZ,MAAM,4BAEV,MAAM,aACH,MAAM,EAAE,KAClB,WAUF,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,SAAU,MAAM,SAAS,WAAW,KAAG,WA0C9D,CAAA;AAKD,eAAO,MAAM,SAAS,UAAW,WAAW,KAAG,WAS9C,CAAA;AACD,eAAO,MAAM,QAAQ,UAAW,WAAW,KAAG,WAQ7C,CAAA;AACD,eAAO,MAAM,MAAM,UAAW,WAAW,KAAG,WAU3C,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,OAAO,UAAW,WAAW,QAAQ,MAAM,KAAG,WA0B1D,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,UAAW,WAAW,KAAG,WAMtD,CAAA;AAED,eAAO,MAAM,eAAe,cAAe,MAAM,KAAG,MAKnD,CAAA"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Helpers to convert the change Payload into native JS types.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.httpEndpointURL = exports.toTimestampString = exports.toArray = exports.toJson = exports.toNumber = exports.toBoolean = exports.convertCell = exports.convertColumn = exports.convertChangeData = exports.PostgresTypes = void 0;
|
|
7
|
+
// Adapted from epgsql (src/epgsql_binary.erl), this module licensed under
|
|
8
|
+
// 3-clause BSD found here: https://raw.githubusercontent.com/epgsql/epgsql/devel/LICENSE
|
|
9
|
+
var PostgresTypes;
|
|
10
|
+
(function (PostgresTypes) {
|
|
11
|
+
PostgresTypes["abstime"] = "abstime";
|
|
12
|
+
PostgresTypes["bool"] = "bool";
|
|
13
|
+
PostgresTypes["date"] = "date";
|
|
14
|
+
PostgresTypes["daterange"] = "daterange";
|
|
15
|
+
PostgresTypes["float4"] = "float4";
|
|
16
|
+
PostgresTypes["float8"] = "float8";
|
|
17
|
+
PostgresTypes["int2"] = "int2";
|
|
18
|
+
PostgresTypes["int4"] = "int4";
|
|
19
|
+
PostgresTypes["int4range"] = "int4range";
|
|
20
|
+
PostgresTypes["int8"] = "int8";
|
|
21
|
+
PostgresTypes["int8range"] = "int8range";
|
|
22
|
+
PostgresTypes["json"] = "json";
|
|
23
|
+
PostgresTypes["jsonb"] = "jsonb";
|
|
24
|
+
PostgresTypes["money"] = "money";
|
|
25
|
+
PostgresTypes["numeric"] = "numeric";
|
|
26
|
+
PostgresTypes["oid"] = "oid";
|
|
27
|
+
PostgresTypes["reltime"] = "reltime";
|
|
28
|
+
PostgresTypes["text"] = "text";
|
|
29
|
+
PostgresTypes["time"] = "time";
|
|
30
|
+
PostgresTypes["timestamp"] = "timestamp";
|
|
31
|
+
PostgresTypes["timestamptz"] = "timestamptz";
|
|
32
|
+
PostgresTypes["timetz"] = "timetz";
|
|
33
|
+
PostgresTypes["tsrange"] = "tsrange";
|
|
34
|
+
PostgresTypes["tstzrange"] = "tstzrange";
|
|
35
|
+
})(PostgresTypes = exports.PostgresTypes || (exports.PostgresTypes = {}));
|
|
36
|
+
/**
|
|
37
|
+
* Takes an array of columns and an object of string values then converts each string value
|
|
38
|
+
* to its mapped type.
|
|
39
|
+
*
|
|
40
|
+
* @param {{name: String, type: String}[]} columns
|
|
41
|
+
* @param {Object} record
|
|
42
|
+
* @param {Object} options The map of various options that can be applied to the mapper
|
|
43
|
+
* @param {Array} options.skipTypes The array of types that should not be converted
|
|
44
|
+
*
|
|
45
|
+
* @example convertChangeData([{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age:'33'}, {})
|
|
46
|
+
* //=>{ first_name: 'Paul', age: 33 }
|
|
47
|
+
*/
|
|
48
|
+
const convertChangeData = (columns, record, options = {}) => {
|
|
49
|
+
var _a;
|
|
50
|
+
const skipTypes = (_a = options.skipTypes) !== null && _a !== void 0 ? _a : [];
|
|
51
|
+
return Object.keys(record).reduce((acc, rec_key) => {
|
|
52
|
+
acc[rec_key] = (0, exports.convertColumn)(rec_key, columns, record, skipTypes);
|
|
53
|
+
return acc;
|
|
54
|
+
}, {});
|
|
55
|
+
};
|
|
56
|
+
exports.convertChangeData = convertChangeData;
|
|
57
|
+
/**
|
|
58
|
+
* Converts the value of an individual column.
|
|
59
|
+
*
|
|
60
|
+
* @param {String} columnName The column that you want to convert
|
|
61
|
+
* @param {{name: String, type: String}[]} columns All of the columns
|
|
62
|
+
* @param {Object} record The map of string values
|
|
63
|
+
* @param {Array} skipTypes An array of types that should not be converted
|
|
64
|
+
* @return {object} Useless information
|
|
65
|
+
*
|
|
66
|
+
* @example convertColumn('age', [{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age: '33'}, [])
|
|
67
|
+
* //=> 33
|
|
68
|
+
* @example convertColumn('age', [{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age: '33'}, ['int4'])
|
|
69
|
+
* //=> "33"
|
|
70
|
+
*/
|
|
71
|
+
const convertColumn = (columnName, columns, record, skipTypes) => {
|
|
72
|
+
const column = columns.find((x) => x.name === columnName);
|
|
73
|
+
const colType = column === null || column === void 0 ? void 0 : column.type;
|
|
74
|
+
const value = record[columnName];
|
|
75
|
+
if (colType && !skipTypes.includes(colType)) {
|
|
76
|
+
return (0, exports.convertCell)(colType, value);
|
|
77
|
+
}
|
|
78
|
+
return noop(value);
|
|
79
|
+
};
|
|
80
|
+
exports.convertColumn = convertColumn;
|
|
81
|
+
/**
|
|
82
|
+
* If the value of the cell is `null`, returns null.
|
|
83
|
+
* Otherwise converts the string value to the correct type.
|
|
84
|
+
* @param {String} type A postgres column type
|
|
85
|
+
* @param {String} value The cell value
|
|
86
|
+
*
|
|
87
|
+
* @example convertCell('bool', 't')
|
|
88
|
+
* //=> true
|
|
89
|
+
* @example convertCell('int8', '10')
|
|
90
|
+
* //=> 10
|
|
91
|
+
* @example convertCell('_int4', '{1,2,3,4}')
|
|
92
|
+
* //=> [1,2,3,4]
|
|
93
|
+
*/
|
|
94
|
+
const convertCell = (type, value) => {
|
|
95
|
+
// if data type is an array
|
|
96
|
+
if (type.charAt(0) === '_') {
|
|
97
|
+
const dataType = type.slice(1, type.length);
|
|
98
|
+
return (0, exports.toArray)(value, dataType);
|
|
99
|
+
}
|
|
100
|
+
// If not null, convert to correct type.
|
|
101
|
+
switch (type) {
|
|
102
|
+
case PostgresTypes.bool:
|
|
103
|
+
return (0, exports.toBoolean)(value);
|
|
104
|
+
case PostgresTypes.float4:
|
|
105
|
+
case PostgresTypes.float8:
|
|
106
|
+
case PostgresTypes.int2:
|
|
107
|
+
case PostgresTypes.int4:
|
|
108
|
+
case PostgresTypes.int8:
|
|
109
|
+
case PostgresTypes.numeric:
|
|
110
|
+
case PostgresTypes.oid:
|
|
111
|
+
return (0, exports.toNumber)(value);
|
|
112
|
+
case PostgresTypes.json:
|
|
113
|
+
case PostgresTypes.jsonb:
|
|
114
|
+
return (0, exports.toJson)(value);
|
|
115
|
+
case PostgresTypes.timestamp:
|
|
116
|
+
return (0, exports.toTimestampString)(value); // Format to be consistent with PostgREST
|
|
117
|
+
case PostgresTypes.abstime: // To allow users to cast it based on Timezone
|
|
118
|
+
case PostgresTypes.date: // To allow users to cast it based on Timezone
|
|
119
|
+
case PostgresTypes.daterange:
|
|
120
|
+
case PostgresTypes.int4range:
|
|
121
|
+
case PostgresTypes.int8range:
|
|
122
|
+
case PostgresTypes.money:
|
|
123
|
+
case PostgresTypes.reltime: // To allow users to cast it based on Timezone
|
|
124
|
+
case PostgresTypes.text:
|
|
125
|
+
case PostgresTypes.time: // To allow users to cast it based on Timezone
|
|
126
|
+
case PostgresTypes.timestamptz: // To allow users to cast it based on Timezone
|
|
127
|
+
case PostgresTypes.timetz: // To allow users to cast it based on Timezone
|
|
128
|
+
case PostgresTypes.tsrange:
|
|
129
|
+
case PostgresTypes.tstzrange:
|
|
130
|
+
return noop(value);
|
|
131
|
+
default:
|
|
132
|
+
// Return the value for remaining types
|
|
133
|
+
return noop(value);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
exports.convertCell = convertCell;
|
|
137
|
+
const noop = (value) => {
|
|
138
|
+
return value;
|
|
139
|
+
};
|
|
140
|
+
const toBoolean = (value) => {
|
|
141
|
+
switch (value) {
|
|
142
|
+
case 't':
|
|
143
|
+
return true;
|
|
144
|
+
case 'f':
|
|
145
|
+
return false;
|
|
146
|
+
default:
|
|
147
|
+
return value;
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
exports.toBoolean = toBoolean;
|
|
151
|
+
const toNumber = (value) => {
|
|
152
|
+
if (typeof value === 'string') {
|
|
153
|
+
const parsedValue = parseFloat(value);
|
|
154
|
+
if (!Number.isNaN(parsedValue)) {
|
|
155
|
+
return parsedValue;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return value;
|
|
159
|
+
};
|
|
160
|
+
exports.toNumber = toNumber;
|
|
161
|
+
const toJson = (value) => {
|
|
162
|
+
if (typeof value === 'string') {
|
|
163
|
+
try {
|
|
164
|
+
return JSON.parse(value);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
console.log(`JSON parse error: ${error}`);
|
|
168
|
+
return value;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return value;
|
|
172
|
+
};
|
|
173
|
+
exports.toJson = toJson;
|
|
174
|
+
/**
|
|
175
|
+
* Converts a Postgres Array into a native JS array
|
|
176
|
+
*
|
|
177
|
+
* @example toArray('{}', 'int4')
|
|
178
|
+
* //=> []
|
|
179
|
+
* @example toArray('{"[2021-01-01,2021-12-31)","(2021-01-01,2021-12-32]"}', 'daterange')
|
|
180
|
+
* //=> ['[2021-01-01,2021-12-31)', '(2021-01-01,2021-12-32]']
|
|
181
|
+
* @example toArray([1,2,3,4], 'int4')
|
|
182
|
+
* //=> [1,2,3,4]
|
|
183
|
+
*/
|
|
184
|
+
const toArray = (value, type) => {
|
|
185
|
+
if (typeof value !== 'string') {
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
const lastIdx = value.length - 1;
|
|
189
|
+
const closeBrace = value[lastIdx];
|
|
190
|
+
const openBrace = value[0];
|
|
191
|
+
// Confirm value is a Postgres array by checking curly brackets
|
|
192
|
+
if (openBrace === '{' && closeBrace === '}') {
|
|
193
|
+
let arr;
|
|
194
|
+
const valTrim = value.slice(1, lastIdx);
|
|
195
|
+
// TODO: find a better solution to separate Postgres array data
|
|
196
|
+
try {
|
|
197
|
+
arr = JSON.parse('[' + valTrim + ']');
|
|
198
|
+
}
|
|
199
|
+
catch (_) {
|
|
200
|
+
// WARNING: splitting on comma does not cover all edge cases
|
|
201
|
+
arr = valTrim ? valTrim.split(',') : [];
|
|
202
|
+
}
|
|
203
|
+
return arr.map((val) => (0, exports.convertCell)(type, val));
|
|
204
|
+
}
|
|
205
|
+
return value;
|
|
206
|
+
};
|
|
207
|
+
exports.toArray = toArray;
|
|
208
|
+
/**
|
|
209
|
+
* Fixes timestamp to be ISO-8601. Swaps the space between the date and time for a 'T'
|
|
210
|
+
* See https://github.com/supabase/supabase/issues/18
|
|
211
|
+
*
|
|
212
|
+
* @example toTimestampString('2019-09-10 00:00:00')
|
|
213
|
+
* //=> '2019-09-10T00:00:00'
|
|
214
|
+
*/
|
|
215
|
+
const toTimestampString = (value) => {
|
|
216
|
+
if (typeof value === 'string') {
|
|
217
|
+
return value.replace(' ', 'T');
|
|
218
|
+
}
|
|
219
|
+
return value;
|
|
220
|
+
};
|
|
221
|
+
exports.toTimestampString = toTimestampString;
|
|
222
|
+
const httpEndpointURL = (socketUrl) => {
|
|
223
|
+
let url = socketUrl;
|
|
224
|
+
url = url.replace(/^ws/i, 'http');
|
|
225
|
+
url = url.replace(/(\/socket\/websocket|\/socket|\/websocket)\/?$/i, '');
|
|
226
|
+
return url.replace(/\/+$/, '');
|
|
227
|
+
};
|
|
228
|
+
exports.httpEndpointURL = httpEndpointURL;
|
|
229
|
+
//# sourceMappingURL=transformers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../../src/utils/transformers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/utils/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,oBAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/utils/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { CHANNEL_STATES } from './utils/constants';
|
|
2
|
+
import Push from './utils/push';
|
|
3
|
+
import type RealtimeClient from './RealtimeClient';
|
|
4
|
+
import Timer from './utils/timer';
|
|
5
|
+
import RealtimePresence, { REALTIME_PRESENCE_LISTEN_EVENTS } from './RealtimePresence';
|
|
6
|
+
import type { RealtimePresenceJoinPayload, RealtimePresenceLeavePayload, RealtimePresenceState } from './RealtimePresence';
|
|
7
|
+
export type RealtimeChannelOptions = {
|
|
8
|
+
config: {
|
|
9
|
+
/**
|
|
10
|
+
* self option enables client to receive message it broadcast
|
|
11
|
+
* ack option instructs server to acknowledge that broadcast message was received
|
|
12
|
+
*/
|
|
13
|
+
broadcast?: {
|
|
14
|
+
self?: boolean;
|
|
15
|
+
ack?: boolean;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* key option is used to track presence payload across clients
|
|
19
|
+
*/
|
|
20
|
+
presence?: {
|
|
21
|
+
key?: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* defines if the channel is private or not and if RLS policies will be used to check data
|
|
25
|
+
*/
|
|
26
|
+
private?: boolean;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
type RealtimePostgresChangesPayloadBase = {
|
|
30
|
+
schema: string;
|
|
31
|
+
table: string;
|
|
32
|
+
commit_timestamp: string;
|
|
33
|
+
errors: string[];
|
|
34
|
+
};
|
|
35
|
+
export type RealtimePostgresInsertPayload<T extends {
|
|
36
|
+
[key: string]: any;
|
|
37
|
+
}> = RealtimePostgresChangesPayloadBase & {
|
|
38
|
+
eventType: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT}`;
|
|
39
|
+
new: T;
|
|
40
|
+
old: {};
|
|
41
|
+
};
|
|
42
|
+
export type RealtimePostgresUpdatePayload<T extends {
|
|
43
|
+
[key: string]: any;
|
|
44
|
+
}> = RealtimePostgresChangesPayloadBase & {
|
|
45
|
+
eventType: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE}`;
|
|
46
|
+
new: T;
|
|
47
|
+
old: Partial<T>;
|
|
48
|
+
};
|
|
49
|
+
export type RealtimePostgresDeletePayload<T extends {
|
|
50
|
+
[key: string]: any;
|
|
51
|
+
}> = RealtimePostgresChangesPayloadBase & {
|
|
52
|
+
eventType: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE}`;
|
|
53
|
+
new: {};
|
|
54
|
+
old: Partial<T>;
|
|
55
|
+
};
|
|
56
|
+
export type RealtimePostgresChangesPayload<T extends {
|
|
57
|
+
[key: string]: any;
|
|
58
|
+
}> = RealtimePostgresInsertPayload<T> | RealtimePostgresUpdatePayload<T> | RealtimePostgresDeletePayload<T>;
|
|
59
|
+
export type RealtimePostgresChangesFilter<T extends `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT}`> = {
|
|
60
|
+
/**
|
|
61
|
+
* The type of database change to listen to.
|
|
62
|
+
*/
|
|
63
|
+
event: T;
|
|
64
|
+
/**
|
|
65
|
+
* The database schema to listen to.
|
|
66
|
+
*/
|
|
67
|
+
schema: string;
|
|
68
|
+
/**
|
|
69
|
+
* The database table to listen to.
|
|
70
|
+
*/
|
|
71
|
+
table?: string;
|
|
72
|
+
/**
|
|
73
|
+
* Receive database changes when filter is matched.
|
|
74
|
+
*/
|
|
75
|
+
filter?: string;
|
|
76
|
+
};
|
|
77
|
+
export type RealtimeChannelSendResponse = 'ok' | 'timed out' | 'error';
|
|
78
|
+
export declare enum REALTIME_POSTGRES_CHANGES_LISTEN_EVENT {
|
|
79
|
+
ALL = "*",
|
|
80
|
+
INSERT = "INSERT",
|
|
81
|
+
UPDATE = "UPDATE",
|
|
82
|
+
DELETE = "DELETE"
|
|
83
|
+
}
|
|
84
|
+
export declare enum REALTIME_LISTEN_TYPES {
|
|
85
|
+
BROADCAST = "broadcast",
|
|
86
|
+
PRESENCE = "presence",
|
|
87
|
+
POSTGRES_CHANGES = "postgres_changes",
|
|
88
|
+
SYSTEM = "system"
|
|
89
|
+
}
|
|
90
|
+
export declare enum REALTIME_SUBSCRIBE_STATES {
|
|
91
|
+
SUBSCRIBED = "SUBSCRIBED",
|
|
92
|
+
TIMED_OUT = "TIMED_OUT",
|
|
93
|
+
CLOSED = "CLOSED",
|
|
94
|
+
CHANNEL_ERROR = "CHANNEL_ERROR"
|
|
95
|
+
}
|
|
96
|
+
export declare const REALTIME_CHANNEL_STATES: typeof CHANNEL_STATES;
|
|
97
|
+
/** A channel is the basic building block of Realtime
|
|
98
|
+
* and narrows the scope of data flow to subscribed clients.
|
|
99
|
+
* You can think of a channel as a chatroom where participants are able to see who's online
|
|
100
|
+
* and send and receive messages.
|
|
101
|
+
*/
|
|
102
|
+
export default class RealtimeChannel {
|
|
103
|
+
/** Topic name can be any string. */
|
|
104
|
+
topic: string;
|
|
105
|
+
params: RealtimeChannelOptions;
|
|
106
|
+
socket: RealtimeClient;
|
|
107
|
+
bindings: {
|
|
108
|
+
[key: string]: {
|
|
109
|
+
type: string;
|
|
110
|
+
filter: {
|
|
111
|
+
[key: string]: any;
|
|
112
|
+
};
|
|
113
|
+
callback: Function;
|
|
114
|
+
id?: string;
|
|
115
|
+
}[];
|
|
116
|
+
};
|
|
117
|
+
timeout: number;
|
|
118
|
+
state: CHANNEL_STATES;
|
|
119
|
+
joinedOnce: boolean;
|
|
120
|
+
joinPush: Push;
|
|
121
|
+
rejoinTimer: Timer;
|
|
122
|
+
pushBuffer: Push[];
|
|
123
|
+
presence: RealtimePresence;
|
|
124
|
+
broadcastEndpointURL: string;
|
|
125
|
+
subTopic: string;
|
|
126
|
+
private: boolean;
|
|
127
|
+
constructor(
|
|
128
|
+
/** Topic name can be any string. */
|
|
129
|
+
topic: string, params: RealtimeChannelOptions, socket: RealtimeClient);
|
|
130
|
+
/** Subscribe registers your client with the server */
|
|
131
|
+
subscribe(callback?: (status: REALTIME_SUBSCRIBE_STATES, err?: Error) => void, timeout?: number): RealtimeChannel;
|
|
132
|
+
presenceState<T extends {
|
|
133
|
+
[key: string]: any;
|
|
134
|
+
} = {}>(): RealtimePresenceState<T>;
|
|
135
|
+
track(payload: {
|
|
136
|
+
[key: string]: any;
|
|
137
|
+
}, opts?: {
|
|
138
|
+
[key: string]: any;
|
|
139
|
+
}): Promise<RealtimeChannelSendResponse>;
|
|
140
|
+
untrack(opts?: {
|
|
141
|
+
[key: string]: any;
|
|
142
|
+
}): Promise<RealtimeChannelSendResponse>;
|
|
143
|
+
/**
|
|
144
|
+
* Creates an event handler that listens to changes.
|
|
145
|
+
*/
|
|
146
|
+
on(type: `${REALTIME_LISTEN_TYPES.PRESENCE}`, filter: {
|
|
147
|
+
event: `${REALTIME_PRESENCE_LISTEN_EVENTS.SYNC}`;
|
|
148
|
+
}, callback: () => void): RealtimeChannel;
|
|
149
|
+
on<T extends {
|
|
150
|
+
[key: string]: any;
|
|
151
|
+
}>(type: `${REALTIME_LISTEN_TYPES.PRESENCE}`, filter: {
|
|
152
|
+
event: `${REALTIME_PRESENCE_LISTEN_EVENTS.JOIN}`;
|
|
153
|
+
}, callback: (payload: RealtimePresenceJoinPayload<T>) => void): RealtimeChannel;
|
|
154
|
+
on<T extends {
|
|
155
|
+
[key: string]: any;
|
|
156
|
+
}>(type: `${REALTIME_LISTEN_TYPES.PRESENCE}`, filter: {
|
|
157
|
+
event: `${REALTIME_PRESENCE_LISTEN_EVENTS.LEAVE}`;
|
|
158
|
+
}, callback: (payload: RealtimePresenceLeavePayload<T>) => void): RealtimeChannel;
|
|
159
|
+
on<T extends {
|
|
160
|
+
[key: string]: any;
|
|
161
|
+
}>(type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`, filter: RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL}`>, callback: (payload: RealtimePostgresChangesPayload<T>) => void): RealtimeChannel;
|
|
162
|
+
on<T extends {
|
|
163
|
+
[key: string]: any;
|
|
164
|
+
}>(type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`, filter: RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT}`>, callback: (payload: RealtimePostgresInsertPayload<T>) => void): RealtimeChannel;
|
|
165
|
+
on<T extends {
|
|
166
|
+
[key: string]: any;
|
|
167
|
+
}>(type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`, filter: RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE}`>, callback: (payload: RealtimePostgresUpdatePayload<T>) => void): RealtimeChannel;
|
|
168
|
+
on<T extends {
|
|
169
|
+
[key: string]: any;
|
|
170
|
+
}>(type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`, filter: RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE}`>, callback: (payload: RealtimePostgresDeletePayload<T>) => void): RealtimeChannel;
|
|
171
|
+
/**
|
|
172
|
+
* The following is placed here to display on supabase.com/docs/reference/javascript/subscribe.
|
|
173
|
+
* @param type One of "broadcast", "presence", or "postgres_changes".
|
|
174
|
+
* @param filter Custom object specific to the Realtime feature detailing which payloads to receive.
|
|
175
|
+
* @param callback Function to be invoked when event handler is triggered.
|
|
176
|
+
*/
|
|
177
|
+
on(type: `${REALTIME_LISTEN_TYPES.BROADCAST}`, filter: {
|
|
178
|
+
event: string;
|
|
179
|
+
}, callback: (payload: {
|
|
180
|
+
type: `${REALTIME_LISTEN_TYPES.BROADCAST}`;
|
|
181
|
+
event: string;
|
|
182
|
+
[key: string]: any;
|
|
183
|
+
}) => void): RealtimeChannel;
|
|
184
|
+
on<T extends {
|
|
185
|
+
[key: string]: any;
|
|
186
|
+
}>(type: `${REALTIME_LISTEN_TYPES.BROADCAST}`, filter: {
|
|
187
|
+
event: string;
|
|
188
|
+
}, callback: (payload: {
|
|
189
|
+
type: `${REALTIME_LISTEN_TYPES.BROADCAST}`;
|
|
190
|
+
event: string;
|
|
191
|
+
payload: T;
|
|
192
|
+
}) => void): RealtimeChannel;
|
|
193
|
+
on<T extends {
|
|
194
|
+
[key: string]: any;
|
|
195
|
+
}>(type: `${REALTIME_LISTEN_TYPES.SYSTEM}`, filter: {}, callback: (payload: any) => void): RealtimeChannel;
|
|
196
|
+
/**
|
|
197
|
+
* Sends a message into the channel.
|
|
198
|
+
*
|
|
199
|
+
* @param args Arguments to send to channel
|
|
200
|
+
* @param args.type The type of event to send
|
|
201
|
+
* @param args.event The name of the event being sent
|
|
202
|
+
* @param args.payload Payload to be sent
|
|
203
|
+
* @param opts Options to be used during the send process
|
|
204
|
+
*/
|
|
205
|
+
send(args: {
|
|
206
|
+
type: 'broadcast' | 'presence' | 'postgres_changes';
|
|
207
|
+
event: string;
|
|
208
|
+
payload?: any;
|
|
209
|
+
[key: string]: any;
|
|
210
|
+
}, opts?: {
|
|
211
|
+
[key: string]: any;
|
|
212
|
+
}): Promise<RealtimeChannelSendResponse>;
|
|
213
|
+
updateJoinPayload(payload: {
|
|
214
|
+
[key: string]: any;
|
|
215
|
+
}): void;
|
|
216
|
+
/**
|
|
217
|
+
* Leaves the channel.
|
|
218
|
+
*
|
|
219
|
+
* Unsubscribes from server events, and instructs channel to terminate on server.
|
|
220
|
+
* Triggers onClose() hooks.
|
|
221
|
+
*
|
|
222
|
+
* To receive leave acknowledgements, use the a `receive` hook to bind to the server ack, ie:
|
|
223
|
+
* channel.unsubscribe().receive("ok", () => alert("left!") )
|
|
224
|
+
*/
|
|
225
|
+
unsubscribe(timeout?: number): Promise<'ok' | 'timed out' | 'error'>;
|
|
226
|
+
}
|
|
227
|
+
export {};
|
|
228
|
+
//# sourceMappingURL=RealtimeChannel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RealtimeChannel.d.ts","sourceRoot":"","sources":["../../src/RealtimeChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,IAAI,MAAM,cAAc,CAAA;AAC/B,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,MAAM,eAAe,CAAA;AACjC,OAAO,gBAAgB,EAAE,EACvB,+BAA+B,EAChC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EACV,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACtB,MAAM,oBAAoB,CAAA;AAI3B,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE;QACN;;;WAGG;QACH,SAAS,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,OAAO,CAAC;YAAC,GAAG,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;QAC7C;;WAEG;QACH,QAAQ,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QAC3B;;WAEG;QACH,OAAO,CAAC,EAAE,OAAO,CAAA;KAClB,CAAA;CACF,CAAA;AAED,KAAK,kCAAkC,GAAG;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,6BAA6B,CAAC,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,IACxE,kCAAkC,GAAG;IACnC,SAAS,EAAE,GAAG,sCAAsC,CAAC,MAAM,EAAE,CAAA;IAC7D,GAAG,EAAE,CAAC,CAAA;IACN,GAAG,EAAE,EAAE,CAAA;CACR,CAAA;AAEH,MAAM,MAAM,6BAA6B,CAAC,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,IACxE,kCAAkC,GAAG;IACnC,SAAS,EAAE,GAAG,sCAAsC,CAAC,MAAM,EAAE,CAAA;IAC7D,GAAG,EAAE,CAAC,CAAA;IACN,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAChB,CAAA;AAEH,MAAM,MAAM,6BAA6B,CAAC,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,IACxE,kCAAkC,GAAG;IACnC,SAAS,EAAE,GAAG,sCAAsC,CAAC,MAAM,EAAE,CAAA;IAC7D,GAAG,EAAE,EAAE,CAAA;IACP,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAChB,CAAA;AAEH,MAAM,MAAM,8BAA8B,CAAC,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,IACvE,6BAA6B,CAAC,CAAC,CAAC,GAChC,6BAA6B,CAAC,CAAC,CAAC,GAChC,6BAA6B,CAAC,CAAC,CAAC,CAAA;AAEpC,MAAM,MAAM,6BAA6B,CACvC,CAAC,SAAS,GAAG,sCAAsC,EAAE,IACnD;IACF;;OAEG;IACH,KAAK,EAAE,CAAC,CAAA;IACR;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG,IAAI,GAAG,WAAW,GAAG,OAAO,CAAA;AAEtE,oBAAY,sCAAsC;IAChD,GAAG,MAAM;IACT,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAED,oBAAY,qBAAqB;IAC/B,SAAS,cAAc;IACvB,QAAQ,aAAa;IACrB,gBAAgB,qBAAqB;IACrC,MAAM,WAAW;CAClB;AAED,oBAAY,yBAAyB;IACnC,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,aAAa,kBAAkB;CAChC;AAED,eAAO,MAAM,uBAAuB,uBAAiB,CAAA;AAWrD;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,eAAe;IAqBhC,oCAAoC;IAC7B,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,sBAAsB;IAC9B,MAAM,EAAE,cAAc;IAvB/B,QAAQ,EAAE;QACR,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,IAAI,EAAE,MAAM,CAAA;YACZ,MAAM,EAAE;gBAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;aAAE,CAAA;YAC9B,QAAQ,EAAE,QAAQ,CAAA;YAClB,EAAE,CAAC,EAAE,MAAM,CAAA;SACZ,EAAE,CAAA;KACJ,CAAK;IACN,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,iBAAwB;IAC7B,UAAU,UAAQ;IAClB,QAAQ,EAAE,IAAI,CAAA;IACd,WAAW,EAAE,KAAK,CAAA;IAClB,UAAU,EAAE,IAAI,EAAE,CAAK;IACvB,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,oBAAoB,EAAE,MAAM,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;;IAGd,oCAAoC;IAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,sBAAuC,EAC/C,MAAM,EAAE,cAAc;IA6D/B,sDAAsD;IACtD,SAAS,CACP,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,EAAE,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,EACnE,OAAO,SAAe,GACrB,eAAe;IAmGlB,aAAa,CACX,CAAC,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,EAAE,KAClC,qBAAqB,CAAC,CAAC,CAAC;IAIvB,KAAK,CACT,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAC/B,IAAI,GAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAO,GAChC,OAAO,CAAC,2BAA2B,CAAC;IAWjC,OAAO,CACX,IAAI,GAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAO,GAChC,OAAO,CAAC,2BAA2B,CAAC;IAUvC;;OAEG;IACH,EAAE,CACA,IAAI,EAAE,GAAG,qBAAqB,CAAC,QAAQ,EAAE,EACzC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,+BAA+B,CAAC,IAAI,EAAE,CAAA;KAAE,EAC5D,QAAQ,EAAE,MAAM,IAAI,GACnB,eAAe;IAClB,EAAE,CAAC,CAAC,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EACjC,IAAI,EAAE,GAAG,qBAAqB,CAAC,QAAQ,EAAE,EACzC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,+BAA+B,CAAC,IAAI,EAAE,CAAA;KAAE,EAC5D,QAAQ,EAAE,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC1D,eAAe;IAClB,EAAE,CAAC,CAAC,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EACjC,IAAI,EAAE,GAAG,qBAAqB,CAAC,QAAQ,EAAE,EACzC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,+BAA+B,CAAC,KAAK,EAAE,CAAA;KAAE,EAC7D,QAAQ,EAAE,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC3D,eAAe;IAClB,EAAE,CAAC,CAAC,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EACjC,IAAI,EAAE,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,EACjD,MAAM,EAAE,6BAA6B,CAAC,GAAG,sCAAsC,CAAC,GAAG,EAAE,CAAC,EACtF,QAAQ,EAAE,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC7D,eAAe;IAClB,EAAE,CAAC,CAAC,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EACjC,IAAI,EAAE,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,EACjD,MAAM,EAAE,6BAA6B,CAAC,GAAG,sCAAsC,CAAC,MAAM,EAAE,CAAC,EACzF,QAAQ,EAAE,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC5D,eAAe;IAClB,EAAE,CAAC,CAAC,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EACjC,IAAI,EAAE,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,EACjD,MAAM,EAAE,6BAA6B,CAAC,GAAG,sCAAsC,CAAC,MAAM,EAAE,CAAC,EACzF,QAAQ,EAAE,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC5D,eAAe;IAClB,EAAE,CAAC,CAAC,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EACjC,IAAI,EAAE,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,EACjD,MAAM,EAAE,6BAA6B,CAAC,GAAG,sCAAsC,CAAC,MAAM,EAAE,CAAC,EACzF,QAAQ,EAAE,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC5D,eAAe;IAClB;;;;;OAKG;IACH,EAAE,CACA,IAAI,EAAE,GAAG,qBAAqB,CAAC,SAAS,EAAE,EAC1C,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EACzB,QAAQ,EAAE,CAAC,OAAO,EAAE;QAClB,IAAI,EAAE,GAAG,qBAAqB,CAAC,SAAS,EAAE,CAAA;QAC1C,KAAK,EAAE,MAAM,CAAA;QACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,KAAK,IAAI,GACT,eAAe;IAClB,EAAE,CAAC,CAAC,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EACjC,IAAI,EAAE,GAAG,qBAAqB,CAAC,SAAS,EAAE,EAC1C,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EACzB,QAAQ,EAAE,CAAC,OAAO,EAAE;QAClB,IAAI,EAAE,GAAG,qBAAqB,CAAC,SAAS,EAAE,CAAA;QAC1C,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,CAAC,CAAA;KACX,KAAK,IAAI,GACT,eAAe;IAClB,EAAE,CAAC,CAAC,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EACjC,IAAI,EAAE,GAAG,qBAAqB,CAAC,MAAM,EAAE,EACvC,MAAM,EAAE,EAAE,EACV,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAC/B,eAAe;IAQlB;;;;;;;;OAQG;IACG,IAAI,CACR,IAAI,EAAE;QACJ,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,kBAAkB,CAAA;QACnD,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,CAAC,EAAE,GAAG,CAAA;QACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,EACD,IAAI,GAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAO,GAChC,OAAO,CAAC,2BAA2B,CAAC;IAwDvC,iBAAiB,CAAC,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,IAAI;IAIxD;;;;;;;;OAQG;IACH,WAAW,CAAC,OAAO,SAAe,GAAG,OAAO,CAAC,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC;CAuT3E"}
|