@socketsecurity/lib 6.0.3 → 6.0.5
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 +22 -0
- package/dist/_virtual/_rolldown/runtime.js +45 -0
- package/dist/abort/signal.js +53 -59
- package/dist/ai/discover.js +110 -110
- package/dist/ai/profiles.js +94 -65
- package/dist/ai/spawn.js +172 -194
- package/dist/ai/types.js +1 -17
- package/dist/ai/worktree.js +160 -183
- package/dist/ansi/constants.js +16 -38
- package/dist/ansi/strip.js +44 -41
- package/dist/archives/_internal.js +64 -73
- package/dist/archives/detect.js +30 -43
- package/dist/archives/extract.js +43 -50
- package/dist/archives/tar.js +197 -228
- package/dist/archives/types.js +1 -17
- package/dist/archives/zip.js +85 -121
- package/dist/argv/flag-predicates.js +203 -101
- package/dist/argv/flag-types.js +96 -113
- package/dist/argv/parse-args-string.d.ts +16 -14
- package/dist/argv/parse-args-string.js +42 -39
- package/dist/argv/parse.js +145 -163
- package/dist/arrays/_internal.js +65 -48
- package/dist/arrays/chunk.js +51 -40
- package/dist/arrays/join.js +87 -35
- package/dist/arrays/predicates.js +46 -28
- package/dist/arrays/unique.js +45 -31
- package/dist/bin/_internal.js +34 -42
- package/dist/bin/check-primordials.js +175 -233
- package/dist/bin/check.js +51 -72
- package/dist/bin/exec.js +70 -74
- package/dist/bin/find.js +151 -134
- package/dist/bin/resolve.js +180 -246
- package/dist/bin/shadow.js +24 -33
- package/dist/bin/socket-lib.js +51 -73
- package/dist/bin/types.js +1 -17
- package/dist/bin/which.js +211 -146
- package/dist/cacache/_internal.js +25 -40
- package/dist/cacache/clear.js +79 -72
- package/dist/cacache/read.js +48 -46
- package/dist/cacache/tmp.js +29 -36
- package/dist/cacache/types.js +1 -17
- package/dist/cacache/write.js +43 -48
- package/dist/cache/ttl/store.js +232 -288
- package/dist/cache/ttl/types.js +1 -17
- package/dist/checks/primordials-defaults.js +83 -89
- package/dist/checks/primordials.js +225 -277
- package/dist/colors/convert.js +45 -37
- package/dist/colors/palette.js +88 -45
- package/dist/colors/socket-palette.js +74 -84
- package/dist/colors/types.js +1 -17
- package/dist/compression/_internal.js +57 -72
- package/dist/compression/brotli.js +94 -127
- package/dist/compression/gzip.js +95 -121
- package/dist/compression/types.js +1 -17
- package/dist/constants/agents.js +61 -113
- package/dist/constants/encoding.js +19 -42
- package/dist/constants/github.js +12 -30
- package/dist/constants/licenses.js +48 -63
- package/dist/constants/lifecycle-script-names.js +31 -45
- package/dist/constants/maintained-node-versions.js +22 -37
- package/dist/constants/node.js +226 -167
- package/dist/constants/package-default-node-range.js +16 -41
- package/dist/constants/package-default-socket-categories.js +12 -30
- package/dist/constants/packages.js +77 -126
- package/dist/constants/platform.js +27 -49
- package/dist/constants/sentinels.js +23 -48
- package/dist/constants/socket.js +42 -87
- package/dist/constants/testing.js +15 -34
- package/dist/constants/time.js +16 -36
- package/dist/constants/typescript.js +32 -52
- package/dist/cover/code.js +111 -142
- package/dist/cover/formatters.js +118 -101
- package/dist/cover/type.js +50 -76
- package/dist/cover/types.js +1 -17
- package/dist/crypto/hash.js +54 -46
- package/dist/debug/_internal.js +62 -71
- package/dist/debug/caller-info.js +53 -64
- package/dist/debug/namespace.js +80 -90
- package/dist/debug/output.js +172 -188
- package/dist/debug/types.js +1 -17
- package/dist/dlx/_internal.js +24 -43
- package/dist/dlx/arborist.js +162 -160
- package/dist/dlx/binary-cache.js +228 -200
- package/dist/dlx/binary-download.js +172 -211
- package/dist/dlx/binary-resolution.js +165 -157
- package/dist/dlx/binary-types.js +1 -17
- package/dist/dlx/binary.js +149 -189
- package/dist/dlx/cache.js +45 -30
- package/dist/dlx/detect.js +245 -159
- package/dist/dlx/dir.js +67 -51
- package/dist/dlx/firewall.js +62 -100
- package/dist/dlx/lockfile.js +122 -127
- package/dist/dlx/manifest.js +264 -274
- package/dist/dlx/package.js +241 -244
- package/dist/dlx/packages.js +99 -96
- package/dist/dlx/paths.js +73 -59
- package/dist/dlx/spec.js +52 -60
- package/dist/dlx/types.js +1 -17
- package/dist/eco/cargo/lockfile-format.js +19 -36
- package/dist/eco/cargo/manifest-format.js +17 -35
- package/dist/eco/cargo/parse-lockfile.js +210 -237
- package/dist/eco/manifest/analyze-lockfile.js +46 -63
- package/dist/eco/manifest/detect-format.js +66 -90
- package/dist/eco/manifest/find-packages.js +39 -64
- package/dist/eco/manifest/get-package-versions.js +27 -48
- package/dist/eco/manifest/get-package.js +21 -40
- package/dist/eco/manifest/manifest-error.js +14 -35
- package/dist/eco/manifest/parse-lockfile.js +40 -86
- package/dist/eco/manifest/parse-manifest.js +26 -43
- package/dist/eco/manifest/parse.js +26 -47
- package/dist/eco/manifest/types.js +1 -17
- package/dist/eco/npm/bun/exec.js +23 -32
- package/dist/eco/npm/manifest-format.js +21 -35
- package/dist/eco/npm/npm/exec.js +51 -61
- package/dist/eco/npm/npm/extract-package-name-from-path.js +28 -50
- package/dist/eco/npm/npm/flags.js +80 -52
- package/dist/eco/npm/npm/lockfile-format.js +21 -40
- package/dist/eco/npm/npm/parse-git-url.js +26 -40
- package/dist/eco/npm/npm/parse-lockfile.js +184 -210
- package/dist/eco/npm/parse-package-json.js +71 -102
- package/dist/eco/npm/pnpm/detect-pnpm-version.js +22 -43
- package/dist/eco/npm/pnpm/exec.js +51 -62
- package/dist/eco/npm/pnpm/flags.js +75 -68
- package/dist/eco/npm/pnpm/lockfile-format.js +19 -36
- package/dist/eco/npm/pnpm/parse-lockfile.js +235 -259
- package/dist/eco/npm/pnpm/parse-pnpm-package-id-v5.js +37 -47
- package/dist/eco/npm/pnpm/parse-pnpm-package-id-v6-v9.js +36 -49
- package/dist/eco/npm/script.js +82 -90
- package/dist/eco/npm/vlt/exec.js +24 -32
- package/dist/eco/npm/yarnpkg/yarn/exec.js +60 -59
- package/dist/eco/npm/yarnpkg/yarn/lockfile-format.js +20 -36
- package/dist/eco/npm/yarnpkg/yarn/parse-lockfile.js +194 -242
- package/dist/eco/npm/yarnpkg/yarn/parse-yarn-descriptor.js +37 -61
- package/dist/eco/purl.js +50 -60
- package/dist/eco/types.js +1 -17
- package/dist/effects/pulse-frames.js +64 -65
- package/dist/effects/shimmer-keyframes.js +71 -52
- package/dist/effects/shimmer-terminal.js +81 -50
- package/dist/effects/shimmer.js +290 -153
- package/dist/env/boolean.js +42 -43
- package/dist/env/case-insensitive.js +54 -39
- package/dist/env/ci.js +29 -31
- package/dist/env/debug.js +28 -31
- package/dist/env/github.js +144 -59
- package/dist/env/home.js +38 -31
- package/dist/env/locale.js +59 -39
- package/dist/env/node-auth-token.js +28 -31
- package/dist/env/node-env.js +28 -31
- package/dist/env/npm.js +94 -47
- package/dist/env/number.js +50 -51
- package/dist/env/package-manager.js +95 -83
- package/dist/env/path.js +28 -31
- package/dist/env/pre-commit.js +30 -32
- package/dist/env/proxy.js +121 -122
- package/dist/env/rewire.js +204 -96
- package/dist/env/shell.js +28 -31
- package/dist/env/socket-cli.js +233 -81
- package/dist/env/socket.js +521 -156
- package/dist/env/string.js +43 -44
- package/dist/env/temp-dir.js +59 -39
- package/dist/env/term.js +28 -31
- package/dist/env/test.js +65 -43
- package/dist/env/types.js +1 -17
- package/dist/env/windows.js +78 -43
- package/dist/env/xdg.js +62 -39
- package/dist/errors/message.js +40 -46
- package/dist/errors/predicates.js +61 -49
- package/dist/errors/stack.js +24 -36
- package/dist/events/exit/_internal.js +86 -103
- package/dist/events/exit/handler.js +48 -55
- package/dist/events/exit/intercept.js +49 -70
- package/dist/events/exit/lifecycle.js +92 -101
- package/dist/events/exit/signals.js +25 -31
- package/dist/events/exit/types.js +1 -17
- package/dist/events/warning/handler.js +43 -40
- package/dist/events/warning/suppress.js +111 -90
- package/dist/external/@npmcli/package-json/lib/read-package.js +132 -153
- package/dist/external/@npmcli/package-json/lib/sort.js +73 -105
- package/dist/external/@npmcli/package-json.js +12705 -15140
- package/dist/external/@npmcli/promise-spawn.js +451 -472
- package/dist/external/@sinclair/typebox/value.js +7443 -9002
- package/dist/external/@sinclair/typebox.js +7516 -7885
- package/dist/external/@socketregistry/is-unicode-supported.js +31 -39
- package/dist/external/@socketregistry/packageurl-js.js +6127 -7369
- package/dist/external/@socketregistry/yocto-spinner.js +394 -455
- package/dist/external/@yarnpkg/extensions.js +435 -1022
- package/dist/external/adm-zip.js +2313 -2673
- package/dist/external/debug.js +700 -687
- package/dist/external/external-pack.js +2658 -3171
- package/dist/external/fast-sort.js +124 -138
- package/dist/external/get-east-asian-width.js +70 -64
- package/dist/external/libnpmexec.js +28 -31
- package/dist/external/npm-pack.js +43617 -50137
- package/dist/external/p-map.js +198 -222
- package/dist/external/pico-pack.js +6735 -7304
- package/dist/external/pony-cause.js +143 -139
- package/dist/external/shell-quote.js +226 -0
- package/dist/external/spdx-pack.js +1283 -1403
- package/dist/external/streaming-iterables.js +835 -1052
- package/dist/external/tar-fs.js +2769 -3048
- package/dist/external/which.js +267 -251
- package/dist/external/yargs-parser.js +851 -1074
- package/dist/external-tools/bazel/asset-names.js +98 -90
- package/dist/external-tools/bazel/from-download.js +52 -46
- package/dist/external-tools/bazel/from-path.js +27 -38
- package/dist/external-tools/bazel/read-bazel-version-file.js +35 -57
- package/dist/external-tools/bazel/resolve-asset-url.js +24 -39
- package/dist/external-tools/bazel/resolve-bazel-version.js +34 -56
- package/dist/external-tools/bazel/resolve.js +44 -58
- package/dist/external-tools/bazel/types.js +1 -17
- package/dist/external-tools/cdxgen/asset-names.js +59 -66
- package/dist/external-tools/cdxgen/from-download.js +52 -80
- package/dist/external-tools/cdxgen/from-path.js +19 -37
- package/dist/external-tools/cdxgen/from-vfs.js +22 -43
- package/dist/external-tools/cdxgen/resolve.js +48 -63
- package/dist/external-tools/cdxgen/types.js +1 -17
- package/dist/external-tools/from-download.js +107 -67
- package/dist/external-tools/janus/asset-names.js +44 -51
- package/dist/external-tools/janus/from-download.js +45 -70
- package/dist/external-tools/janus/from-path.js +19 -37
- package/dist/external-tools/janus/from-vfs.js +22 -43
- package/dist/external-tools/janus/resolve.js +45 -63
- package/dist/external-tools/janus/types.js +1 -17
- package/dist/external-tools/jre/asset-names.js +109 -82
- package/dist/external-tools/jre/detect-platform-arch.js +25 -49
- package/dist/external-tools/jre/from-download.js +71 -67
- package/dist/external-tools/jre/from-java-home.js +27 -54
- package/dist/external-tools/jre/from-path.js +27 -49
- package/dist/external-tools/jre/from-vfs.js +39 -60
- package/dist/external-tools/jre/resolve.js +55 -68
- package/dist/external-tools/jre/types.js +1 -17
- package/dist/external-tools/manifest.js +130 -150
- package/dist/external-tools/opengrep/asset-names.js +60 -72
- package/dist/external-tools/opengrep/from-download.js +58 -80
- package/dist/external-tools/opengrep/from-path.js +19 -37
- package/dist/external-tools/opengrep/from-vfs.js +23 -43
- package/dist/external-tools/opengrep/resolve.js +43 -63
- package/dist/external-tools/opengrep/types.js +1 -17
- package/dist/external-tools/sbt/asset-names.js +21 -30
- package/dist/external-tools/sbt/from-download.js +50 -61
- package/dist/external-tools/sbt/from-path.js +23 -38
- package/dist/external-tools/sbt/from-vfs.js +30 -44
- package/dist/external-tools/sbt/resolve.js +45 -63
- package/dist/external-tools/sbt/types.js +1 -17
- package/dist/external-tools/synp/asset-names.js +11 -29
- package/dist/external-tools/synp/from-download.js +24 -41
- package/dist/external-tools/synp/from-path.js +19 -37
- package/dist/external-tools/synp/from-vfs.js +22 -43
- package/dist/external-tools/synp/resolve.js +43 -62
- package/dist/external-tools/synp/types.js +1 -17
- package/dist/external-tools/trivy/asset-names.js +51 -62
- package/dist/external-tools/trivy/from-download.js +42 -64
- package/dist/external-tools/trivy/from-path.js +19 -37
- package/dist/external-tools/trivy/from-vfs.js +22 -43
- package/dist/external-tools/trivy/resolve.js +43 -63
- package/dist/external-tools/trivy/types.js +1 -17
- package/dist/external-tools/trufflehog/asset-names.js +54 -66
- package/dist/external-tools/trufflehog/from-download.js +44 -62
- package/dist/external-tools/trufflehog/from-path.js +21 -37
- package/dist/external-tools/trufflehog/from-vfs.js +26 -43
- package/dist/external-tools/trufflehog/resolve.js +43 -63
- package/dist/external-tools/trufflehog/types.js +1 -17
- package/dist/external-tools/uv/asset-names.js +64 -74
- package/dist/external-tools/uv/from-download.js +44 -65
- package/dist/external-tools/uv/from-path.js +19 -37
- package/dist/external-tools/uv/from-vfs.js +22 -43
- package/dist/external-tools/uv/resolve.js +42 -63
- package/dist/external-tools/uv/types.js +1 -17
- package/dist/fs/_internal.js +40 -42
- package/dist/fs/access.js +57 -54
- package/dist/fs/encoding.js +80 -97
- package/dist/fs/find-up.js +126 -125
- package/dist/fs/inspect.js +168 -99
- package/dist/fs/path-cache.js +31 -32
- package/dist/fs/read-dir.js +102 -79
- package/dist/fs/read-file.js +177 -118
- package/dist/fs/read-json-cache.js +150 -134
- package/dist/fs/read-json.js +172 -187
- package/dist/fs/resolve-module.js +35 -58
- package/dist/fs/safe.js +278 -169
- package/dist/fs/types.js +1 -17
- package/dist/fs/unique.js +52 -48
- package/dist/fs/validate.js +56 -40
- package/dist/fs/write-json.js +109 -75
- package/dist/git/_internal.js +251 -216
- package/dist/git/changed.js +191 -74
- package/dist/git/repo.js +118 -104
- package/dist/git/staged.js +172 -62
- package/dist/git/types.js +1 -17
- package/dist/git/unstaged.js +175 -62
- package/dist/github/constants.js +25 -33
- package/dist/github/errors.js +46 -38
- package/dist/github/fetch.js +137 -82
- package/dist/github/ghsa.js +217 -151
- package/dist/github/refs-cache.js +54 -43
- package/dist/github/refs-graphql.js +97 -89
- package/dist/github/refs-rest.js +70 -101
- package/dist/github/refs.js +105 -64
- package/dist/github/token.js +96 -48
- package/dist/github/types.js +1 -17
- package/dist/globs/_internal.js +73 -82
- package/dist/globs/defaults.js +40 -59
- package/dist/globs/match.js +93 -77
- package/dist/globs/matcher.js +104 -92
- package/dist/globs/stream.js +43 -55
- package/dist/globs/types.js +1 -17
- package/dist/http-request/_internal.js +11 -38
- package/dist/http-request/browser-fetch.js +19 -29
- package/dist/http-request/browser.js +188 -206
- package/dist/http-request/checksums.js +101 -65
- package/dist/http-request/download-types.js +1 -17
- package/dist/http-request/download.js +195 -196
- package/dist/http-request/errors.js +39 -47
- package/dist/http-request/headers.js +95 -80
- package/dist/http-request/http-request.js +10 -35
- package/dist/http-request/node.js +71 -97
- package/dist/http-request/request-attempt.js +232 -285
- package/dist/http-request/request-types.js +1 -17
- package/dist/http-request/request.js +106 -108
- package/dist/http-request/response-reader.js +47 -51
- package/dist/http-request/response-types.js +22 -38
- package/dist/http-request/user-agent.js +73 -55
- package/dist/integrity.js +105 -106
- package/dist/ipc/_internal.js +34 -48
- package/dist/ipc/directory.js +55 -63
- package/dist/ipc/paths.js +52 -45
- package/dist/ipc/types.js +1 -17
- package/dist/ipc/write.js +81 -74
- package/dist/ipc-cli/get.js +29 -56
- package/dist/ipc-cli/types.js +1 -17
- package/dist/json/edit.js +182 -242
- package/dist/json/format.js +202 -103
- package/dist/json/parse.js +206 -109
- package/dist/json/types.js +1 -17
- package/dist/links/create.js +93 -60
- package/dist/links/types.js +1 -17
- package/dist/logger/_internal.js +109 -73
- package/dist/logger/browser.js +45 -56
- package/dist/logger/colors.js +31 -49
- package/dist/logger/console.js +89 -112
- package/dist/logger/default.js +19 -33
- package/dist/logger/logger.js +5 -29
- package/dist/logger/node.js +793 -854
- package/dist/logger/symbols-builder.js +54 -56
- package/dist/logger/symbols.js +135 -118
- package/dist/logger/types.js +1 -17
- package/dist/memo/_internal.js +39 -49
- package/dist/memo/async.js +133 -117
- package/dist/memo/clear.js +25 -34
- package/dist/memo/decorator.js +43 -37
- package/dist/memo/memoize.js +97 -88
- package/dist/memo/once.js +42 -41
- package/dist/memo/types.js +1 -17
- package/dist/memo/weak.js +45 -41
- package/dist/node/async-hooks.js +9 -30
- package/dist/node/child-process.js +9 -30
- package/dist/node/crypto.js +9 -30
- package/dist/node/events.js +9 -30
- package/dist/node/fs-promises.js +9 -30
- package/dist/node/fs.js +9 -30
- package/dist/node/http.js +9 -30
- package/dist/node/https.js +9 -30
- package/dist/node/module.js +20 -34
- package/dist/node/os.js +9 -30
- package/dist/node/path.js +9 -30
- package/dist/node/timers-promises.js +9 -30
- package/dist/node/url.js +9 -30
- package/dist/node/util.js +9 -30
- package/dist/objects/getters.js +185 -126
- package/dist/objects/inspect.js +85 -52
- package/dist/objects/mutate.js +96 -76
- package/dist/objects/predicates.js +112 -59
- package/dist/objects/sort.js +120 -76
- package/dist/objects/types.js +1 -17
- package/dist/packages/edit-class.js +198 -265
- package/dist/packages/edit.js +79 -86
- package/dist/packages/exports.js +146 -157
- package/dist/packages/isolation.js +159 -209
- package/dist/packages/licenses.js +207 -189
- package/dist/packages/manifest.js +134 -172
- package/dist/packages/normalize.js +91 -102
- package/dist/packages/operations.d.ts +2 -0
- package/dist/packages/operations.js +283 -254
- package/dist/packages/provenance.js +195 -245
- package/dist/packages/specs.js +94 -84
- package/dist/packages/types.js +1 -17
- package/dist/packages/validation.js +49 -50
- package/dist/paths/_internal.js +82 -86
- package/dist/paths/conversion.js +112 -65
- package/dist/paths/dirnames.js +17 -42
- package/dist/paths/exts.js +23 -54
- package/dist/paths/filenames.js +21 -50
- package/dist/paths/globs.js +15 -38
- package/dist/paths/normalize.js +215 -236
- package/dist/paths/packages.js +34 -49
- package/dist/paths/predicates.js +184 -106
- package/dist/paths/resolve.js +146 -128
- package/dist/paths/rewire.js +108 -72
- package/dist/paths/socket.js +252 -132
- package/dist/paths/walk.js +55 -60
- package/dist/perf/_internal.js +10 -28
- package/dist/perf/enabled.js +21 -30
- package/dist/perf/metrics.js +81 -67
- package/dist/perf/report.js +79 -80
- package/dist/perf/timer.js +180 -126
- package/dist/perf/types.js +1 -17
- package/dist/pkg-ext/data.js +29 -82
- package/dist/pkg-ext/types.js +1 -17
- package/dist/primordials/array.js +120 -198
- package/dist/primordials/buffer.js +28 -51
- package/dist/primordials/date.js +26 -51
- package/dist/primordials/error.js +33 -59
- package/dist/primordials/function.js +21 -41
- package/dist/primordials/globals.js +25 -48
- package/dist/primordials/json.js +14 -30
- package/dist/primordials/map-set.js +88 -152
- package/dist/primordials/math.js +59 -116
- package/dist/primordials/number.js +41 -76
- package/dist/primordials/object.js +56 -116
- package/dist/primordials/promise.js +28 -52
- package/dist/primordials/reflect.js +24 -52
- package/dist/primordials/regexp.js +25 -47
- package/dist/primordials/string.js +114 -167
- package/dist/primordials/symbol.js +40 -72
- package/dist/primordials/uncurry.js +38 -55
- package/dist/primordials/url.js +27 -66
- package/dist/process/_internal.js +7 -32
- package/dist/process/abort.js +29 -35
- package/dist/process/lock-instance.js +26 -30
- package/dist/process/lock-manager.js +279 -307
- package/dist/process/lock-types.js +1 -17
- package/dist/process/spawn/_internal.js +43 -55
- package/dist/process/spawn/child.js +172 -211
- package/dist/process/spawn/errors.js +116 -113
- package/dist/process/spawn/stdio.js +51 -35
- package/dist/process/spawn/types.js +1 -17
- package/dist/process/transient.js +49 -66
- package/dist/promises/_internal.js +31 -34
- package/dist/promises/iterate.js +238 -102
- package/dist/promises/options.js +123 -101
- package/dist/promises/queue.js +115 -136
- package/dist/promises/resolvers.js +77 -46
- package/dist/promises/retry.js +156 -101
- package/dist/promises/types.js +1 -17
- package/dist/regexps/escape.js +32 -30
- package/dist/regexps/hex.js +16 -33
- package/dist/regexps/spec.js +53 -81
- package/dist/releases/github-archives.js +127 -118
- package/dist/releases/github-asset-url.js +162 -146
- package/dist/releases/github-assets.js +37 -49
- package/dist/releases/github-auth.js +32 -48
- package/dist/releases/github-downloads.js +118 -138
- package/dist/releases/github-listing.js +175 -145
- package/dist/releases/github-retry-config.js +41 -47
- package/dist/releases/github-types.js +1 -17
- package/dist/releases/socket-btm.js +273 -192
- package/dist/schema/parse.js +35 -36
- package/dist/schema/types.js +1 -17
- package/dist/schema/validate.js +118 -99
- package/dist/sea/detect.js +57 -52
- package/dist/secrets/_internal.js +86 -67
- package/dist/secrets/find.js +96 -77
- package/dist/secrets/keychain.js +315 -309
- package/dist/secrets/linux.js +133 -135
- package/dist/secrets/macos.js +151 -147
- package/dist/secrets/rc.js +182 -181
- package/dist/secrets/socket-api-token.js +28 -43
- package/dist/secrets/types.js +1 -17
- package/dist/secrets/windows.js +184 -242
- package/dist/shadow/skip.js +51 -70
- package/dist/shadow/types.js +1 -17
- package/dist/shell/parse.d.ts +26 -0
- package/dist/shell/parse.js +35 -0
- package/dist/shell/quote.d.ts +19 -0
- package/dist/shell/quote.js +30 -0
- package/dist/smol/detect.js +67 -43
- package/dist/smol/http.js +33 -37
- package/dist/smol/https.js +31 -37
- package/dist/smol/manifest.js +33 -37
- package/dist/smol/path.js +33 -37
- package/dist/smol/primordial.js +35 -37
- package/dist/smol/purl.js +34 -37
- package/dist/smol/versions.js +31 -37
- package/dist/smol/vfs.js +46 -38
- package/dist/sorts/_internal.js +14 -40
- package/dist/sorts/natural.js +57 -64
- package/dist/sorts/semver.js +33 -43
- package/dist/sorts/strings.js +24 -30
- package/dist/sorts/types.js +1 -17
- package/dist/spinner/default.js +72 -63
- package/dist/spinner/format.js +86 -71
- package/dist/spinner/spinner.js +749 -797
- package/dist/spinner/types.js +1 -17
- package/dist/spinner/with.js +193 -137
- package/dist/ssri/convert.js +64 -47
- package/dist/ssri/parse.js +38 -37
- package/dist/ssri/validate.js +51 -34
- package/dist/stdio/_internal.js +50 -46
- package/dist/stdio/clear.js +208 -86
- package/dist/stdio/divider.js +170 -97
- package/dist/stdio/footer.js +116 -110
- package/dist/stdio/header.js +117 -90
- package/dist/stdio/progress.js +189 -218
- package/dist/stdio/prompts.js +244 -168
- package/dist/stdio/stderr.js +173 -78
- package/dist/stdio/stdout.js +177 -94
- package/dist/streams/parallel.js +58 -50
- package/dist/streams/transform.js +36 -45
- package/dist/strings/format.js +145 -63
- package/dist/strings/predicates.js +56 -34
- package/dist/strings/search.js +52 -42
- package/dist/strings/transform.js +113 -72
- package/dist/strings/types.js +1 -17
- package/dist/strings/width.js +89 -82
- package/dist/tables/bordered.js +81 -81
- package/dist/tables/padding.js +36 -46
- package/dist/tables/simple.js +62 -70
- package/dist/tables/types.js +1 -17
- package/dist/temporal/instant.js +72 -81
- package/dist/temporal/now.js +40 -31
- package/dist/temporal/slots.js +42 -36
- package/dist/temporal/system.js +36 -36
- package/dist/temporal/temporal.js +11 -41
- package/dist/themes/context.js +131 -69
- package/dist/themes/resolve.js +207 -132
- package/dist/themes/themes.js +225 -194
- package/dist/themes/types.js +1 -17
- package/dist/url/parse.js +48 -51
- package/dist/url/predicates.js +24 -31
- package/dist/url/search-params.js +133 -101
- package/dist/url/types.js +1 -17
- package/dist/versions/_internal.js +31 -33
- package/dist/versions/compare.js +80 -58
- package/dist/versions/modify.js +41 -39
- package/dist/versions/parse.js +88 -64
- package/dist/versions/range.js +58 -41
- package/dist/versions/types.js +1 -17
- package/dist/words/article.js +22 -30
- package/dist/words/capitalize.js +25 -34
- package/dist/words/pluralize.js +23 -31
- package/dist/words/types.js +1 -17
- package/package.json +17 -5
|
@@ -1,309 +1,281 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/* Socket Lib - Built with
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
2
|
+
/* Socket Lib - Built with rolldown */
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_primordials_error = require('../primordials/error.js');
|
|
5
|
+
const require_primordials_math = require('../primordials/math.js');
|
|
6
|
+
const require_primordials_map_set = require('../primordials/map-set.js');
|
|
7
|
+
const require_node_fs = require('../node/fs.js');
|
|
8
|
+
const require_node_path = require('../node/path.js');
|
|
9
|
+
const require_primordials_date = require('../primordials/date.js');
|
|
10
|
+
const require_errors_message = require('../errors/message.js');
|
|
11
|
+
const require_logger_default = require('../logger/default.js');
|
|
12
|
+
const require_promises_retry = require('../promises/retry.js');
|
|
13
|
+
const require_fs_safe = require('../fs/safe.js');
|
|
14
|
+
const require_events_exit_handler = require('../events/exit/handler.js');
|
|
15
|
+
|
|
16
|
+
//#region src/process/lock-manager.ts
|
|
17
|
+
/**
|
|
18
|
+
* @file `ProcessLockManager` — the class that owns active locks, touch timers,
|
|
19
|
+
* and the exit-handler registration. Provides `acquire` / `release` /
|
|
20
|
+
* `withLock`. Co-located with the touch and staleness helpers because they
|
|
21
|
+
* share private state (`activeLocks` + `touchTimers`).
|
|
22
|
+
*
|
|
23
|
+
* ## Why directories instead of files?
|
|
24
|
+
*
|
|
25
|
+
* This implementation uses `mkdir()` to create lock directories (not files)
|
|
26
|
+
* because:
|
|
27
|
+
*
|
|
28
|
+
* 1. **Atomic guarantee**: `mkdir()` is guaranteed atomic across ALL
|
|
29
|
+
* filesystems, including NFS. Only ONE process can successfully create the
|
|
30
|
+
* directory. If it exists, `mkdir()` fails with EEXIST instantly with no
|
|
31
|
+
* race conditions.
|
|
32
|
+
* 2. **File-based locking issues**:
|
|
33
|
+
*
|
|
34
|
+
* - `writeFile()` with `flag: 'wx'` - atomicity can fail on NFS
|
|
35
|
+
* - `open()` with `O_EXCL` - not guaranteed atomic on older NFS
|
|
36
|
+
* - Traditional lockfiles - can have race conditions on network filesystems
|
|
37
|
+
*
|
|
38
|
+
* 3. **Simplicity**: No need to write/read file content, track PIDs, or manage
|
|
39
|
+
* file descriptors. Just create/delete directory and check mtime.
|
|
40
|
+
* 4. **Historical precedent**: Well-known Unix locking pattern used by package
|
|
41
|
+
* managers for decades. Git uses similar approach for `.git/index.lock`.
|
|
42
|
+
*
|
|
43
|
+
* ## The mtime trick
|
|
44
|
+
*
|
|
45
|
+
* We periodically update the lock directory's mtime (modification time) by
|
|
46
|
+
* "touching" it to signal "I'm still actively working". This prevents other
|
|
47
|
+
* processes from treating the lock as stale and removing it. **The lock
|
|
48
|
+
* directory remains empty** - it's just a sentinel that signals "locked". The
|
|
49
|
+
* mtime is the only data needed to track lock freshness.
|
|
50
|
+
*
|
|
51
|
+
* ## npm npx compatibility
|
|
52
|
+
*
|
|
53
|
+
* This implementation matches npm npx's concurrency.lock approach:
|
|
54
|
+
*
|
|
55
|
+
* - Lock created via `mkdir(path.join(installDir, 'concurrency.lock'))`
|
|
56
|
+
* - 5-second stale timeout (if mtime is older than 5s, lock is stale)
|
|
57
|
+
* - 2-second touching interval (updates mtime every 2s to keep lock fresh)
|
|
58
|
+
* - Automatic cleanup on process exit
|
|
59
|
+
*/
|
|
60
|
+
const logger = require_logger_default.getDefaultLogger();
|
|
61
|
+
/**
|
|
62
|
+
* Process lock manager with stale detection and exit cleanup. Provides
|
|
63
|
+
* cross-platform inter-process synchronization using file-system based locks.
|
|
64
|
+
*/
|
|
65
|
+
var ProcessLockManager = class {
|
|
66
|
+
activeLocks = new require_primordials_map_set.SetCtor();
|
|
67
|
+
touchTimers = new require_primordials_map_set.MapCtor();
|
|
68
|
+
exitHandlerRegistered = false;
|
|
69
|
+
/**
|
|
70
|
+
* Ensure process exit handler is registered for cleanup. Registers a handler
|
|
71
|
+
* that cleans up all active locks when the process exits.
|
|
72
|
+
*/
|
|
73
|
+
ensureExitHandler() {
|
|
74
|
+
if (this.exitHandlerRegistered) return;
|
|
75
|
+
/* @__PURE__ */ require_events_exit_handler.onExit(() => {
|
|
76
|
+
/* c8 ignore start - Exit-handler body only fires on real
|
|
77
|
+
process exit. Subprocess test infra would be needed. */
|
|
78
|
+
for (const timer of this.touchTimers.values()) clearInterval(timer);
|
|
79
|
+
this.touchTimers.clear();
|
|
80
|
+
const fs = /* @__PURE__ */ require_node_fs.getNodeFs();
|
|
81
|
+
for (const lockPath of this.activeLocks) try {
|
|
82
|
+
if (fs.existsSync(lockPath)) require_fs_safe.safeDeleteSync(lockPath, { recursive: true });
|
|
83
|
+
} catch {}
|
|
84
|
+
/* c8 ignore stop */
|
|
85
|
+
});
|
|
86
|
+
this.exitHandlerRegistered = true;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Touch a lock file to update its mtime. This prevents the lock from being
|
|
90
|
+
* detected as stale during long operations.
|
|
91
|
+
*
|
|
92
|
+
* @param lockPath - Path to the lock directory.
|
|
93
|
+
*/
|
|
94
|
+
touchLock(lockPath) {
|
|
95
|
+
try {
|
|
96
|
+
const fs = /* @__PURE__ */ require_node_fs.getNodeFs();
|
|
97
|
+
if (fs.existsSync(lockPath)) {
|
|
98
|
+
const now = require_primordials_date.DateNow() / 1e3;
|
|
99
|
+
fs.utimesSync(lockPath, now, now);
|
|
100
|
+
}
|
|
101
|
+
} catch (e) {
|
|
102
|
+
logger.warn(`Failed to touch lock ${lockPath}: ${require_errors_message.errorMessage(e)}`);
|
|
103
|
+
}
|
|
104
|
+
/* c8 ignore stop */
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Start periodic touching of a lock file. Aligned with npm npx strategy to
|
|
108
|
+
* prevent false stale detection.
|
|
109
|
+
*
|
|
110
|
+
* @param lockPath - Path to the lock directory.
|
|
111
|
+
* @param intervalMs - Touch interval in milliseconds.
|
|
112
|
+
*/
|
|
113
|
+
startTouchTimer(lockPath, intervalMs) {
|
|
114
|
+
if (intervalMs <= 0 || this.touchTimers.has(lockPath)) return;
|
|
115
|
+
const timer = setInterval(() => {
|
|
116
|
+
this.touchLock(lockPath);
|
|
117
|
+
}, intervalMs);
|
|
118
|
+
timer.unref();
|
|
119
|
+
this.touchTimers.set(lockPath, timer);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Stop periodic touching of a lock file.
|
|
123
|
+
*
|
|
124
|
+
* @param lockPath - Path to the lock directory.
|
|
125
|
+
*/
|
|
126
|
+
stopTouchTimer(lockPath) {
|
|
127
|
+
const timer = this.touchTimers.get(lockPath);
|
|
128
|
+
if (timer) {
|
|
129
|
+
clearInterval(timer);
|
|
130
|
+
this.touchTimers.delete(lockPath);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Check if a lock is stale based on mtime. Uses second-level granularity to
|
|
135
|
+
* avoid APFS floating-point precision issues. Aligned with npm's npx locking
|
|
136
|
+
* strategy.
|
|
137
|
+
*
|
|
138
|
+
* @param lockPath - Path to the lock directory.
|
|
139
|
+
* @param staleMs - Stale timeout in milliseconds.
|
|
140
|
+
*
|
|
141
|
+
* @returns True if lock exists and is stale
|
|
142
|
+
*/
|
|
143
|
+
isStale(lockPath, staleMs) {
|
|
144
|
+
try {
|
|
145
|
+
const stats = (/* @__PURE__ */ require_node_fs.getNodeFs()).statSync(lockPath, { throwIfNoEntry: false });
|
|
146
|
+
if (!stats) return false;
|
|
147
|
+
return require_primordials_date.DateNow() - stats.mtime.getTime() > staleMs;
|
|
148
|
+
} catch {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
/* c8 ignore stop */
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Acquire a lock using mkdir for atomic operation. Handles stale locks and
|
|
155
|
+
* includes exit cleanup.
|
|
156
|
+
*
|
|
157
|
+
* This method attempts to create a lock directory atomically. If the lock
|
|
158
|
+
* already exists, it checks if it's stale and removes it before retrying.
|
|
159
|
+
* Uses exponential backoff with jitter for retry attempts.
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ;```typescript
|
|
163
|
+
* const release = await processLock.acquire('/tmp/my-lock')
|
|
164
|
+
* try {
|
|
165
|
+
* // Critical section
|
|
166
|
+
* } finally {
|
|
167
|
+
* release()
|
|
168
|
+
* }
|
|
169
|
+
* ```
|
|
170
|
+
*
|
|
171
|
+
* @param lockPath - Path to the lock directory.
|
|
172
|
+
* @param options - Lock acquisition options.
|
|
173
|
+
*
|
|
174
|
+
* @returns Release function to unlock
|
|
175
|
+
*
|
|
176
|
+
* @throws Error if lock cannot be acquired after all retries
|
|
177
|
+
*/
|
|
178
|
+
async acquire(lockPath, options = {}) {
|
|
179
|
+
const { baseDelayMs = 100, maxDelayMs = 1e3, retries = 3, staleMs = 5e3, touchIntervalMs = 2e3 } = options;
|
|
180
|
+
this.ensureExitHandler();
|
|
181
|
+
return await /* @__PURE__ */ require_promises_retry.pRetry(async () => {
|
|
182
|
+
try {
|
|
183
|
+
if (this.isStale(lockPath, staleMs)) {
|
|
184
|
+
logger.log(`Removing stale lock: ${lockPath}`);
|
|
185
|
+
try {
|
|
186
|
+
require_fs_safe.safeDeleteSync(lockPath, { recursive: true });
|
|
187
|
+
} catch {}
|
|
188
|
+
}
|
|
189
|
+
const fs = /* @__PURE__ */ require_node_fs.getNodeFs();
|
|
190
|
+
const parent = (/* @__PURE__ */ require_node_path.getNodePath()).dirname(lockPath);
|
|
191
|
+
if (parent && parent !== "." && parent !== lockPath) fs.mkdirSync(parent, { recursive: true });
|
|
192
|
+
fs.mkdirSync(lockPath);
|
|
193
|
+
this.activeLocks.add(lockPath);
|
|
194
|
+
this.startTouchTimer(lockPath, touchIntervalMs);
|
|
195
|
+
return () => this.release(lockPath);
|
|
196
|
+
} catch (e) {
|
|
197
|
+
const code = e.code;
|
|
198
|
+
if (code === "EEXIST") {
|
|
199
|
+
if (this.isStale(lockPath, staleMs)) throw new require_primordials_error.ErrorCtor(`Stale lock detected: ${lockPath}`);
|
|
200
|
+
throw new require_primordials_error.ErrorCtor(`Lock already exists: ${lockPath}`);
|
|
201
|
+
}
|
|
202
|
+
if (code === "EACCES" || code === "EPERM") throw new require_primordials_error.ErrorCtor(`Permission denied creating lock: ${lockPath}. Check directory permissions or run with appropriate access.`, { cause: e });
|
|
203
|
+
if (code === "EROFS") throw new require_primordials_error.ErrorCtor(`Cannot create lock on read-only filesystem: ${lockPath}`, { cause: e });
|
|
204
|
+
if (code === "ENOTDIR") {
|
|
205
|
+
const lastSlashIndex = require_primordials_math.MathMax(lockPath.lastIndexOf("/"), lockPath.lastIndexOf("\\"));
|
|
206
|
+
const parentDir = lastSlashIndex === -1 ? "." : lockPath.slice(0, lastSlashIndex);
|
|
207
|
+
throw new require_primordials_error.ErrorCtor(`Cannot create lock directory: ${lockPath}\nA path component is a file when it should be a directory.
|
|
208
|
+
Parent path: ${parentDir}\nTo resolve:
|
|
209
|
+
1. Check if "${parentDir}" contains a file instead of a directory\n 2. Remove any conflicting files in the path
|
|
210
|
+
3. Ensure the full parent directory structure exists`, { cause: e });
|
|
211
|
+
}
|
|
212
|
+
if (code === "ENOENT") {
|
|
213
|
+
const lastSlashIndex = require_primordials_math.MathMax(lockPath.lastIndexOf("/"), lockPath.lastIndexOf("\\"));
|
|
214
|
+
const parentDir = lastSlashIndex === -1 ? "." : lockPath.slice(0, lastSlashIndex);
|
|
215
|
+
throw new require_primordials_error.ErrorCtor(`Cannot create lock directory: ${lockPath}\nParent directory does not exist: ${parentDir}\nTo resolve:
|
|
216
|
+
1. Ensure the parent directory "${parentDir}" exists\n 2. Create the directory structure: mkdir -p "${parentDir}"\n 3. Check filesystem permissions allow directory creation`, { cause: e });
|
|
217
|
+
}
|
|
218
|
+
throw new require_primordials_error.ErrorCtor(`Failed to acquire lock: ${lockPath}`, { cause: e });
|
|
219
|
+
}
|
|
220
|
+
}, {
|
|
221
|
+
retries,
|
|
222
|
+
baseDelayMs,
|
|
223
|
+
maxDelayMs,
|
|
224
|
+
jitter: true
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Release a lock and remove from tracking. Stops periodic touching and
|
|
229
|
+
* removes the lock directory.
|
|
230
|
+
*
|
|
231
|
+
* @example
|
|
232
|
+
* ;```typescript
|
|
233
|
+
* processLock.release('/tmp/my-lock')
|
|
234
|
+
* ```
|
|
235
|
+
*
|
|
236
|
+
* @param lockPath - Path to the lock directory.
|
|
237
|
+
*/
|
|
238
|
+
release(lockPath) {
|
|
239
|
+
this.stopTouchTimer(lockPath);
|
|
240
|
+
try {
|
|
241
|
+
if ((/* @__PURE__ */ require_node_fs.getNodeFs()).existsSync(lockPath)) require_fs_safe.safeDeleteSync(lockPath, { recursive: true });
|
|
242
|
+
this.activeLocks.delete(lockPath);
|
|
243
|
+
} catch (e) {
|
|
244
|
+
logger.warn(`Failed to release lock ${lockPath}: ${require_errors_message.errorMessage(e)}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Execute a function with exclusive lock protection. Automatically handles
|
|
249
|
+
* lock acquisition, execution, and cleanup.
|
|
250
|
+
*
|
|
251
|
+
* This is the recommended way to use process locks, as it guarantees cleanup
|
|
252
|
+
* even if the callback throws an error.
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ;```typescript
|
|
256
|
+
* const result = await processLock.withLock('/tmp/my-lock', async () => {
|
|
257
|
+
* // Critical section
|
|
258
|
+
* return someValue
|
|
259
|
+
* })
|
|
260
|
+
* ```
|
|
261
|
+
*
|
|
262
|
+
* @param lockPath - Path to the lock directory.
|
|
263
|
+
* @param fn - Function to execute while holding the lock.
|
|
264
|
+
* @param options - Lock acquisition options.
|
|
265
|
+
*
|
|
266
|
+
* @returns Result of the callback function
|
|
267
|
+
*
|
|
268
|
+
* @throws Error from callback or lock acquisition failure
|
|
269
|
+
*/
|
|
270
|
+
async withLock(lockPath, fn, options) {
|
|
271
|
+
const release = await this.acquire(lockPath, options);
|
|
272
|
+
try {
|
|
273
|
+
return await fn();
|
|
274
|
+
} finally {
|
|
275
|
+
release();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
19
278
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
ProcessLockManager: () => ProcessLockManager
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(lock_manager_exports);
|
|
26
|
-
var import_message = require("../errors/message");
|
|
27
|
-
var import_safe = require("../fs/safe");
|
|
28
|
-
var import_default = require("../logger/default");
|
|
29
|
-
var import_date = require("../primordials/date");
|
|
30
|
-
var import_error = require("../primordials/error");
|
|
31
|
-
var import_map_set = require("../primordials/map-set");
|
|
32
|
-
var import_math = require("../primordials/math");
|
|
33
|
-
var import_retry = require("../promises/retry");
|
|
34
|
-
var import_handler = require("../events/exit/handler");
|
|
35
|
-
var import_internal = require("./_internal");
|
|
36
|
-
const logger = (0, import_default.getDefaultLogger)();
|
|
37
|
-
class ProcessLockManager {
|
|
38
|
-
activeLocks = new import_map_set.SetCtor();
|
|
39
|
-
touchTimers = new import_map_set.MapCtor();
|
|
40
|
-
exitHandlerRegistered = false;
|
|
41
|
-
/**
|
|
42
|
-
* Ensure process exit handler is registered for cleanup. Registers a handler
|
|
43
|
-
* that cleans up all active locks when the process exits.
|
|
44
|
-
*/
|
|
45
|
-
ensureExitHandler() {
|
|
46
|
-
if (this.exitHandlerRegistered) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
(0, import_handler.onExit)(() => {
|
|
50
|
-
for (const timer of this.touchTimers.values()) {
|
|
51
|
-
clearInterval(timer);
|
|
52
|
-
}
|
|
53
|
-
this.touchTimers.clear();
|
|
54
|
-
const fs = (0, import_internal.getFs)();
|
|
55
|
-
for (const lockPath of this.activeLocks) {
|
|
56
|
-
try {
|
|
57
|
-
if (fs.existsSync(lockPath)) {
|
|
58
|
-
(0, import_safe.safeDeleteSync)(lockPath, { recursive: true });
|
|
59
|
-
}
|
|
60
|
-
} catch {
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
this.exitHandlerRegistered = true;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Touch a lock file to update its mtime. This prevents the lock from being
|
|
68
|
-
* detected as stale during long operations.
|
|
69
|
-
*
|
|
70
|
-
* @param lockPath - Path to the lock directory.
|
|
71
|
-
*/
|
|
72
|
-
touchLock(lockPath) {
|
|
73
|
-
try {
|
|
74
|
-
const fs = (0, import_internal.getFs)();
|
|
75
|
-
if (fs.existsSync(lockPath)) {
|
|
76
|
-
const now = (0, import_date.DateNow)() / 1e3;
|
|
77
|
-
fs.utimesSync(lockPath, now, now);
|
|
78
|
-
}
|
|
79
|
-
} catch (e) {
|
|
80
|
-
logger.warn(`Failed to touch lock ${lockPath}: ${(0, import_message.errorMessage)(e)}`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Start periodic touching of a lock file. Aligned with npm npx strategy to
|
|
85
|
-
* prevent false stale detection.
|
|
86
|
-
*
|
|
87
|
-
* @param lockPath - Path to the lock directory.
|
|
88
|
-
* @param intervalMs - Touch interval in milliseconds.
|
|
89
|
-
*/
|
|
90
|
-
startTouchTimer(lockPath, intervalMs) {
|
|
91
|
-
if (intervalMs <= 0 || this.touchTimers.has(lockPath)) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
const timer = setInterval(() => {
|
|
95
|
-
this.touchLock(lockPath);
|
|
96
|
-
}, intervalMs);
|
|
97
|
-
timer.unref();
|
|
98
|
-
this.touchTimers.set(lockPath, timer);
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Stop periodic touching of a lock file.
|
|
102
|
-
*
|
|
103
|
-
* @param lockPath - Path to the lock directory.
|
|
104
|
-
*/
|
|
105
|
-
stopTouchTimer(lockPath) {
|
|
106
|
-
const timer = this.touchTimers.get(lockPath);
|
|
107
|
-
if (timer) {
|
|
108
|
-
clearInterval(timer);
|
|
109
|
-
this.touchTimers.delete(lockPath);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Check if a lock is stale based on mtime. Uses second-level granularity to
|
|
114
|
-
* avoid APFS floating-point precision issues. Aligned with npm's npx locking
|
|
115
|
-
* strategy.
|
|
116
|
-
*
|
|
117
|
-
* @param lockPath - Path to the lock directory.
|
|
118
|
-
* @param staleMs - Stale timeout in milliseconds.
|
|
119
|
-
*
|
|
120
|
-
* @returns True if lock exists and is stale
|
|
121
|
-
*/
|
|
122
|
-
isStale(lockPath, staleMs) {
|
|
123
|
-
try {
|
|
124
|
-
const stats = (0, import_internal.getFs)().statSync(lockPath, { throwIfNoEntry: false });
|
|
125
|
-
if (!stats) {
|
|
126
|
-
return false;
|
|
127
|
-
}
|
|
128
|
-
return (0, import_date.DateNow)() - stats.mtime.getTime() > staleMs;
|
|
129
|
-
} catch {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Acquire a lock using mkdir for atomic operation. Handles stale locks and
|
|
135
|
-
* includes exit cleanup.
|
|
136
|
-
*
|
|
137
|
-
* This method attempts to create a lock directory atomically. If the lock
|
|
138
|
-
* already exists, it checks if it's stale and removes it before retrying.
|
|
139
|
-
* Uses exponential backoff with jitter for retry attempts.
|
|
140
|
-
*
|
|
141
|
-
* @example
|
|
142
|
-
* ;```typescript
|
|
143
|
-
* const release = await processLock.acquire('/tmp/my-lock')
|
|
144
|
-
* try {
|
|
145
|
-
* // Critical section
|
|
146
|
-
* } finally {
|
|
147
|
-
* release()
|
|
148
|
-
* }
|
|
149
|
-
* ```
|
|
150
|
-
*
|
|
151
|
-
* @param lockPath - Path to the lock directory.
|
|
152
|
-
* @param options - Lock acquisition options.
|
|
153
|
-
*
|
|
154
|
-
* @returns Release function to unlock
|
|
155
|
-
*
|
|
156
|
-
* @throws Error if lock cannot be acquired after all retries
|
|
157
|
-
*/
|
|
158
|
-
async acquire(lockPath, options = {}) {
|
|
159
|
-
const {
|
|
160
|
-
baseDelayMs = 100,
|
|
161
|
-
maxDelayMs = 1e3,
|
|
162
|
-
retries = 3,
|
|
163
|
-
staleMs = 5e3,
|
|
164
|
-
touchIntervalMs = 2e3
|
|
165
|
-
} = options;
|
|
166
|
-
this.ensureExitHandler();
|
|
167
|
-
return await (0, import_retry.pRetry)(
|
|
168
|
-
async () => {
|
|
169
|
-
try {
|
|
170
|
-
if (this.isStale(lockPath, staleMs)) {
|
|
171
|
-
logger.log(`Removing stale lock: ${lockPath}`);
|
|
172
|
-
try {
|
|
173
|
-
(0, import_safe.safeDeleteSync)(lockPath, { recursive: true });
|
|
174
|
-
} catch {
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
const fs = (0, import_internal.getFs)();
|
|
178
|
-
const parent = (0, import_internal.getPath)().dirname(lockPath);
|
|
179
|
-
if (parent && parent !== "." && parent !== lockPath) {
|
|
180
|
-
fs.mkdirSync(parent, { recursive: true });
|
|
181
|
-
}
|
|
182
|
-
fs.mkdirSync(lockPath);
|
|
183
|
-
this.activeLocks.add(lockPath);
|
|
184
|
-
this.startTouchTimer(lockPath, touchIntervalMs);
|
|
185
|
-
return () => this.release(lockPath);
|
|
186
|
-
} catch (e) {
|
|
187
|
-
const code = e.code;
|
|
188
|
-
if (code === "EEXIST") {
|
|
189
|
-
if (this.isStale(lockPath, staleMs)) {
|
|
190
|
-
throw new import_error.ErrorCtor(`Stale lock detected: ${lockPath}`);
|
|
191
|
-
}
|
|
192
|
-
throw new import_error.ErrorCtor(`Lock already exists: ${lockPath}`);
|
|
193
|
-
}
|
|
194
|
-
if (code === "EACCES" || code === "EPERM") {
|
|
195
|
-
throw new import_error.ErrorCtor(
|
|
196
|
-
`Permission denied creating lock: ${lockPath}. Check directory permissions or run with appropriate access.`,
|
|
197
|
-
{ cause: e }
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
if (code === "EROFS") {
|
|
201
|
-
throw new import_error.ErrorCtor(
|
|
202
|
-
`Cannot create lock on read-only filesystem: ${lockPath}`,
|
|
203
|
-
{ cause: e }
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
if (code === "ENOTDIR") {
|
|
207
|
-
const lastSlashIndex = (0, import_math.MathMax)(
|
|
208
|
-
lockPath.lastIndexOf("/"),
|
|
209
|
-
lockPath.lastIndexOf("\\")
|
|
210
|
-
);
|
|
211
|
-
const parentDir = lastSlashIndex === -1 ? "." : lockPath.slice(0, lastSlashIndex);
|
|
212
|
-
throw new import_error.ErrorCtor(
|
|
213
|
-
`Cannot create lock directory: ${lockPath}
|
|
214
|
-
A path component is a file when it should be a directory.
|
|
215
|
-
Parent path: ${parentDir}
|
|
216
|
-
To resolve:
|
|
217
|
-
1. Check if "${parentDir}" contains a file instead of a directory
|
|
218
|
-
2. Remove any conflicting files in the path
|
|
219
|
-
3. Ensure the full parent directory structure exists`,
|
|
220
|
-
{ cause: e }
|
|
221
|
-
);
|
|
222
|
-
}
|
|
223
|
-
if (code === "ENOENT") {
|
|
224
|
-
const lastSlashIndex = (0, import_math.MathMax)(
|
|
225
|
-
lockPath.lastIndexOf("/"),
|
|
226
|
-
lockPath.lastIndexOf("\\")
|
|
227
|
-
);
|
|
228
|
-
const parentDir = lastSlashIndex === -1 ? "." : lockPath.slice(0, lastSlashIndex);
|
|
229
|
-
throw new import_error.ErrorCtor(
|
|
230
|
-
`Cannot create lock directory: ${lockPath}
|
|
231
|
-
Parent directory does not exist: ${parentDir}
|
|
232
|
-
To resolve:
|
|
233
|
-
1. Ensure the parent directory "${parentDir}" exists
|
|
234
|
-
2. Create the directory structure: mkdir -p "${parentDir}"
|
|
235
|
-
3. Check filesystem permissions allow directory creation`,
|
|
236
|
-
{ cause: e }
|
|
237
|
-
);
|
|
238
|
-
}
|
|
239
|
-
throw new import_error.ErrorCtor(`Failed to acquire lock: ${lockPath}`, {
|
|
240
|
-
cause: e
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
},
|
|
244
|
-
{
|
|
245
|
-
retries,
|
|
246
|
-
baseDelayMs,
|
|
247
|
-
maxDelayMs,
|
|
248
|
-
jitter: true
|
|
249
|
-
}
|
|
250
|
-
);
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Release a lock and remove from tracking. Stops periodic touching and
|
|
254
|
-
* removes the lock directory.
|
|
255
|
-
*
|
|
256
|
-
* @example
|
|
257
|
-
* ;```typescript
|
|
258
|
-
* processLock.release('/tmp/my-lock')
|
|
259
|
-
* ```
|
|
260
|
-
*
|
|
261
|
-
* @param lockPath - Path to the lock directory.
|
|
262
|
-
*/
|
|
263
|
-
release(lockPath) {
|
|
264
|
-
this.stopTouchTimer(lockPath);
|
|
265
|
-
try {
|
|
266
|
-
if ((0, import_internal.getFs)().existsSync(lockPath)) {
|
|
267
|
-
(0, import_safe.safeDeleteSync)(lockPath, { recursive: true });
|
|
268
|
-
}
|
|
269
|
-
this.activeLocks.delete(lockPath);
|
|
270
|
-
} catch (e) {
|
|
271
|
-
logger.warn(`Failed to release lock ${lockPath}: ${(0, import_message.errorMessage)(e)}`);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Execute a function with exclusive lock protection. Automatically handles
|
|
276
|
-
* lock acquisition, execution, and cleanup.
|
|
277
|
-
*
|
|
278
|
-
* This is the recommended way to use process locks, as it guarantees cleanup
|
|
279
|
-
* even if the callback throws an error.
|
|
280
|
-
*
|
|
281
|
-
* @example
|
|
282
|
-
* ;```typescript
|
|
283
|
-
* const result = await processLock.withLock('/tmp/my-lock', async () => {
|
|
284
|
-
* // Critical section
|
|
285
|
-
* return someValue
|
|
286
|
-
* })
|
|
287
|
-
* ```
|
|
288
|
-
*
|
|
289
|
-
* @param lockPath - Path to the lock directory.
|
|
290
|
-
* @param fn - Function to execute while holding the lock.
|
|
291
|
-
* @param options - Lock acquisition options.
|
|
292
|
-
*
|
|
293
|
-
* @returns Result of the callback function
|
|
294
|
-
*
|
|
295
|
-
* @throws Error from callback or lock acquisition failure
|
|
296
|
-
*/
|
|
297
|
-
async withLock(lockPath, fn, options) {
|
|
298
|
-
const release = await this.acquire(lockPath, options);
|
|
299
|
-
try {
|
|
300
|
-
return await fn();
|
|
301
|
-
} finally {
|
|
302
|
-
release();
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
307
|
-
0 && (module.exports = {
|
|
308
|
-
ProcessLockManager
|
|
309
|
-
});
|
|
279
|
+
|
|
280
|
+
//#endregion
|
|
281
|
+
exports.ProcessLockManager = ProcessLockManager;
|
|
@@ -1,18 +1,2 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/* Socket Lib - Built with
|
|
3
|
-
"use strict";
|
|
4
|
-
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __copyProps = (to, from, except, desc) => {
|
|
9
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
-
for (let key of __getOwnPropNames(from))
|
|
11
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
-
}
|
|
14
|
-
return to;
|
|
15
|
-
};
|
|
16
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
17
|
-
var lock_types_exports = {};
|
|
18
|
-
module.exports = __toCommonJS(lock_types_exports);
|
|
2
|
+
/* Socket Lib - Built with rolldown */
|