@pipeline-builder/api-core 4.1.12 → 4.1.14
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 +3 -2
- package/lib/constants/index.d.ts +0 -1
- package/lib/constants/index.js +1 -2
- package/lib/errors/app-errors.d.ts +8 -3
- package/lib/errors/app-errors.js +10 -5
- package/lib/helpers/access-helpers.d.ts +4 -6
- package/lib/helpers/access-helpers.js +6 -8
- package/lib/helpers/index.d.ts +3 -3
- package/lib/helpers/index.js +4 -4
- package/lib/helpers/org-hierarchy-http.d.ts +11 -10
- package/lib/helpers/org-hierarchy-http.js +24 -35
- package/lib/helpers/org-hierarchy.d.ts +37 -3
- package/lib/helpers/org-hierarchy.js +45 -4
- package/lib/helpers/restore-helpers.d.ts +44 -24
- package/lib/helpers/restore-helpers.js +41 -52
- package/lib/helpers/sse-helpers.d.ts +29 -7
- package/lib/helpers/sse-helpers.js +36 -9
- package/lib/index.d.ts +16 -14
- package/lib/index.js +17 -15
- package/lib/middleware/assurance.d.ts +116 -0
- package/lib/middleware/assurance.js +176 -0
- package/lib/middleware/auth.d.ts +5 -427
- package/lib/middleware/auth.js +36 -789
- package/lib/middleware/ecosystem-guard.d.ts +47 -0
- package/lib/middleware/ecosystem-guard.js +60 -0
- package/lib/middleware/index.d.ts +11 -4
- package/lib/middleware/index.js +12 -5
- package/lib/middleware/jwt-verify.d.ts +52 -0
- package/lib/middleware/jwt-verify.js +105 -0
- package/lib/middleware/permission-gates.d.ts +133 -0
- package/lib/middleware/permission-gates.js +260 -0
- package/lib/middleware/revocation.d.ts +96 -0
- package/lib/middleware/revocation.js +162 -0
- package/lib/middleware/route-table.d.ts +11 -0
- package/lib/middleware/route-table.js +4 -1
- package/lib/middleware/service-tokens.d.ts +83 -0
- package/lib/middleware/service-tokens.js +158 -0
- package/lib/middleware/step-up.d.ts +2 -2
- package/lib/middleware/step-up.js +8 -7
- package/lib/middleware/system-org.d.ts +20 -0
- package/lib/middleware/system-org.js +25 -0
- package/lib/openapi/routes/plugin-routes.js +133 -10
- package/lib/openapi/schema-registry.js +2 -5
- package/lib/routes/index.d.ts +1 -1
- package/lib/routes/index.js +2 -2
- package/lib/services/api-key-exchange.js +7 -5
- package/lib/services/audit-spool.d.ts +34 -10
- package/lib/services/audit-spool.js +75 -34
- package/lib/services/cache-service.d.ts +7 -0
- package/lib/services/cache-service.js +1 -1
- package/lib/services/circuit-breaker.d.ts +14 -1
- package/lib/services/circuit-breaker.js +36 -10
- package/lib/services/compliance-client.d.ts +10 -2
- package/lib/services/compliance-client.js +17 -10
- package/lib/services/compliance-event-subscriber.js +6 -6
- package/lib/services/durable-event-bus.js +8 -11
- package/lib/services/ecosystem-notify-client.d.ts +32 -0
- package/lib/services/ecosystem-notify-client.js +71 -0
- package/lib/services/env-redis.d.ts +4 -1
- package/lib/services/env-redis.js +32 -3
- package/lib/services/http-client.d.ts +19 -0
- package/lib/services/http-client.js +98 -19
- package/lib/services/index.d.ts +25 -24
- package/lib/services/index.js +25 -22
- package/lib/services/jwks-cache.js +5 -4
- package/lib/services/leader-lock.d.ts +22 -5
- package/lib/services/leader-lock.js +61 -6
- package/lib/services/quota.d.ts +9 -4
- package/lib/services/quota.js +34 -40
- package/lib/services/remote-audit-client.d.ts +28 -32
- package/lib/services/remote-audit-client.js +166 -49
- package/lib/services/retry-forever.js +5 -11
- package/lib/services/retry-strategy.d.ts +1 -1
- package/lib/services/retry-strategy.js +5 -4
- package/lib/services/scheduler.d.ts +8 -3
- package/lib/services/scheduler.js +17 -5
- package/lib/services/service-boot.d.ts +14 -13
- package/lib/services/service-boot.js +18 -15
- package/lib/services/service-keys.d.ts +1 -1
- package/lib/services/service-keys.js +12 -18
- package/lib/services/sse-ticket-store.d.ts +9 -1
- package/lib/services/sse-ticket-store.js +24 -9
- package/lib/services/system-notification.d.ts +27 -0
- package/lib/services/system-notification.js +50 -0
- package/lib/services/token-revocation.d.ts +50 -1
- package/lib/services/token-revocation.js +103 -3
- package/lib/types/audit-events.d.ts +6 -6
- package/lib/types/audit-events.js +1 -1
- package/lib/types/common.d.ts +32 -13
- package/lib/types/common.js +2 -1
- package/lib/types/ecosystem-notifications.d.ts +142 -0
- package/lib/types/ecosystem-notifications.js +210 -0
- package/lib/types/ecosystem.d.ts +77 -0
- package/lib/types/ecosystem.js +119 -0
- package/lib/types/error-codes.d.ts +81 -0
- package/lib/types/error-codes.js +108 -1
- package/lib/types/feature-flags.d.ts +21 -1
- package/lib/types/feature-flags.js +36 -2
- package/lib/types/index.d.ts +14 -9
- package/lib/types/index.js +15 -10
- package/lib/types/permissions.d.ts +46 -8
- package/lib/types/permissions.js +75 -12
- package/lib/types/plugin-catalog.d.ts +35 -0
- package/lib/types/plugin-catalog.js +39 -0
- package/lib/types/plugin-health.d.ts +102 -0
- package/lib/types/plugin-health.js +184 -0
- package/lib/types/quota-tiers.d.ts +15 -0
- package/lib/types/quota-tiers.js +23 -3
- package/lib/types/wire-vocabulary.d.ts +102 -0
- package/lib/types/wire-vocabulary.js +94 -0
- package/lib/utils/alias-resolver.js +2 -2
- package/lib/utils/audit.d.ts +5 -2
- package/lib/utils/audit.js +6 -3
- package/lib/utils/compliance-attributes.js +3 -4
- package/lib/utils/concurrency.d.ts +7 -0
- package/lib/utils/concurrency.js +13 -1
- package/lib/utils/env.d.ts +3 -4
- package/lib/utils/env.js +4 -5
- package/lib/utils/identity.d.ts +13 -4
- package/lib/utils/identity.js +18 -10
- package/lib/utils/index.d.ts +13 -10
- package/lib/utils/index.js +13 -10
- package/lib/utils/jwk.d.ts +4 -0
- package/lib/utils/jwk.js +13 -1
- package/lib/utils/logger.d.ts +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/object.d.ts +11 -0
- package/lib/utils/object.js +24 -1
- package/lib/utils/params.d.ts +8 -22
- package/lib/utils/params.js +15 -43
- package/lib/utils/plugin-compliance.d.ts +98 -0
- package/lib/utils/plugin-compliance.js +78 -0
- package/lib/utils/proof-of-work.d.ts +69 -0
- package/lib/utils/proof-of-work.js +139 -0
- package/lib/utils/response.d.ts +16 -6
- package/lib/utils/response.js +18 -15
- package/lib/utils/retention.d.ts +17 -0
- package/lib/utils/retention.js +30 -0
- package/lib/utils/secret-encryption.d.ts +7 -7
- package/lib/utils/secret-encryption.js +9 -10
- package/lib/utils/secret-rotation.js +2 -2
- package/lib/utils/sensitive-patterns.js +4 -5
- package/lib/utils/service-registry.d.ts +15 -0
- package/lib/utils/service-registry.js +24 -0
- package/lib/utils/ssrf.d.ts +11 -2
- package/lib/utils/ssrf.js +112 -33
- package/lib/validation/ai-schemas.js +3 -2
- package/lib/validation/common-schemas.d.ts +0 -9
- package/lib/validation/common-schemas.js +1 -7
- package/lib/validation/dockerfile-static.d.ts +26 -0
- package/lib/validation/dockerfile-static.js +210 -0
- package/lib/validation/index.d.ts +13 -4
- package/lib/validation/index.js +14 -5
- package/lib/validation/message-schemas.js +6 -4
- package/lib/validation/pipeline-schemas.d.ts +8 -2
- package/lib/validation/pipeline-schemas.js +30 -4
- package/lib/validation/plugin-base-images.d.ts +20 -0
- package/lib/validation/plugin-base-images.js +17 -0
- package/lib/validation/plugin-catalog-detect.d.ts +86 -0
- package/lib/validation/plugin-catalog-detect.js +237 -0
- package/lib/validation/plugin-catalog-metadata.d.ts +141 -0
- package/lib/validation/plugin-catalog-metadata.js +162 -0
- package/lib/validation/plugin-heuristics.d.ts +41 -0
- package/lib/validation/plugin-heuristics.js +211 -0
- package/lib/validation/plugin-lint.d.ts +18 -0
- package/lib/validation/plugin-lint.js +136 -0
- package/lib/validation/plugin-name-confusable.d.ts +15 -0
- package/lib/validation/plugin-name-confusable.js +81 -0
- package/lib/validation/plugin-schemas.d.ts +40 -26
- package/lib/validation/plugin-schemas.js +26 -23
- package/lib/validation/plugin-spec-schema.d.ts +112 -0
- package/lib/validation/plugin-spec-schema.js +163 -0
- package/lib/validation/plugin-template-contract.d.ts +64 -0
- package/lib/validation/plugin-template-contract.js +113 -0
- package/package.json +69 -4
- package/lib/testing/mock-api-core.d.ts +0 -150
- package/lib/testing/mock-api-core.js +0 -246
- package/lib/testing/mock-drizzle.d.ts +0 -6
- package/lib/testing/mock-drizzle.js +0 -57
- package/lib/testing/route-coverage.d.ts +0 -64
- package/lib/testing/route-coverage.js +0 -183
- package/lib/testing/service-tokens.d.ts +0 -66
- package/lib/testing/service-tokens.js +0 -137
- package/lib/testing/tier-mock.d.ts +0 -44
- package/lib/testing/tier-mock.js +0 -65
- package/lib/testing/user-tokens.d.ts +0 -75
- package/lib/testing/user-tokens.js +0 -115
package/README.md
CHANGED
|
@@ -49,8 +49,9 @@ Provides the cross-cutting primitives every backend service depends on: JWT auth
|
|
|
49
49
|
| `CacheService`, `createCacheService` | In-memory LRU TTL cache with cross-replica invalidation over Redis pub/sub |
|
|
50
50
|
| `safeFetch`, `resolveSafeTarget`, `assertSafeUrl`, `isPrivateAddress` | SSRF guards for user/tenant-supplied URLs. **`safeFetch` is the one to use for an outbound request**: it resolves the host, PINS the vetted IP into the socket (no DNS-rebinding window between check and connect), refuses redirects, and caps body size and wall-clock time. `assertSafeUrl` is VALIDATION ONLY — for rejecting a URL at create/update time; never pair it with a `fetch` |
|
|
51
51
|
| `createWebhookChannel`, `createEmailChannel`, `createChannelRegistry`, `NotificationChannel`, `NotificationMessage`, `ChannelTarget`, `DeliveryResult` | Shared notification-channel contract plus the webhook (SSRF-safe, HMAC-signing) and email transports. Services supply only their own `in-app` transport |
|
|
52
|
-
| `wireServiceSecurity` | One call for every stateless service's boot security: the `authz.denied` audit sink, the token-revocation reader (overridable), and the access-key-exchange service name |
|
|
53
|
-
| `
|
|
52
|
+
| `wireServiceSecurity(serviceName, opts?)` | One call for every stateless service's boot security: binds the service identity for `recordAudit`, the `authz.denied` audit sink, the token-revocation reader (overridable), and the access-key-exchange service name |
|
|
53
|
+
| `recordAudit(event)` | The ONE emitter for the durable, hash-chained central audit trail (platform `POST /audit/events`), attributed to the service bound by `wireServiceSecurity`. Fire-and-forget; throws "audit not initialised" only if called before binding. Tests bind with `bindTestAuditService` (`/testing`) or pass `apiCoreMock({ recordAudit: spy })` |
|
|
54
|
+
| `logAuditEvent(logger, event)` | The short-retention operator sink: an audit event as a structured winston → Loki log line (`eventCategory: 'audit'`) |
|
|
54
55
|
| `getRetryDecision`, `getErrorRetryDecision`, `RetryConfig` | The single retry/backoff decision function (Retry-After aware, jittered) and the single `RetryConfig`. pipeline-data's `ConnectionRetryStrategy` is built on it |
|
|
55
56
|
| `createOrgIdCaster` | Builds the Mongo org-id cast (24-hex → ObjectId, anything else through) from a supplied `Types.ObjectId`, so platform and quota share one implementation without api-core depending on mongoose |
|
|
56
57
|
| `entityEvents` | Process-local domain event pub/sub for entity changes |
|
package/lib/constants/index.d.ts
CHANGED
package/lib/constants/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
export * from './http-status.js';
|
|
4
3
|
export * from './ai-providers.js';
|
|
5
4
|
export * from './time.js';
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RhbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgKiBmcm9tICcuL2FpLXByb3ZpZGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3RpbWUuanMnO1xuIl19
|
|
@@ -6,7 +6,11 @@ import { ErrorCode } from '../types/error-codes.js';
|
|
|
6
6
|
export declare class AppError extends Error {
|
|
7
7
|
readonly statusCode: number;
|
|
8
8
|
readonly code: ErrorCode;
|
|
9
|
-
|
|
9
|
+
/** Structured context sent with the error response (e.g. the failing gates). */
|
|
10
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
11
|
+
constructor(statusCode: number, code: ErrorCode, message: string,
|
|
12
|
+
/** Structured context sent with the error response (e.g. the failing gates). */
|
|
13
|
+
details?: Record<string, unknown> | undefined);
|
|
10
14
|
}
|
|
11
15
|
/** 404 — Resource not found. */
|
|
12
16
|
export declare class NotFoundError extends AppError {
|
|
@@ -20,7 +24,8 @@ export declare class ForbiddenError extends AppError {
|
|
|
20
24
|
export declare class ValidationError extends AppError {
|
|
21
25
|
constructor(message: string);
|
|
22
26
|
}
|
|
23
|
-
/** 409 — Conflict / duplicate.
|
|
27
|
+
/** 409 — Conflict / duplicate. `code` narrows the conflict for clients
|
|
28
|
+
* (e.g. `PLUGIN_VERSION_FROZEN`); it must be a 409-mapped code. */
|
|
24
29
|
export declare class ConflictError extends AppError {
|
|
25
|
-
constructor(message: string);
|
|
30
|
+
constructor(message: string, code?: ErrorCode);
|
|
26
31
|
}
|
package/lib/errors/app-errors.js
CHANGED
|
@@ -8,10 +8,14 @@ import { ErrorCode, getStatusForErrorCode } from '../types/error-codes.js';
|
|
|
8
8
|
export class AppError extends Error {
|
|
9
9
|
statusCode;
|
|
10
10
|
code;
|
|
11
|
-
|
|
11
|
+
details;
|
|
12
|
+
constructor(statusCode, code, message,
|
|
13
|
+
/** Structured context sent with the error response (e.g. the failing gates). */
|
|
14
|
+
details) {
|
|
12
15
|
super(message);
|
|
13
16
|
this.statusCode = statusCode;
|
|
14
17
|
this.code = code;
|
|
18
|
+
this.details = details;
|
|
15
19
|
this.name = 'AppError';
|
|
16
20
|
}
|
|
17
21
|
}
|
|
@@ -36,11 +40,12 @@ export class ValidationError extends AppError {
|
|
|
36
40
|
this.name = 'ValidationError';
|
|
37
41
|
}
|
|
38
42
|
}
|
|
39
|
-
/** 409 — Conflict / duplicate.
|
|
43
|
+
/** 409 — Conflict / duplicate. `code` narrows the conflict for clients
|
|
44
|
+
* (e.g. `PLUGIN_VERSION_FROZEN`); it must be a 409-mapped code. */
|
|
40
45
|
export class ConflictError extends AppError {
|
|
41
|
-
constructor(message) {
|
|
42
|
-
super(getStatusForErrorCode(ErrorCode.CONFLICT),
|
|
46
|
+
constructor(message, code = ErrorCode.CONFLICT) {
|
|
47
|
+
super(getStatusForErrorCode(ErrorCode.CONFLICT), code, message);
|
|
43
48
|
this.name = 'ConflictError';
|
|
44
49
|
}
|
|
45
50
|
}
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMvYXBwLWVycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sUUFBUyxTQUFRLEtBQUs7SUFFZixVQUFVO0lBQ1YsSUFBSTtJQUdKLE9BQU87SUFMekIsWUFDa0IsVUFBa0IsRUFDbEIsSUFBZSxFQUMvQixPQUFlO0lBQ2YsZ0ZBQWdGO0lBQ2hFLE9BQWlDO1FBRWpELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzswQkFOQyxVQUFVO29CQUNWLElBQUk7dUJBR0osT0FBTztRQUd2QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFFRCxnQ0FBZ0M7QUFDaEMsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBQ3pDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBRUQsc0NBQXNDO0FBQ3RDLE1BQU0sT0FBTyxjQUFlLFNBQVEsUUFBUTtJQUMxQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RyxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELHNDQUFzQztBQUN0QyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxRQUFRO0lBQzNDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQ7b0VBQ29FO0FBQ3BFLE1BQU0sT0FBTyxhQUFjLFNBQVEsUUFBUTtJQUN6QyxZQUFZLE9BQWUsRUFBRSxJQUFJLEdBQWMsU0FBUyxDQUFDLFFBQVE7UUFDL0QsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgZ2V0U3RhdHVzRm9yRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMuanMnO1xuXG4vKipcbiAqIEJhc2UgYXBwbGljYXRpb24gZXJyb3Igd2l0aCBIVFRQIHN0YXR1cyBjb2RlIGFuZCBlcnJvciBjb2RlLlxuICogRXh0ZW5kIHRoaXMgZm9yIGRvbWFpbi1zcGVjaWZpYyBlcnJvciB0eXBlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIHB1YmxpYyByZWFkb25seSBjb2RlOiBFcnJvckNvZGUsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIC8qKiBTdHJ1Y3R1cmVkIGNvbnRleHQgc2VudCB3aXRoIHRoZSBlcnJvciByZXNwb25zZSAoZS5nLiB0aGUgZmFpbGluZyBnYXRlcykuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0FwcEVycm9yJztcbiAgfVxufVxuXG4vKiogNDA0IOKAlCBSZXNvdXJjZSBub3QgZm91bmQuICovXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIEFwcEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKEVycm9yQ29kZS5OT1RfRk9VTkQpLCBFcnJvckNvZGUuTk9UX0ZPVU5ELCBtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnTm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuLyoqIDQwMyDigJQgSW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLiAqL1xuZXhwb3J0IGNsYXNzIEZvcmJpZGRlbkVycm9yIGV4dGVuZHMgQXBwRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihnZXRTdGF0dXNGb3JFcnJvckNvZGUoRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyksIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsIG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdGb3JiaWRkZW5FcnJvcic7XG4gIH1cbn1cblxuLyoqIDQwMCDigJQgVmFsaWRhdGlvbiAvIGJhZCByZXF1ZXN0LiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25FcnJvciBleHRlbmRzIEFwcEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SKSwgRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1IsIG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdWYWxpZGF0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKiA0MDkg4oCUIENvbmZsaWN0IC8gZHVwbGljYXRlLiBgY29kZWAgbmFycm93cyB0aGUgY29uZmxpY3QgZm9yIGNsaWVudHNcbiAqICAoZS5nLiBgUExVR0lOX1ZFUlNJT05fRlJPWkVOYCk7IGl0IG11c3QgYmUgYSA0MDktbWFwcGVkIGNvZGUuICovXG5leHBvcnQgY2xhc3MgQ29uZmxpY3RFcnJvciBleHRlbmRzIEFwcEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBjb2RlOiBFcnJvckNvZGUgPSBFcnJvckNvZGUuQ09ORkxJQ1QpIHtcbiAgICBzdXBlcihnZXRTdGF0dXNGb3JFcnJvckNvZGUoRXJyb3JDb2RlLkNPTkZMSUNUKSwgY29kZSwgbWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZsaWN0RXJyb3InO1xuICB9XG59XG4iXX0=
|
|
@@ -40,11 +40,9 @@ export type VisibilityWriteVerdict = 'ok' | 'needs-publish' | 'not-author';
|
|
|
40
40
|
/**
|
|
41
41
|
* The visibility write rule as a PREDICATE, with no response side-effect.
|
|
42
42
|
*
|
|
43
|
-
* Extracted so BULK routes
|
|
44
|
-
* re-deriving it
|
|
45
|
-
*
|
|
46
|
-
* this function happily allows an `org` write with plain `:write` — so a bulk
|
|
47
|
-
* delete/update 403'd the default case that single-row delete/update allowed.
|
|
43
|
+
* Extracted so BULK routes apply the identical rule per row instead of
|
|
44
|
+
* re-deriving it — a bulk rule that disagreed would 403 cases single-row
|
|
45
|
+
* delete/update allow (an `org` row with plain `:write`, the default rung).
|
|
48
46
|
*
|
|
49
47
|
* - `private` → author only
|
|
50
48
|
* - `org` → any member of the org
|
|
@@ -72,7 +70,7 @@ export declare function checkVisibilityWriteAccess(req: Request, resource: Visib
|
|
|
72
70
|
* rather than a second code path.
|
|
73
71
|
*
|
|
74
72
|
* Permission-based (not coarse-role-based): a bespoke custom Role can be granted
|
|
75
|
-
* publish rights
|
|
73
|
+
* publish rights regardless of its `member` label. Built-in
|
|
76
74
|
* Admin/Owner bundles carry the publish permissions; the built-in Member bundle
|
|
77
75
|
* does not, so members top out at `org`.
|
|
78
76
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { isSystemAdmin, userHasPermission } from '../middleware/
|
|
3
|
+
import { isSystemAdmin, userHasPermission } from '../middleware/permission-gates.js';
|
|
4
4
|
import { ErrorCode } from '../types/error-codes.js';
|
|
5
5
|
import { sendError } from '../utils/response.js';
|
|
6
6
|
/**
|
|
@@ -41,11 +41,9 @@ export function requireVisibilityWriteAccess(req, res, resource, userId, publish
|
|
|
41
41
|
/**
|
|
42
42
|
* The visibility write rule as a PREDICATE, with no response side-effect.
|
|
43
43
|
*
|
|
44
|
-
* Extracted so BULK routes
|
|
45
|
-
* re-deriving it
|
|
46
|
-
*
|
|
47
|
-
* this function happily allows an `org` write with plain `:write` — so a bulk
|
|
48
|
-
* delete/update 403'd the default case that single-row delete/update allowed.
|
|
44
|
+
* Extracted so BULK routes apply the identical rule per row instead of
|
|
45
|
+
* re-deriving it — a bulk rule that disagreed would 403 cases single-row
|
|
46
|
+
* delete/update allow (an `org` row with plain `:write`, the default rung).
|
|
49
47
|
*
|
|
50
48
|
* - `private` → author only
|
|
51
49
|
* - `org` → any member of the org
|
|
@@ -85,7 +83,7 @@ export function checkVisibilityWriteAccess(req, resource, userId, publishPermiss
|
|
|
85
83
|
* rather than a second code path.
|
|
86
84
|
*
|
|
87
85
|
* Permission-based (not coarse-role-based): a bespoke custom Role can be granted
|
|
88
|
-
* publish rights
|
|
86
|
+
* publish rights regardless of its `member` label. Built-in
|
|
89
87
|
* Admin/Owner bundles carry the publish permissions; the built-in Member bundle
|
|
90
88
|
* does not, so members top out at `org`.
|
|
91
89
|
*/
|
|
@@ -99,4 +97,4 @@ export function resolveVisibility(req, requested, publishPermission, fallback =
|
|
|
99
97
|
return 'private';
|
|
100
98
|
return fallback;
|
|
101
99
|
}
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9hY2Nlc3MtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBR3RDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBVWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUMxQyxHQUFZLEVBQ1osR0FBYSxFQUNiLFFBQStCLEVBQy9CLE1BQWMsRUFDZCxpQkFBNkI7SUFFN0IsTUFBTSxPQUFPLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyRixJQUFJLE9BQU8sS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbEMsU0FBUyxDQUNQLEdBQUcsRUFDSCxHQUFHLEVBQ0gsT0FBTyxLQUFLLGVBQWU7UUFDekIsQ0FBQyxDQUFDLHFEQUFxRDtRQUN2RCxDQUFDLENBQUMsZ0RBQWdELEVBQ3BELFNBQVMsQ0FBQyx3QkFBd0IsQ0FDbkMsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUtEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLEdBQVksRUFDWixRQUErQixFQUMvQixNQUFjLEVBQ2QsaUJBQTZCO0lBRTdCLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXBDLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ25GLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsMkRBQTJEO0lBQzNELElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDcEYsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLEdBQVksRUFDWixTQUE2QixFQUM3QixpQkFBNkIsRUFDN0IsUUFBUSxHQUFlLFNBQVM7SUFFaEMsSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDM0IsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEUsQ0FBQztJQUNELElBQUksU0FBUyxLQUFLLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0QyxJQUFJLFNBQVMsS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUMsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBpc1N5c3RlbUFkbWluLCB1c2VySGFzUGVybWlzc2lvbiB9IGZyb20gJy4uL21pZGRsZXdhcmUvcGVybWlzc2lvbi1nYXRlcy5qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb24gfSBmcm9tICcuLi90eXBlcy9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFZpc2liaWxpdHkgfSBmcm9tICcuLi90eXBlcy92aXNpYmlsaXR5LmpzJztcbmltcG9ydCB7IHNlbmRFcnJvciB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuLyoqIFRoZSBzbGljZSBvZiBhIGNhdGFsb2cgZW50aXR5IHRoZSB3cml0ZSBnYXRlIG5lZWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXNpYmlsaXR5V3JpdGVUYXJnZXQge1xuICAvKiogUnVuZyB0aGUgcm93IGN1cnJlbnRseSBzaXRzIGF0IOKAlCBzZWUge0BsaW5rIFZpc2liaWxpdHl9LiAqL1xuICB2aXNpYmlsaXR5Pzogc3RyaW5nO1xuICAvKiogQXV0aG9yLiBUaGUgb25seSBub24tYWRtaW4gd2hvIG1heSB0b3VjaCBhIGBwcml2YXRlYCByb3cuICovXG4gIGNyZWF0ZWRCeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBjYWxsZXIgbWF5IG1vZGlmeSBhIGNhdGFsb2cgZW50aXR5LCBwZXIgaXRzIHZpc2liaWxpdHkgcnVuZy5cbiAqIFRoZSBzaW5nbGUgd3JpdGUgZ2F0ZSBiZWhpbmQgZXZlcnkgcGlwZWxpbmUgLyBwbHVnaW4gLyB0ZW1wbGF0ZSBtdXRhdGlvbi5cbiAqXG4gKiAtIGBwdWJsaWNgIOKAlCBhIHN5c3RlbSBhZG1pbiwgb3IgdGhlIGhvbGRlciBvZiBgcHVibGlzaFBlcm1pc3Npb25gICh0aGUgc2FtZVxuICogICBwZXJtaXNzaW9uIHRoYXQgbGV0IHRoZW0gcHVibGlzaCBpdCBpbiB0aGUgZmlyc3QgcGxhY2UsIHNvIHdob2V2ZXIgY2FuXG4gKiAgIHB1Ymxpc2ggY2FuIGFsc28gbWFuYWdlIHdoYXQgdGhleSBwdWJsaXNoZWQpXG4gKiAtIGBvcmdgIOKAlCBhbnlvbmUgd2hvIGdvdCB0aGlzIGZhcjogdGhlIHJlc291cmNlJ3MgYDp3cml0ZWAgcGVybWlzc2lvbiBwbHVzIHRoZVxuICogICBvcmcgc2NvcGluZyB0aGUgY2FsbGVyIGFscmVhZHkgcGFzc2VkIElTIHRoZSBnYXRlXG4gKiAtIGBwcml2YXRlYCDigJQgdGhlIEFVVEhPUiBhbG9uZSAocGx1cyBzeXN0ZW0gYWRtaW5zKVxuICpcbiAqIFRoZSBgcHJpdmF0ZWAgYnJhbmNoIGlzIGxvYWQtYmVhcmluZyBvbiB0aGUgVE9NQlNUT05FIHBhdGhzIChyZXN0b3JlIC8gcHVyZ2UpLFxuICogd2hpY2ggYXJlIG9yZy1zY29wZWQgcmF0aGVyIHRoYW4gdmlzaWJpbGl0eS1zY29wZWQgYmVjYXVzZSBzb2Z0LWRlbGV0ZSBpcyBvbmVcbiAqIHNoYXJlZCBjb2RlIHBhdGgg4oCUIHdpdGhvdXQgaXQsIGFueSBvcmcgbWVtYmVyIGNvdWxkIHJlc3VycmVjdCBzb21lb25lIGVsc2Unc1xuICogcGVyc29uYWwgZHJhZnQuIE9uIHRoZSBsaXZlIHBhdGhzIHRoZSByZWFkIHByZWRpY2F0ZSBoYXMgYWxyZWFkeSBoaWRkZW4gdGhlXG4gKiByb3csIG1ha2luZyB0aGlzIGRlZmVuc2UgaW4gZGVwdGguXG4gKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJlcXVlc3QgbWF5IHByb2NlZWQ7IHJldHVybnMgYGZhbHNlYCBoYXZpbmcgQUxSRUFEWSBzZW50XG4gKiBhIDQwMy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKCFyZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzKHJlcSwgcmVzLCBwaXBlbGluZSwgdXNlcklkLCAncGlwZWxpbmVzOnB1Ymxpc2gnKSkgcmV0dXJuO1xuICogYXdhaXQgcGlwZWxpbmVTZXJ2aWNlLmRlbGV0ZShpZCwgb3JnSWQsIHVzZXJJZCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgcmVzb3VyY2U6IFZpc2liaWxpdHlXcml0ZVRhcmdldCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHB1Ymxpc2hQZXJtaXNzaW9uOiBQZXJtaXNzaW9uLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZlcmRpY3QgPSBjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2VzcyhyZXEsIHJlc291cmNlLCB1c2VySWQsIHB1Ymxpc2hQZXJtaXNzaW9uKTtcbiAgaWYgKHZlcmRpY3QgPT09ICdvaycpIHJldHVybiB0cnVlO1xuICBzZW5kRXJyb3IoXG4gICAgcmVzLFxuICAgIDQwMyxcbiAgICB2ZXJkaWN0ID09PSAnbmVlZHMtcHVibGlzaCdcbiAgICAgID8gJ1lvdSBsYWNrIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoaXMgcHVibGljIHJlc291cmNlLidcbiAgICAgIDogJ09ubHkgdGhlIGF1dGhvciBjYW4gbW9kaWZ5IGEgcHJpdmF0ZSByZXNvdXJjZS4nLFxuICAgIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsXG4gICk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIFdoeSBhIHdyaXRlIHdhcyByZWZ1c2VkLCBvciBgJ29rJ2AuIFNlZSB7QGxpbmsgY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3N9LiAqL1xuZXhwb3J0IHR5cGUgVmlzaWJpbGl0eVdyaXRlVmVyZGljdCA9ICdvaycgfCAnbmVlZHMtcHVibGlzaCcgfCAnbm90LWF1dGhvcic7XG5cbi8qKlxuICogVGhlIHZpc2liaWxpdHkgd3JpdGUgcnVsZSBhcyBhIFBSRURJQ0FURSwgd2l0aCBubyByZXNwb25zZSBzaWRlLWVmZmVjdC5cbiAqXG4gKiBFeHRyYWN0ZWQgc28gQlVMSyByb3V0ZXMgYXBwbHkgdGhlIGlkZW50aWNhbCBydWxlIHBlciByb3cgaW5zdGVhZCBvZlxuICogcmUtZGVyaXZpbmcgaXQg4oCUIGEgYnVsayBydWxlIHRoYXQgZGlzYWdyZWVkIHdvdWxkIDQwMyBjYXNlcyBzaW5nbGUtcm93XG4gKiBkZWxldGUvdXBkYXRlIGFsbG93IChhbiBgb3JnYCByb3cgd2l0aCBwbGFpbiBgOndyaXRlYCwgdGhlIGRlZmF1bHQgcnVuZykuXG4gKlxuICogICAtIGBwcml2YXRlYCDihpIgYXV0aG9yIG9ubHlcbiAqICAgLSBgb3JnYCAgICAg4oaSIGFueSBtZW1iZXIgb2YgdGhlIG9yZ1xuICogICAtIGBwdWJsaWNgICDihpIgcmVxdWlyZXMgYHB1Ymxpc2hQZXJtaXNzaW9uYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3MoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzb3VyY2U6IFZpc2liaWxpdHlXcml0ZVRhcmdldCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHB1Ymxpc2hQZXJtaXNzaW9uOiBQZXJtaXNzaW9uLFxuKTogVmlzaWJpbGl0eVdyaXRlVmVyZGljdCB7XG4gIGlmIChpc1N5c3RlbUFkbWluKHJlcSkpIHJldHVybiAnb2snO1xuXG4gIGlmIChyZXNvdXJjZS52aXNpYmlsaXR5ID09PSAncHVibGljJyAmJiAhdXNlckhhc1Blcm1pc3Npb24ocmVxLCBwdWJsaXNoUGVybWlzc2lvbikpIHtcbiAgICByZXR1cm4gJ25lZWRzLXB1Ymxpc2gnO1xuICB9XG5cbiAgLy8gRmFpbCBjbG9zZWQgb24gYW4gYW5vbnltb3VzL2Fic2VudCBjYWxsZXIg4oCUIGFuIGVtcHR5IHVzZXJJZCBtdXN0IG5ldmVyIG1hdGNoXG4gIC8vIGFuIGVtcHR5IGBjcmVhdGVkQnlgIGFuZCBoYW5kIG92ZXIgc29tZW9uZSBlbHNlJ3MgZHJhZnQuXG4gIGlmIChyZXNvdXJjZS52aXNpYmlsaXR5ID09PSAncHJpdmF0ZScgJiYgKCF1c2VySWQgfHwgcmVzb3VyY2UuY3JlYXRlZEJ5ICE9PSB1c2VySWQpKSB7XG4gICAgcmV0dXJuICdub3QtYXV0aG9yJztcbiAgfVxuXG4gIHJldHVybiAnb2snO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSB2aXNpYmlsaXR5IGZvciBhbiBlbnRpdHkgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkLlxuICpcbiAqIGBwdWJsaWNgIHJlcXVpcmVzIHRoZSBwdWJsaXNoIGNhcGFiaWxpdHkgKHN1cGVyYWRtaW5zIHBhc3MgdmlhIGltcGxpY2l0LWFsbCk7XG4gKiBhIGNhbGxlciB3aG8gYXNrcyBmb3IgaXQgd2l0aG91dCB0aGUgcGVybWlzc2lvbiBpcyBjbGFtcGVkIHRvIGBvcmdgIHJhdGhlclxuICogdGhhbiBkcm9wcGVkIHRvIGEgcGVyc29uYWwgZHJhZnQg4oCUIHRoZXkgYXNrZWQgdG8gU0hBUkUgaXQsIGFuZCBgb3JnYCBpcyB0aGVcbiAqIHdpZGVzdCBydW5nIHRoZXkgYXJlIGVudGl0bGVkIHRvLiBBbnl0aGluZyBlbHNlIHBhc3NlcyB0aHJvdWdoLlxuICpcbiAqIGBmYWxsYmFja2AgaXMgdGhlIHJ1bmcgYW4gVU5TUEVDSUZJRUQgdmlzaWJpbGl0eSBsYW5kcyBvbiwgYW5kIGl0IGlzXG4gKiBkZWxpYmVyYXRlbHkgcGVyLWVudGl0eSBldmVuIHRob3VnaCB0aGUgbGFkZGVyIGl0c2VsZiBpcyBpZGVudGljYWwgZXZlcnl3aGVyZTpcbiAqXG4gKiAtICoqdGVtcGxhdGVzKiogZGVmYXVsdCB0byBgcHJpdmF0ZWAg4oCUIGRyYWZ0LWZpcnN0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGVcbiAqICAgcGVyc29uYWwgcnVuZzsgeW91IHBvbGlzaCBhIHN0YXJ0ZXIgYmVmb3JlIHB1Ymxpc2hpbmcgaXQuXG4gKiAtICoqcGlwZWxpbmVzIC8gcGx1Z2lucyoqIGRlZmF1bHQgdG8gYG9yZ2Ag4oCUIHRoZXkgYXJlIHRlYW0gYXNzZXRzIHRoYXQgZGVwbG95XG4gKiAgIHNoYXJlZCBpbmZyYXN0cnVjdHVyZSwgc28gY3JlYXRpbmcgb25lIG11c3Qgbm90IGhpZGUgaXQgZnJvbSB0aGUgdGVhbS4gQVxuICogICBwZXJzb25hbCBkcmFmdCBzdGF5cyBhdmFpbGFibGUsIGJ1dCBvcHQtaW4uXG4gKlxuICogU2FtZSBsYWRkZXIsIHNhbWUgZ2F0ZSwgZGlmZmVyZW50IGNlbnRyZSBvZiBncmF2aXR5IOKAlCBleHByZXNzZWQgYXMgYW4gYXJndW1lbnRcbiAqIHJhdGhlciB0aGFuIGEgc2Vjb25kIGNvZGUgcGF0aC5cbiAqXG4gKiBQZXJtaXNzaW9uLWJhc2VkIChub3QgY29hcnNlLXJvbGUtYmFzZWQpOiBhIGJlc3Bva2UgY3VzdG9tIFJvbGUgY2FuIGJlIGdyYW50ZWRcbiAqIHB1Ymxpc2ggcmlnaHRzIHJlZ2FyZGxlc3Mgb2YgaXRzIGBtZW1iZXJgIGxhYmVsLiBCdWlsdC1pblxuICogQWRtaW4vT3duZXIgYnVuZGxlcyBjYXJyeSB0aGUgcHVibGlzaCBwZXJtaXNzaW9uczsgdGhlIGJ1aWx0LWluIE1lbWJlciBidW5kbGVcbiAqIGRvZXMgbm90LCBzbyBtZW1iZXJzIHRvcCBvdXQgYXQgYG9yZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVmlzaWJpbGl0eShcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcHVibGlzaFBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4gIGZhbGxiYWNrOiBWaXNpYmlsaXR5ID0gJ3ByaXZhdGUnLFxuKTogVmlzaWJpbGl0eSB7XG4gIGlmIChyZXF1ZXN0ZWQgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuIHVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgcHVibGlzaFBlcm1pc3Npb24pID8gJ3B1YmxpYycgOiAnb3JnJztcbiAgfVxuICBpZiAocmVxdWVzdGVkID09PSAnb3JnJykgcmV0dXJuICdvcmcnO1xuICBpZiAocmVxdWVzdGVkID09PSAncHJpdmF0ZScpIHJldHVybiAncHJpdmF0ZSc7XG4gIHJldHVybiBmYWxsYmFjaztcbn1cbiJdfQ==
|
package/lib/helpers/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './crud-helpers.js';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export { requireVisibilityWriteAccess, checkVisibilityWriteAccess, resolveVisibility, } from './access-helpers.js';
|
|
3
|
+
export { loadAndRestore, loadAndPurge, type RestorableService, type PurgeableService, type TombstoneAuthorizer, type TombstoneRouteOptions, } from './restore-helpers.js';
|
|
4
4
|
export * from './sse-helpers.js';
|
|
5
5
|
export * from './org-hierarchy.js';
|
|
6
|
-
export
|
|
6
|
+
export { fetchParentOrgId, fetchOrgDescendants, fetchOrgNames, fetchOrgMembership, } from './org-hierarchy-http.js';
|
package/lib/helpers/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
export * from './crud-helpers.js';
|
|
4
|
-
export
|
|
5
|
-
export
|
|
4
|
+
export { requireVisibilityWriteAccess, checkVisibilityWriteAccess, resolveVisibility, } from './access-helpers.js';
|
|
5
|
+
export { loadAndRestore, loadAndPurge, } from './restore-helpers.js';
|
|
6
6
|
export * from './sse-helpers.js';
|
|
7
7
|
export * from './org-hierarchy.js';
|
|
8
|
-
export
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
export { fetchParentOrgId, fetchOrgDescendants, fetchOrgNames, fetchOrgMembership, } from './org-hierarchy-http.js';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsT0FBTyxFQUNMLDRCQUE0QixFQUM1QiwwQkFBMEIsRUFDMUIsaUJBQWlCLEdBQ2xCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGNBQWMsRUFDZCxZQUFZLEdBS2IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLGtCQUFrQixHQUNuQixNQUFNLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vY3J1ZC1oZWxwZXJzLmpzJztcbmV4cG9ydCB7XG4gIHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MsXG4gIGNoZWNrVmlzaWJpbGl0eVdyaXRlQWNjZXNzLFxuICByZXNvbHZlVmlzaWJpbGl0eSxcbn0gZnJvbSAnLi9hY2Nlc3MtaGVscGVycy5qcyc7XG5leHBvcnQge1xuICBsb2FkQW5kUmVzdG9yZSxcbiAgbG9hZEFuZFB1cmdlLFxuICB0eXBlIFJlc3RvcmFibGVTZXJ2aWNlLFxuICB0eXBlIFB1cmdlYWJsZVNlcnZpY2UsXG4gIHR5cGUgVG9tYnN0b25lQXV0aG9yaXplcixcbiAgdHlwZSBUb21ic3RvbmVSb3V0ZU9wdGlvbnMsXG59IGZyb20gJy4vcmVzdG9yZS1oZWxwZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc3NlLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcmctaGllcmFyY2h5LmpzJztcbmV4cG9ydCB7XG4gIGZldGNoUGFyZW50T3JnSWQsXG4gIGZldGNoT3JnRGVzY2VuZGFudHMsXG4gIGZldGNoT3JnTmFtZXMsXG4gIGZldGNoT3JnTWVtYmVyc2hpcCxcbn0gZnJvbSAnLi9vcmctaGllcmFyY2h5LWh0dHAuanMnO1xuIl19
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { ServiceConfig } from '../types/common.js';
|
|
2
2
|
/** Options shared by the platform org-hierarchy HTTP lookups. */
|
|
3
3
|
export interface OrgHierarchyHttpOptions {
|
|
4
|
-
/** Platform service host/port (+ optional default timeout)
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
/** Platform service host/port (+ optional default timeout). Defaults to the
|
|
5
|
+
* registry's platform endpoint. */
|
|
6
|
+
service?: ServiceConfig;
|
|
7
|
+
/** Service name minted into the service-auth JWT `sub`. Defaults to this
|
|
8
|
+
* process's own identity (`SERVICE_NAME`). */
|
|
9
|
+
serviceName?: string;
|
|
8
10
|
/**
|
|
9
11
|
* Org id embedded in the signed service token's org context. Defaults to the
|
|
10
12
|
* queried `orgId`; pass a system org id for a system-scoped lookup.
|
|
@@ -33,7 +35,7 @@ export interface OrgHierarchyHttpOptions {
|
|
|
33
35
|
* `throwOnHttpError` is set. Always throws on a transport failure
|
|
34
36
|
* (connection/timeout) so the caller can apply its own fallback.
|
|
35
37
|
*/
|
|
36
|
-
export declare function fetchParentOrgId(orgId: string, opts
|
|
38
|
+
export declare function fetchParentOrgId(orgId: string, opts?: OrgHierarchyHttpOptions): Promise<string | undefined>;
|
|
37
39
|
/**
|
|
38
40
|
* Resolve `[self, ...descendantOrgIds]` for an org via platform's
|
|
39
41
|
* `GET /organization/:id/descendants`. Returns the id list only when it is
|
|
@@ -46,7 +48,7 @@ export declare function fetchParentOrgId(orgId: string, opts: OrgHierarchyHttpOp
|
|
|
46
48
|
* a malformed payload can never smuggle a non-string into the returned
|
|
47
49
|
* `string[]`.
|
|
48
50
|
*/
|
|
49
|
-
export declare function fetchOrgDescendants(orgId: string, opts
|
|
51
|
+
export declare function fetchOrgDescendants(orgId: string, opts?: OrgHierarchyHttpOptions): Promise<string[] | undefined>;
|
|
50
52
|
/**
|
|
51
53
|
* Batch-resolve org id → display NAME via platform's `POST /organization/names`.
|
|
52
54
|
* Returns a lowercased `{ [orgId]: name }` map — ids the platform doesn't know
|
|
@@ -59,7 +61,7 @@ export declare function fetchOrgDescendants(orgId: string, opts: OrgHierarchyHtt
|
|
|
59
61
|
* response is validated entry-by-entry (only string→string pairs survive), so a
|
|
60
62
|
* malformed payload can't smuggle a non-string into the returned map.
|
|
61
63
|
*/
|
|
62
|
-
export declare function fetchOrgNames(orgIds: string[], opts
|
|
64
|
+
export declare function fetchOrgNames(orgIds: string[], opts?: OrgHierarchyHttpOptions): Promise<Record<string, string>>;
|
|
63
65
|
/**
|
|
64
66
|
* Check whether `userId` is an ACTIVE member of `orgId` via platform's
|
|
65
67
|
* `GET /organization/:id/members/:userId/exists`. Returns the boolean the
|
|
@@ -68,7 +70,6 @@ export declare function fetchOrgNames(orgIds: string[], opts: OrgHierarchyHttpOp
|
|
|
68
70
|
* Returns `undefined` (— "couldn't determine") on a non-2xx response, and
|
|
69
71
|
* throws only on a transport failure (connection/timeout) — so the caller
|
|
70
72
|
* distinguishes a definitive not-a-member (`false`) from an indeterminate
|
|
71
|
-
* lookup (`undefined`) and applies its own fail-open/closed policy.
|
|
72
|
-
* differs from the parent/descendants shape, so this builds its own request.
|
|
73
|
+
* lookup (`undefined`) and applies its own fail-open/closed policy.
|
|
73
74
|
*/
|
|
74
|
-
export declare function fetchOrgMembership(orgId: string, userId: string, opts
|
|
75
|
+
export declare function fetchOrgMembership(orgId: string, userId: string, opts?: OrgHierarchyHttpOptions): Promise<boolean | undefined>;
|
|
@@ -15,22 +15,28 @@
|
|
|
15
15
|
* These functions deliberately do NOT swallow transport errors: a connection
|
|
16
16
|
* failure/timeout propagates so each caller keeps its own fallback policy (log
|
|
17
17
|
* level, degrade-to-self vs. return-undefined). A non-2xx response is treated
|
|
18
|
-
* as "no data" (returns undefined)
|
|
18
|
+
* as "no data" (returns undefined).
|
|
19
19
|
*/
|
|
20
|
-
import { getServiceAuthHeader
|
|
20
|
+
import { getServiceAuthHeader } from '../middleware/service-tokens.js';
|
|
21
|
+
import { SYSTEM_ORG_ID } from '../middleware/system-org.js';
|
|
21
22
|
import { InternalHttpClient } from '../services/http-client.js';
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
import { serviceIdentity } from '../services/service-keys.js';
|
|
24
|
+
import { serviceEndpoint } from '../utils/service-registry.js';
|
|
25
|
+
/** The platform client + signed service-auth headers for one lookup. */
|
|
26
|
+
function platformRequest(opts, authOrgId) {
|
|
27
|
+
const client = new InternalHttpClient(opts.service ?? serviceEndpoint('platform'));
|
|
25
28
|
const headers = {
|
|
26
29
|
Authorization: getServiceAuthHeader({
|
|
27
|
-
serviceName: opts.serviceName,
|
|
28
|
-
orgId: opts.authOrgId ??
|
|
30
|
+
serviceName: opts.serviceName ?? serviceIdentity(),
|
|
31
|
+
orgId: opts.authOrgId ?? authOrgId,
|
|
29
32
|
role: opts.role ?? 'member',
|
|
30
33
|
}),
|
|
31
34
|
...opts.headers,
|
|
32
35
|
};
|
|
33
|
-
return { client,
|
|
36
|
+
return { client, headers };
|
|
37
|
+
}
|
|
38
|
+
function buildRequest(orgId, suffix, opts) {
|
|
39
|
+
return { ...platformRequest(opts, orgId), path: `/organization/${encodeURIComponent(orgId)}/${suffix}` };
|
|
34
40
|
}
|
|
35
41
|
/**
|
|
36
42
|
* Resolve an org's direct parent id via platform's
|
|
@@ -39,7 +45,7 @@ function buildRequest(orgId, suffix, opts) {
|
|
|
39
45
|
* `throwOnHttpError` is set. Always throws on a transport failure
|
|
40
46
|
* (connection/timeout) so the caller can apply its own fallback.
|
|
41
47
|
*/
|
|
42
|
-
export async function fetchParentOrgId(orgId, opts) {
|
|
48
|
+
export async function fetchParentOrgId(orgId, opts = {}) {
|
|
43
49
|
const { client, path, headers } = buildRequest(orgId, 'parent', opts);
|
|
44
50
|
const res = await client.get(path, { headers, timeout: opts.timeout });
|
|
45
51
|
if (res.statusCode >= 400) {
|
|
@@ -62,7 +68,7 @@ export async function fetchParentOrgId(orgId, opts) {
|
|
|
62
68
|
* a malformed payload can never smuggle a non-string into the returned
|
|
63
69
|
* `string[]`.
|
|
64
70
|
*/
|
|
65
|
-
export async function fetchOrgDescendants(orgId, opts) {
|
|
71
|
+
export async function fetchOrgDescendants(orgId, opts = {}) {
|
|
66
72
|
const { client, path, headers } = buildRequest(orgId, 'descendants', opts);
|
|
67
73
|
const res = await client.get(path, { headers, timeout: opts.timeout });
|
|
68
74
|
if (res.statusCode >= 400)
|
|
@@ -86,20 +92,12 @@ export async function fetchOrgDescendants(orgId, opts) {
|
|
|
86
92
|
* response is validated entry-by-entry (only string→string pairs survive), so a
|
|
87
93
|
* malformed payload can't smuggle a non-string into the returned map.
|
|
88
94
|
*/
|
|
89
|
-
export async function fetchOrgNames(orgIds, opts) {
|
|
95
|
+
export async function fetchOrgNames(orgIds, opts = {}) {
|
|
90
96
|
if (orgIds.length === 0)
|
|
91
97
|
return {};
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
serviceName: opts.serviceName,
|
|
96
|
-
// A cross-org registry read, not a tenant-scoped op — default to the system
|
|
97
|
-
// org context when the caller doesn't pin one.
|
|
98
|
-
orgId: opts.authOrgId ?? SYSTEM_ORG_ID,
|
|
99
|
-
role: opts.role ?? 'member',
|
|
100
|
-
}),
|
|
101
|
-
...opts.headers,
|
|
102
|
-
};
|
|
98
|
+
// A cross-org registry read, not a tenant-scoped op — default to the system
|
|
99
|
+
// org context when the caller doesn't pin one.
|
|
100
|
+
const { client, headers } = platformRequest(opts, SYSTEM_ORG_ID);
|
|
103
101
|
const res = await client.post('/organization/names', { orgIds }, { headers, timeout: opts.timeout });
|
|
104
102
|
if (res.statusCode >= 400)
|
|
105
103
|
return {};
|
|
@@ -121,24 +119,15 @@ export async function fetchOrgNames(orgIds, opts) {
|
|
|
121
119
|
* Returns `undefined` (— "couldn't determine") on a non-2xx response, and
|
|
122
120
|
* throws only on a transport failure (connection/timeout) — so the caller
|
|
123
121
|
* distinguishes a definitive not-a-member (`false`) from an indeterminate
|
|
124
|
-
* lookup (`undefined`) and applies its own fail-open/closed policy.
|
|
125
|
-
* differs from the parent/descendants shape, so this builds its own request.
|
|
122
|
+
* lookup (`undefined`) and applies its own fail-open/closed policy.
|
|
126
123
|
*/
|
|
127
|
-
export async function fetchOrgMembership(orgId, userId, opts) {
|
|
128
|
-
const client =
|
|
124
|
+
export async function fetchOrgMembership(orgId, userId, opts = {}) {
|
|
125
|
+
const { client, headers } = platformRequest(opts, orgId);
|
|
129
126
|
const path = `/organization/${encodeURIComponent(orgId)}/members/${encodeURIComponent(userId)}/exists`;
|
|
130
|
-
const headers = {
|
|
131
|
-
Authorization: getServiceAuthHeader({
|
|
132
|
-
serviceName: opts.serviceName,
|
|
133
|
-
orgId: opts.authOrgId ?? orgId,
|
|
134
|
-
role: opts.role ?? 'member',
|
|
135
|
-
}),
|
|
136
|
-
...opts.headers,
|
|
137
|
-
};
|
|
138
127
|
const res = await client.get(path, { headers, timeout: opts.timeout });
|
|
139
128
|
if (res.statusCode >= 400)
|
|
140
129
|
return undefined;
|
|
141
130
|
const isMember = res.body?.data?.isMember;
|
|
142
131
|
return typeof isMember === 'boolean' ? isMember : undefined;
|
|
143
132
|
}
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWhpZXJhcmNoeS1odHRwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hlbHBlcnMvb3JnLWhpZXJhcmNoeS1odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUErQmhFLFNBQVMsWUFBWSxDQUNuQixLQUFhLEVBQ2IsTUFBZ0MsRUFDaEMsSUFBNkI7SUFFN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO0lBQ3BFLE1BQU0sT0FBTyxHQUEyQjtRQUN0QyxhQUFhLEVBQUUsb0JBQW9CLENBQUM7WUFDbEMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUs7WUFDOUIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksUUFBUTtTQUM1QixDQUFDO1FBQ0YsR0FBRyxJQUFJLENBQUMsT0FBTztLQUNoQixDQUFDO0lBQ0YsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLElBQTZCO0lBQ2pGLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FB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QUksRUFBRSxRQUFRLENBQUM7SUFDMUMsT0FBTyxPQUFPLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5IGxvb2t1cHMgb3ZlciBIVFRQIGFnYWluc3QgdGhlIHBsYXRmb3JtIHNlcnZpY2UuXG4gKlxuICogVGhlIE1vbmdvb3NlLWJhc2VkIHRyYXZlcnNhbCBpbiB7QGxpbmsgLi9vcmctaGllcmFyY2h5fSBpcyBmb3Igc2VydmljZXMgdGhhdFxuICogb3duIHRoZSBvcmcgdGFibGUgKHBsYXRmb3JtLCBxdW90YSkuIEV2ZXJ5b25lIGVsc2UgcmVhZHMgdGhlIGhpZXJhcmNoeSBvdmVyXG4gKiB0aGUgd2lyZSBmcm9tIHBsYXRmb3JtJ3MgYXV0aG9yaXRhdGl2ZSBgL29yZ2FuaXphdGlvbi86aWQvKmAgZW5kcG9pbnRzLiBUaGlzXG4gKiBtb2R1bGUgY2VudHJhbGl6ZXMgdGhlIHRyYW5zcG9ydCBmb3IgdGhvc2UgcmVhZHMg4oCUIFVSTCBjb25zdHJ1Y3Rpb24sIHRoZVxuICogc2lnbmVkIHNlcnZpY2UtdG9rZW4gYXV0aCBoZWFkZXIsIGFuZCB0aW1lb3V0K3JldHJ5IHZpYSB0aGUgc2hhcmVkXG4gKiB7QGxpbmsgSW50ZXJuYWxIdHRwQ2xpZW50fSDigJQgc28gY29tcGxpYW5jZSwgcmVwb3J0aW5nLCBhbmQgYW55IGZ1dHVyZSBjYWxsZXJcbiAqIHNoYXJlIE9ORSBtZWNoYW5pc20gaW5zdGVhZCBvZiBlYWNoIGhhbmQtcm9sbGluZyBhIGBmZXRjaGAvY2xpZW50IHdpdGggaXRzXG4gKiBvd24gYXV0aCBhbmQgZmFpbHVyZSBzZW1hbnRpY3MuXG4gKlxuICogVGhlc2UgZnVuY3Rpb25zIGRlbGliZXJhdGVseSBkbyBOT1Qgc3dhbGxvdyB0cmFuc3BvcnQgZXJyb3JzOiBhIGNvbm5lY3Rpb25cbiAqIGZhaWx1cmUvdGltZW91dCBwcm9wYWdhdGVzIHNvIGVhY2ggY2FsbGVyIGtlZXBzIGl0cyBvd24gZmFsbGJhY2sgcG9saWN5IChsb2dcbiAqIGxldmVsLCBkZWdyYWRlLXRvLXNlbGYgdnMuIHJldHVybi11bmRlZmluZWQpLiBBIG5vbi0yeHggcmVzcG9uc2UgaXMgdHJlYXRlZFxuICogYXMgXCJubyBkYXRhXCIgKHJldHVybnMgdW5kZWZpbmVkKSwgbWF0Y2hpbmcgd2hhdCB0aGUgY2FsbGVycyBwcmV2aW91c2x5IGRpZC5cbiAqL1xuXG5pbXBvcnQgeyBnZXRTZXJ2aWNlQXV0aEhlYWRlciwgU1lTVEVNX09SR19JRCB9IGZyb20gJy4uL21pZGRsZXdhcmUvYXV0aC5qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbEh0dHBDbGllbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9odHRwLWNsaWVudC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuXG4vKiogT3B0aW9ucyBzaGFyZWQgYnkgdGhlIHBsYXRmb3JtIG9yZy1oaWVyYXJjaHkgSFRUUCBsb29rdXBzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdIaWVyYXJjaHlIdHRwT3B0aW9ucyB7XG4gIC8qKiBQbGF0Zm9ybSBzZXJ2aWNlIGhvc3QvcG9ydCAoKyBvcHRpb25hbCBkZWZhdWx0IHRpbWVvdXQpIGZvciB0aGUgY2xpZW50LiAqL1xuICBzZXJ2aWNlOiBTZXJ2aWNlQ29uZmlnO1xuICAvKiogU2VydmljZSBuYW1lIG1pbnRlZCBpbnRvIHRoZSBzZXJ2aWNlLWF1dGggSldUIGBzdWJgIChlLmcuICdjb21wbGlhbmNlJykuICovXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcmcgaWQgZW1iZWRkZWQgaW4gdGhlIHNpZ25lZCBzZXJ2aWNlIHRva2VuJ3Mgb3JnIGNvbnRleHQuIERlZmF1bHRzIHRvIHRoZVxuICAgKiBxdWVyaWVkIGBvcmdJZGA7IHBhc3MgYSBzeXN0ZW0gb3JnIGlkIGZvciBhIHN5c3RlbS1zY29wZWQgbG9va3VwLlxuICAgKi9cbiAgYXV0aE9yZ0lkPzogc3RyaW5nO1xuICAvKiogUm9sZSBjYXJyaWVkIGJ5IHRoZSBzZXJ2aWNlIHRva2VuIChkZWZhdWx0ICdtZW1iZXInIOKAlCBsZWFzdCBwcml2aWxlZ2UpLiAqL1xuICByb2xlPzogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbiAgLyoqIEV4dHJhIHJlcXVlc3QgaGVhZGVycyBtZXJnZWQgYWZ0ZXIgYEF1dGhvcml6YXRpb25gIChlLmcuIGB4LW9yZy1pZGApLiAqL1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFBlci1yZXF1ZXN0IHRpbWVvdXQgb3ZlcnJpZGUgaW4gbXMgKGZhbGxzIGJhY2sgdG8gdGhlIGNsaWVudCBkZWZhdWx0KS4gKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgYSBub24tMnh4IHJlc3BvbnNlIFRIUk9XUyBpbnN0ZWFkIG9mIHJlc29sdmluZyB0byBgdW5kZWZpbmVkYC5cbiAgICogRGVmYXVsdCBmYWxzZSAoYSA0eHgvNXh4IG1hcHMgdG8gYHVuZGVmaW5lZGAsIHRoZSBmYWlsLXNvZnQgcG9saWN5IHRoZVxuICAgKiBtZXNzYWdlL3JlcG9ydGluZyByb290LXJlc29sdXRpb24gY2FsbGVycyByZWx5IG9uKS4gQSBjYWxsZXIgZm9yIHdob20gYVxuICAgKiBmYWlsZWQgbG9va3VwIG11c3QgZmFpbC1DTE9TRUQg4oCUIGUuZy4gYSBjb21wbGlhbmNlIHNjYW4sIHdoZXJlIHRyZWF0aW5nIGFcbiAgICogdGVhbSBvcmcgYXMgcGFyZW50LWxlc3Mgd291bGQgc2lsZW50bHkgc2tpcCBpbmhlcml0ZWQgYmxvY2tpbmcgcnVsZXMg4oCUIHNldHNcbiAgICogdGhpcyBzbyBpdCBjYW4gZGlzdGluZ3Vpc2ggXCJyb290IG9yZ1wiIChgdW5kZWZpbmVkYCkgZnJvbSBcImxvb2t1cCBmYWlsZWRcIi5cbiAgICovXG4gIHRocm93T25IdHRwRXJyb3I/OiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlcXVlc3QoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHN1ZmZpeDogJ3BhcmVudCcgfCAnZGVzY2VuZGFudHMnLFxuICBvcHRzOiBPcmdIaWVyYXJjaHlIdHRwT3B0aW9ucyxcbik6IHsgY2xpZW50OiBJbnRlcm5hbEh0dHBDbGllbnQ7IHBhdGg6IHN0cmluZzsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChvcHRzLnNlcnZpY2UpO1xuICBjb25zdCBwYXRoID0gYC9vcmdhbml6YXRpb24vJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfS8ke3N1ZmZpeH1gO1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIEF1dGhvcml6YXRpb246IGdldFNlcnZpY2VBdXRoSGVhZGVyKHtcbiAgICAgIHNlcnZpY2VOYW1lOiBvcHRzLnNlcnZpY2VOYW1lLFxuICAgICAgb3JnSWQ6IG9wdHMuYXV0aE9yZ0lkID8/IG9yZ0lkLFxuICAgICAgcm9sZTogb3B0cy5yb2xlID8/ICdtZW1iZXInLFxuICAgIH0pLFxuICAgIC4uLm9wdHMuaGVhZGVycyxcbiAgfTtcbiAgcmV0dXJuIHsgY2xpZW50LCBwYXRoLCBoZWFkZXJzIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhbiBvcmcncyBkaXJlY3QgcGFyZW50IGlkIHZpYSBwbGF0Zm9ybSdzXG4gKiBgR0VUIC9vcmdhbml6YXRpb24vOmlkL3BhcmVudGAuIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIGEgcm9vdCBvcmcuIEEgbm9uLTJ4eFxuICogcmVzcG9uc2UgcmVzb2x2ZXMgdG8gYHVuZGVmaW5lZGAgYnkgZGVmYXVsdCwgb3IgVEhST1dTIHdoZW5cbiAqIGB0aHJvd09uSHR0cEVycm9yYCBpcyBzZXQuIEFsd2F5cyB0aHJvd3Mgb24gYSB0cmFuc3BvcnQgZmFpbHVyZVxuICogKGNvbm5lY3Rpb24vdGltZW91dCkgc28gdGhlIGNhbGxlciBjYW4gYXBwbHkgaXRzIG93biBmYWxsYmFjay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoUGFyZW50T3JnSWQob3JnSWQ6IHN0cmluZywgb3B0czogT3JnSGllcmFyY2h5SHR0cE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGNsaWVudCwgcGF0aCwgaGVhZGVycyB9ID0gYnVpbGRSZXF1ZXN0KG9yZ0lkLCAncGFyZW50Jywgb3B0cyk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5nZXQ8eyBkYXRhPzogeyBwYXJlbnRPcmdJZD86IHN0cmluZyB8IG51bGwgfSB9PihwYXRoLCB7IGhlYWRlcnMsIHRpbWVvdXQ6IG9wdHMudGltZW91dCB9KTtcbiAgaWYgKHJlcy5zdGF0dXNDb2RlID49IDQwMCkge1xuICAgIGlmIChvcHRzLnRocm93T25IdHRwRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcGFyZW50LW9yZyBsb29rdXAgZmFpbGVkIGZvciAke29yZ0lkfTogSFRUUCAke3Jlcy5zdGF0dXNDb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiByZXMuYm9keT8uZGF0YT8ucGFyZW50T3JnSWQgPz8gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYFtzZWxmLCAuLi5kZXNjZW5kYW50T3JnSWRzXWAgZm9yIGFuIG9yZyB2aWEgcGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9kZXNjZW5kYW50c2AuIFJldHVybnMgdGhlIGlkIGxpc3Qgb25seSB3aGVuIGl0IGlzXG4gKiBsYXJnZXIgdGhhbiB0aGUgb3JnIGl0c2VsZiAoYSByZWFsIHN1YnRyZWUpLCBlbHNlIGB1bmRlZmluZWRgOyBhbHNvXG4gKiBgdW5kZWZpbmVkYCBvbiBhIG5vbi0yeHggcmVzcG9uc2UuIFRocm93cyBvbiBhIHRyYW5zcG9ydCBmYWlsdXJlIHNvIHRoZVxuICogY2FsbGVyIGNhbiBhcHBseSBpdHMgb3duIGZhbGxiYWNrLlxuICpcbiAqIFRoaXMgaXMgYSB0cnVzdCBib3VuZGFyeTogdGhlIHJlc3BvbnNlIGlzIHZhbGlkYXRlZCBlbGVtZW50LWJ5LWVsZW1lbnQgcmF0aGVyXG4gKiB0aGFuIGNhc3Qg4oCUIGV2ZXJ5IGVudHJ5IG11c3QgYmUgYSBzdHJpbmcsIGFuZCBhbnkgbm9uLXN0cmluZyBpcyBkcm9wcGVkIOKAlCBzb1xuICogYSBtYWxmb3JtZWQgcGF5bG9hZCBjYW4gbmV2ZXIgc211Z2dsZSBhIG5vbi1zdHJpbmcgaW50byB0aGUgcmV0dXJuZWRcbiAqIGBzdHJpbmdbXWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaE9yZ0Rlc2NlbmRhbnRzKG9yZ0lkOiBzdHJpbmcsIG9wdHM6IE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zKTogUHJvbWlzZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGNsaWVudCwgcGF0aCwgaGVhZGVycyB9ID0gYnVpbGRSZXF1ZXN0KG9yZ0lkLCAnZGVzY2VuZGFudHMnLCBvcHRzKTtcbiAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LmdldDx7IGRhdGE/OiB7IG9yZ0lkcz86IHVua25vd24gfSB9PihwYXRoLCB7IGhlYWRlcnMsIHRpbWVvdXQ6IG9wdHMudGltZW91dCB9KTtcbiAgaWYgKHJlcy5zdGF0dXNDb2RlID49IDQwMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaWRzID0gcmVzLmJvZHk/LmRhdGE/Lm9yZ0lkcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KGlkcykpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG9yZ0lkcyA9IGlkcy5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpO1xuICAvLyBPbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgKHZhbGlkYXRlZCkgc3VidHJlZSBpcyBsYXJnZXIgdGhhbiB0aGUgb3JnIGl0c2VsZi5cbiAgcmV0dXJuIG9yZ0lkcy5sZW5ndGggPiAxID8gb3JnSWRzIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEJhdGNoLXJlc29sdmUgb3JnIGlkIOKGkiBkaXNwbGF5IE5BTUUgdmlhIHBsYXRmb3JtJ3MgYFBPU1QgL29yZ2FuaXphdGlvbi9uYW1lc2AuXG4gKiBSZXR1cm5zIGEgbG93ZXJjYXNlZCBgeyBbb3JnSWRdOiBuYW1lIH1gIG1hcCDigJQgaWRzIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IGtub3dcbiAqIGFyZSBzaW1wbHkgYWJzZW50IChjYWxsZXIgZmFsbHMgYmFjayB0byB0aGUgcmF3IGlkKS5cbiAqXG4gKiBCZXN0LWVmZm9ydCBieSBkZXNpZ246IGEgbm9uLTJ4eCByZXNwb25zZSAoZS5nLiB0aGUgY2FsbGVyIGlzbid0IGEgc2VydmljZVxuICogcHJpbmNpcGFsKSBvciBhIG1hbGZvcm1lZCBib2R5IHlpZWxkcyBge31gLCBhbmQgaXQgdGhyb3dzIE9OTFkgb24gYSB0cmFuc3BvcnRcbiAqIGZhaWx1cmUgKGNvbm5lY3Rpb24vdGltZW91dCkg4oCUIG1hdGNoaW5nIHRoZSBmYWlsLXNvZnQgcG9saWN5IG9mIHRoZSBvdGhlclxuICogbG9va3VwcyBoZXJlIHNvIGEgbmFtZS1lbnJpY2htZW50IHJlYWQgbmV2ZXIgZmFpbHMgdGhlIGNhbGxlcidzIHJlcXVlc3QuIFRoZVxuICogcmVzcG9uc2UgaXMgdmFsaWRhdGVkIGVudHJ5LWJ5LWVudHJ5IChvbmx5IHN0cmluZ+KGknN0cmluZyBwYWlycyBzdXJ2aXZlKSwgc28gYVxuICogbWFsZm9ybWVkIHBheWxvYWQgY2FuJ3Qgc211Z2dsZSBhIG5vbi1zdHJpbmcgaW50byB0aGUgcmV0dXJuZWQgbWFwLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hPcmdOYW1lcyhcbiAgb3JnSWRzOiBzdHJpbmdbXSxcbiAgb3B0czogT3JnSGllcmFyY2h5SHR0cE9wdGlvbnMsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgaWYgKG9yZ0lkcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChvcHRzLnNlcnZpY2UpO1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIEF1dGhvcml6YXRpb246IGdldFNlcnZpY2VBdXRoSGVhZGVyKHtcbiAgICAgIHNlcnZpY2VOYW1lOiBvcHRzLnNlcnZpY2VOYW1lLFxuICAgICAgLy8gQSBjcm9zcy1vcmcgcmVnaXN0cnkgcmVhZCwgbm90IGEgdGVuYW50LXNjb3BlZCBvcCDigJQgZGVmYXVsdCB0byB0aGUgc3lzdGVtXG4gICAgICAvLyBvcmcgY29udGV4dCB3aGVuIHRoZSBjYWxsZXIgZG9lc24ndCBwaW4gb25lLlxuICAgICAgb3JnSWQ6IG9wdHMuYXV0aE9yZ0lkID8/IFNZU1RFTV9PUkdfSUQsXG4gICAgICByb2xlOiBvcHRzLnJvbGUgPz8gJ21lbWJlcicsXG4gICAgfSksXG4gICAgLi4ub3B0cy5oZWFkZXJzLFxuICB9O1xuICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQucG9zdDx7IGRhdGE/OiB7IG5hbWVzPzogdW5rbm93biB9IH0+KFxuICAgICcvb3JnYW5pemF0aW9uL25hbWVzJyxcbiAgICB7IG9yZ0lkcyB9LFxuICAgIHsgaGVhZGVycywgdGltZW91dDogb3B0cy50aW1lb3V0IH0sXG4gICk7XG4gIGlmIChyZXMuc3RhdHVzQ29kZSA+PSA0MDApIHJldHVybiB7fTtcbiAgY29uc3QgbmFtZXMgPSByZXMuYm9keT8uZGF0YT8ubmFtZXM7XG4gIGlmICghbmFtZXMgfHwgdHlwZW9mIG5hbWVzICE9PSAnb2JqZWN0JykgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbaWQsIG5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIG91dFtpZC50b0xvd2VyQ2FzZSgpXSA9IG5hbWU7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGB1c2VySWRgIGlzIGFuIEFDVElWRSBtZW1iZXIgb2YgYG9yZ0lkYCB2aWEgcGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9tZW1iZXJzLzp1c2VySWQvZXhpc3RzYC4gUmV0dXJucyB0aGUgYm9vbGVhbiB0aGVcbiAqIHBsYXRmb3JtIHJlcG9ydHMuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCAo4oCUIFwiY291bGRuJ3QgZGV0ZXJtaW5lXCIpIG9uIGEgbm9uLTJ4eCByZXNwb25zZSwgYW5kXG4gKiB0aHJvd3Mgb25seSBvbiBhIHRyYW5zcG9ydCBmYWlsdXJlIChjb25uZWN0aW9uL3RpbWVvdXQpIOKAlCBzbyB0aGUgY2FsbGVyXG4gKiBkaXN0aW5ndWlzaGVzIGEgZGVmaW5pdGl2ZSBub3QtYS1tZW1iZXIgKGBmYWxzZWApIGZyb20gYW4gaW5kZXRlcm1pbmF0ZVxuICogbG9va3VwIChgdW5kZWZpbmVkYCkgYW5kIGFwcGxpZXMgaXRzIG93biBmYWlsLW9wZW4vY2xvc2VkIHBvbGljeS4gVGhlIGBwYXRoYFxuICogZGlmZmVycyBmcm9tIHRoZSBwYXJlbnQvZGVzY2VuZGFudHMgc2hhcGUsIHNvIHRoaXMgYnVpbGRzIGl0cyBvd24gcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoT3JnTWVtYmVyc2hpcChcbiAgb3JnSWQ6IHN0cmluZyxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIG9wdHM6IE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zLFxuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBJbnRlcm5hbEh0dHBDbGllbnQob3B0cy5zZXJ2aWNlKTtcbiAgY29uc3QgcGF0aCA9IGAvb3JnYW5pemF0aW9uLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vbWVtYmVycy8ke2VuY29kZVVSSUNvbXBvbmVudCh1c2VySWQpfS9leGlzdHNgO1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIEF1dGhvcml6YXRpb246IGdldFNlcnZpY2VBdXRoSGVhZGVyKHtcbiAgICAgIHNlcnZpY2VOYW1lOiBvcHRzLnNlcnZpY2VOYW1lLFxuICAgICAgb3JnSWQ6IG9wdHMuYXV0aE9yZ0lkID8/IG9yZ0lkLFxuICAgICAgcm9sZTogb3B0cy5yb2xlID8/ICdtZW1iZXInLFxuICAgIH0pLFxuICAgIC4uLm9wdHMuaGVhZGVycyxcbiAgfTtcbiAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LmdldDx7IGRhdGE/OiB7IGlzTWVtYmVyPzogdW5rbm93biB9IH0+KHBhdGgsIHsgaGVhZGVycywgdGltZW91dDogb3B0cy50aW1lb3V0IH0pO1xuICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gNDAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpc01lbWJlciA9IHJlcy5ib2R5Py5kYXRhPy5pc01lbWJlcjtcbiAgcmV0dXJuIHR5cGVvZiBpc01lbWJlciA9PT0gJ2Jvb2xlYW4nID8gaXNNZW1iZXIgOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWhpZXJhcmNoeS1odHRwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hlbHBlcnMvb3JnLWhpZXJhcmNoeS1odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQWdDL0Qsd0VBQXdFO0FBQ3hFLFNBQVMsZUFBZSxDQUN0QixJQUE2QixFQUM3QixTQUFpQjtJQUVqQixNQUFNLE1BQU0sR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDbkYsTUFBTSxPQUFPLEdBQTJCO1FBQ3RDLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQztZQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxlQUFlLEVBQUU7WUFDbEQsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUztZQUNsQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRO1NBQzVCLENBQUM7UUFDRixHQUFHLElBQUksQ0FBQyxPQUFPO0tBQ2hCLENBQUM7SUFDRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsS0FBYSxFQUNiLE1BQWdDLEVBQ2hDLElBQTZCO0lBRTdCLE9BQU8sRUFBRSxHQUFHLGVBQWUs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QUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIE9yZyDihpIgdGVhbSBoaWVyYXJjaHkgbG9va3VwcyBvdmVyIEhUVFAgYWdhaW5zdCB0aGUgcGxhdGZvcm0gc2VydmljZS5cbiAqXG4gKiBUaGUgTW9uZ29vc2UtYmFzZWQgdHJhdmVyc2FsIGluIHtAbGluayAuL29yZy1oaWVyYXJjaHl9IGlzIGZvciBzZXJ2aWNlcyB0aGF0XG4gKiBvd24gdGhlIG9yZyB0YWJsZSAocGxhdGZvcm0sIHF1b3RhKS4gRXZlcnlvbmUgZWxzZSByZWFkcyB0aGUgaGllcmFyY2h5IG92ZXJcbiAqIHRoZSB3aXJlIGZyb20gcGxhdGZvcm0ncyBhdXRob3JpdGF0aXZlIGAvb3JnYW5pemF0aW9uLzppZC8qYCBlbmRwb2ludHMuIFRoaXNcbiAqIG1vZHVsZSBjZW50cmFsaXplcyB0aGUgdHJhbnNwb3J0IGZvciB0aG9zZSByZWFkcyDigJQgVVJMIGNvbnN0cnVjdGlvbiwgdGhlXG4gKiBzaWduZWQgc2VydmljZS10b2tlbiBhdXRoIGhlYWRlciwgYW5kIHRpbWVvdXQrcmV0cnkgdmlhIHRoZSBzaGFyZWRcbiAqIHtAbGluayBJbnRlcm5hbEh0dHBDbGllbnR9IOKAlCBzbyBjb21wbGlhbmNlLCByZXBvcnRpbmcsIGFuZCBhbnkgZnV0dXJlIGNhbGxlclxuICogc2hhcmUgT05FIG1lY2hhbmlzbSBpbnN0ZWFkIG9mIGVhY2ggaGFuZC1yb2xsaW5nIGEgYGZldGNoYC9jbGllbnQgd2l0aCBpdHNcbiAqIG93biBhdXRoIGFuZCBmYWlsdXJlIHNlbWFudGljcy5cbiAqXG4gKiBUaGVzZSBmdW5jdGlvbnMgZGVsaWJlcmF0ZWx5IGRvIE5PVCBzd2FsbG93IHRyYW5zcG9ydCBlcnJvcnM6IGEgY29ubmVjdGlvblxuICogZmFpbHVyZS90aW1lb3V0IHByb3BhZ2F0ZXMgc28gZWFjaCBjYWxsZXIga2VlcHMgaXRzIG93biBmYWxsYmFjayBwb2xpY3kgKGxvZ1xuICogbGV2ZWwsIGRlZ3JhZGUtdG8tc2VsZiB2cy4gcmV0dXJuLXVuZGVmaW5lZCkuIEEgbm9uLTJ4eCByZXNwb25zZSBpcyB0cmVhdGVkXG4gKiBhcyBcIm5vIGRhdGFcIiAocmV0dXJucyB1bmRlZmluZWQpLlxuICovXG5cbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zZXJ2aWNlLXRva2Vucy5qcyc7XG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zeXN0ZW0tb3JnLmpzJztcbmltcG9ydCB7IEludGVybmFsSHR0cENsaWVudCB9IGZyb20gJy4uL3NlcnZpY2VzL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IHNlcnZpY2VJZGVudGl0eSB9IGZyb20gJy4uL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgc2VydmljZUVuZHBvaW50IH0gZnJvbSAnLi4vdXRpbHMvc2VydmljZS1yZWdpc3RyeS5qcyc7XG5cbi8qKiBPcHRpb25zIHNoYXJlZCBieSB0aGUgcGxhdGZvcm0gb3JnLWhpZXJhcmNoeSBIVFRQIGxvb2t1cHMuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdC9wb3J0ICgrIG9wdGlvbmFsIGRlZmF1bHQgdGltZW91dCkuIERlZmF1bHRzIHRvIHRoZVxuICAgKiAgcmVnaXN0cnkncyBwbGF0Zm9ybSBlbmRwb2ludC4gKi9cbiAgc2VydmljZT86IFNlcnZpY2VDb25maWc7XG4gIC8qKiBTZXJ2aWNlIG5hbWUgbWludGVkIGludG8gdGhlIHNlcnZpY2UtYXV0aCBKV1QgYHN1YmAuIERlZmF1bHRzIHRvIHRoaXNcbiAgICogIHByb2Nlc3MncyBvd24gaWRlbnRpdHkgKGBTRVJWSUNFX05BTUVgKS4gKi9cbiAgc2VydmljZU5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcmcgaWQgZW1iZWRkZWQgaW4gdGhlIHNpZ25lZCBzZXJ2aWNlIHRva2VuJ3Mgb3JnIGNvbnRleHQuIERlZmF1bHRzIHRvIHRoZVxuICAgKiBxdWVyaWVkIGBvcmdJZGA7IHBhc3MgYSBzeXN0ZW0gb3JnIGlkIGZvciBhIHN5c3RlbS1zY29wZWQgbG9va3VwLlxuICAgKi9cbiAgYXV0aE9yZ0lkPzogc3RyaW5nO1xuICAvKiogUm9sZSBjYXJyaWVkIGJ5IHRoZSBzZXJ2aWNlIHRva2VuIChkZWZhdWx0ICdtZW1iZXInIOKAlCBsZWFzdCBwcml2aWxlZ2UpLiAqL1xuICByb2xlPzogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbiAgLyoqIEV4dHJhIHJlcXVlc3QgaGVhZGVycyBtZXJnZWQgYWZ0ZXIgYEF1dGhvcml6YXRpb25gIChlLmcuIGB4LW9yZy1pZGApLiAqL1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFBlci1yZXF1ZXN0IHRpbWVvdXQgb3ZlcnJpZGUgaW4gbXMgKGZhbGxzIGJhY2sgdG8gdGhlIGNsaWVudCBkZWZhdWx0KS4gKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgYSBub24tMnh4IHJlc3BvbnNlIFRIUk9XUyBpbnN0ZWFkIG9mIHJlc29sdmluZyB0byBgdW5kZWZpbmVkYC5cbiAgICogRGVmYXVsdCBmYWxzZSAoYSA0eHgvNXh4IG1hcHMgdG8gYHVuZGVmaW5lZGAsIHRoZSBmYWlsLXNvZnQgcG9saWN5IHRoZVxuICAgKiBtZXNzYWdlL3JlcG9ydGluZyByb290LXJlc29sdXRpb24gY2FsbGVycyByZWx5IG9uKS4gQSBjYWxsZXIgZm9yIHdob20gYVxuICAgKiBmYWlsZWQgbG9va3VwIG11c3QgZmFpbC1DTE9TRUQg4oCUIGUuZy4gYSBjb21wbGlhbmNlIHNjYW4sIHdoZXJlIHRyZWF0aW5nIGFcbiAgICogdGVhbSBvcmcgYXMgcGFyZW50LWxlc3Mgd291bGQgc2lsZW50bHkgc2tpcCBpbmhlcml0ZWQgYmxvY2tpbmcgcnVsZXMg4oCUIHNldHNcbiAgICogdGhpcyBzbyBpdCBjYW4gZGlzdGluZ3Vpc2ggXCJyb290IG9yZ1wiIChgdW5kZWZpbmVkYCkgZnJvbSBcImxvb2t1cCBmYWlsZWRcIi5cbiAgICovXG4gIHRocm93T25IdHRwRXJyb3I/OiBib29sZWFuO1xufVxuXG4vKiogVGhlIHBsYXRmb3JtIGNsaWVudCArIHNpZ25lZCBzZXJ2aWNlLWF1dGggaGVhZGVycyBmb3Igb25lIGxvb2t1cC4gKi9cbmZ1bmN0aW9uIHBsYXRmb3JtUmVxdWVzdChcbiAgb3B0czogT3JnSGllcmFyY2h5SHR0cE9wdGlvbnMsXG4gIGF1dGhPcmdJZDogc3RyaW5nLFxuKTogeyBjbGllbnQ6IEludGVybmFsSHR0cENsaWVudDsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChvcHRzLnNlcnZpY2UgPz8gc2VydmljZUVuZHBvaW50KCdwbGF0Zm9ybScpKTtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBBdXRob3JpemF0aW9uOiBnZXRTZXJ2aWNlQXV0aEhlYWRlcih7XG4gICAgICBzZXJ2aWNlTmFtZTogb3B0cy5zZXJ2aWNlTmFtZSA/PyBzZXJ2aWNlSWRlbnRpdHkoKSxcbiAgICAgIG9yZ0lkOiBvcHRzLmF1dGhPcmdJZCA/PyBhdXRoT3JnSWQsXG4gICAgICByb2xlOiBvcHRzLnJvbGUgPz8gJ21lbWJlcicsXG4gICAgfSksXG4gICAgLi4ub3B0cy5oZWFkZXJzLFxuICB9O1xuICByZXR1cm4geyBjbGllbnQsIGhlYWRlcnMgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZXF1ZXN0KFxuICBvcmdJZDogc3RyaW5nLFxuICBzdWZmaXg6ICdwYXJlbnQnIHwgJ2Rlc2NlbmRhbnRzJyxcbiAgb3B0czogT3JnSGllcmFyY2h5SHR0cE9wdGlvbnMsXG4pOiB7IGNsaWVudDogSW50ZXJuYWxIdHRwQ2xpZW50OyBwYXRoOiBzdHJpbmc7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSB7XG4gIHJldHVybiB7IC4uLnBsYXRmb3JtUmVxdWVzdChvcHRzLCBvcmdJZCksIHBhdGg6IGAvb3JnYW5pemF0aW9uLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vJHtzdWZmaXh9YCB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gb3JnJ3MgZGlyZWN0IHBhcmVudCBpZCB2aWEgcGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9wYXJlbnRgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhIHJvb3Qgb3JnLiBBIG5vbi0yeHhcbiAqIHJlc3BvbnNlIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgIGJ5IGRlZmF1bHQsIG9yIFRIUk9XUyB3aGVuXG4gKiBgdGhyb3dPbkh0dHBFcnJvcmAgaXMgc2V0LiBBbHdheXMgdGhyb3dzIG9uIGEgdHJhbnNwb3J0IGZhaWx1cmVcbiAqIChjb25uZWN0aW9uL3RpbWVvdXQpIHNvIHRoZSBjYWxsZXIgY2FuIGFwcGx5IGl0cyBvd24gZmFsbGJhY2suXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFBhcmVudE9yZ0lkKG9yZ0lkOiBzdHJpbmcsIG9wdHM6IE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGNsaWVudCwgcGF0aCwgaGVhZGVycyB9ID0gYnVpbGRSZXF1ZXN0KG9yZ0lkLCAncGFyZW50Jywgb3B0cyk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5nZXQ8eyBkYXRhPzogeyBwYXJlbnRPcmdJZD86IHN0cmluZyB8IG51bGwgfSB9PihwYXRoLCB7IGhlYWRlcnMsIHRpbWVvdXQ6IG9wdHMudGltZW91dCB9KTtcbiAgaWYgKHJlcy5zdGF0dXNDb2RlID49IDQwMCkge1xuICAgIGlmIChvcHRzLnRocm93T25IdHRwRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcGFyZW50LW9yZyBsb29rdXAgZmFpbGVkIGZvciAke29yZ0lkfTogSFRUUCAke3Jlcy5zdGF0dXNDb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiByZXMuYm9keT8uZGF0YT8ucGFyZW50T3JnSWQgPz8gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYFtzZWxmLCAuLi5kZXNjZW5kYW50T3JnSWRzXWAgZm9yIGFuIG9yZyB2aWEgcGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9kZXNjZW5kYW50c2AuIFJldHVybnMgdGhlIGlkIGxpc3Qgb25seSB3aGVuIGl0IGlzXG4gKiBsYXJnZXIgdGhhbiB0aGUgb3JnIGl0c2VsZiAoYSByZWFsIHN1YnRyZWUpLCBlbHNlIGB1bmRlZmluZWRgOyBhbHNvXG4gKiBgdW5kZWZpbmVkYCBvbiBhIG5vbi0yeHggcmVzcG9uc2UuIFRocm93cyBvbiBhIHRyYW5zcG9ydCBmYWlsdXJlIHNvIHRoZVxuICogY2FsbGVyIGNhbiBhcHBseSBpdHMgb3duIGZhbGxiYWNrLlxuICpcbiAqIFRoaXMgaXMgYSB0cnVzdCBib3VuZGFyeTogdGhlIHJlc3BvbnNlIGlzIHZhbGlkYXRlZCBlbGVtZW50LWJ5LWVsZW1lbnQgcmF0aGVyXG4gKiB0aGFuIGNhc3Qg4oCUIGV2ZXJ5IGVudHJ5IG11c3QgYmUgYSBzdHJpbmcsIGFuZCBhbnkgbm9uLXN0cmluZyBpcyBkcm9wcGVkIOKAlCBzb1xuICogYSBtYWxmb3JtZWQgcGF5bG9hZCBjYW4gbmV2ZXIgc211Z2dsZSBhIG5vbi1zdHJpbmcgaW50byB0aGUgcmV0dXJuZWRcbiAqIGBzdHJpbmdbXWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaE9yZ0Rlc2NlbmRhbnRzKG9yZ0lkOiBzdHJpbmcsIG9wdHM6IE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgY2xpZW50LCBwYXRoLCBoZWFkZXJzIH0gPSBidWlsZFJlcXVlc3Qob3JnSWQsICdkZXNjZW5kYW50cycsIG9wdHMpO1xuICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQuZ2V0PHsgZGF0YT86IHsgb3JnSWRzPzogdW5rbm93biB9IH0+KHBhdGgsIHsgaGVhZGVycywgdGltZW91dDogb3B0cy50aW1lb3V0IH0pO1xuICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gNDAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpZHMgPSByZXMuYm9keT8uZGF0YT8ub3JnSWRzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3JnSWRzID0gaWRzLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyk7XG4gIC8vIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSAodmFsaWRhdGVkKSBzdWJ0cmVlIGlzIGxhcmdlciB0aGFuIHRoZSBvcmcgaXRzZWxmLlxuICByZXR1cm4gb3JnSWRzLmxlbmd0aCA+IDEgPyBvcmdJZHMgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQmF0Y2gtcmVzb2x2ZSBvcmcgaWQg4oaSIGRpc3BsYXkgTkFNRSB2aWEgcGxhdGZvcm0ncyBgUE9TVCAvb3JnYW5pemF0aW9uL25hbWVzYC5cbiAqIFJldHVybnMgYSBsb3dlcmNhc2VkIGB7IFtvcmdJZF06IG5hbWUgfWAgbWFwIOKAlCBpZHMgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qga25vd1xuICogYXJlIHNpbXBseSBhYnNlbnQgKGNhbGxlciBmYWxscyBiYWNrIHRvIHRoZSByYXcgaWQpLlxuICpcbiAqIEJlc3QtZWZmb3J0IGJ5IGRlc2lnbjogYSBub24tMnh4IHJlc3BvbnNlIChlLmcuIHRoZSBjYWxsZXIgaXNuJ3QgYSBzZXJ2aWNlXG4gKiBwcmluY2lwYWwpIG9yIGEgbWFsZm9ybWVkIGJvZHkgeWllbGRzIGB7fWAsIGFuZCBpdCB0aHJvd3MgT05MWSBvbiBhIHRyYW5zcG9ydFxuICogZmFpbHVyZSAoY29ubmVjdGlvbi90aW1lb3V0KSDigJQgbWF0Y2hpbmcgdGhlIGZhaWwtc29mdCBwb2xpY3kgb2YgdGhlIG90aGVyXG4gKiBsb29rdXBzIGhlcmUgc28gYSBuYW1lLWVucmljaG1lbnQgcmVhZCBuZXZlciBmYWlscyB0aGUgY2FsbGVyJ3MgcmVxdWVzdC4gVGhlXG4gKiByZXNwb25zZSBpcyB2YWxpZGF0ZWQgZW50cnktYnktZW50cnkgKG9ubHkgc3RyaW5n4oaSc3RyaW5nIHBhaXJzIHN1cnZpdmUpLCBzbyBhXG4gKiBtYWxmb3JtZWQgcGF5bG9hZCBjYW4ndCBzbXVnZ2xlIGEgbm9uLXN0cmluZyBpbnRvIHRoZSByZXR1cm5lZCBtYXAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaE9yZ05hbWVzKFxuICBvcmdJZHM6IHN0cmluZ1tdLFxuICBvcHRzOiBPcmdIaWVyYXJjaHlIdHRwT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGlmIChvcmdJZHMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG4gIC8vIEEgY3Jvc3Mtb3JnIHJlZ2lzdHJ5IHJlYWQsIG5vdCBhIHRlbmFudC1zY29wZWQgb3Ag4oCUIGRlZmF1bHQgdG8gdGhlIHN5c3RlbVxuICAvLyBvcmcgY29udGV4dCB3aGVuIHRoZSBjYWxsZXIgZG9lc24ndCBwaW4gb25lLlxuICBjb25zdCB7IGNsaWVudCwgaGVhZGVycyB9ID0gcGxhdGZvcm1SZXF1ZXN0KG9wdHMsIFNZU1RFTV9PUkdfSUQpO1xuICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQucG9zdDx7IGRhdGE/OiB7IG5hbWVzPzogdW5rbm93biB9IH0+KFxuICAgICcvb3JnYW5pemF0aW9uL25hbWVzJyxcbiAgICB7IG9yZ0lkcyB9LFxuICAgIHsgaGVhZGVycywgdGltZW91dDogb3B0cy50aW1lb3V0IH0sXG4gICk7XG4gIGlmIChyZXMuc3RhdHVzQ29kZSA+PSA0MDApIHJldHVybiB7fTtcbiAgY29uc3QgbmFtZXMgPSByZXMuYm9keT8uZGF0YT8ubmFtZXM7XG4gIGlmICghbmFtZXMgfHwgdHlwZW9mIG5hbWVzICE9PSAnb2JqZWN0JykgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbaWQsIG5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIG91dFtpZC50b0xvd2VyQ2FzZSgpXSA9IG5hbWU7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGB1c2VySWRgIGlzIGFuIEFDVElWRSBtZW1iZXIgb2YgYG9yZ0lkYCB2aWEgcGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9tZW1iZXJzLzp1c2VySWQvZXhpc3RzYC4gUmV0dXJucyB0aGUgYm9vbGVhbiB0aGVcbiAqIHBsYXRmb3JtIHJlcG9ydHMuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCAo4oCUIFwiY291bGRuJ3QgZGV0ZXJtaW5lXCIpIG9uIGEgbm9uLTJ4eCByZXNwb25zZSwgYW5kXG4gKiB0aHJvd3Mgb25seSBvbiBhIHRyYW5zcG9ydCBmYWlsdXJlIChjb25uZWN0aW9uL3RpbWVvdXQpIOKAlCBzbyB0aGUgY2FsbGVyXG4gKiBkaXN0aW5ndWlzaGVzIGEgZGVmaW5pdGl2ZSBub3QtYS1tZW1iZXIgKGBmYWxzZWApIGZyb20gYW4gaW5kZXRlcm1pbmF0ZVxuICogbG9va3VwIChgdW5kZWZpbmVkYCkgYW5kIGFwcGxpZXMgaXRzIG93biBmYWlsLW9wZW4vY2xvc2VkIHBvbGljeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoT3JnTWVtYmVyc2hpcChcbiAgb3JnSWQ6IHN0cmluZyxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIG9wdHM6IE9yZ0hpZXJhcmNoeUh0dHBPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgeyBjbGllbnQsIGhlYWRlcnMgfSA9IHBsYXRmb3JtUmVxdWVzdChvcHRzLCBvcmdJZCk7XG4gIGNvbnN0IHBhdGggPSBgL29yZ2FuaXphdGlvbi8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L21lbWJlcnMvJHtlbmNvZGVVUklDb21wb25lbnQodXNlcklkKX0vZXhpc3RzYDtcbiAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LmdldDx7IGRhdGE/OiB7IGlzTWVtYmVyPzogdW5rbm93biB9IH0+KHBhdGgsIHsgaGVhZGVycywgdGltZW91dDogb3B0cy50aW1lb3V0IH0pO1xuICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gNDAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpc01lbWJlciA9IHJlcy5ib2R5Py5kYXRhPy5pc01lbWJlcjtcbiAgcmV0dXJuIHR5cGVvZiBpc01lbWJlciA9PT0gJ2Jvb2xlYW4nID8gaXNNZW1iZXIgOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
@@ -13,9 +13,8 @@
|
|
|
13
13
|
* - {@link isAncestorOrgWith} — UP: is A an ancestor of B?
|
|
14
14
|
* - {@link expandOrgScopeWith} — DOWN: self + all descendant org ids.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* orgs get parents.
|
|
16
|
+
* A root org (`parentOrgId` null) resolves to `{ rootOrgId: self }` and scope
|
|
17
|
+
* `[self]`.
|
|
19
18
|
*/
|
|
20
19
|
/** Hard ceiling on ancestry/descendant traversal — cycle + abuse guard. */
|
|
21
20
|
export declare const MAX_ORG_DEPTH = 16;
|
|
@@ -44,6 +43,33 @@ export declare function toOrgIdString(v: unknown): string | undefined;
|
|
|
44
43
|
* export const toOrgId = createOrgIdCaster(mongoose.Types.ObjectId);
|
|
45
44
|
*/
|
|
46
45
|
export declare function createOrgIdCaster<T>(ObjectIdCtor: new (hex: string) => T): (id: string | string[]) => string | T;
|
|
46
|
+
/**
|
|
47
|
+
* The slice of a Mongoose `Organization` model the hierarchy callbacks read.
|
|
48
|
+
* Structural (api-core has no mongoose dependency); `select().lean()` chains as
|
|
49
|
+
* mongoose queries do.
|
|
50
|
+
*/
|
|
51
|
+
export interface OrgHierarchyModel {
|
|
52
|
+
findById(id: any): {
|
|
53
|
+
select(fields: string): {
|
|
54
|
+
lean(): PromiseLike<unknown>;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
find(filter: any): {
|
|
58
|
+
select(fields: string): {
|
|
59
|
+
lean(): PromiseLike<unknown[]>;
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The parent/children lookups over a service's own `organizations` model, for
|
|
65
|
+
* the `*With` traversals below. `getChildOrgIds` returns LIVE children only (a
|
|
66
|
+
* soft-deleted team leaves every downward scope); `getParentOrgId` does not
|
|
67
|
+
* filter, so a deleted team still resolves through its parent.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createMongoOrgHierarchy(Model: OrgHierarchyModel, toOrgId: (id: string) => unknown): {
|
|
70
|
+
getParentOrgId: GetParentOrgId;
|
|
71
|
+
getChildOrgIds: GetChildOrgIds;
|
|
72
|
+
};
|
|
47
73
|
export interface OrgLineage {
|
|
48
74
|
/** The org's direct parent id, or `undefined` when it's a root org. */
|
|
49
75
|
parentOrgId?: string;
|
|
@@ -59,6 +85,14 @@ export interface OrgLineage {
|
|
|
59
85
|
export declare function resolveOrgLineageWith(orgId: string, getParent: GetParentOrgId): Promise<OrgLineage>;
|
|
60
86
|
/** Walk `parentOrgId` up to the root and return just the root id. */
|
|
61
87
|
export declare function resolveRootOrgIdWith(orgId: string, getParent: GetParentOrgId): Promise<string>;
|
|
88
|
+
/**
|
|
89
|
+
* Fail-CLOSED variant of {@link resolveRootOrgIdWith}: returns `null` when the
|
|
90
|
+
* root can't be proven — a cycle or a chain deeper than {@link MAX_ORG_DEPTH} —
|
|
91
|
+
* instead of treating the last reached id as the root. Lookup errors propagate.
|
|
92
|
+
* For callers where a wrong root is worse than no answer (e.g. a retention purge
|
|
93
|
+
* that would otherwise apply a team's shorter default window).
|
|
94
|
+
*/
|
|
95
|
+
export declare function resolveRootOrgIdStrict(orgId: string, getParent: GetParentOrgId): Promise<string | null>;
|
|
62
96
|
/**
|
|
63
97
|
* True when `ancestorOrgId` is an ancestor of `candidateOrgId` — i.e.
|
|
64
98
|
* `candidateOrgId` lives somewhere in the subtree rooted at `ancestorOrgId`.
|