prostgles-server 2.0.178 → 2.0.179
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/AuthHandler.d.ts +4 -4
- package/dist/AuthHandler.d.ts.map +1 -1
- package/dist/DBSchemaBuilder.d.ts +6 -6
- package/dist/DBSchemaBuilder.d.ts.map +1 -1
- package/dist/DBSchemaBuilder.js +25 -8
- package/dist/DBSchemaBuilder.js.map +1 -1
- package/dist/DboBuilder.d.ts +20 -21
- package/dist/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder.js +1 -1
- package/dist/DboBuilder.js.map +1 -1
- package/dist/Prostgles.d.ts +8 -10
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js.map +1 -1
- package/dist/PublishParser.d.ts +37 -37
- package/dist/PublishParser.d.ts.map +1 -1
- package/dist/PublishParser.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/lib/AuthHandler.d.ts +148 -0
- package/lib/AuthHandler.d.ts.map +1 -0
- package/lib/AuthHandler.js +411 -0
- package/lib/AuthHandler.ts +3 -3
- package/lib/DBEventsManager.d.ts +38 -0
- package/lib/DBEventsManager.d.ts.map +1 -0
- package/lib/DBEventsManager.js +136 -0
- package/lib/DBSchemaBuilder.d.ts +11 -0
- package/lib/DBSchemaBuilder.d.ts.map +1 -0
- package/lib/DBSchemaBuilder.js +102 -0
- package/lib/DBSchemaBuilder.ts +62 -27
- package/lib/DboBuilder.d.ts +428 -0
- package/lib/DboBuilder.d.ts.map +1 -0
- package/lib/DboBuilder.js +3078 -0
- package/lib/DboBuilder.ts +25 -25
- package/lib/FileManager.d.ts +168 -0
- package/lib/FileManager.d.ts.map +1 -0
- package/lib/FileManager.js +474 -0
- package/lib/Filtering.d.ts +15 -0
- package/lib/Filtering.d.ts.map +1 -0
- package/lib/Filtering.js +299 -0
- package/lib/PostgresNotifListenManager.d.ts +27 -0
- package/lib/PostgresNotifListenManager.d.ts.map +1 -0
- package/lib/PostgresNotifListenManager.js +122 -0
- package/lib/Prostgles.d.ts +193 -0
- package/lib/Prostgles.d.ts.map +1 -0
- package/lib/Prostgles.js +579 -0
- package/lib/Prostgles.ts +6 -6
- package/lib/PubSubManager.d.ts +157 -0
- package/lib/PubSubManager.d.ts.map +1 -0
- package/lib/PubSubManager.js +1400 -0
- package/lib/PublishParser.d.ts +262 -0
- package/lib/PublishParser.d.ts.map +1 -0
- package/lib/PublishParser.js +390 -0
- package/lib/PublishParser.ts +39 -38
- package/lib/QueryBuilder.d.ts +124 -0
- package/lib/QueryBuilder.d.ts.map +1 -0
- package/lib/QueryBuilder.js +1349 -0
- package/lib/SyncReplication.d.ts +34 -0
- package/lib/SyncReplication.d.ts.map +1 -0
- package/lib/SyncReplication.js +411 -0
- package/lib/TableConfig.d.ts +175 -0
- package/lib/TableConfig.d.ts.map +1 -0
- package/lib/TableConfig.js +231 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +45 -0
- package/lib/index.ts +3 -4
- package/lib/shortestPath.d.ts +10 -0
- package/lib/shortestPath.d.ts.map +1 -0
- package/lib/shortestPath.js +111 -0
- package/lib/utils.d.ts +2 -0
- package/lib/utils.d.ts.map +1 -0
- package/lib/utils.js +5 -0
- package/package.json +3 -3
- package/tests/client/PID.txt +1 -1
- package/tests/client/index.d.ts +1 -1
- package/tests/client/index.d.ts.map +1 -1
- package/tests/client_only_queries.d.ts +4 -0
- package/tests/client_only_queries.d.ts.map +1 -0
- package/tests/isomorphic_queries.d.ts +6 -0
- package/tests/isomorphic_queries.d.ts.map +1 -0
- package/tests/server/DBoGenerated.d.ts +97 -193
- package/tests/server/dboTypeCheck.d.ts +2 -0
- package/tests/server/dboTypeCheck.d.ts.map +1 -0
- package/tests/server/dboTypeCheck.js +14 -0
- package/tests/server/dboTypeCheck.ts +17 -0
- package/tests/server/index.d.ts +2 -0
- package/tests/server/index.d.ts.map +1 -0
- package/tests/server/index.js +11 -11
- package/tests/server/index.ts +23 -16
- package/tests/server/package-lock.json +5 -5
- package/tests/server/publishTypeCheck.d.ts +2 -0
- package/tests/server/publishTypeCheck.d.ts.map +1 -0
- package/tests/server/publishTypeCheck.js +120 -0
- package/tests/server/publishTypeCheck.ts +129 -0
- package/tests/server/tsconfig.json +4 -5
- package/tests/server_only_queries.d.ts +2 -0
- package/tests/server_only_queries.d.ts.map +1 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { PostgresNotifListenManager } from "./PostgresNotifListenManager";
|
|
3
|
+
import { TableOrViewInfo, TableInfo, DBHandlerServer, DboBuilder, PRGLIOSocket } from "./DboBuilder";
|
|
4
|
+
import { DB } from "./Prostgles";
|
|
5
|
+
import { SelectParams, FieldFilter, WAL, AnyObject } from "prostgles-types";
|
|
6
|
+
import { ClientExpressData } from "./SyncReplication";
|
|
7
|
+
import { TableRule } from "./PublishParser";
|
|
8
|
+
export declare const asValue: (v: any) => string;
|
|
9
|
+
export declare const DEFAULT_SYNC_BATCH_SIZE = 50;
|
|
10
|
+
export declare const log: (...args: any[]) => void;
|
|
11
|
+
export declare type BasicCallback = (err?: any, res?: any) => void;
|
|
12
|
+
export declare type SyncParams = {
|
|
13
|
+
socket_id: string;
|
|
14
|
+
channel_name: string;
|
|
15
|
+
table_name: string;
|
|
16
|
+
table_rules?: TableRule;
|
|
17
|
+
synced_field: string;
|
|
18
|
+
allow_delete: boolean;
|
|
19
|
+
id_fields: string[];
|
|
20
|
+
batch_size: number;
|
|
21
|
+
filter: object;
|
|
22
|
+
params: {
|
|
23
|
+
select: FieldFilter;
|
|
24
|
+
};
|
|
25
|
+
condition: string;
|
|
26
|
+
wal?: WAL;
|
|
27
|
+
throttle?: number;
|
|
28
|
+
lr?: AnyObject;
|
|
29
|
+
last_synced: number;
|
|
30
|
+
is_syncing: boolean;
|
|
31
|
+
};
|
|
32
|
+
declare type AddSyncParams = {
|
|
33
|
+
socket: any;
|
|
34
|
+
table_info: TableInfo;
|
|
35
|
+
table_rules: TableRule;
|
|
36
|
+
synced_field: string;
|
|
37
|
+
allow_delete?: boolean;
|
|
38
|
+
id_fields: string[];
|
|
39
|
+
filter: object;
|
|
40
|
+
params: {
|
|
41
|
+
select: FieldFilter;
|
|
42
|
+
};
|
|
43
|
+
condition: string;
|
|
44
|
+
throttle?: number;
|
|
45
|
+
};
|
|
46
|
+
declare type SubscriptionParams = {
|
|
47
|
+
socket_id?: string;
|
|
48
|
+
channel_name: string;
|
|
49
|
+
table_name: string;
|
|
50
|
+
socket: PRGLIOSocket | undefined;
|
|
51
|
+
table_info: TableOrViewInfo;
|
|
52
|
+
table_rules?: TableRule;
|
|
53
|
+
filter: object;
|
|
54
|
+
params: SelectParams;
|
|
55
|
+
func?: (data: any) => any;
|
|
56
|
+
throttle?: number;
|
|
57
|
+
last_throttled: number;
|
|
58
|
+
is_throttling?: any;
|
|
59
|
+
is_ready?: boolean;
|
|
60
|
+
};
|
|
61
|
+
declare type AddSubscriptionParams = SubscriptionParams & {
|
|
62
|
+
condition: string;
|
|
63
|
+
};
|
|
64
|
+
export declare type PubSubManagerOptions = {
|
|
65
|
+
dboBuilder: DboBuilder;
|
|
66
|
+
db: DB;
|
|
67
|
+
dbo: DBHandlerServer;
|
|
68
|
+
wsChannelNamePrefix?: string;
|
|
69
|
+
pgChannelName?: string;
|
|
70
|
+
onSchemaChange?: (event: {
|
|
71
|
+
command: string;
|
|
72
|
+
query: string;
|
|
73
|
+
}) => void;
|
|
74
|
+
};
|
|
75
|
+
export declare class PubSubManager {
|
|
76
|
+
static DELIMITER: string;
|
|
77
|
+
dboBuilder: DboBuilder;
|
|
78
|
+
db: DB;
|
|
79
|
+
dbo: DBHandlerServer;
|
|
80
|
+
_triggers?: Record<string, string[]>;
|
|
81
|
+
sockets: any;
|
|
82
|
+
subs: {
|
|
83
|
+
[ke: string]: {
|
|
84
|
+
[ke: string]: {
|
|
85
|
+
subs: SubscriptionParams[];
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
syncs: SyncParams[];
|
|
90
|
+
socketChannelPreffix: string;
|
|
91
|
+
onSchemaChange?: ((event: {
|
|
92
|
+
command: string;
|
|
93
|
+
query: string;
|
|
94
|
+
}) => void);
|
|
95
|
+
postgresNotifListenManager?: PostgresNotifListenManager;
|
|
96
|
+
private constructor();
|
|
97
|
+
NOTIF_TYPE: {
|
|
98
|
+
data: string;
|
|
99
|
+
schema: string;
|
|
100
|
+
};
|
|
101
|
+
NOTIF_CHANNEL: {
|
|
102
|
+
preffix: string;
|
|
103
|
+
getFull: (appID?: string) => string;
|
|
104
|
+
};
|
|
105
|
+
private appID?;
|
|
106
|
+
appCheckFrequencyMS: number;
|
|
107
|
+
appCheck?: ReturnType<typeof setInterval>;
|
|
108
|
+
static create: (options: PubSubManagerOptions) => Promise<PubSubManager>;
|
|
109
|
+
destroyed: boolean;
|
|
110
|
+
destroy: () => void;
|
|
111
|
+
canContinue: () => boolean;
|
|
112
|
+
appChecking: boolean;
|
|
113
|
+
init: () => Promise<PubSubManager | undefined>;
|
|
114
|
+
DB_OBJ_NAMES: {
|
|
115
|
+
trigger_add_remove_func: string;
|
|
116
|
+
data_watch_func: string;
|
|
117
|
+
schema_watch_func: string;
|
|
118
|
+
schema_watch_trigger: string;
|
|
119
|
+
};
|
|
120
|
+
static EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID: string;
|
|
121
|
+
prepareTriggers: () => Promise<boolean>;
|
|
122
|
+
isReady(): any;
|
|
123
|
+
getSubs(table_name: string, condition: string): SubscriptionParams[];
|
|
124
|
+
getSyncs(table_name: string, condition: string): SyncParams[];
|
|
125
|
+
notifListener: (data: {
|
|
126
|
+
payload: string;
|
|
127
|
+
}) => Promise<void>;
|
|
128
|
+
pushSubData(sub: SubscriptionParams, err?: any): true | Promise<unknown>;
|
|
129
|
+
upsertSocket(socket: any, channel_name: string): void;
|
|
130
|
+
syncTimeout?: ReturnType<typeof setTimeout>;
|
|
131
|
+
syncData(sync: SyncParams, clientData: ClientExpressData | undefined, source: "trigger" | "client"): Promise<void>;
|
|
132
|
+
/**
|
|
133
|
+
* Returns a sync channel
|
|
134
|
+
* A sync channel is unique per socket for each filter
|
|
135
|
+
*/
|
|
136
|
+
addSync(syncParams: AddSyncParams): Promise<string>;
|
|
137
|
+
parseCondition: (condition: string) => string;
|
|
138
|
+
addSub(subscriptionParams: Omit<AddSubscriptionParams, "channel_name">): Promise<string>;
|
|
139
|
+
removeLocalSub(table_name: string, condition: string, func: (items: object[]) => any): void;
|
|
140
|
+
getActiveListeners: () => {
|
|
141
|
+
table_name: string;
|
|
142
|
+
condition: string;
|
|
143
|
+
}[];
|
|
144
|
+
onSocketDisconnected(socket?: PRGLIOSocket, channel_name?: string): string;
|
|
145
|
+
checkIfTimescaleBug: (table_name: string) => Promise<boolean>;
|
|
146
|
+
getMyTriggerQuery: () => Promise<string>;
|
|
147
|
+
addingTrigger: any;
|
|
148
|
+
addTriggerPool?: Record<string, string[]>;
|
|
149
|
+
addTrigger(params: {
|
|
150
|
+
table_name: string;
|
|
151
|
+
condition: string;
|
|
152
|
+
}): Promise<boolean>;
|
|
153
|
+
}
|
|
154
|
+
export declare function omitKeys<T extends AnyObject, Exclude extends keyof T>(obj: T, exclude: Exclude[]): Omit<T, Exclude>;
|
|
155
|
+
export declare function pickKeys<T extends AnyObject, Include extends keyof T>(obj: T, include?: Include[]): Pick<T, Include>;
|
|
156
|
+
export {};
|
|
157
|
+
//# sourceMappingURL=PubSubManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PubSubManager.d.ts","sourceRoot":"","sources":["PubSubManager.ts"],"names":[],"mappings":"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"}
|