@p0security/cli 0.18.9 → 0.18.11
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/build/dist/commands/__tests__/login.test.js +17 -10
- package/build/dist/commands/__tests__/login.test.js.map +1 -1
- package/build/dist/commands/__tests__/request.test.js +64 -9
- package/build/dist/commands/__tests__/request.test.js.map +1 -1
- package/build/dist/commands/__tests__/ssh.test.js +75 -51
- package/build/dist/commands/__tests__/ssh.test.js.map +1 -1
- package/build/dist/commands/allow.js +3 -2
- package/build/dist/commands/allow.js.map +1 -1
- package/build/dist/commands/aws/__tests__/role.test.js +18 -12
- package/build/dist/commands/aws/__tests__/role.test.js.map +1 -1
- package/build/dist/commands/aws/index.js +0 -4
- package/build/dist/commands/aws/index.js.map +1 -1
- package/build/dist/commands/aws/permission-set.js +1 -2
- package/build/dist/commands/aws/permission-set.js.map +1 -1
- package/build/dist/commands/aws/role.js +1 -2
- package/build/dist/commands/aws/role.js.map +1 -1
- package/build/dist/commands/grant.js +12 -2
- package/build/dist/commands/grant.js.map +1 -1
- package/build/dist/commands/index.js +2 -0
- package/build/dist/commands/index.js.map +1 -1
- package/build/dist/commands/kubeconfig.js +1 -2
- package/build/dist/commands/kubeconfig.js.map +1 -1
- package/build/dist/commands/login.js +19 -27
- package/build/dist/commands/login.js.map +1 -1
- package/build/dist/commands/logout.d.ts +2 -0
- package/build/dist/commands/logout.js +61 -0
- package/build/dist/commands/logout.js.map +1 -0
- package/build/dist/commands/ls.js +1 -2
- package/build/dist/commands/ls.js.map +1 -1
- package/build/dist/commands/request.js +12 -2
- package/build/dist/commands/request.js.map +1 -1
- package/build/dist/commands/scp.js +1 -2
- package/build/dist/commands/scp.js.map +1 -1
- package/build/dist/commands/shared/index.d.ts +7 -4
- package/build/dist/commands/shared/index.js +20 -45
- package/build/dist/commands/shared/index.js.map +1 -1
- package/build/dist/commands/shared/request.d.ts +3 -0
- package/build/dist/commands/shared/request.js +105 -59
- package/build/dist/commands/shared/request.js.map +1 -1
- package/build/dist/commands/shared/ssh.js +21 -12
- package/build/dist/commands/shared/ssh.js.map +1 -1
- package/build/dist/commands/ssh-proxy.js +2 -3
- package/build/dist/commands/ssh-proxy.js.map +1 -1
- package/build/dist/commands/ssh-resolve.js +2 -3
- package/build/dist/commands/ssh-resolve.js.map +1 -1
- package/build/dist/commands/ssh.js +3 -4
- package/build/dist/commands/ssh.js.map +1 -1
- package/build/dist/common/keys.js +40 -7
- package/build/dist/common/keys.js.map +1 -1
- package/build/dist/drivers/__tests__/api.test.d.ts +1 -0
- package/build/dist/drivers/__tests__/api.test.js +688 -0
- package/build/dist/drivers/__tests__/api.test.js.map +1 -0
- package/build/dist/drivers/api.d.ts +11 -1
- package/build/dist/drivers/api.js +247 -30
- package/build/dist/drivers/api.js.map +1 -1
- package/build/dist/drivers/auth/index.js +23 -10
- package/build/dist/drivers/auth/index.js.map +1 -1
- package/build/dist/drivers/auth/path.d.ts +2 -0
- package/build/dist/drivers/auth/path.js +19 -1
- package/build/dist/drivers/auth/path.js.map +1 -1
- package/build/dist/drivers/config.js +10 -18
- package/build/dist/drivers/config.js.map +1 -1
- package/build/dist/drivers/env.d.ts +1 -1
- package/build/dist/drivers/env.js +2 -2
- package/build/dist/drivers/env.js.map +1 -1
- package/build/dist/drivers/firestore.d.ts +0 -10
- package/build/dist/drivers/firestore.js +3 -43
- package/build/dist/drivers/firestore.js.map +1 -1
- package/build/dist/drivers/org.d.ts +1 -0
- package/build/dist/drivers/org.js +43 -0
- package/build/dist/drivers/org.js.map +1 -0
- package/build/dist/opentelemetry/instrumentation.js +6 -14
- package/build/dist/opentelemetry/instrumentation.js.map +1 -1
- package/build/dist/plugins/aws/config.js +3 -6
- package/build/dist/plugins/aws/config.js.map +1 -1
- package/build/dist/plugins/azure/login.d.ts +3 -0
- package/build/dist/plugins/azure/login.js +86 -0
- package/build/dist/plugins/azure/login.js.map +1 -0
- package/build/dist/plugins/google/ssh-key.js +9 -9
- package/build/dist/plugins/google/ssh-key.js.map +1 -1
- package/build/dist/plugins/kubeconfig/index.js +12 -10
- package/build/dist/plugins/kubeconfig/index.js.map +1 -1
- package/build/dist/plugins/login.js +11 -9
- package/build/dist/plugins/login.js.map +1 -1
- package/build/dist/plugins/self-hosted/ssh.d.ts +3 -0
- package/build/dist/plugins/self-hosted/ssh.js +80 -0
- package/build/dist/plugins/self-hosted/ssh.js.map +1 -0
- package/build/dist/plugins/self-hosted/types.d.ts +31 -0
- package/build/dist/plugins/self-hosted/types.js +3 -0
- package/build/dist/plugins/self-hosted/types.js.map +1 -0
- package/build/dist/types/identity.d.ts +2 -1
- package/build/dist/types/org.d.ts +2 -0
- package/build/dist/types/request.d.ts +1 -1
- package/build/dist/types/ssh.d.ts +5 -4
- package/build/dist/types/ssh.js +6 -1
- package/build/dist/types/ssh.js.map +1 -1
- package/build/dist/util.d.ts +3 -0
- package/build/dist/util.js +19 -3
- package/build/dist/util.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -4
- package/build/dist/testing/firestore.d.ts +0 -2
- package/build/dist/testing/firestore.js +0 -17
- package/build/dist/testing/firestore.js.map +0 -1
|
@@ -0,0 +1,688 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
12
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
13
|
+
var m = o[Symbol.asyncIterator], i;
|
|
14
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
15
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
16
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
const api_1 = require("../api");
|
|
20
|
+
// Mock dependencies
|
|
21
|
+
jest.mock("../config");
|
|
22
|
+
jest.mock("../env");
|
|
23
|
+
jest.mock("../../version", () => ({
|
|
24
|
+
p0VersionInfo: { version: "1.0.0" },
|
|
25
|
+
}));
|
|
26
|
+
describe("fetchWithStreaming", () => {
|
|
27
|
+
const mockAuthn = {
|
|
28
|
+
getToken: jest.fn().mockResolvedValue("mock-token"),
|
|
29
|
+
identity: {
|
|
30
|
+
org: { slug: "test-org" },
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
jest.clearAllMocks();
|
|
35
|
+
});
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
// Clear all mocks after each test
|
|
38
|
+
jest.clearAllMocks();
|
|
39
|
+
jest.restoreAllMocks();
|
|
40
|
+
});
|
|
41
|
+
const createMockStreamingResponse = (chunks) => {
|
|
42
|
+
const encoder = new TextEncoder();
|
|
43
|
+
let chunkIndex = 0;
|
|
44
|
+
const mockReader = {
|
|
45
|
+
read: jest.fn().mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
46
|
+
if (chunkIndex < chunks.length) {
|
|
47
|
+
const chunk = chunks[chunkIndex++];
|
|
48
|
+
return {
|
|
49
|
+
done: false,
|
|
50
|
+
value: encoder.encode(chunk),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return { done: true, value: undefined };
|
|
54
|
+
})),
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
body: {
|
|
58
|
+
getReader: jest.fn().mockReturnValue(mockReader),
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
it("should yield data from streaming response", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
63
|
+
var _a, e_1, _b, _c;
|
|
64
|
+
const mockFetch = jest.spyOn(global, "fetch").mockResolvedValue(createMockStreamingResponse([
|
|
65
|
+
JSON.stringify({
|
|
66
|
+
type: "data",
|
|
67
|
+
data: { id: "1", message: "First chunk" },
|
|
68
|
+
}) + "\n",
|
|
69
|
+
JSON.stringify({
|
|
70
|
+
type: "data",
|
|
71
|
+
data: { id: "2", message: "Second chunk" },
|
|
72
|
+
}) + "\n",
|
|
73
|
+
]));
|
|
74
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
75
|
+
url: "/command",
|
|
76
|
+
method: "POST",
|
|
77
|
+
body: JSON.stringify({ test: "data" }),
|
|
78
|
+
});
|
|
79
|
+
const results = [];
|
|
80
|
+
try {
|
|
81
|
+
for (var _d = true, generator_1 = __asyncValues(generator), generator_1_1; generator_1_1 = yield generator_1.next(), _a = generator_1_1.done, !_a;) {
|
|
82
|
+
_c = generator_1_1.value;
|
|
83
|
+
_d = false;
|
|
84
|
+
try {
|
|
85
|
+
const chunk = _c;
|
|
86
|
+
results.push(chunk);
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
_d = true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
94
|
+
finally {
|
|
95
|
+
try {
|
|
96
|
+
if (!_d && !_a && (_b = generator_1.return)) yield _b.call(generator_1);
|
|
97
|
+
}
|
|
98
|
+
finally { if (e_1) throw e_1.error; }
|
|
99
|
+
}
|
|
100
|
+
expect(results).toEqual([
|
|
101
|
+
{ id: "1", message: "First chunk" },
|
|
102
|
+
{ id: "2", message: "Second chunk" },
|
|
103
|
+
]);
|
|
104
|
+
expect(mockFetch).toHaveBeenCalledWith("/command", {
|
|
105
|
+
method: "POST",
|
|
106
|
+
headers: {
|
|
107
|
+
authorization: "Bearer mock-token",
|
|
108
|
+
"Content-Type": "application/json",
|
|
109
|
+
"User-Agent": "P0 CLI/1.0.0",
|
|
110
|
+
},
|
|
111
|
+
body: JSON.stringify({ test: "data" }),
|
|
112
|
+
keepalive: true,
|
|
113
|
+
});
|
|
114
|
+
}));
|
|
115
|
+
it("should skip heartbeat messages", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
116
|
+
var _e, e_2, _f, _g;
|
|
117
|
+
const chunks = [
|
|
118
|
+
JSON.stringify({
|
|
119
|
+
type: "heartbeat",
|
|
120
|
+
}) + "\n",
|
|
121
|
+
JSON.stringify({
|
|
122
|
+
type: "data",
|
|
123
|
+
data: { id: "1", message: "Real data" },
|
|
124
|
+
}) + "\n",
|
|
125
|
+
JSON.stringify({
|
|
126
|
+
type: "heartbeat",
|
|
127
|
+
}) + "\n",
|
|
128
|
+
];
|
|
129
|
+
jest
|
|
130
|
+
.spyOn(global, "fetch")
|
|
131
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
132
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
133
|
+
url: "/stream",
|
|
134
|
+
method: "GET",
|
|
135
|
+
});
|
|
136
|
+
const results = [];
|
|
137
|
+
try {
|
|
138
|
+
for (var _h = true, generator_2 = __asyncValues(generator), generator_2_1; generator_2_1 = yield generator_2.next(), _e = generator_2_1.done, !_e;) {
|
|
139
|
+
_g = generator_2_1.value;
|
|
140
|
+
_h = false;
|
|
141
|
+
try {
|
|
142
|
+
const chunk = _g;
|
|
143
|
+
results.push(chunk);
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
_h = true;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
151
|
+
finally {
|
|
152
|
+
try {
|
|
153
|
+
if (!_h && !_e && (_f = generator_2.return)) yield _f.call(generator_2);
|
|
154
|
+
}
|
|
155
|
+
finally { if (e_2) throw e_2.error; }
|
|
156
|
+
}
|
|
157
|
+
expect(results).toEqual([{ id: "1", message: "Real data" }]);
|
|
158
|
+
}));
|
|
159
|
+
it("should throw error when response type is error", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
160
|
+
const chunks = [
|
|
161
|
+
JSON.stringify({
|
|
162
|
+
type: "error",
|
|
163
|
+
error: "Something went wrong",
|
|
164
|
+
}) + "\n",
|
|
165
|
+
];
|
|
166
|
+
jest
|
|
167
|
+
.spyOn(global, "fetch")
|
|
168
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
169
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
170
|
+
url: "/stream",
|
|
171
|
+
method: "GET",
|
|
172
|
+
});
|
|
173
|
+
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
174
|
+
var _j, e_3, _k, _l;
|
|
175
|
+
try {
|
|
176
|
+
for (var _m = true, generator_3 = __asyncValues(generator), generator_3_1; generator_3_1 = yield generator_3.next(), _j = generator_3_1.done, !_j;) {
|
|
177
|
+
_l = generator_3_1.value;
|
|
178
|
+
_m = false;
|
|
179
|
+
try {
|
|
180
|
+
const _chunk = _l;
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
_m = true;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
188
|
+
finally {
|
|
189
|
+
try {
|
|
190
|
+
if (!_m && !_j && (_k = generator_3.return)) yield _k.call(generator_3);
|
|
191
|
+
}
|
|
192
|
+
finally { if (e_3) throw e_3.error; }
|
|
193
|
+
}
|
|
194
|
+
})).rejects.toBe("Something went wrong");
|
|
195
|
+
}));
|
|
196
|
+
it("should throw error when data contains error", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
197
|
+
const chunks = [
|
|
198
|
+
JSON.stringify({
|
|
199
|
+
type: "data",
|
|
200
|
+
data: { error: "Data error occurred" },
|
|
201
|
+
}) + "\n",
|
|
202
|
+
];
|
|
203
|
+
jest
|
|
204
|
+
.spyOn(global, "fetch")
|
|
205
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
206
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
207
|
+
url: "/stream",
|
|
208
|
+
method: "GET",
|
|
209
|
+
});
|
|
210
|
+
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
211
|
+
var _o, e_4, _p, _q;
|
|
212
|
+
try {
|
|
213
|
+
for (var _r = true, generator_4 = __asyncValues(generator), generator_4_1; generator_4_1 = yield generator_4.next(), _o = generator_4_1.done, !_o;) {
|
|
214
|
+
_q = generator_4_1.value;
|
|
215
|
+
_r = false;
|
|
216
|
+
try {
|
|
217
|
+
const _chunk = _q;
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
_r = true;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
225
|
+
finally {
|
|
226
|
+
try {
|
|
227
|
+
if (!_r && !_o && (_p = generator_4.return)) yield _p.call(generator_4);
|
|
228
|
+
}
|
|
229
|
+
finally { if (e_4) throw e_4.error; }
|
|
230
|
+
}
|
|
231
|
+
})).rejects.toBe("Data error occurred");
|
|
232
|
+
}));
|
|
233
|
+
it("should throw error for invalid response format", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
234
|
+
const chunks = [
|
|
235
|
+
JSON.stringify({
|
|
236
|
+
type: "unknown",
|
|
237
|
+
someData: "invalid",
|
|
238
|
+
}) + "\n",
|
|
239
|
+
];
|
|
240
|
+
jest
|
|
241
|
+
.spyOn(global, "fetch")
|
|
242
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
243
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
244
|
+
url: "/stream",
|
|
245
|
+
method: "GET",
|
|
246
|
+
});
|
|
247
|
+
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
248
|
+
var _s, e_5, _t, _u;
|
|
249
|
+
try {
|
|
250
|
+
for (var _v = true, generator_5 = __asyncValues(generator), generator_5_1; generator_5_1 = yield generator_5.next(), _s = generator_5_1.done, !_s;) {
|
|
251
|
+
_u = generator_5_1.value;
|
|
252
|
+
_v = false;
|
|
253
|
+
try {
|
|
254
|
+
const _chunk = _u;
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
_v = true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
262
|
+
finally {
|
|
263
|
+
try {
|
|
264
|
+
if (!_v && !_s && (_t = generator_5.return)) yield _t.call(generator_5);
|
|
265
|
+
}
|
|
266
|
+
finally { if (e_5) throw e_5.error; }
|
|
267
|
+
}
|
|
268
|
+
})).rejects.toBe("Invalid response from the server");
|
|
269
|
+
}));
|
|
270
|
+
it("should handle multiple JSON objects in single chunk", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
271
|
+
var _w, e_6, _x, _y;
|
|
272
|
+
const chunks = [
|
|
273
|
+
JSON.stringify({ type: "data", data: { id: "1\ntest" } }) +
|
|
274
|
+
"\n" +
|
|
275
|
+
JSON.stringify({ type: "data", data: { id: "2" } }) +
|
|
276
|
+
"\n",
|
|
277
|
+
];
|
|
278
|
+
jest
|
|
279
|
+
.spyOn(global, "fetch")
|
|
280
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
281
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
282
|
+
url: "/stream",
|
|
283
|
+
method: "GET",
|
|
284
|
+
});
|
|
285
|
+
const results = [];
|
|
286
|
+
try {
|
|
287
|
+
for (var _z = true, generator_6 = __asyncValues(generator), generator_6_1; generator_6_1 = yield generator_6.next(), _w = generator_6_1.done, !_w;) {
|
|
288
|
+
_y = generator_6_1.value;
|
|
289
|
+
_z = false;
|
|
290
|
+
try {
|
|
291
|
+
const chunk = _y;
|
|
292
|
+
results.push(chunk);
|
|
293
|
+
}
|
|
294
|
+
finally {
|
|
295
|
+
_z = true;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
300
|
+
finally {
|
|
301
|
+
try {
|
|
302
|
+
if (!_z && !_w && (_x = generator_6.return)) yield _x.call(generator_6);
|
|
303
|
+
}
|
|
304
|
+
finally { if (e_6) throw e_6.error; }
|
|
305
|
+
}
|
|
306
|
+
expect(results).toEqual([{ id: "1\ntest" }, { id: "2" }]);
|
|
307
|
+
}));
|
|
308
|
+
it("should handle chunks with partial data", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
309
|
+
var _0, e_7, _1, _2;
|
|
310
|
+
const chunks = [
|
|
311
|
+
'{"type":"data","data":{"id":"1"}}\n{"type":"heartbeat"}\n{"type":"da',
|
|
312
|
+
'ta","data":{"id":"2"}}\n', // Completes the JSON
|
|
313
|
+
];
|
|
314
|
+
jest
|
|
315
|
+
.spyOn(global, "fetch")
|
|
316
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
317
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
318
|
+
url: "/stream",
|
|
319
|
+
method: "GET",
|
|
320
|
+
});
|
|
321
|
+
const results = [];
|
|
322
|
+
try {
|
|
323
|
+
for (var _3 = true, generator_7 = __asyncValues(generator), generator_7_1; generator_7_1 = yield generator_7.next(), _0 = generator_7_1.done, !_0;) {
|
|
324
|
+
_2 = generator_7_1.value;
|
|
325
|
+
_3 = false;
|
|
326
|
+
try {
|
|
327
|
+
const chunk = _2;
|
|
328
|
+
results.push(chunk);
|
|
329
|
+
}
|
|
330
|
+
finally {
|
|
331
|
+
_3 = true;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
336
|
+
finally {
|
|
337
|
+
try {
|
|
338
|
+
if (!_3 && !_0 && (_1 = generator_7.return)) yield _1.call(generator_7);
|
|
339
|
+
}
|
|
340
|
+
finally { if (e_7) throw e_7.error; }
|
|
341
|
+
}
|
|
342
|
+
expect(results).toEqual([{ id: "1" }, { id: "2" }]);
|
|
343
|
+
}));
|
|
344
|
+
it("should handle incomplete JSON across multiple chunks", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
345
|
+
var _4, e_8, _5, _6;
|
|
346
|
+
// Simulate arbitrary chunks that split JSON objects
|
|
347
|
+
const chunks = [
|
|
348
|
+
'{"type":"data","data":{"id":"1","mess',
|
|
349
|
+
'age":"First chunk"}}\n{"type":"data",',
|
|
350
|
+
'"data":{"id":"2","message":"Second chu',
|
|
351
|
+
'nk"}}\n', // Completes second JSON
|
|
352
|
+
];
|
|
353
|
+
jest
|
|
354
|
+
.spyOn(global, "fetch")
|
|
355
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
356
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
357
|
+
url: "/stream",
|
|
358
|
+
method: "GET",
|
|
359
|
+
});
|
|
360
|
+
const results = [];
|
|
361
|
+
try {
|
|
362
|
+
for (var _7 = true, generator_8 = __asyncValues(generator), generator_8_1; generator_8_1 = yield generator_8.next(), _4 = generator_8_1.done, !_4;) {
|
|
363
|
+
_6 = generator_8_1.value;
|
|
364
|
+
_7 = false;
|
|
365
|
+
try {
|
|
366
|
+
const chunk = _6;
|
|
367
|
+
results.push(chunk);
|
|
368
|
+
}
|
|
369
|
+
finally {
|
|
370
|
+
_7 = true;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
375
|
+
finally {
|
|
376
|
+
try {
|
|
377
|
+
if (!_7 && !_4 && (_5 = generator_8.return)) yield _5.call(generator_8);
|
|
378
|
+
}
|
|
379
|
+
finally { if (e_8) throw e_8.error; }
|
|
380
|
+
}
|
|
381
|
+
expect(results).toEqual([
|
|
382
|
+
{ id: "1", message: "First chunk" },
|
|
383
|
+
{ id: "2", message: "Second chunk" },
|
|
384
|
+
]);
|
|
385
|
+
}));
|
|
386
|
+
it("should handle single character chunks", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
387
|
+
var _8, e_9, _9, _10;
|
|
388
|
+
// Each character as a separate chunk
|
|
389
|
+
const jsonString = '{"type":"data","data":{"id":"test"}}\n';
|
|
390
|
+
const chunks = jsonString.split("");
|
|
391
|
+
jest
|
|
392
|
+
.spyOn(global, "fetch")
|
|
393
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
394
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
395
|
+
url: "/stream",
|
|
396
|
+
method: "GET",
|
|
397
|
+
});
|
|
398
|
+
const results = [];
|
|
399
|
+
try {
|
|
400
|
+
for (var _11 = true, generator_9 = __asyncValues(generator), generator_9_1; generator_9_1 = yield generator_9.next(), _8 = generator_9_1.done, !_8;) {
|
|
401
|
+
_10 = generator_9_1.value;
|
|
402
|
+
_11 = false;
|
|
403
|
+
try {
|
|
404
|
+
const chunk = _10;
|
|
405
|
+
results.push(chunk);
|
|
406
|
+
}
|
|
407
|
+
finally {
|
|
408
|
+
_11 = true;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
413
|
+
finally {
|
|
414
|
+
try {
|
|
415
|
+
if (!_11 && !_8 && (_9 = generator_9.return)) yield _9.call(generator_9);
|
|
416
|
+
}
|
|
417
|
+
finally { if (e_9) throw e_9.error; }
|
|
418
|
+
}
|
|
419
|
+
expect(results).toEqual([{ id: "test" }]);
|
|
420
|
+
}));
|
|
421
|
+
it("should handle chunks with no invalid json and no new lines", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
422
|
+
const chunks = [
|
|
423
|
+
'{"type":"data","data":{"id":"1"}', // No newlines
|
|
424
|
+
];
|
|
425
|
+
jest
|
|
426
|
+
.spyOn(global, "fetch")
|
|
427
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
428
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
429
|
+
url: "/stream",
|
|
430
|
+
method: "GET",
|
|
431
|
+
});
|
|
432
|
+
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
433
|
+
var _12, e_10, _13, _14;
|
|
434
|
+
try {
|
|
435
|
+
for (var _15 = true, generator_10 = __asyncValues(generator), generator_10_1; generator_10_1 = yield generator_10.next(), _12 = generator_10_1.done, !_12;) {
|
|
436
|
+
_14 = generator_10_1.value;
|
|
437
|
+
_15 = false;
|
|
438
|
+
try {
|
|
439
|
+
const _chunk = _14;
|
|
440
|
+
}
|
|
441
|
+
finally {
|
|
442
|
+
_15 = true;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
|
447
|
+
finally {
|
|
448
|
+
try {
|
|
449
|
+
if (!_15 && !_12 && (_13 = generator_10.return)) yield _13.call(generator_10);
|
|
450
|
+
}
|
|
451
|
+
finally { if (e_10) throw e_10.error; }
|
|
452
|
+
}
|
|
453
|
+
})).rejects.toBe("Invalid response from the server");
|
|
454
|
+
}));
|
|
455
|
+
it("should handle empty chunks", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
456
|
+
var _16, e_11, _17, _18;
|
|
457
|
+
const chunks = [
|
|
458
|
+
"",
|
|
459
|
+
'{"type":"data","data":{"id":"1"}}\n',
|
|
460
|
+
"",
|
|
461
|
+
'{"type":"data","data":{"id":"2"}}\n',
|
|
462
|
+
];
|
|
463
|
+
jest
|
|
464
|
+
.spyOn(global, "fetch")
|
|
465
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
466
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
467
|
+
url: "/stream",
|
|
468
|
+
method: "GET",
|
|
469
|
+
});
|
|
470
|
+
const results = [];
|
|
471
|
+
try {
|
|
472
|
+
for (var _19 = true, generator_11 = __asyncValues(generator), generator_11_1; generator_11_1 = yield generator_11.next(), _16 = generator_11_1.done, !_16;) {
|
|
473
|
+
_18 = generator_11_1.value;
|
|
474
|
+
_19 = false;
|
|
475
|
+
try {
|
|
476
|
+
const chunk = _18;
|
|
477
|
+
results.push(chunk);
|
|
478
|
+
}
|
|
479
|
+
finally {
|
|
480
|
+
_19 = true;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
catch (e_11_1) { e_11 = { error: e_11_1 }; }
|
|
485
|
+
finally {
|
|
486
|
+
try {
|
|
487
|
+
if (!_19 && !_16 && (_17 = generator_11.return)) yield _17.call(generator_11);
|
|
488
|
+
}
|
|
489
|
+
finally { if (e_11) throw e_11.error; }
|
|
490
|
+
}
|
|
491
|
+
expect(results).toEqual([{ id: "1" }, { id: "2" }]);
|
|
492
|
+
}));
|
|
493
|
+
it("should throw errors if there is leftover error chunk without new-line and a type", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
494
|
+
const chunks = ['{"error":"Something went wrong"}'];
|
|
495
|
+
jest
|
|
496
|
+
.spyOn(global, "fetch")
|
|
497
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
498
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
499
|
+
url: "/stream",
|
|
500
|
+
method: "GET",
|
|
501
|
+
});
|
|
502
|
+
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
503
|
+
var _20, e_12, _21, _22;
|
|
504
|
+
try {
|
|
505
|
+
for (var _23 = true, generator_12 = __asyncValues(generator), generator_12_1; generator_12_1 = yield generator_12.next(), _20 = generator_12_1.done, !_20;) {
|
|
506
|
+
_22 = generator_12_1.value;
|
|
507
|
+
_23 = false;
|
|
508
|
+
try {
|
|
509
|
+
const _chunk = _22;
|
|
510
|
+
}
|
|
511
|
+
finally {
|
|
512
|
+
_23 = true;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
catch (e_12_1) { e_12 = { error: e_12_1 }; }
|
|
517
|
+
finally {
|
|
518
|
+
try {
|
|
519
|
+
if (!_23 && !_20 && (_21 = generator_12.return)) yield _21.call(generator_12);
|
|
520
|
+
}
|
|
521
|
+
finally { if (e_12) throw e_12.error; }
|
|
522
|
+
}
|
|
523
|
+
})).rejects.toBe("Something went wrong");
|
|
524
|
+
}));
|
|
525
|
+
it("should throw network error for terminated", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
526
|
+
jest.spyOn(global, "fetch").mockRejectedValue(new TypeError("terminated"));
|
|
527
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
528
|
+
url: "/stream",
|
|
529
|
+
method: "GET",
|
|
530
|
+
});
|
|
531
|
+
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
532
|
+
var _24, e_13, _25, _26;
|
|
533
|
+
try {
|
|
534
|
+
for (var _27 = true, generator_13 = __asyncValues(generator), generator_13_1; generator_13_1 = yield generator_13.next(), _24 = generator_13_1.done, !_24;) {
|
|
535
|
+
_26 = generator_13_1.value;
|
|
536
|
+
_27 = false;
|
|
537
|
+
try {
|
|
538
|
+
const _chunk = _26;
|
|
539
|
+
}
|
|
540
|
+
finally {
|
|
541
|
+
_27 = true;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
catch (e_13_1) { e_13 = { error: e_13_1 }; }
|
|
546
|
+
finally {
|
|
547
|
+
try {
|
|
548
|
+
if (!_27 && !_24 && (_25 = generator_13.return)) yield _25.call(generator_13);
|
|
549
|
+
}
|
|
550
|
+
finally { if (e_13) throw e_13.error; }
|
|
551
|
+
}
|
|
552
|
+
})).rejects.toBe("Network error: Unable to reach the server.");
|
|
553
|
+
}));
|
|
554
|
+
it("should rethrow other errors", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
555
|
+
const customError = new Error("Custom error");
|
|
556
|
+
jest.spyOn(global, "fetch").mockRejectedValue(customError);
|
|
557
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
558
|
+
url: "/stream",
|
|
559
|
+
method: "GET",
|
|
560
|
+
});
|
|
561
|
+
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
562
|
+
var _28, e_14, _29, _30;
|
|
563
|
+
try {
|
|
564
|
+
for (var _31 = true, generator_14 = __asyncValues(generator), generator_14_1; generator_14_1 = yield generator_14.next(), _28 = generator_14_1.done, !_28;) {
|
|
565
|
+
_30 = generator_14_1.value;
|
|
566
|
+
_31 = false;
|
|
567
|
+
try {
|
|
568
|
+
const _chunk = _30;
|
|
569
|
+
}
|
|
570
|
+
finally {
|
|
571
|
+
_31 = true;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
catch (e_14_1) { e_14 = { error: e_14_1 }; }
|
|
576
|
+
finally {
|
|
577
|
+
try {
|
|
578
|
+
if (!_31 && !_28 && (_29 = generator_14.return)) yield _29.call(generator_14);
|
|
579
|
+
}
|
|
580
|
+
finally { if (e_14) throw e_14.error; }
|
|
581
|
+
}
|
|
582
|
+
})).rejects.toBe(customError);
|
|
583
|
+
}));
|
|
584
|
+
it("should throw network error for fetch failed", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
585
|
+
jest
|
|
586
|
+
.spyOn(global, "fetch")
|
|
587
|
+
.mockRejectedValue(new TypeError("fetch failed"));
|
|
588
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
589
|
+
url: "/stream",
|
|
590
|
+
method: "GET",
|
|
591
|
+
});
|
|
592
|
+
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
593
|
+
var _32, e_15, _33, _34;
|
|
594
|
+
try {
|
|
595
|
+
for (var _35 = true, generator_15 = __asyncValues(generator), generator_15_1; generator_15_1 = yield generator_15.next(), _32 = generator_15_1.done, !_32;) {
|
|
596
|
+
_34 = generator_15_1.value;
|
|
597
|
+
_35 = false;
|
|
598
|
+
try {
|
|
599
|
+
const _chunk = _34;
|
|
600
|
+
}
|
|
601
|
+
finally {
|
|
602
|
+
_35 = true;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
catch (e_15_1) { e_15 = { error: e_15_1 }; }
|
|
607
|
+
finally {
|
|
608
|
+
try {
|
|
609
|
+
if (!_35 && !_32 && (_33 = generator_15.return)) yield _33.call(generator_15);
|
|
610
|
+
}
|
|
611
|
+
finally { if (e_15) throw e_15.error; }
|
|
612
|
+
}
|
|
613
|
+
})).rejects.toBe("Network error: Unable to reach the server.");
|
|
614
|
+
}));
|
|
615
|
+
it("should throw error when no reader available", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
616
|
+
jest.spyOn(global, "fetch").mockResolvedValue({
|
|
617
|
+
body: null,
|
|
618
|
+
});
|
|
619
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
620
|
+
url: "/stream",
|
|
621
|
+
method: "GET",
|
|
622
|
+
});
|
|
623
|
+
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
624
|
+
var _36, e_16, _37, _38;
|
|
625
|
+
try {
|
|
626
|
+
for (var _39 = true, generator_16 = __asyncValues(generator), generator_16_1; generator_16_1 = yield generator_16.next(), _36 = generator_16_1.done, !_36;) {
|
|
627
|
+
_38 = generator_16_1.value;
|
|
628
|
+
_39 = false;
|
|
629
|
+
try {
|
|
630
|
+
const _chunk = _38;
|
|
631
|
+
}
|
|
632
|
+
finally {
|
|
633
|
+
_39 = true;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
catch (e_16_1) { e_16 = { error: e_16_1 }; }
|
|
638
|
+
finally {
|
|
639
|
+
try {
|
|
640
|
+
if (!_39 && !_36 && (_37 = generator_16.return)) yield _37.call(generator_16);
|
|
641
|
+
}
|
|
642
|
+
finally { if (e_16) throw e_16.error; }
|
|
643
|
+
}
|
|
644
|
+
})).rejects.toBe("No reader available");
|
|
645
|
+
}));
|
|
646
|
+
it("should use timeout when maxTimeoutMs is provided", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
647
|
+
var _40, e_17, _41, _42;
|
|
648
|
+
const chunks = [
|
|
649
|
+
JSON.stringify({
|
|
650
|
+
type: "data",
|
|
651
|
+
data: { message: "success" },
|
|
652
|
+
}) + "\n",
|
|
653
|
+
];
|
|
654
|
+
const mockFetch = jest
|
|
655
|
+
.spyOn(global, "fetch")
|
|
656
|
+
.mockResolvedValue(createMockStreamingResponse(chunks));
|
|
657
|
+
const generator = (0, api_1.fetchWithStreaming)(mockAuthn, {
|
|
658
|
+
url: "/stream",
|
|
659
|
+
method: "POST",
|
|
660
|
+
maxTimeoutMs: 5000,
|
|
661
|
+
});
|
|
662
|
+
const results = [];
|
|
663
|
+
try {
|
|
664
|
+
for (var _43 = true, generator_17 = __asyncValues(generator), generator_17_1; generator_17_1 = yield generator_17.next(), _40 = generator_17_1.done, !_40;) {
|
|
665
|
+
_42 = generator_17_1.value;
|
|
666
|
+
_43 = false;
|
|
667
|
+
try {
|
|
668
|
+
const chunk = _42;
|
|
669
|
+
results.push(chunk);
|
|
670
|
+
}
|
|
671
|
+
finally {
|
|
672
|
+
_43 = true;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
catch (e_17_1) { e_17 = { error: e_17_1 }; }
|
|
677
|
+
finally {
|
|
678
|
+
try {
|
|
679
|
+
if (!_43 && !_40 && (_41 = generator_17.return)) yield _41.call(generator_17);
|
|
680
|
+
}
|
|
681
|
+
finally { if (e_17) throw e_17.error; }
|
|
682
|
+
}
|
|
683
|
+
expect(mockFetch).toHaveBeenCalledWith("/stream", expect.objectContaining({
|
|
684
|
+
signal: expect.any(AbortSignal),
|
|
685
|
+
}));
|
|
686
|
+
}));
|
|
687
|
+
});
|
|
688
|
+
//# sourceMappingURL=api.test.js.map
|