@milaboratories/pl-client 2.16.26 → 2.16.28
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/README.md +2 -1
- package/dist/core/PromiseTracker.cjs +1 -3
- package/dist/core/PromiseTracker.cjs.map +1 -1
- package/dist/core/PromiseTracker.d.ts.map +1 -1
- package/dist/core/PromiseTracker.js +1 -3
- package/dist/core/PromiseTracker.js.map +1 -1
- package/dist/core/StatefulPromise.cjs +4 -4
- package/dist/core/StatefulPromise.cjs.map +1 -1
- package/dist/core/StatefulPromise.d.ts +1 -1
- package/dist/core/StatefulPromise.d.ts.map +1 -1
- package/dist/core/StatefulPromise.js +4 -4
- package/dist/core/StatefulPromise.js.map +1 -1
- package/dist/core/advisory_locks.cjs +1 -1
- package/dist/core/advisory_locks.cjs.map +1 -1
- package/dist/core/advisory_locks.js +1 -1
- package/dist/core/advisory_locks.js.map +1 -1
- package/dist/core/auth.cjs.map +1 -1
- package/dist/core/auth.d.ts +1 -1
- package/dist/core/auth.js.map +1 -1
- package/dist/core/cache.d.ts +1 -1
- package/dist/core/client.cjs +14 -14
- package/dist/core/client.cjs.map +1 -1
- package/dist/core/client.d.ts +11 -11
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +14 -14
- package/dist/core/client.js.map +1 -1
- package/dist/core/config.cjs +39 -39
- package/dist/core/config.cjs.map +1 -1
- package/dist/core/config.d.ts +5 -5
- package/dist/core/config.js +39 -39
- package/dist/core/config.js.map +1 -1
- package/dist/core/default_client.cjs +23 -23
- package/dist/core/default_client.cjs.map +1 -1
- package/dist/core/default_client.d.ts +3 -3
- package/dist/core/default_client.js +23 -23
- package/dist/core/default_client.js.map +1 -1
- package/dist/core/driver.cjs +1 -1
- package/dist/core/driver.cjs.map +1 -1
- package/dist/core/driver.d.ts +5 -5
- package/dist/core/driver.js +1 -1
- package/dist/core/driver.js.map +1 -1
- package/dist/core/error_resource.cjs +2 -2
- package/dist/core/error_resource.cjs.map +1 -1
- package/dist/core/error_resource.d.ts +1 -1
- package/dist/core/error_resource.js +2 -2
- package/dist/core/error_resource.js.map +1 -1
- package/dist/core/errors.cjs +24 -24
- package/dist/core/errors.cjs.map +1 -1
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +24 -24
- package/dist/core/errors.js.map +1 -1
- package/dist/core/final.cjs +43 -43
- package/dist/core/final.cjs.map +1 -1
- package/dist/core/final.d.ts +3 -3
- package/dist/core/final.d.ts.map +1 -1
- package/dist/core/final.js +43 -43
- package/dist/core/final.js.map +1 -1
- package/dist/core/ll_client.cjs +50 -43
- package/dist/core/ll_client.cjs.map +1 -1
- package/dist/core/ll_client.d.ts +9 -9
- package/dist/core/ll_client.d.ts.map +1 -1
- package/dist/core/ll_client.js +50 -43
- package/dist/core/ll_client.js.map +1 -1
- package/dist/core/ll_transaction.cjs +9 -9
- package/dist/core/ll_transaction.cjs.map +1 -1
- package/dist/core/ll_transaction.d.ts +7 -7
- package/dist/core/ll_transaction.d.ts.map +1 -1
- package/dist/core/ll_transaction.js +9 -9
- package/dist/core/ll_transaction.js.map +1 -1
- package/dist/core/stat.cjs.map +1 -1
- package/dist/core/stat.d.ts +1 -1
- package/dist/core/stat.js.map +1 -1
- package/dist/core/transaction.cjs +46 -46
- package/dist/core/transaction.cjs.map +1 -1
- package/dist/core/transaction.d.ts +7 -7
- package/dist/core/transaction.d.ts.map +1 -1
- package/dist/core/transaction.js +46 -46
- package/dist/core/transaction.js.map +1 -1
- package/dist/core/type_conversion.cjs +22 -22
- package/dist/core/type_conversion.cjs.map +1 -1
- package/dist/core/type_conversion.d.ts +3 -3
- package/dist/core/type_conversion.d.ts.map +1 -1
- package/dist/core/type_conversion.js +22 -22
- package/dist/core/type_conversion.js.map +1 -1
- package/dist/core/types.cjs +25 -25
- package/dist/core/types.cjs.map +1 -1
- package/dist/core/types.d.ts +7 -7
- package/dist/core/types.js +25 -25
- package/dist/core/types.js.map +1 -1
- package/dist/core/unauth_client.cjs +6 -4
- package/dist/core/unauth_client.cjs.map +1 -1
- package/dist/core/unauth_client.d.ts +4 -4
- package/dist/core/unauth_client.d.ts.map +1 -1
- package/dist/core/unauth_client.js +6 -4
- package/dist/core/unauth_client.js.map +1 -1
- package/dist/core/websocket_stream.cjs +22 -20
- package/dist/core/websocket_stream.cjs.map +1 -1
- package/dist/core/websocket_stream.d.ts +3 -3
- package/dist/core/websocket_stream.d.ts.map +1 -1
- package/dist/core/websocket_stream.js +22 -20
- package/dist/core/websocket_stream.js.map +1 -1
- package/dist/core/wire.d.ts +6 -6
- package/dist/core/wire.d.ts.map +1 -1
- package/dist/helpers/pl.cjs +19 -19
- package/dist/helpers/pl.cjs.map +1 -1
- package/dist/helpers/pl.d.ts +2 -2
- package/dist/helpers/pl.js +19 -19
- package/dist/helpers/pl.js.map +1 -1
- package/dist/helpers/poll.cjs +6 -6
- package/dist/helpers/poll.cjs.map +1 -1
- package/dist/helpers/poll.d.ts +4 -4
- package/dist/helpers/poll.d.ts.map +1 -1
- package/dist/helpers/poll.js +6 -6
- package/dist/helpers/poll.js.map +1 -1
- package/dist/helpers/retry_strategy.cjs +1 -1
- package/dist/helpers/retry_strategy.cjs.map +1 -1
- package/dist/helpers/retry_strategy.d.ts.map +1 -1
- package/dist/helpers/retry_strategy.js +1 -1
- package/dist/helpers/retry_strategy.js.map +1 -1
- package/dist/helpers/state_helpers.d.ts +2 -2
- package/dist/helpers/tx_helpers.cjs +2 -2
- package/dist/helpers/tx_helpers.cjs.map +1 -1
- package/dist/helpers/tx_helpers.d.ts +2 -2
- package/dist/helpers/tx_helpers.d.ts.map +1 -1
- package/dist/helpers/tx_helpers.js +2 -2
- package/dist/helpers/tx_helpers.js.map +1 -1
- package/dist/index.d.ts +16 -16
- package/dist/proto-grpc/google/protobuf/struct.d.ts +1 -1
- package/dist/proto-grpc/google/protobuf/struct.d.ts.map +1 -1
- package/dist/proto-rest/index.cjs +4 -5
- package/dist/proto-rest/index.cjs.map +1 -1
- package/dist/proto-rest/index.d.ts +4 -4
- package/dist/proto-rest/index.d.ts.map +1 -1
- package/dist/proto-rest/index.js +4 -5
- package/dist/proto-rest/index.js.map +1 -1
- package/dist/proto-rest/plapi.d.ts.map +1 -1
- package/dist/test/tcp-proxy.cjs +11 -10
- package/dist/test/tcp-proxy.cjs.map +1 -1
- package/dist/test/tcp-proxy.d.ts +1 -1
- package/dist/test/tcp-proxy.d.ts.map +1 -1
- package/dist/test/tcp-proxy.js +11 -10
- package/dist/test/tcp-proxy.js.map +1 -1
- package/dist/test/test_config.cjs +21 -17
- package/dist/test/test_config.cjs.map +1 -1
- package/dist/test/test_config.d.ts +6 -6
- package/dist/test/test_config.d.ts.map +1 -1
- package/dist/test/test_config.js +21 -17
- package/dist/test/test_config.js.map +1 -1
- package/dist/util/pl.cjs +1 -1
- package/dist/util/pl.cjs.map +1 -1
- package/dist/util/pl.js +1 -1
- package/dist/util/pl.js.map +1 -1
- package/dist/util/util.cjs +1 -1
- package/dist/util/util.cjs.map +1 -1
- package/dist/util/util.js +1 -1
- package/dist/util/util.js.map +1 -1
- package/package.json +23 -23
- package/src/core/PromiseTracker.ts +3 -4
- package/src/core/StatefulPromise.ts +17 -8
- package/src/core/abstract_stream.ts +3 -4
- package/src/core/advisory_locks.ts +1 -1
- package/src/core/auth.ts +2 -2
- package/src/core/cache.ts +1 -1
- package/src/core/client.test.ts +25 -21
- package/src/core/client.ts +54 -45
- package/src/core/config.test.ts +44 -44
- package/src/core/config.ts +49 -49
- package/src/core/connectivity.test.ts +69 -63
- package/src/core/default_client.ts +46 -46
- package/src/core/driver.ts +6 -6
- package/src/core/error.test.ts +5 -5
- package/src/core/error_resource.ts +3 -3
- package/src/core/errors.ts +39 -31
- package/src/core/final.ts +48 -55
- package/src/core/ll_client.test.ts +53 -36
- package/src/core/ll_client.ts +125 -81
- package/src/core/ll_transaction.test.ts +75 -49
- package/src/core/ll_transaction.ts +37 -35
- package/src/core/stat.ts +1 -1
- package/src/core/transaction.test.ts +65 -65
- package/src/core/transaction.ts +91 -84
- package/src/core/type_conversion.ts +30 -31
- package/src/core/types.test.ts +6 -6
- package/src/core/types.ts +35 -35
- package/src/core/unauth_client.test.ts +18 -14
- package/src/core/unauth_client.ts +14 -12
- package/src/core/websocket_stream.test.ts +52 -52
- package/src/core/websocket_stream.ts +41 -37
- package/src/core/wire.ts +10 -8
- package/src/helpers/pl.ts +22 -22
- package/src/helpers/poll.ts +13 -27
- package/src/helpers/retry_strategy.ts +2 -4
- package/src/helpers/rich_resource_types.test.ts +2 -2
- package/src/helpers/state_helpers.ts +3 -3
- package/src/helpers/tx_helpers.ts +9 -7
- package/src/index.ts +16 -16
- package/src/proto-grpc/google/protobuf/struct.ts +1 -1
- package/src/proto-rest/index.ts +17 -18
- package/src/proto-rest/plapi.ts +1472 -1472
- package/src/test/tcp-proxy.ts +55 -54
- package/src/test/test_config.test.ts +3 -3
- package/src/test/test_config.ts +51 -46
- package/src/util/pl.ts +1 -1
- package/src/util/util.test.ts +5 -5
- package/src/util/util.ts +1 -1
- package/dist/helpers/rich_resource_types.d.ts +0 -2
- package/dist/helpers/rich_resource_types.d.ts.map +0 -1
- package/dist/helpers/smart_accessors.d.ts +0 -2
- package/dist/helpers/smart_accessors.d.ts.map +0 -1
- package/src/helpers/rich_resource_types.ts +0 -84
- package/src/helpers/smart_accessors.ts +0 -146
package/src/core/errors.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import type { Status } from
|
|
2
|
-
import { Aborted } from
|
|
3
|
-
import { Code } from
|
|
1
|
+
import type { Status } from "../proto-grpc/github.com/googleapis/googleapis/google/rpc/status";
|
|
2
|
+
import { Aborted } from "@milaboratories/ts-helpers";
|
|
3
|
+
import { Code } from "../proto-grpc/google/rpc/code";
|
|
4
4
|
|
|
5
5
|
export function isConnectionProblem(err: unknown, nested: boolean = false): boolean {
|
|
6
6
|
if (err === undefined || err === null) return false;
|
|
7
7
|
|
|
8
8
|
if (err instanceof DisconnectedError) return true;
|
|
9
|
-
if ((err as any).name ==
|
|
10
|
-
if ((err as any).name ==
|
|
11
|
-
if ((err as any).cause !== undefined && !nested)
|
|
9
|
+
if ((err as any).name == "RpcError" && (err as any).code == "UNAVAILABLE") return true;
|
|
10
|
+
if ((err as any).name == "RESTError" && (err as any).status.code == Code.UNAVAILABLE) return true;
|
|
11
|
+
if ((err as any).cause !== undefined && !nested)
|
|
12
|
+
return isConnectionProblem((err as any).cause, true);
|
|
12
13
|
return false;
|
|
13
14
|
}
|
|
14
15
|
|
|
@@ -16,18 +17,21 @@ export function isUnauthenticated(err: unknown, nested: boolean = false): boolea
|
|
|
16
17
|
if (err === undefined || err === null) return false;
|
|
17
18
|
|
|
18
19
|
if (err instanceof UnauthenticatedError) return true;
|
|
19
|
-
if ((err as any).name ==
|
|
20
|
-
if ((err as any).name ==
|
|
21
|
-
|
|
20
|
+
if ((err as any).name == "RpcError" && (err as any).code == "UNAUTHENTICATED") return true;
|
|
21
|
+
if ((err as any).name == "RESTError" && (err as any).status.code == Code.UNAUTHENTICATED)
|
|
22
|
+
return true;
|
|
23
|
+
if ((err as any).cause !== undefined && !nested)
|
|
24
|
+
return isUnauthenticated((err as any).cause, true);
|
|
22
25
|
return false;
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
export function isTimeoutError(err: unknown, nested: boolean = false): boolean {
|
|
26
29
|
if (err === undefined || err === null) return false;
|
|
27
30
|
|
|
28
|
-
if ((err as any).name ==
|
|
29
|
-
if ((err as any).name ==
|
|
30
|
-
if ((err as any).name ==
|
|
31
|
+
if ((err as any).name == "TimeoutError") return true;
|
|
32
|
+
if ((err as any).name == "RpcError" && (err as any).code == "DEADLINE_EXCEEDED") return true;
|
|
33
|
+
if ((err as any).name == "RESTError" && (err as any).status.code == Code.DEADLINE_EXCEEDED)
|
|
34
|
+
return true;
|
|
31
35
|
if ((err as any).cause !== undefined && !nested) return isTimeoutError((err as any).cause, true);
|
|
32
36
|
return false;
|
|
33
37
|
}
|
|
@@ -35,8 +39,8 @@ export function isTimeoutError(err: unknown, nested: boolean = false): boolean {
|
|
|
35
39
|
export function isCancelError(err: unknown, nested: boolean = false): boolean {
|
|
36
40
|
if (err === undefined || err === null) return false;
|
|
37
41
|
|
|
38
|
-
if ((err as any).name ==
|
|
39
|
-
if ((err as any).name ==
|
|
42
|
+
if ((err as any).name == "RpcError" && (err as any).code == "CANCELLED") return true;
|
|
43
|
+
if ((err as any).name == "RESTError" && (err as any).status.code == Code.CANCELLED) return true;
|
|
40
44
|
if ((err as any).cause !== undefined && !nested) return isCancelError((err as any).cause, true);
|
|
41
45
|
return false;
|
|
42
46
|
}
|
|
@@ -44,11 +48,11 @@ export function isCancelError(err: unknown, nested: boolean = false): boolean {
|
|
|
44
48
|
export function isAbortedError(err: unknown, nested: boolean = false): boolean {
|
|
45
49
|
if (err === undefined || err === null) return false;
|
|
46
50
|
|
|
47
|
-
if (err instanceof Aborted || (err as any).name ==
|
|
48
|
-
if ((err as any).code ==
|
|
51
|
+
if (err instanceof Aborted || (err as any).name == "AbortError") return true;
|
|
52
|
+
if ((err as any).code == "ABORT_ERR") return true;
|
|
49
53
|
if (err instanceof DOMException && err.code === DOMException.ABORT_ERR) return true; // WebSocket error
|
|
50
|
-
if ((err as any).name ==
|
|
51
|
-
if ((err as any).name ==
|
|
54
|
+
if ((err as any).name == "RpcError" && (err as any).code == "ABORTED") return true;
|
|
55
|
+
if ((err as any).name == "RESTError" && (err as any).status.code == Code.ABORTED) return true;
|
|
52
56
|
if ((err as any).cause !== undefined && !nested) isAbortedError((err as any).cause, true);
|
|
53
57
|
return false;
|
|
54
58
|
}
|
|
@@ -59,15 +63,16 @@ export function isTimeoutOrCancelError(err: unknown, nested: boolean = false): b
|
|
|
59
63
|
if (isAbortedError(err, true)) return true;
|
|
60
64
|
if (isTimeoutError(err, true)) return true;
|
|
61
65
|
if (isCancelError(err, true)) return true;
|
|
62
|
-
if ((err as any).cause !== undefined && !nested)
|
|
66
|
+
if ((err as any).cause !== undefined && !nested)
|
|
67
|
+
return isTimeoutOrCancelError((err as any).cause, true);
|
|
63
68
|
return false;
|
|
64
69
|
}
|
|
65
70
|
|
|
66
71
|
export function isNotFoundError(err: unknown, nested: boolean = false): boolean {
|
|
67
72
|
if (err === undefined || err === null) return false;
|
|
68
73
|
|
|
69
|
-
if ((err as any).name ==
|
|
70
|
-
if ((err as any).name ==
|
|
74
|
+
if ((err as any).name == "RpcError" && (err as any).code == "NOT_FOUND") return true;
|
|
75
|
+
if ((err as any).name == "RESTError" && (err as any).status.code == Code.NOT_FOUND) return true;
|
|
71
76
|
if ((err as any).cause !== undefined && !nested) return isNotFoundError((err as any).cause, true);
|
|
72
77
|
return err instanceof RecoverablePlError && err.status.code === PlErrorCodeNotFound;
|
|
73
78
|
}
|
|
@@ -75,8 +80,11 @@ export function isNotFoundError(err: unknown, nested: boolean = false): boolean
|
|
|
75
80
|
export const PlErrorCodeNotFound: number = Code.NOT_FOUND;
|
|
76
81
|
|
|
77
82
|
export class PlError extends Error {
|
|
78
|
-
name =
|
|
79
|
-
constructor(
|
|
83
|
+
name = "PlError";
|
|
84
|
+
constructor(
|
|
85
|
+
public readonly status: Status,
|
|
86
|
+
opts?: ErrorOptions,
|
|
87
|
+
) {
|
|
80
88
|
super(`code=${status.code} ${status.message}`, opts);
|
|
81
89
|
}
|
|
82
90
|
}
|
|
@@ -86,35 +94,35 @@ export function throwPlNotFoundError(message: string): never {
|
|
|
86
94
|
}
|
|
87
95
|
|
|
88
96
|
export class RecoverablePlError extends PlError {
|
|
89
|
-
name =
|
|
97
|
+
name = "RecoverablePlError";
|
|
90
98
|
constructor(status: Status) {
|
|
91
99
|
super(status);
|
|
92
100
|
}
|
|
93
101
|
}
|
|
94
102
|
|
|
95
103
|
export class UnrecoverablePlError extends PlError {
|
|
96
|
-
name =
|
|
104
|
+
name = "UnrecoverablePlError";
|
|
97
105
|
constructor(status: Status) {
|
|
98
106
|
super(status);
|
|
99
107
|
}
|
|
100
108
|
}
|
|
101
109
|
|
|
102
110
|
export class UnauthenticatedError extends Error {
|
|
103
|
-
name =
|
|
111
|
+
name = "UnauthenticatedError";
|
|
104
112
|
constructor(message: string) {
|
|
105
|
-
super(
|
|
113
|
+
super("LoginFailed: " + message);
|
|
106
114
|
}
|
|
107
115
|
}
|
|
108
116
|
|
|
109
117
|
export class DisconnectedError extends Error {
|
|
110
|
-
name =
|
|
118
|
+
name = "DisconnectedError";
|
|
111
119
|
constructor(message: string) {
|
|
112
|
-
super(
|
|
120
|
+
super("Disconnected: " + message);
|
|
113
121
|
}
|
|
114
122
|
}
|
|
115
123
|
|
|
116
124
|
export class RESTError extends PlError {
|
|
117
|
-
name =
|
|
125
|
+
name = "RESTError";
|
|
118
126
|
constructor(status: Status, opts?: ErrorOptions) {
|
|
119
127
|
super(status, opts);
|
|
120
128
|
}
|
|
@@ -131,7 +139,7 @@ export function rethrowMeaningfulError(error: any, wrapIfUnknown: boolean = fals
|
|
|
131
139
|
}
|
|
132
140
|
if (isTimeoutOrCancelError(error)) throw new Aborted(error);
|
|
133
141
|
if (wrapIfUnknown) {
|
|
134
|
-
const message = error.message || String(error) ||
|
|
142
|
+
const message = error.message || String(error) || "Unknown error";
|
|
135
143
|
throw new Error(message, { cause: error });
|
|
136
144
|
} else throw error;
|
|
137
145
|
}
|
package/src/core/final.ts
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
|
-
import type { Optional } from
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
ResourceData,
|
|
5
|
-
} from './types';
|
|
6
|
-
import {
|
|
7
|
-
getField,
|
|
8
|
-
isNotNullResourceId,
|
|
9
|
-
isNullResourceId,
|
|
10
|
-
} from './types';
|
|
1
|
+
import type { Optional } from "utility-types";
|
|
2
|
+
import type { BasicResourceData, ResourceData } from "./types";
|
|
3
|
+
import { getField, isNotNullResourceId, isNullResourceId } from "./types";
|
|
11
4
|
|
|
12
5
|
/**
|
|
13
6
|
* Function is used to guide multiple layers of caching in pl-client and derived pl-tree.
|
|
@@ -19,7 +12,7 @@ import {
|
|
|
19
12
|
* "final" state should be calculated for "basic" part of resource data only.
|
|
20
13
|
*/
|
|
21
14
|
export type FinalResourceDataPredicate = (
|
|
22
|
-
resourceData: Optional<ResourceData,
|
|
15
|
+
resourceData: Optional<ResourceData, "fields">,
|
|
23
16
|
) => boolean;
|
|
24
17
|
|
|
25
18
|
function readyOrDuplicateOrError(r: ResourceData | BasicResourceData): boolean {
|
|
@@ -28,7 +21,7 @@ function readyOrDuplicateOrError(r: ResourceData | BasicResourceData): boolean {
|
|
|
28
21
|
);
|
|
29
22
|
}
|
|
30
23
|
|
|
31
|
-
function readyAndHasAllOutputsFilled(r: Optional<ResourceData,
|
|
24
|
+
function readyAndHasAllOutputsFilled(r: Optional<ResourceData, "fields">): boolean {
|
|
32
25
|
if (!readyOrDuplicateOrError(r)) return false;
|
|
33
26
|
if (!r.outputsLocked) return false;
|
|
34
27
|
if (r.fields === undefined) return true; // if fields are not provided basic resource state is not expected to change in the future
|
|
@@ -43,65 +36,65 @@ const unknownResourceTypeNames = new Set<string>();
|
|
|
43
36
|
/** Default implementation, defining behaviour for built-in resource types. */
|
|
44
37
|
export const DefaultFinalResourceDataPredicate: FinalResourceDataPredicate = (r): boolean => {
|
|
45
38
|
switch (r.type.name) {
|
|
46
|
-
case
|
|
39
|
+
case "StreamManager": {
|
|
47
40
|
if (!readyOrDuplicateOrError(r)) return false;
|
|
48
41
|
if (r.fields === undefined) return true; // if fields are not provided basic resource state is not expected to change in the future
|
|
49
42
|
if (isNotNullResourceId(r.error)) return true;
|
|
50
|
-
const downloadable = getField(r as ResourceData,
|
|
51
|
-
const stream = getField(r as ResourceData,
|
|
43
|
+
const downloadable = getField(r as ResourceData, "downloadable");
|
|
44
|
+
const stream = getField(r as ResourceData, "stream");
|
|
52
45
|
return stream.value === downloadable.value;
|
|
53
46
|
}
|
|
54
|
-
case
|
|
55
|
-
case
|
|
56
|
-
case
|
|
57
|
-
case
|
|
58
|
-
case
|
|
59
|
-
case
|
|
60
|
-
case
|
|
61
|
-
case
|
|
62
|
-
case
|
|
63
|
-
case
|
|
64
|
-
case
|
|
65
|
-
case
|
|
66
|
-
case
|
|
67
|
-
case
|
|
68
|
-
case
|
|
69
|
-
case
|
|
70
|
-
case
|
|
47
|
+
case "StdMap":
|
|
48
|
+
case "std/map":
|
|
49
|
+
case "EphStdMap":
|
|
50
|
+
case "PFrame":
|
|
51
|
+
case "ParquetChunk":
|
|
52
|
+
case "BContext":
|
|
53
|
+
case "BlockPackCustom":
|
|
54
|
+
case "BinaryMap":
|
|
55
|
+
case "BinaryValue":
|
|
56
|
+
case "BlobMap":
|
|
57
|
+
case "BResolveSingle":
|
|
58
|
+
case "BResolveSingleNoResult":
|
|
59
|
+
case "BQueryResult":
|
|
60
|
+
case "TengoTemplate":
|
|
61
|
+
case "TengoLib":
|
|
62
|
+
case "SoftwareInfo":
|
|
63
|
+
case "Dummy":
|
|
71
64
|
return readyOrDuplicateOrError(r);
|
|
72
|
-
case
|
|
73
|
-
return r.type.version ===
|
|
74
|
-
case
|
|
75
|
-
case
|
|
76
|
-
case
|
|
77
|
-
case
|
|
78
|
-
case
|
|
79
|
-
case
|
|
80
|
-
case
|
|
81
|
-
case
|
|
82
|
-
case
|
|
83
|
-
case
|
|
84
|
-
case
|
|
85
|
-
case
|
|
86
|
-
case
|
|
65
|
+
case "json/resourceError":
|
|
66
|
+
return r.type.version === "1";
|
|
67
|
+
case "json/object":
|
|
68
|
+
case "json-gz/object":
|
|
69
|
+
case "json/string":
|
|
70
|
+
case "json/array":
|
|
71
|
+
case "json/number":
|
|
72
|
+
case "BContextEnd":
|
|
73
|
+
case "Frontend/FromUrl":
|
|
74
|
+
case "Frontend/FromFolder":
|
|
75
|
+
case "BObjectSpec":
|
|
76
|
+
case "Blob":
|
|
77
|
+
case "Null":
|
|
78
|
+
case "binary":
|
|
79
|
+
case "LSProvider":
|
|
87
80
|
return true;
|
|
88
|
-
case
|
|
89
|
-
case
|
|
90
|
-
case
|
|
81
|
+
case "UserProject":
|
|
82
|
+
case "Projects":
|
|
83
|
+
case "ClientRoot":
|
|
91
84
|
return false;
|
|
92
85
|
default:
|
|
93
|
-
if (r.type.name.startsWith(
|
|
94
|
-
else if (r.type.name.startsWith(
|
|
86
|
+
if (r.type.name.startsWith("Blob/")) return true;
|
|
87
|
+
else if (r.type.name.startsWith("BlobUpload/") || r.type.name.startsWith("BlobIndex/")) {
|
|
95
88
|
return readyAndHasAllOutputsFilled(r);
|
|
96
|
-
} else if (r.type.name.startsWith(
|
|
89
|
+
} else if (r.type.name.startsWith("PColumnData/")) {
|
|
97
90
|
return readyOrDuplicateOrError(r);
|
|
98
|
-
} else if (r.type.name.startsWith(
|
|
91
|
+
} else if (r.type.name.startsWith("StreamWorkdir/")) {
|
|
99
92
|
return readyOrDuplicateOrError(r);
|
|
100
93
|
} else {
|
|
101
94
|
// Unknown resource type detected
|
|
102
95
|
// Set used to log this message only once
|
|
103
96
|
if (!unknownResourceTypeNames.has(r.type.name)) {
|
|
104
|
-
console.log(
|
|
97
|
+
console.log("UNKNOWN RESOURCE TYPE: " + r.type.name);
|
|
105
98
|
unknownResourceTypeNames.add(r.type.name);
|
|
106
99
|
}
|
|
107
100
|
}
|
|
@@ -1,37 +1,46 @@
|
|
|
1
|
-
import { LLPlClient } from
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { LLPlClient } from "./ll_client";
|
|
2
|
+
import {
|
|
3
|
+
getTestConfig,
|
|
4
|
+
plAddressToTestConfig,
|
|
5
|
+
getTestLLClient,
|
|
6
|
+
getTestClientConf,
|
|
7
|
+
} from "../test/test_config";
|
|
8
|
+
import { TxAPI_Open_Request_WritableTx } from "../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api";
|
|
9
|
+
import { request } from "undici";
|
|
10
|
+
import * as tp from "node:timers/promises";
|
|
11
|
+
import { test, expect } from "vitest";
|
|
12
|
+
|
|
13
|
+
import { UnauthenticatedError } from "./errors";
|
|
14
|
+
|
|
15
|
+
test("wire protocol detection", async () => {
|
|
11
16
|
const { conf, auth } = await getTestClientConf();
|
|
12
|
-
const expectedWireProtocol = conf.wireProtocol ??
|
|
17
|
+
const expectedWireProtocol = conf.wireProtocol ?? "grpc";
|
|
13
18
|
conf.wireProtocol = undefined;
|
|
14
19
|
|
|
15
20
|
const client = await LLPlClient.build(conf, { auth });
|
|
16
21
|
expect(client.wireProtocol).toBe(expectedWireProtocol);
|
|
17
22
|
});
|
|
18
23
|
|
|
19
|
-
test(
|
|
24
|
+
test("authenticated instance test", async () => {
|
|
20
25
|
const client = await getTestLLClient();
|
|
21
26
|
const tx = client.createTx(true);
|
|
22
27
|
const response = await tx.send(
|
|
23
28
|
{
|
|
24
|
-
oneofKind:
|
|
25
|
-
txOpen: {
|
|
29
|
+
oneofKind: "txOpen",
|
|
30
|
+
txOpen: {
|
|
31
|
+
name: "test",
|
|
32
|
+
writable: TxAPI_Open_Request_WritableTx.WRITABLE,
|
|
33
|
+
enableFormattedErrors: false,
|
|
34
|
+
},
|
|
26
35
|
},
|
|
27
|
-
false
|
|
36
|
+
false,
|
|
28
37
|
);
|
|
29
38
|
expect(response.txOpen.tx?.isValid).toBeTruthy();
|
|
30
39
|
await tx.complete();
|
|
31
40
|
await tx.await();
|
|
32
41
|
});
|
|
33
42
|
|
|
34
|
-
test(
|
|
43
|
+
test("unauthenticated status change", async () => {
|
|
35
44
|
const cfg = getTestConfig();
|
|
36
45
|
if (cfg.test_password === undefined) {
|
|
37
46
|
console.log("skipping test because target server doesn't support authentication");
|
|
@@ -39,17 +48,21 @@ test('unauthenticated status change', async () => {
|
|
|
39
48
|
}
|
|
40
49
|
|
|
41
50
|
const client = await LLPlClient.build(plAddressToTestConfig(cfg.address));
|
|
42
|
-
expect(client.status).toBe(
|
|
51
|
+
expect(client.status).toBe("OK");
|
|
43
52
|
|
|
44
53
|
const tx = client.createTx(true);
|
|
45
54
|
|
|
46
55
|
await expect(async () => {
|
|
47
56
|
await tx.send(
|
|
48
57
|
{
|
|
49
|
-
oneofKind:
|
|
50
|
-
txOpen: {
|
|
58
|
+
oneofKind: "txOpen",
|
|
59
|
+
txOpen: {
|
|
60
|
+
name: "test",
|
|
61
|
+
writable: TxAPI_Open_Request_WritableTx.WRITABLE,
|
|
62
|
+
enableFormattedErrors: false,
|
|
63
|
+
},
|
|
51
64
|
},
|
|
52
|
-
false
|
|
65
|
+
false,
|
|
53
66
|
);
|
|
54
67
|
}).rejects.toThrow(UnauthenticatedError);
|
|
55
68
|
|
|
@@ -59,10 +72,10 @@ test('unauthenticated status change', async () => {
|
|
|
59
72
|
|
|
60
73
|
await tp.setImmediate();
|
|
61
74
|
|
|
62
|
-
expect(client.status).toEqual(
|
|
75
|
+
expect(client.status).toEqual("Unauthenticated");
|
|
63
76
|
});
|
|
64
77
|
|
|
65
|
-
test(
|
|
78
|
+
test("automatic token update", async () => {
|
|
66
79
|
const cfg = getTestConfig();
|
|
67
80
|
if (cfg.test_password === undefined) {
|
|
68
81
|
console.log("skipping test because target server doesn't support authentication");
|
|
@@ -78,18 +91,22 @@ test('automatic token update', async () => {
|
|
|
78
91
|
onUpdate: (auth) => {
|
|
79
92
|
console.log(auth);
|
|
80
93
|
++numberOfAuthUpdates;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
94
|
+
},
|
|
95
|
+
},
|
|
83
96
|
});
|
|
84
97
|
|
|
85
98
|
for (let i = 0; i < 6; i++) {
|
|
86
99
|
const tx = client.createTx(true);
|
|
87
100
|
const response = await tx.send(
|
|
88
101
|
{
|
|
89
|
-
oneofKind:
|
|
90
|
-
txOpen: {
|
|
102
|
+
oneofKind: "txOpen",
|
|
103
|
+
txOpen: {
|
|
104
|
+
name: "test",
|
|
105
|
+
writable: TxAPI_Open_Request_WritableTx.WRITABLE,
|
|
106
|
+
enableFormattedErrors: false,
|
|
107
|
+
},
|
|
91
108
|
},
|
|
92
|
-
false
|
|
109
|
+
false,
|
|
93
110
|
);
|
|
94
111
|
expect(response.txOpen.tx?.isValid).toBeTruthy();
|
|
95
112
|
await tx.complete();
|
|
@@ -103,25 +120,25 @@ test('automatic token update', async () => {
|
|
|
103
120
|
}
|
|
104
121
|
}, 5000);
|
|
105
122
|
|
|
106
|
-
test(
|
|
123
|
+
test("test simple https call", async () => {
|
|
107
124
|
const client = await getTestLLClient();
|
|
108
|
-
const response = await request(
|
|
109
|
-
dispatcher: client.httpDispatcher
|
|
125
|
+
const response = await request("https://cdn.milaboratory.com/ping", {
|
|
126
|
+
dispatcher: client.httpDispatcher,
|
|
110
127
|
});
|
|
111
128
|
const text = await response.body.text();
|
|
112
|
-
expect(text).toEqual(
|
|
129
|
+
expect(text).toEqual("pong");
|
|
113
130
|
});
|
|
114
131
|
|
|
115
|
-
test(
|
|
132
|
+
test("test https call via proxy", async () => {
|
|
116
133
|
const testConfig = getTestConfig();
|
|
117
134
|
if (testConfig.test_proxy === undefined) {
|
|
118
|
-
console.log(
|
|
135
|
+
console.log("skipped");
|
|
119
136
|
return;
|
|
120
137
|
}
|
|
121
138
|
const client = await getTestLLClient({ httpProxy: testConfig.test_proxy });
|
|
122
|
-
const response = await request(
|
|
123
|
-
dispatcher: client.httpDispatcher
|
|
139
|
+
const response = await request("https://cdn.milaboratory.com/ping", {
|
|
140
|
+
dispatcher: client.httpDispatcher,
|
|
124
141
|
});
|
|
125
142
|
const text = await response.body.text();
|
|
126
|
-
expect(text).toEqual(
|
|
143
|
+
expect(text).toEqual("pong");
|
|
127
144
|
});
|