@quenty/nevermore-cli 4.47.0 → 4.47.2
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 +11 -0
- package/dist/commands/batch-command/batch-deploy-command.d.ts.map +1 -1
- package/dist/commands/batch-command/batch-deploy-command.js +4 -3
- package/dist/commands/batch-command/batch-deploy-command.js.map +1 -1
- package/dist/utils/build/upload.d.ts.map +1 -1
- package/dist/utils/build/upload.js +4 -1
- package/dist/utils/build/upload.js.map +1 -1
- package/dist/utils/job-context/cloud-job-context.d.ts.map +1 -1
- package/dist/utils/job-context/cloud-job-context.js +5 -3
- package/dist/utils/job-context/cloud-job-context.js.map +1 -1
- package/dist/utils/open-cloud/open-cloud-client.d.ts +4 -4
- package/dist/utils/open-cloud/open-cloud-client.d.ts.map +1 -1
- package/dist/utils/open-cloud/open-cloud-client.js +6 -5
- package/dist/utils/open-cloud/open-cloud-client.js.map +1 -1
- package/dist/utils/open-cloud/rate-limiter.d.ts +29 -2
- package/dist/utils/open-cloud/rate-limiter.d.ts.map +1 -1
- package/dist/utils/open-cloud/rate-limiter.js +98 -20
- package/dist/utils/open-cloud/rate-limiter.js.map +1 -1
- package/dist/utils/open-cloud/rate-limiter.test.js +64 -4
- package/dist/utils/open-cloud/rate-limiter.test.js.map +1 -1
- package/dist/utils/testing/parsers/batch-log-parser.test.js +1 -1
- package/dist/utils/testing/parsers/batch-log-parser.test.js.map +1 -1
- package/dist/utils/testing/runner/test-runner.d.ts.map +1 -1
- package/dist/utils/testing/runner/test-runner.js +8 -7
- package/dist/utils/testing/runner/test-runner.js.map +1 -1
- package/dist/utils/testing/runner/test-runner.test.js +1 -1
- package/dist/utils/testing/runner/test-runner.test.js.map +1 -1
- package/package.json +3 -3
- package/src/commands/batch-command/batch-deploy-command.ts +11 -3
- package/src/utils/build/upload.ts +5 -1
- package/src/utils/job-context/cloud-job-context.ts +24 -15
- package/src/utils/open-cloud/open-cloud-client.ts +25 -12
- package/src/utils/open-cloud/rate-limiter.test.ts +106 -4
- package/src/utils/open-cloud/rate-limiter.ts +150 -21
- package/src/utils/testing/parsers/batch-log-parser.test.ts +3 -3
- package/src/utils/testing/runner/test-runner.test.ts +1 -1
- package/src/utils/testing/runner/test-runner.ts +8 -9
- package/templates/batch-test-runner.lua +176 -172
- package/templates/game-template/src/scripts/Server/ServerMain.server.lua +3 -2
- package/templates/nevermore-library-package-template/test/scripts/Server/ServerMain.server.lua +3 -2
- package/templates/nevermore-service-package-template/test/scripts/Server/ServerMain.server.lua +3 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-runner.test.js","sourceRoot":"","sources":["../../../../src/utils/testing/runner/test-runner.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAQ,EACR,MAAM,EACN,EAAE,EACF,EAAE,GACH,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAOpE,MAAM,YAAY,GAAG;IACnB,gCAAgC;IAChC,kCAAkC;CACnC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,iBAAiB,CAAC,YAAqC,EAAE;IAChE,OAAO;QACL,MAAM,EAAE,mBAAmB;QAC3B,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,EAAE;QACT,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,EAAE;QACZ,eAAe,EAAE,CAAC;QAClB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,SAAS,eAAe;IACtB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAe,EAAE,EAAE;QACpE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAoB,EAAE,IAAY;IACvD,OAAO;QACL,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QACF,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAiB,CAAA;QACrD,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG;QAC/B,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACxD,YAAY,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAC5B,sBAAsB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtC,YAAY,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,WAAmB,CAAC;IAExB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC1E,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAC/C,cAAc,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,QAAQ,CAAC,GAAoB,EAAE,IAAY;QACxD,OAAO,kBAAkB,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;YAClD,WAAW;YACX,WAAW,EAAE,MAAM;YACnB,MAAM,EAAE;gBACN,cAAc,EAAE,uBAAuB;aACb;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,2EAA2E;QAC3E,4EAA4E;QAC5E,wEAAwE;QACxE,gBAAgB;QAChB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;YACE,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;SACjE,EACD,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;YACE,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;SAC/D,EACD,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,2EAA2E;QAC3E,mDAAmD;QACnD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,EACtD,kBAAkB,CACnB,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,yEAAyE;QACzE,mCAAmC;QACnC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,EACtD,GAAG,YAAY,sDAAsD,CACtE,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,4EAA4E;QAC5E,6DAA6D;QAC7D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EACnC,4CAA4C,CAC7C,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EACnC,YAAY,CACb,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,EAC1C,EAAE,CACH,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,EACtD,YAAY,CACb,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EACnC,YAAY,CACb,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,yEAAyE;QACzE,uEAAuE;QACvE,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QAEnC,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;QAElE,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"test-runner.test.js","sourceRoot":"","sources":["../../../../src/utils/testing/runner/test-runner.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAQ,EACR,MAAM,EACN,EAAE,EACF,EAAE,GACH,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAOpE,MAAM,YAAY,GAAG;IACnB,gCAAgC;IAChC,kCAAkC;CACnC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,iBAAiB,CAAC,YAAqC,EAAE;IAChE,OAAO;QACL,MAAM,EAAE,mBAAmB;QAC3B,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,EAAE;QACT,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,EAAE;QACZ,eAAe,EAAE,CAAC;QAClB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,SAAS,eAAe;IACtB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAe,EAAE,EAAE;QACpE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAoB,EAAE,IAAY;IACvD,OAAO;QACL,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QACF,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAiB,CAAA;QACrD,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG;QAC/B,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACxD,YAAY,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAC5B,sBAAsB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtC,YAAY,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,WAAmB,CAAC;IAExB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC1E,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAC/C,cAAc,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,QAAQ,CAAC,GAAoB,EAAE,IAAY;QACxD,OAAO,kBAAkB,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;YAClD,WAAW;YACX,WAAW,EAAE,MAAM;YACnB,MAAM,EAAE;gBACN,cAAc,EAAE,uBAAuB;aACb;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,2EAA2E;QAC3E,4EAA4E;QAC5E,wEAAwE;QACxE,gBAAgB;QAChB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;YACE,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;SACjE,EACD,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;YACE,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;SAC/D,EACD,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,2EAA2E;QAC3E,mDAAmD;QACnD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,EACtD,kBAAkB,CACnB,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,yEAAyE;QACzE,mCAAmC;QACnC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,EACtD,GAAG,YAAY,sDAAsD,CACtE,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,4EAA4E;QAC5E,6DAA6D;QAC7D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EACnC,4CAA4C,CAC7C,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EACnC,YAAY,CACb,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,EAC1C,EAAE,CACH,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,EACtD,YAAY,CACb,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EACnC,YAAY,CACb,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,yEAAyE;QACzE,uEAAuE;QACvE,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QAEnC,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;QAElE,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI,CACtE,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,4EAA4E;QAC5E,8EAA8E;QAC9E,6EAA6E;QAC7E,cAAc;QACd,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,iBAAiB,CAAC,EAChD,aAAa,CACd,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;YACE,OAAO,EAAE,IAAI;YACb,YAAY,EAAE;gBACZ,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;aAC3D;SACF,EACD,+EAA+E,CAChF,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAExD,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE;YACzC,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,iEAAiE;QACjE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;YACE,OAAO,EAAE,IAAI;YACb,YAAY,EAAE;gBACZ,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;aAC3D;SACF,EACD,+EAA+E,CAChF,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,0EAA0E;QAC1E,yEAAyE;QACzE,kCAAkC;QAClC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QAEnC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B;YACE,OAAO,EAAE,IAAI;YACb,WAAW,EAAE;gBACX,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,GAAG;gBACV,YAAY,EAAE,CAAC;gBACf,YAAY,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;gBACd,QAAQ,EAAE,EAAE;gBACZ,eAAe,EAAE,CAAC;aACnB;SACF,EACD,6CAA6C,CAC9C,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1E,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,4EAA4E;QAC5E,iEAAiE;QACjE,MAAM,MAAM,GAAG,mBAAmB,CAChC,2CAA2C,EAC3C,CAAC,wBAAwB,EAAE,mBAAmB,CAAC,CAChD,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,wBAAwB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,mBAAmB,CAChC,wCAAwC,EACxC,CAAC,mBAAmB,CAAC,CACtB,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,IAAI,WAAmB,CAAC;IAExB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QAClE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAC/C,cAAc,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,SAAS,QAAQ,CAAC,IAAY;QAC5B,OAAO,kBAAkB,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE;YAChE,WAAW;YACX,WAAW,EAAE,YAAY;YACzB,MAAM,EAAE;gBACN,cAAc,EAAE,uBAAuB;aACb;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iCAAiC,CAAC,CAAC;QAEjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,2EAA2E;QAC3E,0EAA0E;QAC1E,4EAA4E;QAC5E,wEAAwE;QACxE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QAElC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/nevermore-cli",
|
|
3
|
-
"version": "4.47.
|
|
3
|
+
"version": "4.47.2",
|
|
4
4
|
"description": "CLI interface for Nevermore",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"@quenty/nevermore-cli-helpers": "1.19.0",
|
|
30
30
|
"@quenty/nevermore-deploy": "1.1.1",
|
|
31
31
|
"@quenty/nevermore-template-helpers": "1.20.0",
|
|
32
|
-
"@quenty/studio-bridge": "0.21.
|
|
32
|
+
"@quenty/studio-bridge": "0.21.1",
|
|
33
33
|
"execa": "^9.6.1",
|
|
34
34
|
"find-git-root": "^1.0.4",
|
|
35
35
|
"inquirer": "^13.2.0",
|
|
@@ -60,5 +60,5 @@
|
|
|
60
60
|
"engines": {
|
|
61
61
|
"node": ">=16"
|
|
62
62
|
},
|
|
63
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "e209b95fe15e7490d4d74c32497382d1ef9f74fc"
|
|
64
64
|
}
|
|
@@ -26,7 +26,10 @@ import {
|
|
|
26
26
|
injectDeployMetadataAsync,
|
|
27
27
|
} from '../../utils/deploy/deploy-metadata.js';
|
|
28
28
|
import { OpenCloudClient } from '../../utils/open-cloud/open-cloud-client.js';
|
|
29
|
-
import {
|
|
29
|
+
import {
|
|
30
|
+
RateLimiter,
|
|
31
|
+
reportRateLimitWait,
|
|
32
|
+
} from '../../utils/open-cloud/rate-limiter.js';
|
|
30
33
|
import { CloudJobContext } from '../../utils/job-context/cloud-job-context.js';
|
|
31
34
|
import {
|
|
32
35
|
createBasePlaceResolver,
|
|
@@ -546,12 +549,16 @@ async function _runSmokeTestAsync(
|
|
|
546
549
|
throw new Error(`Smoke test script not found: ${SMOKE_TEST_SCRIPT_PATH}`);
|
|
547
550
|
}
|
|
548
551
|
|
|
552
|
+
const onRateLimitWait = reportRateLimitWait(reporter, packageName);
|
|
553
|
+
|
|
549
554
|
reporter.onPackagePhaseChange(packageName, 'scheduling');
|
|
550
555
|
const task = await client.createExecutionTaskAsync(
|
|
551
556
|
universeId,
|
|
552
557
|
placeId,
|
|
553
558
|
version,
|
|
554
|
-
scriptContent
|
|
559
|
+
scriptContent,
|
|
560
|
+
undefined,
|
|
561
|
+
onRateLimitWait
|
|
555
562
|
);
|
|
556
563
|
|
|
557
564
|
const completedTask = await client.pollTaskCompletionAsync(
|
|
@@ -560,7 +567,8 @@ async function _runSmokeTestAsync(
|
|
|
560
567
|
if (state === 'PROCESSING') {
|
|
561
568
|
reporter.onPackagePhaseChange(packageName, 'executing');
|
|
562
569
|
}
|
|
563
|
-
}
|
|
570
|
+
},
|
|
571
|
+
onRateLimitWait
|
|
564
572
|
);
|
|
565
573
|
|
|
566
574
|
const rawLogs = await client.getRawTaskLogsAsync(task.path);
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
} from '@quenty/nevermore-cli-helpers';
|
|
5
5
|
import { type DeployTarget } from '@quenty/nevermore-deploy';
|
|
6
6
|
import { OpenCloudClient } from '../open-cloud/open-cloud-client.js';
|
|
7
|
+
import { reportRateLimitWait } from '../open-cloud/rate-limiter.js';
|
|
7
8
|
import { type BuiltPlace } from './build.js';
|
|
8
9
|
import { type Reporter } from '@quenty/cli-output-helpers/reporting';
|
|
9
10
|
|
|
@@ -53,7 +54,10 @@ export async function uploadPlaceAsync(
|
|
|
53
54
|
target.placeId,
|
|
54
55
|
rbxlPath,
|
|
55
56
|
args.publish,
|
|
56
|
-
onProgress
|
|
57
|
+
onProgress,
|
|
58
|
+
reporter && packageName
|
|
59
|
+
? reportRateLimitWait(reporter, packageName)
|
|
60
|
+
: undefined
|
|
57
61
|
);
|
|
58
62
|
|
|
59
63
|
return { client, apiKey, target, version };
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type LuauTask,
|
|
5
5
|
type OpenCloudClient,
|
|
6
6
|
} from '../open-cloud/open-cloud-client.js';
|
|
7
|
+
import { reportRateLimitWait } from '../open-cloud/rate-limiter.js';
|
|
7
8
|
import { tryRenamePlaceAsync } from '@quenty/nevermore-cli-helpers';
|
|
8
9
|
import { buildPlaceNameAsync, timeoutAsync } from '../nevermore-cli-utils.js';
|
|
9
10
|
import {
|
|
@@ -60,7 +61,8 @@ export class CloudJobContext extends BaseJobContext {
|
|
|
60
61
|
transferredBytes: transferred,
|
|
61
62
|
totalBytes: total,
|
|
62
63
|
});
|
|
63
|
-
}
|
|
64
|
+
},
|
|
65
|
+
reportRateLimitWait(this._reporter, packageName)
|
|
64
66
|
);
|
|
65
67
|
|
|
66
68
|
// Eagerly release build artifacts after upload (disposeAsync is safety net)
|
|
@@ -82,13 +84,16 @@ export class CloudJobContext extends BaseJobContext {
|
|
|
82
84
|
const cloudDeployment = deployment as CloudDeployment;
|
|
83
85
|
const { scriptContent, packageName, timeoutMs = 120_000 } = options;
|
|
84
86
|
|
|
87
|
+
const onRateLimitWait = reportRateLimitWait(this._reporter, packageName);
|
|
88
|
+
|
|
85
89
|
this._reporter.onPackagePhaseChange(packageName, 'scheduling');
|
|
86
90
|
const task = await this._openCloudClient!.createExecutionTaskAsync(
|
|
87
91
|
cloudDeployment.universeId,
|
|
88
92
|
cloudDeployment.placeId,
|
|
89
93
|
cloudDeployment.version,
|
|
90
94
|
scriptContent,
|
|
91
|
-
timeoutMs
|
|
95
|
+
timeoutMs,
|
|
96
|
+
onRateLimitWait
|
|
92
97
|
);
|
|
93
98
|
|
|
94
99
|
// Give the server-side timeout a head start so we observe the cancelled
|
|
@@ -97,19 +102,23 @@ export class CloudJobContext extends BaseJobContext {
|
|
|
97
102
|
|
|
98
103
|
let pollCount = 0;
|
|
99
104
|
const completedTask = await Promise.race([
|
|
100
|
-
this._openCloudClient!.pollTaskCompletionAsync(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
105
|
+
this._openCloudClient!.pollTaskCompletionAsync(
|
|
106
|
+
task.path,
|
|
107
|
+
(state) => {
|
|
108
|
+
pollCount++;
|
|
109
|
+
if (state === 'PROCESSING') {
|
|
110
|
+
this._reporter.onPackagePhaseChange(packageName, 'executing');
|
|
111
|
+
}
|
|
112
|
+
const label = state === 'QUEUED' ? 'queued' : `poll #${pollCount}`;
|
|
113
|
+
this._reporter.onPackageProgressUpdate(packageName, {
|
|
114
|
+
kind: 'steps',
|
|
115
|
+
completed: pollCount,
|
|
116
|
+
total: 0,
|
|
117
|
+
label,
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
onRateLimitWait
|
|
121
|
+
),
|
|
113
122
|
timeoutAsync(
|
|
114
123
|
timeoutMs + CLIENT_TIMEOUT_GRACE_MS,
|
|
115
124
|
`Test timed out after ${timeoutMs / 1000}s`
|
|
@@ -3,7 +3,11 @@ import * as path from 'path';
|
|
|
3
3
|
import { Readable, Transform } from 'node:stream';
|
|
4
4
|
import nodeFetch from 'node-fetch';
|
|
5
5
|
import { OutputHelper } from '@quenty/cli-output-helpers';
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
RateLimiter,
|
|
8
|
+
type FetchLike,
|
|
9
|
+
type RateLimitWait,
|
|
10
|
+
} from './rate-limiter.js';
|
|
7
11
|
import {
|
|
8
12
|
parseTestLogs,
|
|
9
13
|
type ParsedTestLogs,
|
|
@@ -264,7 +268,8 @@ export class OpenCloudClient {
|
|
|
264
268
|
placeId: number,
|
|
265
269
|
rbxlPath: string,
|
|
266
270
|
publish?: boolean,
|
|
267
|
-
onProgress?: (transferredBytes: number, totalBytes: number) => void
|
|
271
|
+
onProgress?: (transferredBytes: number, totalBytes: number) => void,
|
|
272
|
+
onRateLimitWait?: (wait: RateLimitWait) => void
|
|
268
273
|
): Promise<number> {
|
|
269
274
|
OutputHelper.verbose(
|
|
270
275
|
`Uploading to https://www.roblox.com/games/${placeId}/place ...`
|
|
@@ -310,6 +315,7 @@ export class OpenCloudClient {
|
|
|
310
315
|
|
|
311
316
|
const response = await this._rateLimiter.fetchAsync(url, makeUploadInit, {
|
|
312
317
|
fetchImpl: nodeFetch as unknown as FetchLike,
|
|
318
|
+
onWait: onRateLimitWait,
|
|
313
319
|
});
|
|
314
320
|
|
|
315
321
|
if (!response.ok) {
|
|
@@ -362,7 +368,8 @@ export class OpenCloudClient {
|
|
|
362
368
|
placeId: number,
|
|
363
369
|
placeVersion: number,
|
|
364
370
|
script: string,
|
|
365
|
-
timeoutMs?: number
|
|
371
|
+
timeoutMs?: number,
|
|
372
|
+
onRateLimitWait?: (wait: RateLimitWait) => void
|
|
366
373
|
): Promise<LuauTask> {
|
|
367
374
|
const apiKey = await this._resolveApiKeyAsync();
|
|
368
375
|
const url = `https://apis.roblox.com/cloud/v2/universes/${universeId}/places/${placeId}/versions/${placeVersion}/luau-execution-session-tasks`;
|
|
@@ -386,14 +393,18 @@ export class OpenCloudClient {
|
|
|
386
393
|
body.timeout = `${clampedSeconds}s`;
|
|
387
394
|
}
|
|
388
395
|
|
|
389
|
-
const response = await this._rateLimiter.fetchAsync(
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
396
|
+
const response = await this._rateLimiter.fetchAsync(
|
|
397
|
+
url,
|
|
398
|
+
{
|
|
399
|
+
method: 'POST',
|
|
400
|
+
headers: {
|
|
401
|
+
'Content-Type': 'application/json',
|
|
402
|
+
'X-API-Key': apiKey,
|
|
403
|
+
},
|
|
404
|
+
body: JSON.stringify(body),
|
|
394
405
|
},
|
|
395
|
-
|
|
396
|
-
|
|
406
|
+
{ onWait: onRateLimitWait }
|
|
407
|
+
);
|
|
397
408
|
|
|
398
409
|
if (!response.ok) {
|
|
399
410
|
const text = await response.text();
|
|
@@ -422,7 +433,8 @@ export class OpenCloudClient {
|
|
|
422
433
|
|
|
423
434
|
async pollTaskCompletionAsync(
|
|
424
435
|
taskPath: string,
|
|
425
|
-
onProgress?: (state: LuauTask['state']) => void
|
|
436
|
+
onProgress?: (state: LuauTask['state']) => void,
|
|
437
|
+
onRateLimitWait?: (wait: RateLimitWait) => void
|
|
426
438
|
): Promise<LuauTask> {
|
|
427
439
|
const apiKey = await this._resolveApiKeyAsync();
|
|
428
440
|
const pollIntervalMs = 3000;
|
|
@@ -435,7 +447,8 @@ export class OpenCloudClient {
|
|
|
435
447
|
headers: {
|
|
436
448
|
'X-API-Key': apiKey,
|
|
437
449
|
},
|
|
438
|
-
}
|
|
450
|
+
},
|
|
451
|
+
{ onWait: onRateLimitWait }
|
|
439
452
|
);
|
|
440
453
|
|
|
441
454
|
if (!response.ok) {
|
|
@@ -5,10 +5,11 @@ vi.mock('@quenty/cli-output-helpers', () => ({
|
|
|
5
5
|
warn: vi.fn(),
|
|
6
6
|
info: vi.fn(),
|
|
7
7
|
error: vi.fn(),
|
|
8
|
+
verbose: vi.fn(),
|
|
8
9
|
},
|
|
9
10
|
}));
|
|
10
11
|
|
|
11
|
-
import { RateLimiter } from './rate-limiter.js';
|
|
12
|
+
import { formatRateLimitWait, RateLimiter } from './rate-limiter.js';
|
|
12
13
|
|
|
13
14
|
interface Deferred<T> {
|
|
14
15
|
promise: Promise<T>;
|
|
@@ -105,9 +106,10 @@ describe('RateLimiter', () => {
|
|
|
105
106
|
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
106
107
|
});
|
|
107
108
|
|
|
108
|
-
it('blocks the next request when x-ratelimit-remaining hits 0 until reset elapses', async () => {
|
|
109
|
+
it('blocks the next request to the same endpoint when x-ratelimit-remaining hits 0 until reset elapses', async () => {
|
|
109
110
|
vi.useFakeTimers();
|
|
110
111
|
const limiter = new RateLimiter();
|
|
112
|
+
const onWait = vi.fn();
|
|
111
113
|
|
|
112
114
|
fetchMock
|
|
113
115
|
.mockResolvedValueOnce(
|
|
@@ -118,20 +120,83 @@ describe('RateLimiter', () => {
|
|
|
118
120
|
)
|
|
119
121
|
.mockResolvedValueOnce(makeResponse(200));
|
|
120
122
|
|
|
121
|
-
await limiter.fetchAsync(
|
|
123
|
+
await limiter.fetchAsync(
|
|
124
|
+
'https://apis.roblox.com/cloud/v2/universes/1/places/2/versions/3/luau-execution-session-tasks',
|
|
125
|
+
{ method: 'POST' }
|
|
126
|
+
);
|
|
122
127
|
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
123
128
|
|
|
124
|
-
const second = limiter.fetchAsync(
|
|
129
|
+
const second = limiter.fetchAsync(
|
|
130
|
+
'https://apis.roblox.com/cloud/v2/universes/1/places/2/versions/4/luau-execution-session-tasks',
|
|
131
|
+
{ method: 'POST' },
|
|
132
|
+
{ onWait }
|
|
133
|
+
);
|
|
125
134
|
|
|
126
135
|
// Without advancing time, the second fetch is parked in _waitIfNeededAsync
|
|
127
136
|
await vi.advanceTimersByTimeAsync(0);
|
|
128
137
|
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
138
|
+
expect(onWait).toHaveBeenCalledWith(
|
|
139
|
+
expect.objectContaining({ reason: 'quota', waitMs: 5000 })
|
|
140
|
+
);
|
|
129
141
|
|
|
130
142
|
await vi.advanceTimersByTimeAsync(5000);
|
|
131
143
|
await second;
|
|
132
144
|
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
133
145
|
});
|
|
134
146
|
|
|
147
|
+
it('does not let a spent quota on one endpoint stall another', async () => {
|
|
148
|
+
// Open Cloud meters task creation (5/min) and task polling (200/min)
|
|
149
|
+
// separately; creation running dry must not park the poll.
|
|
150
|
+
vi.useFakeTimers();
|
|
151
|
+
const limiter = new RateLimiter();
|
|
152
|
+
|
|
153
|
+
fetchMock
|
|
154
|
+
.mockResolvedValueOnce(
|
|
155
|
+
makeResponse(200, {
|
|
156
|
+
'x-ratelimit-remaining': '0',
|
|
157
|
+
'x-ratelimit-reset': '60',
|
|
158
|
+
})
|
|
159
|
+
)
|
|
160
|
+
.mockResolvedValueOnce(makeResponse(200));
|
|
161
|
+
|
|
162
|
+
await limiter.fetchAsync(
|
|
163
|
+
'https://apis.roblox.com/cloud/v2/universes/1/places/2/versions/3/luau-execution-session-tasks',
|
|
164
|
+
{ method: 'POST' }
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
const poll = limiter.fetchAsync(
|
|
168
|
+
'https://apis.roblox.com/cloud/v2/universes/1/places/2/versions/3/luau-execution-sessions/12b4bf19-8ddc-4885-9e54-fa40bb0faca8/tasks/12b4bf19-8ddc-4885-9e54-fa40bb0faca8',
|
|
169
|
+
{ method: 'GET' }
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
173
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
174
|
+
expect((await poll).status).toBe(200);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('reports retry waits to onWait with the triggering status', async () => {
|
|
178
|
+
vi.useFakeTimers();
|
|
179
|
+
const limiter = new RateLimiter();
|
|
180
|
+
const onWait = vi.fn();
|
|
181
|
+
|
|
182
|
+
fetchMock
|
|
183
|
+
.mockResolvedValueOnce(makeResponse(429, { 'retry-after': '5' }))
|
|
184
|
+
.mockResolvedValueOnce(makeResponse(200));
|
|
185
|
+
|
|
186
|
+
const promise = limiter.fetchAsync(
|
|
187
|
+
'https://apis.roblox.com/cloud/v2/a',
|
|
188
|
+
undefined,
|
|
189
|
+
{ onWait }
|
|
190
|
+
);
|
|
191
|
+
await vi.advanceTimersByTimeAsync(5000);
|
|
192
|
+
await promise;
|
|
193
|
+
|
|
194
|
+
expect(onWait).toHaveBeenCalledTimes(1);
|
|
195
|
+
expect(onWait).toHaveBeenCalledWith(
|
|
196
|
+
expect.objectContaining({ reason: 'retry', status: 429, waitMs: 5000 })
|
|
197
|
+
);
|
|
198
|
+
});
|
|
199
|
+
|
|
135
200
|
it('returns the last 429 response after exhausting all retries without sleeping past the final attempt', async () => {
|
|
136
201
|
vi.useFakeTimers();
|
|
137
202
|
const limiter = new RateLimiter({ maxRetries: 3 });
|
|
@@ -228,3 +293,40 @@ describe('RateLimiter', () => {
|
|
|
228
293
|
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
229
294
|
});
|
|
230
295
|
});
|
|
296
|
+
|
|
297
|
+
describe('formatRateLimitWait', () => {
|
|
298
|
+
it('says whether the wait is a rate limit or a retry', () => {
|
|
299
|
+
expect(
|
|
300
|
+
formatRateLimitWait({ route: 'r', waitMs: 54_000, reason: 'quota' })
|
|
301
|
+
).toBe('rate limited 54s');
|
|
302
|
+
expect(
|
|
303
|
+
formatRateLimitWait({
|
|
304
|
+
route: 'r',
|
|
305
|
+
waitMs: 5_500,
|
|
306
|
+
reason: 'retry',
|
|
307
|
+
status: 429,
|
|
308
|
+
})
|
|
309
|
+
).toBe('rate limited 6s');
|
|
310
|
+
expect(
|
|
311
|
+
formatRateLimitWait({
|
|
312
|
+
route: 'r',
|
|
313
|
+
waitMs: 1_000,
|
|
314
|
+
reason: 'retry',
|
|
315
|
+
status: 503,
|
|
316
|
+
})
|
|
317
|
+
).toBe('retrying in 1s');
|
|
318
|
+
expect(
|
|
319
|
+
formatRateLimitWait({ route: 'r', waitMs: 2_000, reason: 'retry' })
|
|
320
|
+
).toBe('retrying in 2s');
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it('fits the spinner status column while scheduling', () => {
|
|
324
|
+
// "◇ Scheduling " is 13 columns; the status cell is 32.
|
|
325
|
+
const longest = formatRateLimitWait({
|
|
326
|
+
route: 'r',
|
|
327
|
+
waitMs: 300_000,
|
|
328
|
+
reason: 'quota',
|
|
329
|
+
});
|
|
330
|
+
expect(`◇ Scheduling (${longest})`.length).toBeLessThanOrEqual(32);
|
|
331
|
+
});
|
|
332
|
+
});
|