@laikatest/sdk 0.1.0 → 0.2.0
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 +14 -14
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -3
- package/dist/laika.d.ts +2 -2
- package/dist/laika.js +7 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -15,9 +15,9 @@ const client = new LaikaTest('key'); // Same key again?
|
|
|
15
15
|
|
|
16
16
|
**After** - single unified init:
|
|
17
17
|
```typescript
|
|
18
|
-
import {
|
|
18
|
+
import { LaikaTest } from '@laikatest/sdk';
|
|
19
19
|
|
|
20
|
-
const laika =
|
|
20
|
+
const laika = LaikaTest.init({
|
|
21
21
|
apiKey: 'key',
|
|
22
22
|
serviceName: 'app',
|
|
23
23
|
});
|
|
@@ -33,10 +33,10 @@ npm install @laikatest/sdk
|
|
|
33
33
|
## Quick Start
|
|
34
34
|
|
|
35
35
|
```typescript
|
|
36
|
-
import {
|
|
36
|
+
import { LaikaTest, setSessionId } from '@laikatest/sdk';
|
|
37
37
|
|
|
38
38
|
// Initialize once - enables both tracing and experiments
|
|
39
|
-
const laika =
|
|
39
|
+
const laika = LaikaTest.init({
|
|
40
40
|
apiKey: process.env.LAIKA_API_KEY,
|
|
41
41
|
serviceName: 'my-app',
|
|
42
42
|
});
|
|
@@ -103,14 +103,14 @@ Enable only what you need:
|
|
|
103
103
|
|
|
104
104
|
```typescript
|
|
105
105
|
// Tracing only (observability without experiments)
|
|
106
|
-
const laika =
|
|
106
|
+
const laika = LaikaTest.init({
|
|
107
107
|
apiKey: 'key',
|
|
108
108
|
serviceName: 'app',
|
|
109
109
|
experiments: false,
|
|
110
110
|
});
|
|
111
111
|
|
|
112
112
|
// Experiments only (A/B testing without tracing)
|
|
113
|
-
const laika =
|
|
113
|
+
const laika = LaikaTest.init({
|
|
114
114
|
apiKey: 'key',
|
|
115
115
|
serviceName: 'app',
|
|
116
116
|
tracing: false,
|
|
@@ -157,11 +157,11 @@ setProperties({
|
|
|
157
157
|
|
|
158
158
|
## API Reference
|
|
159
159
|
|
|
160
|
-
###
|
|
160
|
+
### LaikaTest Class
|
|
161
161
|
|
|
162
162
|
| Method | Description |
|
|
163
163
|
|--------|-------------|
|
|
164
|
-
| `
|
|
164
|
+
| `LaikaTest.init(config)` | Initialize SDK (static factory) |
|
|
165
165
|
| `laika.getPrompt(name, options?)` | Fetch prompt by name |
|
|
166
166
|
| `laika.getExperimentPrompt(title, context?)` | Get A/B tested prompt |
|
|
167
167
|
| `laika.shutdown()` | Cleanup resources |
|
|
@@ -197,9 +197,9 @@ import type {
|
|
|
197
197
|
### Multi-Turn Chatbot
|
|
198
198
|
|
|
199
199
|
```typescript
|
|
200
|
-
import {
|
|
200
|
+
import { LaikaTest, setSessionId, setUserId } from '@laikatest/sdk';
|
|
201
201
|
|
|
202
|
-
const laika =
|
|
202
|
+
const laika = LaikaTest.init({
|
|
203
203
|
apiKey: process.env.LAIKA_API_KEY,
|
|
204
204
|
serviceName: 'chatbot',
|
|
205
205
|
});
|
|
@@ -228,9 +228,9 @@ async function handleMessage(userId: string, conversationId: string, message: st
|
|
|
228
228
|
### Express.js Middleware
|
|
229
229
|
|
|
230
230
|
```typescript
|
|
231
|
-
import {
|
|
231
|
+
import { LaikaTest, setSessionId, setUserId, setProperty } from '@laikatest/sdk';
|
|
232
232
|
|
|
233
|
-
const laika =
|
|
233
|
+
const laika = LaikaTest.init({
|
|
234
234
|
apiKey: process.env.LAIKA_API_KEY,
|
|
235
235
|
serviceName: 'api-server',
|
|
236
236
|
});
|
|
@@ -266,9 +266,9 @@ const prompt = await client.getExperimentPrompt('exp', { userId: 'u1' });
|
|
|
266
266
|
### After (Unified SDK)
|
|
267
267
|
|
|
268
268
|
```typescript
|
|
269
|
-
import {
|
|
269
|
+
import { LaikaTest, setSessionId } from '@laikatest/sdk';
|
|
270
270
|
|
|
271
|
-
const laika =
|
|
271
|
+
const laika = LaikaTest.init({ apiKey: 'key', serviceName: 'app' });
|
|
272
272
|
|
|
273
273
|
setSessionId('conv-123');
|
|
274
274
|
const prompt = await laika.getExperimentPrompt('exp', { userId: 'u1' });
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { LaikaTest } from './laika';
|
|
2
2
|
export { LaikaConfig } from './types';
|
|
3
3
|
export { setSessionId, getSessionId, clearSessionId, setUserId, getUserId, clearUserId, runWithContext, runWithContextAsync, setProperty, setProperties, getProperties, clearProperties, removeProperty, runWithProperties, runWithPropertiesAsync, shutdown, } from '@laikatest/auto-otel';
|
|
4
4
|
export { Prompt, LaikaServiceError, NetworkError, ValidationError, AuthenticationError, } from '@laikatest/js-client';
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AuthenticationError = exports.ValidationError = exports.NetworkError = exports.LaikaServiceError = exports.Prompt = exports.shutdown = exports.runWithPropertiesAsync = exports.runWithProperties = exports.removeProperty = exports.clearProperties = exports.getProperties = exports.setProperties = exports.setProperty = exports.runWithContextAsync = exports.runWithContext = exports.clearUserId = exports.getUserId = exports.setUserId = exports.clearSessionId = exports.getSessionId = exports.setSessionId = exports.
|
|
3
|
+
exports.AuthenticationError = exports.ValidationError = exports.NetworkError = exports.LaikaServiceError = exports.Prompt = exports.shutdown = exports.runWithPropertiesAsync = exports.runWithProperties = exports.removeProperty = exports.clearProperties = exports.getProperties = exports.setProperties = exports.setProperty = exports.runWithContextAsync = exports.runWithContext = exports.clearUserId = exports.getUserId = exports.setUserId = exports.clearSessionId = exports.getSessionId = exports.setSessionId = exports.LaikaTest = void 0;
|
|
4
4
|
// Main class
|
|
5
5
|
var laika_1 = require("./laika");
|
|
6
|
-
Object.defineProperty(exports, "
|
|
6
|
+
Object.defineProperty(exports, "LaikaTest", { enumerable: true, get: function () { return laika_1.LaikaTest; } });
|
|
7
7
|
// Re-export from auto-otel for convenience
|
|
8
8
|
var auto_otel_1 = require("@laikatest/auto-otel");
|
|
9
9
|
Object.defineProperty(exports, "setSessionId", { enumerable: true, get: function () { return auto_otel_1.setSessionId; } });
|
|
@@ -29,4 +29,4 @@ Object.defineProperty(exports, "LaikaServiceError", { enumerable: true, get: fun
|
|
|
29
29
|
Object.defineProperty(exports, "NetworkError", { enumerable: true, get: function () { return js_client_1.NetworkError; } });
|
|
30
30
|
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return js_client_1.ValidationError; } });
|
|
31
31
|
Object.defineProperty(exports, "AuthenticationError", { enumerable: true, get: function () { return js_client_1.AuthenticationError; } });
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsYUFBYTtBQUNiLGlDQUFvQztBQUEzQixrR0FBQSxTQUFTLE9BQUE7QUFHbEIsMkNBQTJDO0FBQzNDLGtEQWlCOEI7QUFoQjVCLHlHQUFBLFlBQVksT0FBQTtBQUNaLHlHQUFBLFlBQVksT0FBQTtBQUNaLDJHQUFBLGNBQWMsT0FBQTtBQUNkLHNHQUFBLFNBQVMsT0FBQTtBQUNULHNHQUFBLFNBQVMsT0FBQTtBQUNULHdHQUFBLFdBQVcsT0FBQTtBQUNYLDJHQUFBLGNBQWMsT0FBQTtBQUNkLGdIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHdHQUFBLFdBQVcsT0FBQTtBQUNYLDBHQUFBLGFBQWEsT0FBQTtBQUNiLDBHQUFBLGFBQWEsT0FBQTtBQUNiLDRHQUFBLGVBQWUsT0FBQTtBQUNmLDJHQUFBLGNBQWMsT0FBQTtBQUNkLDhHQUFBLGlCQUFpQixPQUFBO0FBQ2pCLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLHFHQUFBLFFBQVEsT0FBQTtBQUdWLHdDQUF3QztBQUN4QyxrREFNOEI7QUFMNUIsbUdBQUEsTUFBTSxPQUFBO0FBQ04sOEdBQUEsaUJBQWlCLE9BQUE7QUFDakIseUdBQUEsWUFBWSxPQUFBO0FBQ1osNEdBQUEsZUFBZSxPQUFBO0FBQ2YsZ0hBQUEsbUJBQW1CLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBNYWluIGNsYXNzXG5leHBvcnQgeyBMYWlrYVRlc3QgfSBmcm9tICcuL2xhaWthJztcbmV4cG9ydCB7IExhaWthQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIFJlLWV4cG9ydCBmcm9tIGF1dG8tb3RlbCBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB7XG4gIHNldFNlc3Npb25JZCxcbiAgZ2V0U2Vzc2lvbklkLFxuICBjbGVhclNlc3Npb25JZCxcbiAgc2V0VXNlcklkLFxuICBnZXRVc2VySWQsXG4gIGNsZWFyVXNlcklkLFxuICBydW5XaXRoQ29udGV4dCxcbiAgcnVuV2l0aENvbnRleHRBc3luYyxcbiAgc2V0UHJvcGVydHksXG4gIHNldFByb3BlcnRpZXMsXG4gIGdldFByb3BlcnRpZXMsXG4gIGNsZWFyUHJvcGVydGllcyxcbiAgcmVtb3ZlUHJvcGVydHksXG4gIHJ1bldpdGhQcm9wZXJ0aWVzLFxuICBydW5XaXRoUHJvcGVydGllc0FzeW5jLFxuICBzaHV0ZG93bixcbn0gZnJvbSAnQGxhaWthdGVzdC9hdXRvLW90ZWwnO1xuXG4vLyBSZS1leHBvcnQgZnJvbSBjbGllbnQgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQge1xuICBQcm9tcHQsXG4gIExhaWthU2VydmljZUVycm9yLFxuICBOZXR3b3JrRXJyb3IsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgQXV0aGVudGljYXRpb25FcnJvcixcbn0gZnJvbSAnQGxhaWthdGVzdC9qcy1jbGllbnQnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgZnJvbSBjbGllbnRcbmV4cG9ydCB0eXBlIHtcbiAgUHJvbXB0Q29udGVudCxcbiAgU2NvcmVJbnB1dCxcbiAgU2NvcmVUeXBlLFxuICBTY29yZVNvdXJjZSxcbiAgUHVzaFNjb3JlT3B0aW9ucyxcbiAgUHVzaFNjb3JlUmVzcG9uc2UsXG4gIENsaWVudE9wdGlvbnMsXG4gIEdldFByb21wdE9wdGlvbnMsXG59IGZyb20gJ0BsYWlrYXRlc3QvanMtY2xpZW50JztcbiJdfQ==
|
package/dist/laika.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { LaikaConfig } from './types';
|
|
|
4
4
|
* Unified LaikaTest SDK for tracing and experiments.
|
|
5
5
|
* Provides a single entry point for both observability and A/B testing.
|
|
6
6
|
*/
|
|
7
|
-
export declare class
|
|
7
|
+
export declare class LaikaTest {
|
|
8
8
|
private client;
|
|
9
9
|
private tracingEnabled;
|
|
10
10
|
private constructor();
|
|
@@ -14,7 +14,7 @@ export declare class Laika {
|
|
|
14
14
|
* @throws {Error} If apiKey or serviceName is missing/invalid
|
|
15
15
|
* @throws {Error} If OpenTelemetry SDK fails to start
|
|
16
16
|
*/
|
|
17
|
-
static init(config: LaikaConfig):
|
|
17
|
+
static init(config: LaikaConfig): LaikaTest;
|
|
18
18
|
/**
|
|
19
19
|
* Fetch prompt content by name.
|
|
20
20
|
* Requires experiments to be enabled.
|
package/dist/laika.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.LaikaTest = void 0;
|
|
4
4
|
const auto_otel_1 = require("@laikatest/auto-otel");
|
|
5
5
|
const js_client_1 = require("@laikatest/js-client");
|
|
6
6
|
/**
|
|
7
7
|
* Unified LaikaTest SDK for tracing and experiments.
|
|
8
8
|
* Provides a single entry point for both observability and A/B testing.
|
|
9
9
|
*/
|
|
10
|
-
class
|
|
10
|
+
class LaikaTest {
|
|
11
11
|
constructor() {
|
|
12
12
|
this.client = null;
|
|
13
13
|
this.tracingEnabled = false;
|
|
@@ -19,11 +19,11 @@ class Laika {
|
|
|
19
19
|
* @throws {Error} If OpenTelemetry SDK fails to start
|
|
20
20
|
*/
|
|
21
21
|
static init(config) {
|
|
22
|
-
const instance = new
|
|
22
|
+
const instance = new LaikaTest();
|
|
23
23
|
try {
|
|
24
24
|
// Initialize tracing (if enabled, default: true)
|
|
25
25
|
if (config.tracing !== false) {
|
|
26
|
-
(0, auto_otel_1.
|
|
26
|
+
(0, auto_otel_1.initLaikaTest)({
|
|
27
27
|
apiKey: config.apiKey,
|
|
28
28
|
serviceName: config.serviceName,
|
|
29
29
|
endpoint: config.endpoint,
|
|
@@ -113,7 +113,7 @@ class Laika {
|
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
if (errors.length > 0) {
|
|
116
|
-
console.error('[
|
|
116
|
+
console.error('[LaikaTest] Errors during shutdown:', errors);
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
/** Throws if experiments not enabled. */
|
|
@@ -123,5 +123,5 @@ class Laika {
|
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
exports.
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
126
|
+
exports.LaikaTest = LaikaTest;
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFpa2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbGFpa2EudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0RBQStEO0FBQy9ELG9EQUE4RjtBQUc5Rjs7O0dBR0c7QUFDSCxNQUFhLFNBQVM7SUFJcEI7UUFIUSxXQUFNLEdBQTJCLElBQUksQ0FBQztRQUN0QyxtQkFBYyxHQUFZLEtBQUssQ0FBQztJQUVqQixDQUFDO0lBRXhCOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFtQjtRQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBRWpDLElBQUksQ0FBQztZQUNILGlEQUFpRDtZQUNqRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzdCLElBQUEseUJBQWEsRUFBQztvQkFDWixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07b0JBQ3JCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztvQkFDL0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO29CQUN6QixjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWM7b0JBQ3JDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztvQkFDbkIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO29CQUMzQixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7b0JBQ2pDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtvQkFDckIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO29CQUMzQixpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO2lCQUM1QyxDQUFDLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDakMsQ0FBQztZQUVELDREQUE0RDtZQUM1RCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2pDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxxQkFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7b0JBQ25ELE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztvQkFDdkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO29CQUN2QixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7b0JBQ2pDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtpQkFDMUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YscUNBQXFDO1lBQ3JDLElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM1QixJQUFBLG9CQUFRLEdBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0IsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ2IsVUFBa0IsRUFDbEIsT0FBMEI7UUFFMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU8sQ0FBQyxTQUFTLENBQUksVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FDdkIsZUFBdUIsRUFDdkIsT0FBaUM7UUFFakMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU8sQ0FBQyxtQkFBbUIsQ0FBSSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFFBQVE7UUFDWixNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUM7UUFFM0IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBQSxvQkFBUSxHQUFFLENBQUM7WUFDbkIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFjLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBYyxDQUFDLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0gsQ0FBQztJQUVELHlDQUF5QztJQUNqQyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FDYiwyREFBMkQsQ0FDNUQsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFySUQsOEJBcUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5pdExhaWthVGVzdCwgc2h1dGRvd24gfSBmcm9tICdAbGFpa2F0ZXN0L2F1dG8tb3RlbCc7XG5pbXBvcnQgeyBMYWlrYVRlc3QgYXMgTGFpa2FUZXN0Q2xpZW50LCBQcm9tcHQsIEdldFByb21wdE9wdGlvbnMgfSBmcm9tICdAbGFpa2F0ZXN0L2pzLWNsaWVudCc7XG5pbXBvcnQgeyBMYWlrYUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFVuaWZpZWQgTGFpa2FUZXN0IFNESyBmb3IgdHJhY2luZyBhbmQgZXhwZXJpbWVudHMuXG4gKiBQcm92aWRlcyBhIHNpbmdsZSBlbnRyeSBwb2ludCBmb3IgYm90aCBvYnNlcnZhYmlsaXR5IGFuZCBBL0IgdGVzdGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhaWthVGVzdCB7XG4gIHByaXZhdGUgY2xpZW50OiBMYWlrYVRlc3RDbGllbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0cmFjaW5nRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIExhaWthVGVzdCB3aXRoIHVuaWZpZWQgY29uZmlndXJhdGlvbi5cbiAgICogRW5hYmxlcyBib3RoIHRyYWNpbmcgYW5kIGV4cGVyaW1lbnRzIGJ5IGRlZmF1bHQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhcGlLZXkgb3Igc2VydmljZU5hbWUgaXMgbWlzc2luZy9pbnZhbGlkXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBPcGVuVGVsZW1ldHJ5IFNESyBmYWlscyB0byBzdGFydFxuICAgKi9cbiAgc3RhdGljIGluaXQoY29uZmlnOiBMYWlrYUNvbmZpZyk6IExhaWthVGVzdCB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTGFpa2FUZXN0KCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB0cmFjaW5nIChpZiBlbmFibGVkLCBkZWZhdWx0OiB0cnVlKVxuICAgICAgaWYgKGNvbmZpZy50cmFjaW5nICE9PSBmYWxzZSkge1xuICAgICAgICBpbml0TGFpa2FUZXN0KHtcbiAgICAgICAgICBhcGlLZXk6IGNvbmZpZy5hcGlLZXksXG4gICAgICAgICAgc2VydmljZU5hbWU6IGNvbmZpZy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgICBlbmRwb2ludDogY29uZmlnLmVuZHBvaW50LFxuICAgICAgICAgIGNhcHR1cmVDb250ZW50OiBjb25maWcuY2FwdHVyZUNvbnRlbnQsXG4gICAgICAgICAgZGVidWc6IGNvbmZpZy5kZWJ1ZyxcbiAgICAgICAgICBzZXNzaW9uSWQ6IGNvbmZpZy5zZXNzaW9uSWQsXG4gICAgICAgICAgZ2V0U2Vzc2lvbklkOiBjb25maWcuZ2V0U2Vzc2lvbklkLFxuICAgICAgICAgIHVzZXJJZDogY29uZmlnLnVzZXJJZCxcbiAgICAgICAgICBnZXRVc2VySWQ6IGNvbmZpZy5nZXRVc2VySWQsXG4gICAgICAgICAgZGVmYXVsdFByb3BlcnRpZXM6IGNvbmZpZy5kZWZhdWx0UHJvcGVydGllcyxcbiAgICAgICAgfSk7XG4gICAgICAgIGluc3RhbmNlLnRyYWNpbmdFbmFibGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSBleHBlcmltZW50cyBjbGllbnQgKGlmIGVuYWJsZWQsIGRlZmF1bHQ6IHRydWUpXG4gICAgICBpZiAoY29uZmlnLmV4cGVyaW1lbnRzICE9PSBmYWxzZSkge1xuICAgICAgICBpbnN0YW5jZS5jbGllbnQgPSBuZXcgTGFpa2FUZXN0Q2xpZW50KGNvbmZpZy5hcGlLZXksIHtcbiAgICAgICAgICBiYXNlVXJsOiBjb25maWcuYmFzZVVybCxcbiAgICAgICAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCxcbiAgICAgICAgICBjYWNoZUVuYWJsZWQ6IGNvbmZpZy5jYWNoZUVuYWJsZWQsXG4gICAgICAgICAgY2FjaGVUVEw6IGNvbmZpZy5jYWNoZVRUTCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ2xlYW51cCBhbnkgcGFydGlhbCBpbml0aWFsaXphdGlvblxuICAgICAgaWYgKGluc3RhbmNlLnRyYWNpbmdFbmFibGVkKSB7XG4gICAgICAgIHNodXRkb3duKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHByb21wdCBjb250ZW50IGJ5IG5hbWUuXG4gICAqIFJlcXVpcmVzIGV4cGVyaW1lbnRzIHRvIGJlIGVuYWJsZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBleHBlcmltZW50cyBhcmUgbm90IGVuYWJsZWRcbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBwcm9tcHQgbmFtZSBpcyBpbnZhbGlkXG4gICAqIEB0aHJvd3Mge0F1dGhlbnRpY2F0aW9uRXJyb3J9IElmIEFQSSBrZXkgaXMgaW52YWxpZFxuICAgKiBAdGhyb3dzIHtMYWlrYVNlcnZpY2VFcnJvcn0gSWYgQVBJIHJldHVybnMgYW4gZXJyb3JcbiAgICogQHRocm93cyB7TmV0d29ya0Vycm9yfSBJZiBuZXR3b3JrIHJlcXVlc3QgZmFpbHNcbiAgICovXG4gIGFzeW5jIGdldFByb21wdDxDID0gdW5rbm93bj4oXG4gICAgcHJvbXB0TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBHZXRQcm9tcHRPcHRpb25zXG4gICk6IFByb21pc2U8UHJvbXB0PEM+PiB7XG4gICAgdGhpcy5lbnN1cmVDbGllbnQoKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQhLmdldFByb21wdDxDPihwcm9tcHROYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZXhwZXJpbWVudCBwcm9tcHQgd2l0aCBhdXRvbWF0aWMgYnVja2V0aW5nLlxuICAgKiBSZXF1aXJlcyBleHBlcmltZW50cyB0byBiZSBlbmFibGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgZXhwZXJpbWVudHMgYXJlIG5vdCBlbmFibGVkXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgZXhwZXJpbWVudCB0aXRsZSBvciBjb250ZXh0IGlzIGludmFsaWRcbiAgICogQHRocm93cyB7QXV0aGVudGljYXRpb25FcnJvcn0gSWYgQVBJIGtleSBpcyBpbnZhbGlkXG4gICAqIEB0aHJvd3Mge0xhaWthU2VydmljZUVycm9yfSBJZiBBUEkgcmV0dXJucyBhbiBlcnJvclxuICAgKiBAdGhyb3dzIHtOZXR3b3JrRXJyb3J9IElmIG5ldHdvcmsgcmVxdWVzdCBmYWlsc1xuICAgKi9cbiAgYXN5bmMgZ2V0RXhwZXJpbWVudFByb21wdDxDID0gdW5rbm93bj4oXG4gICAgZXhwZXJpbWVudFRpdGxlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8UHJvbXB0PEM+PiB7XG4gICAgdGhpcy5lbnN1cmVDbGllbnQoKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQhLmdldEV4cGVyaW1lbnRQcm9tcHQ8Qz4oZXhwZXJpbWVudFRpdGxlLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgdHJhY2luZyBpcyBlbmFibGVkLiAqL1xuICBpc1RyYWNpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRyYWNpbmdFbmFibGVkO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdHJ1ZSBpZiBleHBlcmltZW50cyBjbGllbnQgaXMgZW5hYmxlZC4gKi9cbiAgaXNFeHBlcmltZW50c0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50ICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNodXRkb3duIGJvdGggdHJhY2luZyBhbmQgY2xpZW50IHJlc291cmNlcy5cbiAgICogQ2FsbCB0aGlzIGJlZm9yZSBwcm9jZXNzIGV4aXQgZm9yIGNsZWFuIHNodXRkb3duLlxuICAgKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXJyb3JzOiBFcnJvcltdID0gW107XG5cbiAgICBpZiAodGhpcy50cmFjaW5nRW5hYmxlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGVycm9yIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY2xpZW50LmRlc3Ryb3koKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGVycm9yIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tMYWlrYVRlc3RdIEVycm9ycyBkdXJpbmcgc2h1dGRvd246JywgZXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhyb3dzIGlmIGV4cGVyaW1lbnRzIG5vdCBlbmFibGVkLiAqL1xuICBwcml2YXRlIGVuc3VyZUNsaWVudCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdFeHBlcmltZW50cyBub3QgZW5hYmxlZC4gU2V0IGV4cGVyaW1lbnRzOiB0cnVlIGluIGNvbmZpZy4nXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|