letify 2.1.1__tar.gz → 2.1.3__tar.gz
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.
Potentially problematic release.
This version of letify might be problematic. Click here for more details.
- {letify-2.1.1 → letify-2.1.3}/PKG-INFO +1 -1
- {letify-2.1.1 → letify-2.1.3}/letify/__init__.py +1 -1
- {letify-2.1.1 → letify-2.1.3}/letify/protocol/worker.py +17 -8
- {letify-2.1.1 → letify-2.1.3}/letify-core/Cargo.lock +3 -3
- {letify-2.1.1 → letify-2.1.3}/letify-core/Cargo.toml +1 -1
- {letify-2.1.1 → letify-2.1.3}/letify-ext/package-lock.json +2 -2
- {letify-2.1.1 → letify-2.1.3}/letify-ext/package.json +1 -1
- {letify-2.1.1 → letify-2.1.3}/pyproject.toml +1 -1
- {letify-2.1.1 → letify-2.1.3}/tests/test_transport.py +5 -0
- {letify-2.1.1 → letify-2.1.3}/.github/workflows/ci.yml +0 -0
- {letify-2.1.1 → letify-2.1.3}/.github/workflows/docs.yml +0 -0
- {letify-2.1.1 → letify-2.1.3}/.github/workflows/publish.yml +0 -0
- {letify-2.1.1 → letify-2.1.3}/.gitignore +0 -0
- {letify-2.1.1 → letify-2.1.3}/.researchtree +0 -0
- {letify-2.1.1 → letify-2.1.3}/LICENSE +0 -0
- {letify-2.1.1 → letify-2.1.3}/README.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/01-getting-started.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/02-providers.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/03-execution-modes.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/04-environments-and-data.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/05-concurrency.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/06-cost.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/07-troubleshooting.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/08-releasing.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/README.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/ko/01-/354/213/234/354/236/221/355/225/230/352/270/260.md" +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/ko/02-/355/224/204/353/241/234/353/260/224/354/235/264/353/215/224.md" +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/ko/03-/354/213/244/355/226/211-/353/260/251/354/213/235.md" +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/ko/04-/355/231/230/352/262/275/352/263/274-/353/215/260/354/235/264/355/204/260.md" +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/ko/05-/353/217/231/354/213/234-/354/213/244/355/226/211.md" +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/ko/06-/353/271/204/354/232/251.md" +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/ko/07-/353/254/270/354/240/234-/355/225/264/352/262/260.md" +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/ko/08-/353/246/264/353/246/254/354/212/244.md" +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/guide/ko/README.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/locales/README_ko.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/docs/mkdocs.yml +0 -0
- {letify-2.1.1 → letify-2.1.3}/examples/README.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/examples/nvfp4-lora/.letify.example +0 -0
- {letify-2.1.1 → letify-2.1.3}/examples/nvfp4-lora/00_smoke.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/examples/nvfp4-lora/01_sweep.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/examples/nvfp4-lora/02_resume.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/examples/nvfp4-lora/03_watch.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/examples/nvfp4-lora/README.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/examples/nvfp4-lora/README_ko.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/examples/nvfp4-lora/common.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/examples/nvfp4-lora/recipe.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/cli.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/config/__init__.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/config/inventory.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/config/login.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/config/schema.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/config/secrets.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/config/writer.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/declare/__init__.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/declare/cache.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/declare/env.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/declare/function.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/declare/instance.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/errors.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/install.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/launcher.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/paths.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/protocol/__init__.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/protocol/codec.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/protocol/driver.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/protocol/handle.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/protocol/wire.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/__init__.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/base.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/colab.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/colab_files.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/colab_keepalive.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/elice.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/kaggle.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/kaggle_adapter.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/local.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/modal.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/modal_adapter.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/naming.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/shell.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/tunnel.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/providers/usage.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/__init__.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/capability.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/device/__init__.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/device/client.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/device/cuda.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/device/executor.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/device/frames.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/device/guard.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/device/tensor.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/device/trace.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/device/value.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/loader.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/remoting/probe.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/render.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/runtime/__init__.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/runtime/bootstrap.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/runtime/channel.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/runtime/lease.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/runtime/pool.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/runtime/session.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/runtime/telemetry.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/store/__init__.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/store/backends/__init__.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/store/backends/filesystem.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/store/backends/google_auth.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/store/backends/layout.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/store/backends/objects.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/store/cas.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/store/pathdata.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/store/sendorder.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/store/volume.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/stubs.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/tools.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/__init__.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/agent.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/announce.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/link.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/nat.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/pipeline.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/portmap.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/probe.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/quic.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/rendezvous.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/setup.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/sshopts.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify/transport/strategies.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/.gitignore +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/build.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-agent/Cargo.toml +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-agent/src/driver.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-agent/src/main.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-driver/Cargo.toml +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-driver/src/client.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-driver/src/exports.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-driver/src/image.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-driver/src/lib.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-driver/src/status.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-driver/src/table.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-quic/Cargo.toml +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-quic/src/main.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-wire/Cargo.toml +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-wire/src/lib.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/letify-wire/tests/throughput.rs +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-core/rust-toolchain.toml +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/.vscodeignore +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/LICENSE +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/README.md +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/media/icon.svg +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/src/cli.ts +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/src/extension.ts +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/src/history.ts +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/src/model.ts +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/src/poll.ts +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/src/render.ts +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/test/cli.test.ts +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/test/manifest.test.ts +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/test/model.test.ts +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/test/regressions.test.ts +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify-ext/tsconfig.json +0 -0
- {letify-2.1.1 → letify-2.1.3}/letify_providers.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/scripts/sync-main.sh +0 -0
- {letify-2.1.1 → letify-2.1.3}/scripts/version.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/conftest.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/fake_kaggle_adapter.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/fake_modal_adapter.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_cli.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_cli_output.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_colab_keepalive.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_config.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_core.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_data.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_data_streaming.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_declare.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_device.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_editor_sessions.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_elice.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_frames.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_install.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_kaggle.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_kaggle_cookie.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_kaggle_link.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_link_log.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_notebook.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_parallel_placement.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_paths.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_portmap.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_protocol.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_providers.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_quic.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_remoting.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_render.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_runtime.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_ship.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_store.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_strategies.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_stubs.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_tunnel_setup.py +0 -0
- {letify-2.1.1 → letify-2.1.3}/tests/test_version.py +0 -0
|
@@ -1307,23 +1307,32 @@ def _data_install_patch():
|
|
|
1307
1307
|
entries.append(_PendingEntry(name, prefix + name, size))
|
|
1308
1308
|
return _Scandir(entries, found)
|
|
1309
1309
|
|
|
1310
|
+
def missing(path, found, real_name, kwargs):
|
|
1311
|
+
"""Answer a stat that found nothing, from the manifest or by looking again.
|
|
1312
|
+
|
|
1313
|
+
The real stat runs first, so the data thread can place the file and drop it from
|
|
1314
|
+
the pending map in between, leaving the path in neither: not on disk when it was
|
|
1315
|
+
looked for, not pending when the manifest was asked. Looking again settles it,
|
|
1316
|
+
because placement puts the file on disk before it clears pending, so the second
|
|
1317
|
+
look finds it. A path that is genuinely absent raises as it should. Spec "What the
|
|
1318
|
+
body sees before a file arrives"; the listing states the same rule and takes its
|
|
1319
|
+
snapshot first instead, which a stat cannot afford on a data loader's hot path.
|
|
1320
|
+
"""
|
|
1321
|
+
if found is not None:
|
|
1322
|
+
return _data_fake_stat(found[2][1])
|
|
1323
|
+
return real[real_name](path, **kwargs)
|
|
1324
|
+
|
|
1310
1325
|
def stated(path, **kwargs):
|
|
1311
1326
|
try:
|
|
1312
1327
|
return real["stat"](path, **kwargs)
|
|
1313
1328
|
except FileNotFoundError:
|
|
1314
|
-
|
|
1315
|
-
if found is None:
|
|
1316
|
-
raise
|
|
1317
|
-
return _data_fake_stat(found[2][1])
|
|
1329
|
+
return missing(path, pending_of(path), "stat", kwargs)
|
|
1318
1330
|
|
|
1319
1331
|
def lstated(path, **kwargs):
|
|
1320
1332
|
try:
|
|
1321
1333
|
return real["lstat"](path, **kwargs)
|
|
1322
1334
|
except FileNotFoundError:
|
|
1323
|
-
|
|
1324
|
-
if found is None:
|
|
1325
|
-
raise
|
|
1326
|
-
return _data_fake_stat(found[2][1])
|
|
1335
|
+
return missing(path, pending_of(path), "lstat", kwargs)
|
|
1327
1336
|
|
|
1328
1337
|
def disguise(patched, module, name):
|
|
1329
1338
|
"""Give a wrapper the name it replaced, so pickling it finds the name, not the
|
|
@@ -138,7 +138,7 @@ dependencies = [
|
|
|
138
138
|
|
|
139
139
|
[[package]]
|
|
140
140
|
name = "letify-agent"
|
|
141
|
-
version = "2.1.
|
|
141
|
+
version = "2.1.3"
|
|
142
142
|
dependencies = [
|
|
143
143
|
"letify-wire",
|
|
144
144
|
"libloading",
|
|
@@ -146,7 +146,7 @@ dependencies = [
|
|
|
146
146
|
|
|
147
147
|
[[package]]
|
|
148
148
|
name = "letify-driver"
|
|
149
|
-
version = "2.1.
|
|
149
|
+
version = "2.1.3"
|
|
150
150
|
dependencies = [
|
|
151
151
|
"letify-wire",
|
|
152
152
|
]
|
|
@@ -164,7 +164,7 @@ dependencies = [
|
|
|
164
164
|
|
|
165
165
|
[[package]]
|
|
166
166
|
name = "letify-wire"
|
|
167
|
-
version = "2.1.
|
|
167
|
+
version = "2.1.3"
|
|
168
168
|
|
|
169
169
|
[[package]]
|
|
170
170
|
name = "libc"
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "letify-status",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.3",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "letify-status",
|
|
9
|
-
"version": "2.1.
|
|
9
|
+
"version": "2.1.3",
|
|
10
10
|
"license": "SEE LICENSE IN LICENSE",
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"@types/node": "^18.19.0",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "letify-status",
|
|
3
3
|
"displayName": "letify Status",
|
|
4
4
|
"description": "letify quota and GPU activity in the status bar, read from the letify CLI.",
|
|
5
|
-
"version": "2.1.
|
|
5
|
+
"version": "2.1.3",
|
|
6
6
|
"publisher": "darkpyonix",
|
|
7
7
|
"license": "SEE LICENSE IN LICENSE",
|
|
8
8
|
"repository": {
|
|
@@ -127,6 +127,9 @@ def test_a_dial_the_kernel_refuses_at_once_is_not_taken_for_a_connection() -> No
|
|
|
127
127
|
taken_far, _ = peer_listener.accept()
|
|
128
128
|
token = b"d" * 16
|
|
129
129
|
arrived: dict[str, socket.socket] = {}
|
|
130
|
+
# The handshake completes inside create_connection, so the punch can return before the
|
|
131
|
+
# thread has published the socket. Without waiting the read below raises KeyError.
|
|
132
|
+
published = threading.Event()
|
|
130
133
|
|
|
131
134
|
def peer_completes_its_own_dial() -> None:
|
|
132
135
|
# Over loopback the taken pair is also the peer's own pair seen from its side, so
|
|
@@ -134,12 +137,14 @@ def test_a_dial_the_kernel_refuses_at_once_is_not_taken_for_a_connection() -> No
|
|
|
134
137
|
# refused, and a connection then arrives on its listener.
|
|
135
138
|
time.sleep(0.25)
|
|
136
139
|
arrived["sock"] = socket.create_connection(("127.0.0.1", port))
|
|
140
|
+
published.set()
|
|
137
141
|
|
|
138
142
|
threading.Thread(target=peer_completes_its_own_dial, daemon=True).start()
|
|
139
143
|
try:
|
|
140
144
|
chosen = nat.punch(
|
|
141
145
|
port, ("127.0.0.1", peer_port), token, initiator=True, start_at=0, window=5.0
|
|
142
146
|
)
|
|
147
|
+
assert published.wait(10), "the peer's dial never completed"
|
|
143
148
|
assert nat.recv_exact(arrived["sock"], len(nat.HELLO) + 16) == nat.HELLO + token
|
|
144
149
|
chosen.close()
|
|
145
150
|
finally:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{letify-2.1.1 → letify-2.1.3}/docs/guide/ko/01-/354/213/234/354/236/221/355/225/230/352/270/260.md"
RENAMED
|
File without changes
|
|
File without changes
|
{letify-2.1.1 → letify-2.1.3}/docs/guide/ko/03-/354/213/244/355/226/211-/353/260/251/354/213/235.md"
RENAMED
|
File without changes
|
|
File without changes
|
{letify-2.1.1 → letify-2.1.3}/docs/guide/ko/05-/353/217/231/354/213/234-/354/213/244/355/226/211.md"
RENAMED
|
File without changes
|
|
File without changes
|
{letify-2.1.1 → letify-2.1.3}/docs/guide/ko/07-/353/254/270/354/240/234-/355/225/264/352/262/260.md"
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|