ugly-app 0.1.963 → 0.1.965
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/dist/character/client/index.d.ts +1 -1
- package/dist/character/client/index.d.ts.map +1 -1
- package/dist/character/client/index.js +4 -1
- package/dist/character/client/index.js.map +1 -1
- package/dist/cli/auth/cloudflareOauth.d.ts +54 -19
- package/dist/cli/auth/cloudflareOauth.d.ts.map +1 -1
- package/dist/cli/auth/cloudflareOauth.js +96 -54
- package/dist/cli/auth/cloudflareOauth.js.map +1 -1
- package/dist/cli/auth/credentials.d.ts +21 -1
- package/dist/cli/auth/credentials.d.ts.map +1 -1
- package/dist/cli/auth/credentials.js +18 -18
- package/dist/cli/auth/credentials.js.map +1 -1
- package/dist/cli/auth/refreshCli.d.ts +59 -0
- package/dist/cli/auth/refreshCli.d.ts.map +1 -0
- package/dist/cli/auth/refreshCli.js +123 -0
- package/dist/cli/auth/refreshCli.js.map +1 -0
- package/dist/cli/index.js +25 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/publish/orchestrator.d.ts.map +1 -1
- package/dist/cli/publish/orchestrator.js +10 -4
- package/dist/cli/publish/orchestrator.js.map +1 -1
- package/dist/cli/refreshCommand.d.ts +17 -0
- package/dist/cli/refreshCommand.d.ts.map +1 -0
- package/dist/cli/refreshCommand.js +34 -0
- package/dist/cli/refreshCommand.js.map +1 -0
- package/dist/cli/tailCommand.d.ts.map +1 -1
- package/dist/cli/tailCommand.js +3 -1
- package/dist/cli/tailCommand.js.map +1 -1
- package/dist/cli/telemetryAuth.d.ts +4 -2
- package/dist/cli/telemetryAuth.d.ts.map +1 -1
- package/dist/cli/telemetryAuth.js +19 -12
- package/dist/cli/telemetryAuth.js.map +1 -1
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/package.json +1 -1
- package/src/character/client/index.ts +3 -0
- package/src/cli/auth/cloudflareOauth.ts +148 -54
- package/src/cli/auth/cloudflareRefresh.test.ts +274 -0
- package/src/cli/auth/credentials.ts +41 -3
- package/src/cli/auth/refreshCli.ts +163 -0
- package/src/cli/index.ts +40 -0
- package/src/cli/publish/orchestrator.ts +10 -4
- package/src/cli/refreshCommand.ts +48 -0
- package/src/cli/tailCommand.ts +3 -1
- package/src/cli/telemetryAuth.ts +20 -12
- package/src/cli/version.ts +1 -1
|
@@ -12,7 +12,7 @@ export type { CharPart, PartManifest, EyesManifest, MouthManifest, } from './lib
|
|
|
12
12
|
export { CharPartDraw } from './lib/charPartDraw.js';
|
|
13
13
|
export { loadHairMeshes, HAIR_CUTOUT } from './lib/charHair.js';
|
|
14
14
|
export type { HairMeshes, HairManifest, GeoStyle } from './lib/charHair.js';
|
|
15
|
-
export { loadGarments, garmentSlotById, conformGarment, garmentNormals, wornOver, drapeOverInner, GARMENT_SLOTS, } from './lib/charGarment.js';
|
|
15
|
+
export { loadGarments, garmentSlotById, transferSkinWeights, conformGarment, garmentNormals, wornOver, drapeOverInner, GARMENT_SLOTS, } from './lib/charGarment.js';
|
|
16
16
|
export type { Garment, GarmentKit, GarmentRung, GarmentSlot, GarmentMeta, GarmentManifest, } from './lib/charGarment.js';
|
|
17
17
|
export { makeSkinCache, makeHairCache, makeGarmentCache, loadSkinManifest, loadHairTextures, } from './lib/skinTextures.js';
|
|
18
18
|
export type { SkinCache, SkinManifest } from './lib/skinTextures.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/character/client/index.ts"],"names":[],"mappings":"AAUA,cAAc,oBAAoB,CAAC;AAInC,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EACL,YAAY,EACZ,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/character/client/index.ts"],"names":[],"mappings":"AAUA,cAAc,oBAAoB,CAAC;AAInC,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EACL,YAAY,EACZ,eAAe,EAGf,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,QAAQ,EACR,cAAc,EACd,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,OAAO,EACP,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACpE,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,oBAAoB,EACpB,YAAY,EACZ,SAAS,GACV,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAgBzD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACzE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EACL,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EACL,SAAS,EACT,OAAO,EACP,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAChF,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -18,7 +18,10 @@ export { loadCharKit } from './lib/charKit.js';
|
|
|
18
18
|
export { loadCharParts, paintMouth, partDigestOk } from './lib/charParts.js';
|
|
19
19
|
export { CharPartDraw } from './lib/charPartDraw.js';
|
|
20
20
|
export { loadHairMeshes, HAIR_CUTOUT } from './lib/charHair.js';
|
|
21
|
-
export { loadGarments, garmentSlotById,
|
|
21
|
+
export { loadGarments, garmentSlotById,
|
|
22
|
+
// Needed by a consumer assembling its own scene — the cook-time skin-weight
|
|
23
|
+
// transfer a garment needs against a morphed body. See the export note below.
|
|
24
|
+
transferSkinWeights, conformGarment, garmentNormals, wornOver, drapeOverInner, GARMENT_SLOTS, } from './lib/charGarment.js';
|
|
22
25
|
export { makeSkinCache, makeHairCache, makeGarmentCache, loadSkinManifest, loadHairTextures, } from './lib/skinTextures.js';
|
|
23
26
|
export { loadFbxClip, fbxClipNames } from './lib/fbxClips.js';
|
|
24
27
|
export { useCharSpeech, speechChannels } from './lib/charSpeech.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/character/client/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kCAAkC;AAClC,EAAE;AACF,0FAA0F;AAC1F,2FAA2F;AAC3F,uEAAuE;AACvE,EAAE;AACF,wFAAwF;AACxF,uFAAuF;AACvF,gFAAgF;AAChF,cAAc,oBAAoB,CAAC;AAEnC,4FAA4F;AAC5F,8EAA8E;AAC9E,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQ7E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhE,OAAO,EACL,YAAY,EACZ,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/character/client/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kCAAkC;AAClC,EAAE;AACF,0FAA0F;AAC1F,2FAA2F;AAC3F,uEAAuE;AACvE,EAAE;AACF,wFAAwF;AACxF,uFAAuF;AACvF,gFAAgF;AAChF,cAAc,oBAAoB,CAAC;AAEnC,4FAA4F;AAC5F,8EAA8E;AAC9E,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQ7E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhE,OAAO,EACL,YAAY,EACZ,eAAe;AACf,4EAA4E;AAC5E,8EAA8E;AAC9E,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,QAAQ,EACR,cAAc,EACd,aAAa,GACd,MAAM,sBAAsB,CAAC;AAU9B,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOpE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,gFAAgF;AAChF,6CAA6C;AAC7C,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,gDAAgD;AAChD,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,4EAA4E;AAC5E,2EAA2E;AAC3E,gFAAgF;AAChF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGzE,OAAO,EACL,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGtE,OAAO,EACL,SAAS,EACT,OAAO,EACP,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAQvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQzD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CloudflareCredentials } from './credentials.js';
|
|
2
|
+
import { type RefreshSpawnDeps } from './refreshCli.js';
|
|
2
3
|
export interface RunCloudflareOAuthOptions {
|
|
3
4
|
/** Local callback server port (default 8976). */
|
|
4
5
|
port?: number | undefined;
|
|
@@ -37,28 +38,62 @@ export declare function refreshCloudflareToken(refreshToken: string): Promise<{
|
|
|
37
38
|
refreshToken?: string;
|
|
38
39
|
expiresAt: number;
|
|
39
40
|
} | undefined>;
|
|
41
|
+
export interface RefreshHealOptions {
|
|
42
|
+
/**
|
|
43
|
+
* When true, the refresh CLI is spawned and AWAITED — for callers where the
|
|
44
|
+
* token is load-bearing for the current operation (deploy steps, `tail`).
|
|
45
|
+
* When false/absent (default), the refresh CLI is fired detached and the
|
|
46
|
+
* caller proceeds best-effort with the token it already has.
|
|
47
|
+
*/
|
|
48
|
+
awaitRefresh?: boolean | undefined;
|
|
49
|
+
/** Test seam — observe spawning without launching a real child process. */
|
|
50
|
+
deps?: RefreshSpawnDeps | undefined;
|
|
51
|
+
}
|
|
40
52
|
/**
|
|
41
|
-
* Return a fresh Cloudflare access token
|
|
42
|
-
* of expiry
|
|
43
|
-
*
|
|
44
|
-
*
|
|
53
|
+
* Return a fresh Cloudflare access token. When the cached token is within
|
|
54
|
+
* REFRESH_SKEW_MS of expiry, the refresh is handed to the
|
|
55
|
+
* `ugly-app refresh cloudflare` CLI (which runs it under the cross-process
|
|
56
|
+
* credentials lock) rather than being performed inline: by default the CLI is
|
|
57
|
+
* fired detached and this returns the best available (possibly stale) creds so
|
|
58
|
+
* the request path never blocks on the lock; with `awaitRefresh: true` the
|
|
59
|
+
* CLI's exit is awaited and the healed credentials are re-read.
|
|
60
|
+
*
|
|
61
|
+
* Returns `undefined` when not signed in or no refresh token exists.
|
|
45
62
|
*/
|
|
46
|
-
export declare function getFreshCloudflareCredentials(): Promise<CloudflareCredentials | undefined>;
|
|
63
|
+
export declare function getFreshCloudflareCredentials(opts?: RefreshHealOptions): Promise<CloudflareCredentials | undefined>;
|
|
47
64
|
/**
|
|
48
|
-
* FORCE a token refresh (ignoring the local `expiresAt`)
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* Runs inside the cross-process credentials lock. Pass `staleToken` — the access
|
|
53
|
-
* token that just 401'd — so that if another process already rotated the token
|
|
54
|
-
* out from under us (the on-disk access token no longer matches), we return the
|
|
55
|
-
* fresh token WITHOUT consuming the single-use refresh token a second time. This
|
|
56
|
-
* is the dedupe that collapses concurrent 401 storms into a single refresh and
|
|
57
|
-
* stops the refresh chain from being breach-invalidated.
|
|
65
|
+
* FORCE a token refresh (ignoring the local `expiresAt`). For callers that hit
|
|
66
|
+
* a real 401 despite a locally-"valid" token — the cached `expiresAt` can lie
|
|
67
|
+
* (revoked token, or a mis-computed expiry).
|
|
58
68
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
69
|
+
* Pass `staleToken` — the access token that just 401'd. If the on-disk access
|
|
70
|
+
* token no longer matches, another process already rotated it and we reuse the
|
|
71
|
+
* fresh one WITHOUT firing another refresh. Otherwise the refresh is handed to
|
|
72
|
+
* the `ugly-app refresh cloudflare` CLI with the same stale-token dedupe (the
|
|
73
|
+
* command no-ops if the on-disk token moved on), collapsing a concurrent 401
|
|
74
|
+
* storm into a single locked refresh. Fire-and-forget by default (returns the
|
|
75
|
+
* current creds; the retry uses a rotated token only if one already landed);
|
|
76
|
+
* `awaitRefresh: true` blocks on the CLI and re-reads.
|
|
77
|
+
*/
|
|
78
|
+
export declare function forceRefreshCloudflareCredentials(staleToken?: string, opts?: RefreshHealOptions): Promise<CloudflareCredentials | undefined>;
|
|
79
|
+
export type CloudflareRefreshStatus = 'refreshed' | 'already-fresh' | 'no-session';
|
|
80
|
+
export interface RefreshNowOptions {
|
|
81
|
+
/** Refresh even when the cached `expiresAt` still looks fresh. */
|
|
82
|
+
force?: boolean;
|
|
83
|
+
/** Only refresh if the on-disk access token still equals this (401-storm dedupe). */
|
|
84
|
+
staleToken?: string;
|
|
85
|
+
/** Test seam — stub the token endpoint. Defaults to the real fetch. */
|
|
86
|
+
refreshTokenFn?: typeof refreshCloudflareToken;
|
|
87
|
+
/** Test seam — override the lock wait budget. */
|
|
88
|
+
lockTimeoutMs?: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The body of `ugly-app refresh cloudflare` — THE single locked refresh path.
|
|
92
|
+
* Acquires the credentials lock (waiting up to REFRESH_LOCK_TIMEOUT_MS and
|
|
93
|
+
* failing cleanly on timeout — it never refreshes unlocked), re-reads inside
|
|
94
|
+
* the lock, no-ops when the token is fresh or was already rotated by someone
|
|
95
|
+
* else, and refreshes + persists (including the rotated single-use refresh
|
|
96
|
+
* token) when stale. Throws when the refresh token is rejected.
|
|
62
97
|
*/
|
|
63
|
-
export declare function
|
|
98
|
+
export declare function refreshCloudflareCredentialsNow(opts?: RefreshNowOptions): Promise<CloudflareRefreshStatus>;
|
|
64
99
|
//# sourceMappingURL=cloudflareOauth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflareOauth.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/cloudflareOauth.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,qBAAqB,EAI3B,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cloudflareOauth.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/cloudflareOauth.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,qBAAqB,EAI3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,iBAAiB,CAAC;AAgGzB,MAAM,WAAW,yBAAyB;IACxC,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAYD;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CA2EhC;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,GACnB,OAAO,CACR;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAC9E,CAsBA;AAkBD,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,2EAA2E;IAC3E,IAAI,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACrC;AAyBD;;;;;;;;;;GAUG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAM5C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iCAAiC,CACrD,UAAU,CAAC,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAU5C;AAED,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG,eAAe,GAAG,YAAY,CAAC;AAEnF,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,sBAAsB,CAAC;IAC/C,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAsB,+BAA+B,CACnD,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,uBAAuB,CAAC,CAoClC"}
|
|
@@ -3,6 +3,7 @@ import { openInBrowser } from './browser.js';
|
|
|
3
3
|
import { startCallbackServer } from './callbackServer.js';
|
|
4
4
|
import { generateCodeChallenge, generateCodeVerifier, generateState, } from './pkce.js';
|
|
5
5
|
import { getCloudflareCredentials, setCloudflareCredentials, withCredentialsLock, } from './credentials.js';
|
|
6
|
+
import { runCloudflareRefreshCli, triggerCloudflareRefresh, } from './refreshCli.js';
|
|
6
7
|
import { parseOrLog, parseOrThrow } from '../../shared/parseWithZod.js';
|
|
7
8
|
/**
|
|
8
9
|
* Cloudflare OAuth configuration.
|
|
@@ -197,16 +198,48 @@ export async function refreshCloudflareToken(refreshToken) {
|
|
|
197
198
|
/**
|
|
198
199
|
* How far before local `expiresAt` we proactively refresh. Bumped from 60s to
|
|
199
200
|
* 5 min so a token doesn't expire mid-operation (a multi-step publish can outlive
|
|
200
|
-
* a 60s window).
|
|
201
|
+
* a 60s window).
|
|
201
202
|
*/
|
|
202
203
|
const REFRESH_SKEW_MS = 300_000;
|
|
203
204
|
/**
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
205
|
+
* Lock budget for the refresh command's critical section. A refresh must NEVER
|
|
206
|
+
* run without the cross-process lock (an unlocked refresh can double-consume
|
|
207
|
+
* the single-use refresh token and breach-invalidate the chain), so the command
|
|
208
|
+
* waits far longer than the legacy 10s best-effort budget and fails cleanly
|
|
209
|
+
* (`onTimeout: 'throw'`) rather than proceeding unlocked.
|
|
208
210
|
*/
|
|
209
|
-
|
|
211
|
+
const REFRESH_LOCK_TIMEOUT_MS = 60_000;
|
|
212
|
+
/**
|
|
213
|
+
* Route a needed refresh through the `ugly-app refresh cloudflare` CLI (the
|
|
214
|
+
* single locked refresh path) instead of refreshing inline. Fire-and-forget
|
|
215
|
+
* by default; awaited when `opts.awaitRefresh`. After an awaited refresh we
|
|
216
|
+
* re-read the credentials file — a concurrent refresher may have healed it
|
|
217
|
+
* even if our child failed, and vice versa.
|
|
218
|
+
*/
|
|
219
|
+
async function healViaRefreshCli(creds, opts) {
|
|
220
|
+
const req = {
|
|
221
|
+
...(opts.force ? { force: true } : {}),
|
|
222
|
+
...(opts.staleToken ? { staleToken: opts.staleToken } : {}),
|
|
223
|
+
};
|
|
224
|
+
if (!opts.awaitRefresh) {
|
|
225
|
+
await triggerCloudflareRefresh(req, opts.deps);
|
|
226
|
+
return creds;
|
|
227
|
+
}
|
|
228
|
+
await runCloudflareRefreshCli(req, opts.deps);
|
|
229
|
+
return (await getCloudflareCredentials()) ?? creds;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Return a fresh Cloudflare access token. When the cached token is within
|
|
233
|
+
* REFRESH_SKEW_MS of expiry, the refresh is handed to the
|
|
234
|
+
* `ugly-app refresh cloudflare` CLI (which runs it under the cross-process
|
|
235
|
+
* credentials lock) rather than being performed inline: by default the CLI is
|
|
236
|
+
* fired detached and this returns the best available (possibly stale) creds so
|
|
237
|
+
* the request path never blocks on the lock; with `awaitRefresh: true` the
|
|
238
|
+
* CLI's exit is awaited and the healed credentials are re-read.
|
|
239
|
+
*
|
|
240
|
+
* Returns `undefined` when not signed in or no refresh token exists.
|
|
241
|
+
*/
|
|
242
|
+
export async function getFreshCloudflareCredentials(opts) {
|
|
210
243
|
const creds = await getCloudflareCredentials();
|
|
211
244
|
if (!creds)
|
|
212
245
|
return undefined;
|
|
@@ -214,65 +247,74 @@ export async function getFreshCloudflareCredentials() {
|
|
|
214
247
|
return creds;
|
|
215
248
|
if (!creds.refreshToken)
|
|
216
249
|
return undefined;
|
|
217
|
-
return
|
|
218
|
-
// Re-read INSIDE the lock — another process/waiter may have just refreshed,
|
|
219
|
-
// in which case we reuse its token instead of consuming the rotated one.
|
|
220
|
-
const cur = await getCloudflareCredentials();
|
|
221
|
-
if (!cur)
|
|
222
|
-
return undefined;
|
|
223
|
-
if (cur.expiresAt > Date.now() + REFRESH_SKEW_MS)
|
|
224
|
-
return cur;
|
|
225
|
-
if (!cur.refreshToken)
|
|
226
|
-
return undefined;
|
|
227
|
-
const refreshed = await refreshCloudflareToken(cur.refreshToken);
|
|
228
|
-
if (!refreshed)
|
|
229
|
-
return undefined;
|
|
230
|
-
const next = {
|
|
231
|
-
...cur,
|
|
232
|
-
accessToken: refreshed.accessToken,
|
|
233
|
-
refreshToken: refreshed.refreshToken,
|
|
234
|
-
expiresAt: refreshed.expiresAt,
|
|
235
|
-
};
|
|
236
|
-
await setCloudflareCredentials(next);
|
|
237
|
-
return next;
|
|
238
|
-
});
|
|
250
|
+
return healViaRefreshCli(creds, { ...opts });
|
|
239
251
|
}
|
|
240
252
|
/**
|
|
241
|
-
* FORCE a token refresh (ignoring the local `expiresAt`)
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
* Runs inside the cross-process credentials lock. Pass `staleToken` — the access
|
|
246
|
-
* token that just 401'd — so that if another process already rotated the token
|
|
247
|
-
* out from under us (the on-disk access token no longer matches), we return the
|
|
248
|
-
* fresh token WITHOUT consuming the single-use refresh token a second time. This
|
|
249
|
-
* is the dedupe that collapses concurrent 401 storms into a single refresh and
|
|
250
|
-
* stops the refresh chain from being breach-invalidated.
|
|
253
|
+
* FORCE a token refresh (ignoring the local `expiresAt`). For callers that hit
|
|
254
|
+
* a real 401 despite a locally-"valid" token — the cached `expiresAt` can lie
|
|
255
|
+
* (revoked token, or a mis-computed expiry).
|
|
251
256
|
*
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
257
|
+
* Pass `staleToken` — the access token that just 401'd. If the on-disk access
|
|
258
|
+
* token no longer matches, another process already rotated it and we reuse the
|
|
259
|
+
* fresh one WITHOUT firing another refresh. Otherwise the refresh is handed to
|
|
260
|
+
* the `ugly-app refresh cloudflare` CLI with the same stale-token dedupe (the
|
|
261
|
+
* command no-ops if the on-disk token moved on), collapsing a concurrent 401
|
|
262
|
+
* storm into a single locked refresh. Fire-and-forget by default (returns the
|
|
263
|
+
* current creds; the retry uses a rotated token only if one already landed);
|
|
264
|
+
* `awaitRefresh: true` blocks on the CLI and re-reads.
|
|
255
265
|
*/
|
|
256
|
-
export async function forceRefreshCloudflareCredentials(staleToken) {
|
|
266
|
+
export async function forceRefreshCloudflareCredentials(staleToken, opts) {
|
|
267
|
+
const creds = await getCloudflareCredentials();
|
|
268
|
+
if (!creds?.refreshToken)
|
|
269
|
+
return undefined;
|
|
270
|
+
// Someone else already rotated it — reuse instead of double-consuming.
|
|
271
|
+
if (staleToken && creds.accessToken !== staleToken)
|
|
272
|
+
return creds;
|
|
273
|
+
return healViaRefreshCli(creds, {
|
|
274
|
+
...opts,
|
|
275
|
+
force: true,
|
|
276
|
+
...(staleToken ? { staleToken } : {}),
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* The body of `ugly-app refresh cloudflare` — THE single locked refresh path.
|
|
281
|
+
* Acquires the credentials lock (waiting up to REFRESH_LOCK_TIMEOUT_MS and
|
|
282
|
+
* failing cleanly on timeout — it never refreshes unlocked), re-reads inside
|
|
283
|
+
* the lock, no-ops when the token is fresh or was already rotated by someone
|
|
284
|
+
* else, and refreshes + persists (including the rotated single-use refresh
|
|
285
|
+
* token) when stale. Throws when the refresh token is rejected.
|
|
286
|
+
*/
|
|
287
|
+
export async function refreshCloudflareCredentialsNow(opts = {}) {
|
|
288
|
+
const creds = await getCloudflareCredentials();
|
|
289
|
+
if (!creds?.refreshToken)
|
|
290
|
+
return 'no-session';
|
|
257
291
|
return withCredentialsLock(async () => {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if (
|
|
263
|
-
return
|
|
264
|
-
|
|
265
|
-
if (
|
|
266
|
-
return
|
|
292
|
+
// Re-read INSIDE the lock — another process/waiter may have just
|
|
293
|
+
// refreshed, in which case we reuse its token instead of consuming the
|
|
294
|
+
// rotated single-use refresh token a second time.
|
|
295
|
+
const cur = await getCloudflareCredentials();
|
|
296
|
+
if (!cur?.refreshToken)
|
|
297
|
+
return 'no-session';
|
|
298
|
+
// 401-storm dedupe: the token that failed is already gone from disk.
|
|
299
|
+
if (opts.staleToken && cur.accessToken !== opts.staleToken) {
|
|
300
|
+
return 'already-fresh';
|
|
301
|
+
}
|
|
302
|
+
if (!opts.force && cur.expiresAt > Date.now() + REFRESH_SKEW_MS) {
|
|
303
|
+
return 'already-fresh';
|
|
304
|
+
}
|
|
305
|
+
const refreshed = await (opts.refreshTokenFn ?? refreshCloudflareToken)(cur.refreshToken);
|
|
306
|
+
if (!refreshed) {
|
|
307
|
+
throw new Error('Cloudflare rejected the refresh token. Re-authenticate: `ugly-app login cloudflare`.');
|
|
308
|
+
}
|
|
267
309
|
const next = {
|
|
268
|
-
...
|
|
310
|
+
...cur,
|
|
269
311
|
accessToken: refreshed.accessToken,
|
|
270
312
|
refreshToken: refreshed.refreshToken,
|
|
271
313
|
expiresAt: refreshed.expiresAt,
|
|
272
314
|
};
|
|
273
315
|
await setCloudflareCredentials(next);
|
|
274
|
-
return
|
|
275
|
-
});
|
|
316
|
+
return 'refreshed';
|
|
317
|
+
}, { timeoutMs: opts.lockTimeoutMs ?? REFRESH_LOCK_TIMEOUT_MS, onTimeout: 'throw' });
|
|
276
318
|
}
|
|
277
319
|
const cfUserResponseSchema = z
|
|
278
320
|
.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflareOauth.js","sourceRoot":"","sources":["../../../src/cli/auth/cloudflareOauth.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cloudflareOauth.js","sourceRoot":"","sources":["../../../src/cli/auth/cloudflareOauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,7 +59,27 @@ export declare function writeCredentials(creds: Credentials): Promise<void>;
|
|
|
59
59
|
* The callback MUST use the lock-free `readCredentials`/`writeCredentials` (never
|
|
60
60
|
* re-enter this lock).
|
|
61
61
|
*/
|
|
62
|
-
export
|
|
62
|
+
export interface CredentialsLockOptions {
|
|
63
|
+
/**
|
|
64
|
+
* Max time to wait for the lock. Default 10s. Refresh callers should pass a
|
|
65
|
+
* longer budget (the refresh command waits up to a minute) — a short wait
|
|
66
|
+
* plus `onTimeout: 'throw'` is how a refresh guarantees it never runs unlocked.
|
|
67
|
+
*/
|
|
68
|
+
timeoutMs?: number;
|
|
69
|
+
/**
|
|
70
|
+
* What to do when the wait budget is exhausted:
|
|
71
|
+
* - `'proceed'` (default, legacy): run the callback WITHOUT the lock. Kept for
|
|
72
|
+
* non-refresh callers where a best-effort read-modify-write is acceptable.
|
|
73
|
+
* - `'throw'`: reject instead. MANDATORY for refresh paths — an unlocked
|
|
74
|
+
* refresh can double-consume Cloudflare's single-use refresh token and
|
|
75
|
+
* breach-invalidate the whole chain.
|
|
76
|
+
*/
|
|
77
|
+
onTimeout?: 'proceed' | 'throw';
|
|
78
|
+
}
|
|
79
|
+
export declare class CredentialsLockTimeoutError extends Error {
|
|
80
|
+
constructor(lockPath: string, waitedMs: number);
|
|
81
|
+
}
|
|
82
|
+
export declare function withCredentialsLock<T>(fn: () => Promise<T>, opts?: CredentialsLockOptions): Promise<T>;
|
|
63
83
|
export declare function getCloudflareCredentials(): Promise<CloudflareCredentials | undefined>;
|
|
64
84
|
export declare function setCloudflareCredentials(cf: CloudflareCredentials): Promise<void>;
|
|
65
85
|
export declare function getNeonCredentials(): Promise<NeonCredentials | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAIxC;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAU5D;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAIxC;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAU5D;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxE;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;CACjC;AAED,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAO/C;AAED,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,CAAC,EAAE,sBAAsB,GAC5B,OAAO,CAAC,CAAC,CAAC,CAmDZ;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CACvD,qBAAqB,GAAG,SAAS,CAClC,CAGA;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,qBAAqB,GACxB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CACjD,eAAe,GAAG,SAAS,CAC5B,CAGA;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7E;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,YAAY,GAAG,MAAM,GAC9B,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAE9C"}
|
|
@@ -43,28 +43,21 @@ export async function writeCredentials(creds) {
|
|
|
43
43
|
await fs.writeFile(tmp, JSON.stringify(creds, null, 2), { mode: 0o600 });
|
|
44
44
|
await fs.rename(tmp, file);
|
|
45
45
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
*
|
|
55
|
-
* Implementation: an atomic `O_CREAT|O_EXCL` create of a sibling `.lock` file
|
|
56
|
-
* (works cross-process on local filesystems — this is a single-machine dev tool).
|
|
57
|
-
* A crashed holder can't wedge login forever: a lock older than STALE_MS is broken.
|
|
58
|
-
* The callback MUST use the lock-free `readCredentials`/`writeCredentials` (never
|
|
59
|
-
* re-enter this lock).
|
|
60
|
-
*/
|
|
61
|
-
export async function withCredentialsLock(fn) {
|
|
46
|
+
export class CredentialsLockTimeoutError extends Error {
|
|
47
|
+
constructor(lockPath, waitedMs) {
|
|
48
|
+
super(`Timed out after ${waitedMs}ms waiting for the credentials lock (${lockPath}). ` +
|
|
49
|
+
`Another process may be mid-refresh; retry shortly.`);
|
|
50
|
+
this.name = 'CredentialsLockTimeoutError';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export async function withCredentialsLock(fn, opts) {
|
|
62
54
|
const lock = `${credentialsPath()}.lock`;
|
|
63
55
|
const dir = path.dirname(lock);
|
|
64
56
|
await fs.mkdir(dir, { recursive: true, mode: 0o700 });
|
|
65
57
|
const STALE_MS = 15_000;
|
|
66
|
-
const MAX_WAIT_MS = 10_000;
|
|
58
|
+
const MAX_WAIT_MS = opts?.timeoutMs ?? 10_000;
|
|
67
59
|
const started = Date.now();
|
|
60
|
+
let acquired = false;
|
|
68
61
|
// eslint-disable-next-line no-constant-condition
|
|
69
62
|
while (true) {
|
|
70
63
|
try {
|
|
@@ -75,6 +68,7 @@ export async function withCredentialsLock(fn) {
|
|
|
75
68
|
finally {
|
|
76
69
|
await fh.close();
|
|
77
70
|
}
|
|
71
|
+
acquired = true;
|
|
78
72
|
break; // acquired
|
|
79
73
|
}
|
|
80
74
|
catch (err) {
|
|
@@ -93,6 +87,9 @@ export async function withCredentialsLock(fn) {
|
|
|
93
87
|
continue;
|
|
94
88
|
}
|
|
95
89
|
if (Date.now() - started > MAX_WAIT_MS) {
|
|
90
|
+
if (opts?.onTimeout === 'throw') {
|
|
91
|
+
throw new CredentialsLockTimeoutError(lock, Date.now() - started);
|
|
92
|
+
}
|
|
96
93
|
// Give up waiting rather than hang login forever; proceed best-effort.
|
|
97
94
|
break;
|
|
98
95
|
}
|
|
@@ -103,7 +100,10 @@ export async function withCredentialsLock(fn) {
|
|
|
103
100
|
return await fn();
|
|
104
101
|
}
|
|
105
102
|
finally {
|
|
106
|
-
|
|
103
|
+
// Only the process that actually acquired the lock may release it — a
|
|
104
|
+
// timed-out best-effort caller must not delete the real holder's lock.
|
|
105
|
+
if (acquired)
|
|
106
|
+
await fs.rm(lock, { force: true }).catch(() => { });
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
export async function getCloudflareCredentials() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/cli/auth/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAiC7B;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC1D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA4B,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACnC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAkB;IACvD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IACvD,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/cli/auth/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Spawn helpers for `ugly-app refresh cloudflare`.
|
|
4
|
+
*
|
|
5
|
+
* All Cloudflare token refreshes flow through that ONE CLI command, which holds
|
|
6
|
+
* the cross-process credentials lock for the whole read→refresh→write. Callers
|
|
7
|
+
* that detect a stale/401'd token never refresh inline — they either:
|
|
8
|
+
*
|
|
9
|
+
* - `triggerCloudflareRefresh()` — fire-and-forget a detached refresher and
|
|
10
|
+
* proceed best-effort (telemetry queries and other degradable paths). The
|
|
11
|
+
* next call picks up the healed credentials.
|
|
12
|
+
* - `runCloudflareRefreshCli()` — spawn the same command and AWAIT its exit
|
|
13
|
+
* (deploy steps and other paths where the token is load-bearing for the
|
|
14
|
+
* current operation).
|
|
15
|
+
*/
|
|
16
|
+
export interface RefreshCliRequest {
|
|
17
|
+
/** Refresh even when the cached `expiresAt` still looks fresh. */
|
|
18
|
+
force?: boolean | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* The access token that just failed. The refresh command no-ops when the
|
|
21
|
+
* on-disk token no longer matches (another process already rotated it) —
|
|
22
|
+
* this collapses a concurrent 401 storm into a single refresh.
|
|
23
|
+
*/
|
|
24
|
+
staleToken?: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
/** Injectable seam so tests can observe spawning without a real child process. */
|
|
27
|
+
export interface RefreshSpawnDeps {
|
|
28
|
+
spawn?: typeof spawn;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Debounce window for fire-and-forget triggers: a marker file records the last
|
|
32
|
+
* spawn, and triggers within the window skip. A 401 storm across N processes
|
|
33
|
+
* therefore spawns one refresher, not fifty. Nobody deletes the marker — its
|
|
34
|
+
* mtime IS the debounce state, so a crashed refresher can never wedge it.
|
|
35
|
+
*/
|
|
36
|
+
export declare const REFRESH_SPAWN_DEBOUNCE_MS = 10000;
|
|
37
|
+
/**
|
|
38
|
+
* The CLI entry to spawn. Resolved relative to THIS module
|
|
39
|
+
* (`dist/cli/auth/refreshCli.js` → `dist/cli/index.js`), so it works for both
|
|
40
|
+
* `npx ugly-app` and global installs regardless of how the bin was invoked.
|
|
41
|
+
*/
|
|
42
|
+
export declare function refreshCliEntry(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Fire-and-forget: spawn `ugly-app refresh cloudflare` detached (survives this
|
|
45
|
+
* process exiting), with stdio sent to a log next to the credentials file.
|
|
46
|
+
* Debounced — concurrent triggers within REFRESH_SPAWN_DEBOUNCE_MS collapse to
|
|
47
|
+
* a single spawn. Best-effort: never throws, returns whether it spawned.
|
|
48
|
+
*/
|
|
49
|
+
export declare function triggerCloudflareRefresh(req?: RefreshCliRequest, deps?: RefreshSpawnDeps): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* Spawn the refresh CLI and await its exit code. For paths where the token is
|
|
52
|
+
* load-bearing for the current operation (mid-deploy steps, `tail`): the
|
|
53
|
+
* refresh still flows through the single locked CLI code path, but the caller
|
|
54
|
+
* blocks until credentials are healed (or the refresh fails). Caller should
|
|
55
|
+
* re-read credentials after this resolves — a concurrent refresher may have
|
|
56
|
+
* done the work even if this child exited non-zero.
|
|
57
|
+
*/
|
|
58
|
+
export declare function runCloudflareRefreshCli(req?: RefreshCliRequest, deps?: RefreshSpawnDeps): Promise<number>;
|
|
59
|
+
//# sourceMappingURL=refreshCli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refreshCli.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/refreshCli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAK9D;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,kFAAkF;AAClF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAUhD;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAoCD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,GAAE,iBAAsB,EAC3B,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,OAAO,CAAC,CA0BlB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,GAAE,iBAAsB,EAC3B,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,MAAM,CAAC,CAejB"}
|