@portaidentity/cli 1.7.3 → 1.9.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/CHANGELOG.md +18 -0
- package/README.md +125 -105
- package/dist/admin/admin-date-time.d.ts +6 -0
- package/dist/admin/admin-date-time.d.ts.map +1 -0
- package/dist/admin/admin-date-time.js +33 -0
- package/dist/admin/admin-date-time.js.map +1 -0
- package/dist/admin/application-client-features.d.ts +38 -0
- package/dist/admin/application-client-features.d.ts.map +1 -0
- package/dist/admin/application-client-features.js +545 -0
- package/dist/admin/application-client-features.js.map +1 -0
- package/dist/admin/application-controller.d.ts +58 -0
- package/dist/admin/application-controller.d.ts.map +1 -0
- package/dist/admin/application-controller.js +286 -0
- package/dist/admin/application-controller.js.map +1 -0
- package/dist/admin/application-dialogs.d.ts +91 -0
- package/dist/admin/application-dialogs.d.ts.map +1 -0
- package/dist/admin/application-dialogs.js +250 -0
- package/dist/admin/application-dialogs.js.map +1 -0
- package/dist/admin/application-rbac-controller.d.ts +56 -0
- package/dist/admin/application-rbac-controller.d.ts.map +1 -0
- package/dist/admin/application-rbac-controller.js +280 -0
- package/dist/admin/application-rbac-controller.js.map +1 -0
- package/dist/admin/application-rbac-features.d.ts +51 -0
- package/dist/admin/application-rbac-features.d.ts.map +1 -0
- package/dist/admin/application-rbac-features.js +175 -0
- package/dist/admin/application-rbac-features.js.map +1 -0
- package/dist/admin/application-rbac-workspace.d.ts +62 -0
- package/dist/admin/application-rbac-workspace.d.ts.map +1 -0
- package/dist/admin/application-rbac-workspace.js +344 -0
- package/dist/admin/application-rbac-workspace.js.map +1 -0
- package/dist/admin/application-runtime.d.ts +44 -0
- package/dist/admin/application-runtime.d.ts.map +1 -0
- package/dist/admin/application-runtime.js +183 -0
- package/dist/admin/application-runtime.js.map +1 -0
- package/dist/admin/application-service.d.ts +39 -0
- package/dist/admin/application-service.d.ts.map +1 -0
- package/dist/admin/application-service.js +248 -0
- package/dist/admin/application-service.js.map +1 -0
- package/dist/admin/application-state.d.ts +109 -0
- package/dist/admin/application-state.d.ts.map +1 -0
- package/dist/admin/application-state.js +3 -0
- package/dist/admin/application-state.js.map +1 -0
- package/dist/admin/application-workspace.d.ts +77 -0
- package/dist/admin/application-workspace.d.ts.map +1 -0
- package/dist/admin/application-workspace.js +302 -0
- package/dist/admin/application-workspace.js.map +1 -0
- package/dist/admin/application.d.ts +88 -0
- package/dist/admin/application.d.ts.map +1 -0
- package/dist/admin/application.js +932 -0
- package/dist/admin/application.js.map +1 -0
- package/dist/admin/client-authentication-dialog.d.ts +77 -0
- package/dist/admin/client-authentication-dialog.d.ts.map +1 -0
- package/dist/admin/client-authentication-dialog.js +217 -0
- package/dist/admin/client-authentication-dialog.js.map +1 -0
- package/dist/admin/client-controller.d.ts +58 -0
- package/dist/admin/client-controller.d.ts.map +1 -0
- package/dist/admin/client-controller.js +462 -0
- package/dist/admin/client-controller.js.map +1 -0
- package/dist/admin/client-credential-dialogs.d.ts +36 -0
- package/dist/admin/client-credential-dialogs.d.ts.map +1 -0
- package/dist/admin/client-credential-dialogs.js +145 -0
- package/dist/admin/client-credential-dialogs.js.map +1 -0
- package/dist/admin/client-dialogs.d.ts +64 -0
- package/dist/admin/client-dialogs.d.ts.map +1 -0
- package/dist/admin/client-dialogs.js +110 -0
- package/dist/admin/client-dialogs.js.map +1 -0
- package/dist/admin/client-form-scroller.d.ts +17 -0
- package/dist/admin/client-form-scroller.d.ts.map +1 -0
- package/dist/admin/client-form-scroller.js +67 -0
- package/dist/admin/client-form-scroller.js.map +1 -0
- package/dist/admin/client-registration-dialog.d.ts +27 -0
- package/dist/admin/client-registration-dialog.d.ts.map +1 -0
- package/dist/admin/client-registration-dialog.js +195 -0
- package/dist/admin/client-registration-dialog.js.map +1 -0
- package/dist/admin/client-service.d.ts +41 -0
- package/dist/admin/client-service.d.ts.map +1 -0
- package/dist/admin/client-service.js +486 -0
- package/dist/admin/client-service.js.map +1 -0
- package/dist/admin/client-state.d.ts +159 -0
- package/dist/admin/client-state.d.ts.map +1 -0
- package/dist/admin/client-state.js +3 -0
- package/dist/admin/client-state.js.map +1 -0
- package/dist/admin/client-workspace.d.ts +88 -0
- package/dist/admin/client-workspace.d.ts.map +1 -0
- package/dist/admin/client-workspace.js +491 -0
- package/dist/admin/client-workspace.js.map +1 -0
- package/dist/admin/delete-confirmation-layout.d.ts +38 -0
- package/dist/admin/delete-confirmation-layout.d.ts.map +1 -0
- package/dist/admin/delete-confirmation-layout.js +52 -0
- package/dist/admin/delete-confirmation-layout.js.map +1 -0
- package/dist/admin/index.d.ts +64 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +31 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/organization-controller.d.ts +77 -0
- package/dist/admin/organization-controller.d.ts.map +1 -0
- package/dist/admin/organization-controller.js +472 -0
- package/dist/admin/organization-controller.js.map +1 -0
- package/dist/admin/organization-dialogs.d.ts +63 -0
- package/dist/admin/organization-dialogs.d.ts.map +1 -0
- package/dist/admin/organization-dialogs.js +303 -0
- package/dist/admin/organization-dialogs.js.map +1 -0
- package/dist/admin/organization-service.d.ts +110 -0
- package/dist/admin/organization-service.d.ts.map +1 -0
- package/dist/admin/organization-service.js +548 -0
- package/dist/admin/organization-service.js.map +1 -0
- package/dist/admin/organization-workspace.d.ts +29 -0
- package/dist/admin/organization-workspace.d.ts.map +1 -0
- package/dist/admin/organization-workspace.js +421 -0
- package/dist/admin/organization-workspace.js.map +1 -0
- package/dist/admin/portability-controller.d.ts +83 -0
- package/dist/admin/portability-controller.d.ts.map +1 -0
- package/dist/admin/portability-controller.js +466 -0
- package/dist/admin/portability-controller.js.map +1 -0
- package/dist/admin/portability-service.d.ts +31 -0
- package/dist/admin/portability-service.d.ts.map +1 -0
- package/dist/admin/portability-service.js +51 -0
- package/dist/admin/portability-service.js.map +1 -0
- package/dist/admin/portability-state.d.ts +88 -0
- package/dist/admin/portability-state.d.ts.map +1 -0
- package/dist/admin/portability-state.js +3 -0
- package/dist/admin/portability-state.js.map +1 -0
- package/dist/admin/portability-workspace.d.ts +78 -0
- package/dist/admin/portability-workspace.d.ts.map +1 -0
- package/dist/admin/portability-workspace.js +337 -0
- package/dist/admin/portability-workspace.js.map +1 -0
- package/dist/admin/presentation.d.ts +46 -0
- package/dist/admin/presentation.d.ts.map +1 -0
- package/dist/admin/presentation.js +271 -0
- package/dist/admin/presentation.js.map +1 -0
- package/dist/admin/rbac-dialogs.d.ts +73 -0
- package/dist/admin/rbac-dialogs.d.ts.map +1 -0
- package/dist/admin/rbac-dialogs.js +345 -0
- package/dist/admin/rbac-dialogs.js.map +1 -0
- package/dist/admin/rbac-service.d.ts +47 -0
- package/dist/admin/rbac-service.d.ts.map +1 -0
- package/dist/admin/rbac-service.js +258 -0
- package/dist/admin/rbac-service.js.map +1 -0
- package/dist/admin/rbac-state.d.ts +129 -0
- package/dist/admin/rbac-state.d.ts.map +1 -0
- package/dist/admin/rbac-state.js +136 -0
- package/dist/admin/rbac-state.js.map +1 -0
- package/dist/admin/selectable-read-only-input.d.ts +18 -0
- package/dist/admin/selectable-read-only-input.d.ts.map +1 -0
- package/dist/admin/selectable-read-only-input.js +24 -0
- package/dist/admin/selectable-read-only-input.js.map +1 -0
- package/dist/admin/session-service.d.ts +169 -0
- package/dist/admin/session-service.d.ts.map +1 -0
- package/dist/admin/session-service.js +353 -0
- package/dist/admin/session-service.js.map +1 -0
- package/dist/admin/state.d.ts +301 -0
- package/dist/admin/state.d.ts.map +1 -0
- package/dist/admin/state.js +10 -0
- package/dist/admin/state.js.map +1 -0
- package/dist/admin/system-config-controller.d.ts +58 -0
- package/dist/admin/system-config-controller.d.ts.map +1 -0
- package/dist/admin/system-config-controller.js +218 -0
- package/dist/admin/system-config-controller.js.map +1 -0
- package/dist/admin/system-config-service.d.ts +54 -0
- package/dist/admin/system-config-service.d.ts.map +1 -0
- package/dist/admin/system-config-service.js +180 -0
- package/dist/admin/system-config-service.js.map +1 -0
- package/dist/admin/system-config-state.d.ts +77 -0
- package/dist/admin/system-config-state.d.ts.map +1 -0
- package/dist/admin/system-config-state.js +78 -0
- package/dist/admin/system-config-state.js.map +1 -0
- package/dist/admin/system-config-workspace.d.ts +47 -0
- package/dist/admin/system-config-workspace.d.ts.map +1 -0
- package/dist/admin/system-config-workspace.js +217 -0
- package/dist/admin/system-config-workspace.js.map +1 -0
- package/dist/admin/user-controller-types.d.ts +67 -0
- package/dist/admin/user-controller-types.d.ts.map +1 -0
- package/dist/admin/user-controller-types.js +3 -0
- package/dist/admin/user-controller-types.js.map +1 -0
- package/dist/admin/user-controller.d.ts +6 -0
- package/dist/admin/user-controller.d.ts.map +1 -0
- package/dist/admin/user-controller.js +674 -0
- package/dist/admin/user-controller.js.map +1 -0
- package/dist/admin/user-dialog-fields.d.ts +44 -0
- package/dist/admin/user-dialog-fields.d.ts.map +1 -0
- package/dist/admin/user-dialog-fields.js +130 -0
- package/dist/admin/user-dialog-fields.js.map +1 -0
- package/dist/admin/user-dialogs.d.ts +66 -0
- package/dist/admin/user-dialogs.d.ts.map +1 -0
- package/dist/admin/user-dialogs.js +374 -0
- package/dist/admin/user-dialogs.js.map +1 -0
- package/dist/admin/user-role-controller.d.ts +82 -0
- package/dist/admin/user-role-controller.d.ts.map +1 -0
- package/dist/admin/user-role-controller.js +337 -0
- package/dist/admin/user-role-controller.js.map +1 -0
- package/dist/admin/user-role-dialog.d.ts +94 -0
- package/dist/admin/user-role-dialog.d.ts.map +1 -0
- package/dist/admin/user-role-dialog.js +265 -0
- package/dist/admin/user-role-dialog.js.map +1 -0
- package/dist/admin/user-service-types.d.ts +100 -0
- package/dist/admin/user-service-types.d.ts.map +1 -0
- package/dist/admin/user-service-types.js +3 -0
- package/dist/admin/user-service-types.js.map +1 -0
- package/dist/admin/user-service.d.ts +14 -0
- package/dist/admin/user-service.d.ts.map +1 -0
- package/dist/admin/user-service.js +612 -0
- package/dist/admin/user-service.js.map +1 -0
- package/dist/admin/user-state.d.ts +158 -0
- package/dist/admin/user-state.d.ts.map +1 -0
- package/dist/admin/user-state.js +3 -0
- package/dist/admin/user-state.js.map +1 -0
- package/dist/admin/user-workspace.d.ts +65 -0
- package/dist/admin/user-workspace.d.ts.map +1 -0
- package/dist/admin/user-workspace.js +366 -0
- package/dist/admin/user-workspace.js.map +1 -0
- package/dist/auth/browser-flow.d.ts +27 -1
- package/dist/auth/browser-flow.d.ts.map +1 -1
- package/dist/auth/browser-flow.js +55 -33
- package/dist/auth/browser-flow.js.map +1 -1
- package/dist/auth/callback-server.d.ts.map +1 -1
- package/dist/auth/callback-server.js +5 -9
- package/dist/auth/callback-server.js.map +1 -1
- package/dist/auth/id-token-verifier.d.ts +39 -0
- package/dist/auth/id-token-verifier.d.ts.map +1 -0
- package/dist/auth/id-token-verifier.js +104 -0
- package/dist/auth/id-token-verifier.js.map +1 -0
- package/dist/auth/login-coordinator.d.ts +72 -0
- package/dist/auth/login-coordinator.d.ts.map +1 -0
- package/dist/auth/login-coordinator.js +190 -0
- package/dist/auth/login-coordinator.js.map +1 -0
- package/dist/auth/metadata.d.ts +2 -1
- package/dist/auth/metadata.d.ts.map +1 -1
- package/dist/auth/metadata.js +67 -6
- package/dist/auth/metadata.js.map +1 -1
- package/dist/auth/types.d.ts +14 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/client-factory.d.ts.map +1 -1
- package/dist/client-factory.js +15 -2
- package/dist/client-factory.js.map +1 -1
- package/dist/commands/admin.d.ts +22 -0
- package/dist/commands/admin.d.ts.map +1 -0
- package/dist/commands/admin.js +112 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/app-claim.d.ts.map +1 -1
- package/dist/commands/app-claim.js +11 -4
- package/dist/commands/app-claim.js.map +1 -1
- package/dist/commands/app-module.d.ts.map +1 -1
- package/dist/commands/app-module.js +61 -12
- package/dist/commands/app-module.js.map +1 -1
- package/dist/commands/app-permission.d.ts.map +1 -1
- package/dist/commands/app-permission.js +66 -24
- package/dist/commands/app-permission.js.map +1 -1
- package/dist/commands/app-role.d.ts.map +1 -1
- package/dist/commands/app-role.js +48 -27
- package/dist/commands/app-role.js.map +1 -1
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +37 -25
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/bulk.d.ts.map +1 -1
- package/dist/commands/bulk.js +9 -2
- package/dist/commands/bulk.js.map +1 -1
- package/dist/commands/client-secret.d.ts.map +1 -1
- package/dist/commands/client-secret.js +12 -6
- package/dist/commands/client-secret.js.map +1 -1
- package/dist/commands/client.d.ts +3 -2
- package/dist/commands/client.d.ts.map +1 -1
- package/dist/commands/client.js +102 -43
- package/dist/commands/client.js.map +1 -1
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +68 -7
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +182 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +6 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +142 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/keys.d.ts.map +1 -1
- package/dist/commands/keys.js +11 -4
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +24 -10
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/org.d.ts +2 -4
- package/dist/commands/org.d.ts.map +1 -1
- package/dist/commands/org.js +16 -76
- package/dist/commands/org.js.map +1 -1
- package/dist/commands/user-role.d.ts.map +1 -1
- package/dist/commands/user-role.js +19 -14
- package/dist/commands/user-role.js.map +1 -1
- package/dist/commands/user.d.ts +3 -2
- package/dist/commands/user.d.ts.map +1 -1
- package/dist/commands/user.js +47 -71
- package/dist/commands/user.js.map +1 -1
- package/dist/commands/version.d.ts +1 -1
- package/dist/commands/version.js +1 -1
- package/dist/credential-lock.d.ts +20 -0
- package/dist/credential-lock.d.ts.map +1 -0
- package/dist/credential-lock.js +130 -0
- package/dist/credential-lock.js.map +1 -0
- package/dist/credential-store.d.ts +14 -0
- package/dist/credential-store.d.ts.map +1 -1
- package/dist/credential-store.js +114 -3
- package/dist/credential-store.js.map +1 -1
- package/dist/error-handler.d.ts.map +1 -1
- package/dist/error-handler.js +2 -0
- package/dist/error-handler.js.map +1 -1
- package/dist/global-options.d.ts +8 -0
- package/dist/global-options.d.ts.map +1 -1
- package/dist/global-options.js +19 -8
- package/dist/global-options.js.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/output.d.ts +11 -0
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +25 -6
- package/dist/output.js.map +1 -1
- package/dist/prompt.d.ts +2 -2
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +27 -7
- package/dist/prompt.js.map +1 -1
- package/package.json +7 -3
- package/dist/commands/gui.d.ts +0 -21
- package/dist/commands/gui.d.ts.map +0 -1
- package/dist/commands/gui.js +0 -67
- package/dist/commands/gui.js.map +0 -1
- package/dist/commands/provision.d.ts +0 -47
- package/dist/commands/provision.d.ts.map +0 -1
- package/dist/commands/provision.js +0 -444
- package/dist/commands/provision.js.map +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Bounded cross-process kernel locking for the CLI credential file. */
|
|
2
|
+
/** Options controlling one bounded credential lock acquisition. */
|
|
3
|
+
export interface CredentialLockOptions {
|
|
4
|
+
/** Persistent lock-file path; the file is never unlinked. */
|
|
5
|
+
readonly lockPath: string;
|
|
6
|
+
/** Maximum wait before failing closed. */
|
|
7
|
+
readonly timeoutMs: number;
|
|
8
|
+
/** Caller-owned cancellation signal. */
|
|
9
|
+
readonly signal: AbortSignal;
|
|
10
|
+
}
|
|
11
|
+
/** Categorized error returned by credential lock acquisition. */
|
|
12
|
+
export declare class CredentialLockError extends Error {
|
|
13
|
+
/** Stable machine-readable failure category. */
|
|
14
|
+
readonly code: 'AUTH_CANCELLED' | 'CREDENTIAL_LOCK_TIMEOUT';
|
|
15
|
+
/** Creates a bounded, non-sensitive lock error. */
|
|
16
|
+
constructor(code: CredentialLockError['code'], message: string);
|
|
17
|
+
}
|
|
18
|
+
/** Runs an operation under a bounded exclusive lock that survives as a file. */
|
|
19
|
+
export declare function withCredentialLock<T>(options: CredentialLockOptions, operation: () => Promise<T>): Promise<T>;
|
|
20
|
+
//# sourceMappingURL=credential-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-lock.d.ts","sourceRoot":"","sources":["../src/credential-lock.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAWxE,mEAAmE;AACnE,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED,iEAAiE;AACjE,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,yBAAyB,CAAC;IAE5D,mDAAmD;IACnD,YAAY,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAI7D;CACF;AAyDD,gFAAgF;AAChF,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAmEZ"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/** Bounded cross-process kernel locking for the CLI credential file. */
|
|
2
|
+
import { constants as nativeConstants, fcntlSync, lockFileExSync, unlockFileExSync, } from 'fs-ext-extra-prebuilt';
|
|
3
|
+
import { open } from 'node:fs/promises';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
/** Categorized error returned by credential lock acquisition. */
|
|
6
|
+
export class CredentialLockError extends Error {
|
|
7
|
+
/** Stable machine-readable failure category. */
|
|
8
|
+
code;
|
|
9
|
+
/** Creates a bounded, non-sensitive lock error. */
|
|
10
|
+
constructor(code, message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'CredentialLockError';
|
|
13
|
+
this.code = code;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const RETRY_DELAY_MS = 10;
|
|
17
|
+
const activeProcessLocks = new Set();
|
|
18
|
+
/** Returns true only for documented non-blocking contention failures. */
|
|
19
|
+
function isContention(error) {
|
|
20
|
+
if (!error || typeof error !== 'object' || !('code' in error))
|
|
21
|
+
return false;
|
|
22
|
+
return error.code === 'EACCES' || error.code === 'EAGAIN' || error.code === 'EBUSY';
|
|
23
|
+
}
|
|
24
|
+
/** Applies the platform's exclusive non-blocking one-byte kernel lock. */
|
|
25
|
+
function tryLock(descriptor) {
|
|
26
|
+
/* v8 ignore if -- @preserve */
|
|
27
|
+
if (process.platform === 'win32') {
|
|
28
|
+
lockFileExSync(descriptor, nativeConstants.LOCKFILE_EXCLUSIVE_LOCK | nativeConstants.LOCKFILE_FAIL_IMMEDIATELY, 0, 0, 1, 0);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
fcntlSync(descriptor, 'setlk', nativeConstants.F_WRLCK, 0, 1);
|
|
32
|
+
}
|
|
33
|
+
/** Releases the platform's one-byte kernel lock. */
|
|
34
|
+
function unlock(descriptor) {
|
|
35
|
+
/* v8 ignore if -- @preserve */
|
|
36
|
+
if (process.platform === 'win32') {
|
|
37
|
+
unlockFileExSync(descriptor, 0, 0, 1, 0);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
fcntlSync(descriptor, 'setlk', nativeConstants.F_UNLCK, 0, 1);
|
|
41
|
+
}
|
|
42
|
+
/** Waits briefly while remaining immediately cancellable. */
|
|
43
|
+
async function waitForRetry(signal) {
|
|
44
|
+
if (signal.aborted) {
|
|
45
|
+
throw new CredentialLockError('AUTH_CANCELLED', 'Authentication was cancelled.');
|
|
46
|
+
}
|
|
47
|
+
await new Promise((resolveWait, rejectWait) => {
|
|
48
|
+
const complete = () => {
|
|
49
|
+
signal.removeEventListener('abort', abort);
|
|
50
|
+
resolveWait();
|
|
51
|
+
};
|
|
52
|
+
const timeout = setTimeout(complete, RETRY_DELAY_MS);
|
|
53
|
+
const abort = () => {
|
|
54
|
+
clearTimeout(timeout);
|
|
55
|
+
rejectWait(new CredentialLockError('AUTH_CANCELLED', 'Authentication was cancelled.'));
|
|
56
|
+
};
|
|
57
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/** Runs an operation under a bounded exclusive lock that survives as a file. */
|
|
61
|
+
export async function withCredentialLock(options, operation) {
|
|
62
|
+
const lockPath = resolve(options.lockPath);
|
|
63
|
+
const deadline = performance.now() + options.timeoutMs;
|
|
64
|
+
let handle;
|
|
65
|
+
let processReservation = false;
|
|
66
|
+
let acquired = false;
|
|
67
|
+
let keepProcessAlive;
|
|
68
|
+
try {
|
|
69
|
+
// POSIX record locks are released when this process closes any descriptor
|
|
70
|
+
// for the same file. Reserve the path in-process before opening it so a
|
|
71
|
+
// local waiter can never release the active operation's kernel lock.
|
|
72
|
+
while (!processReservation) {
|
|
73
|
+
if (options.signal.aborted) {
|
|
74
|
+
throw new CredentialLockError('AUTH_CANCELLED', 'Authentication was cancelled.');
|
|
75
|
+
}
|
|
76
|
+
if (!activeProcessLocks.has(lockPath)) {
|
|
77
|
+
activeProcessLocks.add(lockPath);
|
|
78
|
+
processReservation = true;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
if (performance.now() >= deadline) {
|
|
82
|
+
throw new CredentialLockError('CREDENTIAL_LOCK_TIMEOUT', 'Credential storage is busy. Try again.');
|
|
83
|
+
}
|
|
84
|
+
await waitForRetry(options.signal);
|
|
85
|
+
}
|
|
86
|
+
const activeHandle = await open(lockPath, 'a+', 0o600);
|
|
87
|
+
handle = activeHandle;
|
|
88
|
+
while (!acquired) {
|
|
89
|
+
if (options.signal.aborted) {
|
|
90
|
+
throw new CredentialLockError('AUTH_CANCELLED', 'Authentication was cancelled.');
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
tryLock(activeHandle.fd);
|
|
94
|
+
acquired = true;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (!isContention(error))
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
if (performance.now() >= deadline) {
|
|
102
|
+
throw new CredentialLockError('CREDENTIAL_LOCK_TIMEOUT', 'Credential storage is busy. Try again.');
|
|
103
|
+
}
|
|
104
|
+
await waitForRetry(options.signal);
|
|
105
|
+
}
|
|
106
|
+
// A pending promise alone does not keep Node alive. The referenced timer
|
|
107
|
+
// ensures the process cannot exit normally while its operation still owns
|
|
108
|
+
// the kernel lock; crashes and signals still release the lock in-kernel.
|
|
109
|
+
keepProcessAlive = setInterval(() => void activeHandle.fd, 60_000);
|
|
110
|
+
return await operation();
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
if (keepProcessAlive)
|
|
114
|
+
clearInterval(keepProcessAlive);
|
|
115
|
+
try {
|
|
116
|
+
if (acquired && handle)
|
|
117
|
+
unlock(handle.fd);
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
try {
|
|
121
|
+
await handle?.close();
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
if (processReservation)
|
|
125
|
+
activeProcessLocks.delete(lockPath);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=credential-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-lock.js","sourceRoot":"","sources":["../src/credential-lock.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,EACL,SAAS,IAAI,eAAe,EAC5B,SAAS,EACT,cAAc,EACd,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,iEAAiE;AACjE,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,gDAAgD;IACvC,IAAI,CAA+C;IAE5D,mDAAmD;IACnD,YAAY,IAAiC,EAAE,OAAe;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE7C,yEAAyE;AACzE,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5E,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;AACtF,CAAC;AAED,0EAA0E;AAC1E,SAAS,OAAO,CAAC,UAAkB;IACjC,+BAA+B;IAC/B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,cAAc,CACZ,UAAU,EACV,eAAe,CAAC,uBAAuB,GAAG,eAAe,CAAC,yBAAyB,EACnF,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,CACF,CAAC;QACF,OAAO;IACT,CAAC;IACD,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,eAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,oDAAoD;AACpD,SAAS,MAAM,CAAC,UAAkB;IAChC,+BAA+B;IAC/B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,gBAAgB,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IACD,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,eAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,6DAA6D;AAC7D,KAAK,UAAU,YAAY,CAAC,MAAmB;IAC7C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,mBAAmB,CAAC,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,IAAI,OAAO,CAAO,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE;QAClD,MAAM,QAAQ,GAAG,GAAS,EAAE;YAC1B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3C,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,GAAS,EAAE;YACvB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,UAAU,CAAC,IAAI,mBAAmB,CAAC,gBAAgB,EAAE,+BAA+B,CAAC,CAAC,CAAC;QACzF,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA8B,EAC9B,SAA2B;IAE3B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IACvD,IAAI,MAA8B,CAAC;IACnC,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,gBAA4D,CAAC;IACjE,IAAI,CAAC;QACH,0EAA0E;QAC1E,wEAAwE;QACxE,qEAAqE;QACrE,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC3B,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC3B,MAAM,IAAI,mBAAmB,CAAC,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACjC,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,MAAM;YACR,CAAC;YACD,IAAI,WAAW,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAClC,MAAM,IAAI,mBAAmB,CAC3B,yBAAyB,EACzB,wCAAwC,CACzC,CAAC;YACJ,CAAC;YACD,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,GAAG,YAAY,CAAC;QACtB,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjB,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC3B,MAAM,IAAI,mBAAmB,CAAC,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACzB,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;YACR,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;oBAAE,MAAM,KAAK,CAAC;YACxC,CAAC;YACD,IAAI,WAAW,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAClC,MAAM,IAAI,mBAAmB,CAC3B,yBAAyB,EACzB,wCAAwC,CACzC,CAAC;YACJ,CAAC;YACD,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,yEAAyE;QACzE,0EAA0E;QAC1E,yEAAyE;QACzE,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnE,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,IAAI,gBAAgB;YAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,IAAI,QAAQ,IAAI,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;YACxB,CAAC;oBAAS,CAAC;gBACT,IAAI,kBAAkB;oBAAE,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*
|
|
18
18
|
* @module credential-store
|
|
19
19
|
*/
|
|
20
|
+
import type { CliCredentialPersistence } from '@portaidentity/sdk/node';
|
|
20
21
|
/**
|
|
21
22
|
* User info embedded in stored credentials.
|
|
22
23
|
* Contains the OIDC subject identifier and basic profile data.
|
|
@@ -77,6 +78,8 @@ export declare function loadCredentials(): StoredCredentials | null;
|
|
|
77
78
|
* @param credentials - The credentials to persist
|
|
78
79
|
*/
|
|
79
80
|
export declare function saveCredentials(credentials: StoredCredentials): void;
|
|
81
|
+
/** Persists login credentials under the same lock and atomic-write contract as refresh. */
|
|
82
|
+
export declare function saveCredentialsDurably(credentials: StoredCredentials, signal?: AbortSignal): Promise<void>;
|
|
80
83
|
/**
|
|
81
84
|
* Deletes the stored credentials file.
|
|
82
85
|
*
|
|
@@ -97,6 +100,17 @@ export declare function hasCredentials(): boolean;
|
|
|
97
100
|
* @returns Absolute path to credentials.json
|
|
98
101
|
*/
|
|
99
102
|
export declare function getCredentialsPath(): string;
|
|
103
|
+
/** Options for durable SDK refresh persistence owned by the CLI. */
|
|
104
|
+
export interface CliCredentialPersistenceOptions {
|
|
105
|
+
/** Credential file to replace atomically. */
|
|
106
|
+
readonly credentialsPath?: string;
|
|
107
|
+
/** Maximum time to wait for another CLI process. */
|
|
108
|
+
readonly lockTimeoutMs: number;
|
|
109
|
+
/** Optional cancellation signal for lock acquisition. */
|
|
110
|
+
readonly signal?: AbortSignal;
|
|
111
|
+
}
|
|
112
|
+
/** Creates the CLI-owned lock and atomic-write hooks used by SDK refresh. */
|
|
113
|
+
export declare function createCliCredentialPersistence(options: CliCredentialPersistenceOptions): CliCredentialPersistence;
|
|
100
114
|
/**
|
|
101
115
|
* Checks whether the access token is expired (with 60s safety buffer).
|
|
102
116
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAOxE;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAmFD;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,GAAG,IAAI,CAW1D;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAUpE;AAED,2FAA2F;AAC3F,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,iBAAiB,EAC9B,MAAM,GAAE,WAA0C,GACjD,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAQvC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,oEAAoE;AACpE,MAAM,WAAW,+BAA+B;IAC9C,6CAA6C;IAC7C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,oDAAoD;IACpD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AA8BD,6EAA6E;AAC7E,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,+BAA+B,GACvC,wBAAwB,CAiB1B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAMtE"}
|
package/dist/credential-store.js
CHANGED
|
@@ -17,9 +17,12 @@
|
|
|
17
17
|
*
|
|
18
18
|
* @module credential-store
|
|
19
19
|
*/
|
|
20
|
-
import { readFileSync, writeFileSync, mkdirSync, unlinkSync, existsSync
|
|
21
|
-
import {
|
|
20
|
+
import { readFileSync, writeFileSync, mkdirSync, unlinkSync, existsSync } from 'node:fs';
|
|
21
|
+
import { chmod, mkdir, open, rename, rm } from 'node:fs/promises';
|
|
22
|
+
import { randomBytes } from 'node:crypto';
|
|
23
|
+
import { dirname, join } from 'node:path';
|
|
22
24
|
import { homedir } from 'node:os';
|
|
25
|
+
import { withCredentialLock } from './credential-lock.js';
|
|
23
26
|
// ---------------------------------------------------------------------------
|
|
24
27
|
// Constants
|
|
25
28
|
// ---------------------------------------------------------------------------
|
|
@@ -31,6 +34,62 @@ const CREDENTIALS_PATH = join(PORTA_DIR, 'credentials.json');
|
|
|
31
34
|
const FILE_MODE = 0o600;
|
|
32
35
|
/** Directory permissions: owner access only (0700) */
|
|
33
36
|
const DIR_MODE = 0o700;
|
|
37
|
+
/** Maximum wait for another CLI process to finish a credential update. */
|
|
38
|
+
const LOGIN_LOCK_TIMEOUT_MS = 5_000;
|
|
39
|
+
/** Organization slug format shared with Porta's server-side validator. */
|
|
40
|
+
const ORGANIZATION_SLUG = /^[a-z0-9][a-z0-9-]{1,98}[a-z0-9]$/;
|
|
41
|
+
/** Returns true for a non-empty string accepted at a credential boundary. */
|
|
42
|
+
function isNonEmptyString(value) {
|
|
43
|
+
return typeof value === 'string' && value.length > 0;
|
|
44
|
+
}
|
|
45
|
+
/** Validates a stored credential snapshot before any field is trusted. */
|
|
46
|
+
function parseStoredCredentials(value) {
|
|
47
|
+
if (!value || typeof value !== 'object')
|
|
48
|
+
return null;
|
|
49
|
+
const candidate = value;
|
|
50
|
+
const userInfoValue = candidate.userInfo;
|
|
51
|
+
if (!userInfoValue || typeof userInfoValue !== 'object')
|
|
52
|
+
return null;
|
|
53
|
+
const userInfo = userInfoValue;
|
|
54
|
+
if (!isNonEmptyString(candidate.server) ||
|
|
55
|
+
!isNonEmptyString(candidate.orgSlug) ||
|
|
56
|
+
!ORGANIZATION_SLUG.test(candidate.orgSlug) ||
|
|
57
|
+
!isNonEmptyString(candidate.clientId) ||
|
|
58
|
+
!isNonEmptyString(candidate.accessToken) ||
|
|
59
|
+
(candidate.refreshToken !== undefined && typeof candidate.refreshToken !== 'string') ||
|
|
60
|
+
!isNonEmptyString(candidate.idToken) ||
|
|
61
|
+
!isNonEmptyString(candidate.expiresAt) ||
|
|
62
|
+
Number.isNaN(Date.parse(candidate.expiresAt)) ||
|
|
63
|
+
!isNonEmptyString(userInfo.sub) ||
|
|
64
|
+
typeof userInfo.email !== 'string' ||
|
|
65
|
+
(userInfo.name !== undefined && typeof userInfo.name !== 'string')) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const server = new URL(candidate.server);
|
|
70
|
+
if (server.protocol !== 'https:' ||
|
|
71
|
+
server.username ||
|
|
72
|
+
server.password ||
|
|
73
|
+
!/^\/*$/.test(server.pathname) ||
|
|
74
|
+
server.search ||
|
|
75
|
+
server.hash) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
server: candidate.server,
|
|
84
|
+
orgSlug: candidate.orgSlug,
|
|
85
|
+
clientId: candidate.clientId,
|
|
86
|
+
accessToken: candidate.accessToken,
|
|
87
|
+
refreshToken: isNonEmptyString(candidate.refreshToken) ? candidate.refreshToken : undefined,
|
|
88
|
+
idToken: candidate.idToken,
|
|
89
|
+
expiresAt: candidate.expiresAt,
|
|
90
|
+
userInfo: { sub: userInfo.sub, email: userInfo.email, name: userInfo.name },
|
|
91
|
+
};
|
|
92
|
+
}
|
|
34
93
|
// ---------------------------------------------------------------------------
|
|
35
94
|
// Public API
|
|
36
95
|
// ---------------------------------------------------------------------------
|
|
@@ -48,7 +107,7 @@ export function loadCredentials() {
|
|
|
48
107
|
return null;
|
|
49
108
|
}
|
|
50
109
|
const raw = readFileSync(CREDENTIALS_PATH, 'utf-8');
|
|
51
|
-
return JSON.parse(raw);
|
|
110
|
+
return parseStoredCredentials(JSON.parse(raw));
|
|
52
111
|
}
|
|
53
112
|
catch {
|
|
54
113
|
// Corrupt file or parse error — treat as no credentials
|
|
@@ -73,6 +132,15 @@ export function saveCredentials(credentials) {
|
|
|
73
132
|
encoding: 'utf-8',
|
|
74
133
|
});
|
|
75
134
|
}
|
|
135
|
+
/** Persists login credentials under the same lock and atomic-write contract as refresh. */
|
|
136
|
+
export async function saveCredentialsDurably(credentials, signal = new AbortController().signal) {
|
|
137
|
+
await prepareCredentialDirectory(CREDENTIALS_PATH);
|
|
138
|
+
await withCredentialLock({
|
|
139
|
+
lockPath: `${CREDENTIALS_PATH}.lock`,
|
|
140
|
+
timeoutMs: LOGIN_LOCK_TIMEOUT_MS,
|
|
141
|
+
signal,
|
|
142
|
+
}, async () => persistAtomically(CREDENTIALS_PATH, credentials));
|
|
143
|
+
}
|
|
76
144
|
/**
|
|
77
145
|
* Deletes the stored credentials file.
|
|
78
146
|
*
|
|
@@ -106,6 +174,49 @@ export function hasCredentials() {
|
|
|
106
174
|
export function getCredentialsPath() {
|
|
107
175
|
return CREDENTIALS_PATH;
|
|
108
176
|
}
|
|
177
|
+
/** Creates and corrects the owner-only directory needed by a credential path. */
|
|
178
|
+
async function prepareCredentialDirectory(path) {
|
|
179
|
+
const directory = dirname(path);
|
|
180
|
+
await mkdir(directory, { recursive: true, mode: DIR_MODE });
|
|
181
|
+
await chmod(directory, DIR_MODE);
|
|
182
|
+
}
|
|
183
|
+
/** Writes a credential snapshot through an owner-only sibling and atomic rename. */
|
|
184
|
+
async function persistAtomically(path, credentials) {
|
|
185
|
+
await prepareCredentialDirectory(path);
|
|
186
|
+
const temporaryPath = `${path}.${randomBytes(12).toString('hex')}.tmp`;
|
|
187
|
+
const handle = await open(temporaryPath, 'wx', FILE_MODE);
|
|
188
|
+
try {
|
|
189
|
+
try {
|
|
190
|
+
await handle.writeFile(JSON.stringify(credentials), 'utf8');
|
|
191
|
+
await handle.sync();
|
|
192
|
+
await handle.chmod(FILE_MODE);
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
await handle.close();
|
|
196
|
+
}
|
|
197
|
+
await rename(temporaryPath, path);
|
|
198
|
+
await chmod(path, FILE_MODE);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
await rm(temporaryPath, { force: true });
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/** Creates the CLI-owned lock and atomic-write hooks used by SDK refresh. */
|
|
206
|
+
export function createCliCredentialPersistence(options) {
|
|
207
|
+
const credentialsPath = options.credentialsPath ?? CREDENTIALS_PATH;
|
|
208
|
+
const signal = options.signal ?? new AbortController().signal;
|
|
209
|
+
return {
|
|
210
|
+
withRefreshLock: (operation) => withCredentialLock({
|
|
211
|
+
lockPath: `${credentialsPath}.lock`,
|
|
212
|
+
timeoutMs: options.lockTimeoutMs,
|
|
213
|
+
signal,
|
|
214
|
+
}, operation),
|
|
215
|
+
persistRefreshedCredentials: async (_previous, refreshed) => {
|
|
216
|
+
await persistAtomically(credentialsPath, refreshed);
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
109
220
|
/**
|
|
110
221
|
* Checks whether the access token is expired (with 60s safety buffer).
|
|
111
222
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAmBH,gCAAgC;AAChC,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAMvC;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,EACnD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EACjC,OAAO,UAAQ,GACd,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAQ/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,UAAQ,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAmBH,gCAAgC;AAChC,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAMvC;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,EACnD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EACjC,OAAO,UAAQ,GACd,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAQ/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,UAAQ,GAAG,KAAK,CAuFhE"}
|
package/dist/error-handler.js
CHANGED
|
@@ -114,6 +114,8 @@ export function handleError(err, verbose = false) {
|
|
|
114
114
|
// --- SDK Server Error (5xx) ---
|
|
115
115
|
if (err instanceof PortaServerError) {
|
|
116
116
|
printError(`Server error (${err.status}): ${err.message}`);
|
|
117
|
+
if (err.requestId)
|
|
118
|
+
printError(`Request ID: ${err.requestId}`);
|
|
117
119
|
if (verbose)
|
|
118
120
|
printVerboseDetails(err);
|
|
119
121
|
process.exit(EXIT_GENERAL_ERROR);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AAElD,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,gCAAgC;AAChC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEvC,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAAiC,EACjC,OAAO,GAAG,KAAK;IAEf,OAAO,KAAK,EAAE,GAAG,IAAO,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY,EAAE,OAAO,GAAG,KAAK;IACvD,qCAAqC;IACrC,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;QACxC,UAAU,CAAC,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBACjC,UAAU,CAAC,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,IAAI,OAAO;YAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACtC,CAAC;IAED,yCAAyC;IACzC,IAAI,GAAG,YAAY,wBAAwB,EAAE,CAAC;QAC5C,UAAU,CAAC,0BAA0B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,UAAU,CAAC,oCAAoC,CAAC,CAAC;QACjD,IAAI,OAAO;YAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;QACvC,UAAU,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,UAAU,CAAC,8DAA8D,CAAC,CAAC;QAC3E,IAAI,OAAO;YAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;QACtC,UAAU,CAAC,cAAc,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,IAAI,OAAO;YAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnC,CAAC;IAED,mCAAmC;IACnC,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;QACtC,UAAU,CAAC,aAAa,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,OAAO;YAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnC,CAAC;IAED,qCAAqC;IACrC,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,UAAU,CAAC,wBAAwB,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC;QAC7D,IAAI,OAAO;YAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnC,CAAC;IAED,iCAAiC;IACjC,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;QACpC,UAAU,CAAC,iBAAiB,GAAG,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,IAAI,OAAO;YAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnC,CAAC;IAED,iCAAiC;IACjC,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;QAClC,UAAU,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,IAAI,OAAO;YAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnC,CAAC;IAED,4BAA4B;IAC5B,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnC,CAAC;IAED,yBAAyB;IACzB,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnC,CAAC;IAED,wBAAwB;IACxB,UAAU,CAAC,iCAAiC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACnC,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,GAAmB;IAC9C,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/global-options.d.ts
CHANGED
|
@@ -47,4 +47,12 @@ export interface GlobalOptions {
|
|
|
47
47
|
* @throws Error if no server URL can be determined
|
|
48
48
|
*/
|
|
49
49
|
export declare function resolveServerUrl(options: GlobalOptions): string;
|
|
50
|
+
/**
|
|
51
|
+
* Validates and canonicalizes an HTTPS server origin.
|
|
52
|
+
*
|
|
53
|
+
* @param value - Candidate URL from CLI, environment, or credentials.
|
|
54
|
+
* @returns Canonical URL containing only scheme, host, and optional port.
|
|
55
|
+
* @throws Error when the value is not an HTTPS origin.
|
|
56
|
+
*/
|
|
57
|
+
export declare function normalizeServerOrigin(value: string | URL): URL;
|
|
50
58
|
//# sourceMappingURL=global-options.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-options.d.ts","sourceRoot":"","sources":["../src/global-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,IAAI,EAAE,OAAO,CAAC;IACd,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,QAAQ,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,KAAK,EAAE,OAAO,CAAC;CAChB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAsB/D"}
|
|
1
|
+
{"version":3,"file":"global-options.d.ts","sourceRoot":"","sources":["../src/global-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,IAAI,EAAE,OAAO,CAAC;IACd,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,QAAQ,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,KAAK,EAAE,OAAO,CAAC;CAChB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAsB/D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,GAAG,CAc9D"}
|
package/dist/global-options.js
CHANGED
|
@@ -35,28 +35,39 @@ import { loadCredentials } from './credential-store.js';
|
|
|
35
35
|
export function resolveServerUrl(options) {
|
|
36
36
|
// Priority 1: --server flag
|
|
37
37
|
if (options.server) {
|
|
38
|
-
return
|
|
38
|
+
return normalizeServerOrigin(options.server).origin;
|
|
39
39
|
}
|
|
40
40
|
// Priority 2: PORTA_SERVER environment variable
|
|
41
41
|
const envUrl = process.env.PORTA_SERVER;
|
|
42
42
|
if (envUrl) {
|
|
43
|
-
return
|
|
43
|
+
return normalizeServerOrigin(envUrl).origin;
|
|
44
44
|
}
|
|
45
45
|
// Priority 3: Credentials file
|
|
46
46
|
const credentials = loadCredentials();
|
|
47
47
|
if (credentials?.server) {
|
|
48
|
-
return
|
|
48
|
+
return normalizeServerOrigin(credentials.server).origin;
|
|
49
49
|
}
|
|
50
50
|
// Priority 4: No server configured
|
|
51
51
|
throw new Error('No Porta server configured. Use --server, set PORTA_SERVER, or run "porta login" first.');
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
|
-
*
|
|
54
|
+
* Validates and canonicalizes an HTTPS server origin.
|
|
55
55
|
*
|
|
56
|
-
* @param
|
|
57
|
-
* @returns URL
|
|
56
|
+
* @param value - Candidate URL from CLI, environment, or credentials.
|
|
57
|
+
* @returns Canonical URL containing only scheme, host, and optional port.
|
|
58
|
+
* @throws Error when the value is not an HTTPS origin.
|
|
58
59
|
*/
|
|
59
|
-
function
|
|
60
|
-
|
|
60
|
+
export function normalizeServerOrigin(value) {
|
|
61
|
+
const url = new URL(value);
|
|
62
|
+
if (url.protocol !== 'https:' ||
|
|
63
|
+
url.username ||
|
|
64
|
+
url.password ||
|
|
65
|
+
!/^\/*$/.test(url.pathname) ||
|
|
66
|
+
url.search ||
|
|
67
|
+
url.hash) {
|
|
68
|
+
throw new Error('Porta server must be an HTTPS origin without credentials or a path.');
|
|
69
|
+
}
|
|
70
|
+
url.pathname = '/';
|
|
71
|
+
return url;
|
|
61
72
|
}
|
|
62
73
|
//# sourceMappingURL=global-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-options.js","sourceRoot":"","sources":["../src/global-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAyBxD,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAsB;IACrD,4BAA4B;IAC5B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,
|
|
1
|
+
{"version":3,"file":"global-options.js","sourceRoot":"","sources":["../src/global-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAyBxD,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAsB;IACrD,4BAA4B;IAC5B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACtD,CAAC;IAED,gDAAgD;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAC9C,CAAC;IAED,+BAA+B;IAC/B,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,IAAI,WAAW,EAAE,MAAM,EAAE,CAAC;QACxB,OAAO,qBAAqB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAC1D,CAAC;IAED,mCAAmC;IACnC,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAmB;IACvD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,IACE,GAAG,CAAC,QAAQ,KAAK,QAAQ;QACzB,GAAG,CAAC,QAAQ;QACZ,GAAG,CAAC,QAAQ;QACZ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,GAAG,CAAC,MAAM;QACV,GAAG,CAAC,IAAI,EACR,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC;IACnB,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -40,13 +40,14 @@ import { userCommand } from './commands/user.js';
|
|
|
40
40
|
import { keysCommand } from './commands/keys.js';
|
|
41
41
|
import { configCommand } from './commands/config.js';
|
|
42
42
|
import { auditCommand } from './commands/audit.js';
|
|
43
|
-
import { provisionCommand } from './commands/provision.js';
|
|
44
43
|
import { healthCommand } from './commands/health.js';
|
|
45
44
|
import { sessionsCommand } from './commands/sessions.js';
|
|
46
45
|
import { bulkCommand } from './commands/bulk.js';
|
|
47
46
|
import { statsCommand } from './commands/stats.js';
|
|
48
47
|
import { exportsCommand } from './commands/exports.js';
|
|
49
|
-
import {
|
|
48
|
+
import { exportCommand } from './commands/export.js';
|
|
49
|
+
import { importCommand } from './commands/import.js';
|
|
50
|
+
import { adminCommand } from './commands/admin.js';
|
|
50
51
|
/**
|
|
51
52
|
* Builds and runs the CLI.
|
|
52
53
|
*
|
|
@@ -106,11 +107,12 @@ async function main() {
|
|
|
106
107
|
.command(statsCommand)
|
|
107
108
|
.command(bulkCommand)
|
|
108
109
|
.command(exportsCommand)
|
|
109
|
-
.command(
|
|
110
|
+
.command(exportCommand)
|
|
111
|
+
.command(importCommand)
|
|
110
112
|
// Unauthenticated commands
|
|
111
113
|
.command(healthCommand)
|
|
112
|
-
//
|
|
113
|
-
.command(
|
|
114
|
+
// Embedded administration application (handles its own session)
|
|
115
|
+
.command(adminCommand)
|
|
114
116
|
.demandCommand(1, 'Please specify a command')
|
|
115
117
|
.strict()
|
|
116
118
|
.help()
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
CHANGED
|
@@ -11,6 +11,17 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @module output
|
|
13
13
|
*/
|
|
14
|
+
/**
|
|
15
|
+
* Replace terminal control characters before rendering untrusted text.
|
|
16
|
+
*
|
|
17
|
+
* JSON output remains untouched because `JSON.stringify` escapes controls for machine consumers.
|
|
18
|
+
* Human output uses this boundary to prevent stored names or labels from emitting terminal escape
|
|
19
|
+
* sequences, changing the screen, or writing to the clipboard.
|
|
20
|
+
*
|
|
21
|
+
* @param value - Text that may originate from the server or command input
|
|
22
|
+
* @returns Printable text with C0, DEL, and C1 controls replaced
|
|
23
|
+
*/
|
|
24
|
+
export declare function sanitizeTerminalText(value: string): string;
|
|
14
25
|
/**
|
|
15
26
|
* Formats data as a table and prints to stdout.
|
|
16
27
|
*
|
package/dist/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAMpE;
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAMpE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAIzE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,CAGzD"}
|