@workflow/world-testing 5.0.0-beta.2 → 5.0.0-beta.20

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.
@@ -19,4 +19,4 @@ export function addition(world) {
19
19
  expect(output).toEqual(3);
20
20
  });
21
21
  }
22
- //# sourceMappingURL=addition.mjs.map
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkaXRpb24ubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkZGl0aW9uLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFhO0lBQ3BDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FDaEMsdUJBQXVCLEVBQ3ZCLFVBQVUsRUFDVixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDUCxDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtZQUNULE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsR0FBRztZQUNiLE9BQU8sRUFBRSxNQUFNO1NBQ2hCLENBQ0YsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQzdDLEdBQUcsQ0FBQyxNQUFPLEVBQ1gsR0FBRyxDQUFDLEtBQUssRUFDVCxTQUFTLENBQ1YsQ0FBQztRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhwZWN0LCB0ZXN0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgY3JlYXRlRmV0Y2hlciwgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL3V0aWwubWpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZGl0aW9uKHdvcmxkOiBzdHJpbmcpIHtcbiAgdGVzdCgncnVucyBhbiBhZGRpdGlvbicsIHsgdGltZW91dDogMzBfMDAwIH0sIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcih7IHdvcmxkIH0pLnRoZW4oY3JlYXRlRmV0Y2hlcik7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmVyLmludm9rZShcbiAgICAgICd3b3JrZmxvd3MvYWRkaXRpb24udHMnLFxuICAgICAgJ2FkZGl0aW9uJyxcbiAgICAgIFsxLCAyXVxuICAgICk7XG4gICAgZXhwZWN0KHJlc3VsdC5ydW5JZCkudG9NYXRjaCgvXndydW5fLisvKTtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBydW4gPSBhd2FpdCBzZXJ2ZXIuZ2V0UnVuKHJlc3VsdC5ydW5JZCk7XG4gICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgZXhwZWN0KHJ1bi5vdXRwdXQpLnRvQmVJbnN0YW5jZU9mKFVpbnQ4QXJyYXkpO1xuICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaW50ZXJ2YWw6IDIwMCxcbiAgICAgICAgdGltZW91dDogMjVfMDAwLFxuICAgICAgfVxuICAgICk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gICAgICBydW4ub3V0cHV0ISxcbiAgICAgIHJ1bi5ydW5JZCxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9FcXVhbCgzKTtcbiAgfSk7XG59XG4iXX0=
@@ -28,4 +28,4 @@ export function errors(world) {
28
28
  expect(output.retryableResult.duration).toBeGreaterThanOrEqual(2000);
29
29
  });
30
30
  }
31
- //# sourceMappingURL=errors.mjs.map
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLm1qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4RCxNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQWE7SUFDbEMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUNoQyxrQ0FBa0MsRUFDbEMsZ0NBQWdDLEVBQ2hDLEVBQUUsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtZQUNULE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBc0I7Z0JBQzdDLE1BQU0sRUFBRSxXQUFXO2FBQ3BCLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUNEO1lBQ0UsUUFBUSxFQUFFLEdBQUc7WUFDYixPQUFPLEVBQUUsTUFBTTtTQUNoQixDQUNGLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0sMEJBQTBCLENBQzlDLEdBQUcsQ0FBQyxNQUFPLEVBQ1gsR0FBRyxDQUFDLEtBQUssRUFDVCxTQUFTLENBQ1YsQ0FBUSxDQUFDO1FBQ1YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNyQixhQUFhLEVBQUUsSUFBSTtZQUNuQixlQUFlLEVBQUU7Z0JBQ2YsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUM1QixhQUFhLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7YUFDaEM7U0FDRixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHBlY3QsIHRlc3QsIHZpIH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7IGh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBjcmVhdGVGZXRjaGVyLCBzdGFydFNlcnZlciB9IGZyb20gJy4vdXRpbC5tanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JzKHdvcmxkOiBzdHJpbmcpIHtcbiAgdGVzdCgncmV0cmlhYmxlIGFuZCBmYXRhbCBlcnJvcnMnLCB7IHRpbWVvdXQ6IDU5XzAwMCB9LCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoeyB3b3JsZCB9KS50aGVuKGNyZWF0ZUZldGNoZXIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZlci5pbnZva2UoXG4gICAgICAnd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMnLFxuICAgICAgJ3JldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvdycsXG4gICAgICBbXVxuICAgICk7XG4gICAgZXhwZWN0KHJlc3VsdC5ydW5JZCkudG9NYXRjaCgvXndydW5fLisvKTtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBydW4gPSBhd2FpdCBzZXJ2ZXIuZ2V0UnVuKHJlc3VsdC5ydW5JZCk7XG4gICAgICAgIGV4cGVjdChydW4pLnRvTWF0Y2hPYmplY3Q8UGFydGlhbDx0eXBlb2YgcnVuPj4oe1xuICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaW50ZXJ2YWw6IDIwMCxcbiAgICAgICAgdGltZW91dDogNTBfMDAwLFxuICAgICAgfVxuICAgICk7XG4gICAgY29uc3Qgb3V0cHV0ID0gKGF3YWl0IGh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICAgICAgcnVuLm91dHB1dCEsXG4gICAgICBydW4ucnVuSWQsXG4gICAgICB1bmRlZmluZWRcbiAgICApKSBhcyBhbnk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9FcXVhbCh7XG4gICAgICBnb3RGYXRhbEVycm9yOiB0cnVlLFxuICAgICAgcmV0cnlhYmxlUmVzdWx0OiB7XG4gICAgICAgIGF0dGVtcHQ6IDIsXG4gICAgICAgIGR1cmF0aW9uOiBleHBlY3QuYW55KE51bWJlciksXG4gICAgICAgIHN0ZXBTdGFydGVkQXQ6IGV4cGVjdC5hbnkoRGF0ZSksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChvdXRwdXQucmV0cnlhYmxlUmVzdWx0LmR1cmF0aW9uKS50b0JlR3JlYXRlclRoYW5PckVxdWFsKDIwMDApO1xuICB9KTtcbn1cbiJdfQ==
@@ -71,4 +71,4 @@ export function hooks(world) {
71
71
  });
72
72
  });
73
73
  }
74
- //# sourceMappingURL=hooks.mjs.map
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9va3MubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXhELE1BQU0sVUFBVSxLQUFLLENBQUMsS0FBYTtJQUNqQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsS0FBSyxFQUFFLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUNoQyxvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUNwQixDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBUSxDQUFDO1FBQ2xELE1BQU0saUJBQWlCLEdBQUcsRUFBZSxDQUFDO1FBRTFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDVixJQUFJLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxHQUFHLEVBQUUsS0FBSyxLQUFLLGFBQWEsRUFBRSxDQUFDO29CQUNqQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3RCLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxJQUFJLEdBQUcsRUFBRSxLQUFLLEtBQUssYUFBYSxFQUFFLENBQUM7b0JBQ2pDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3BDLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDZCxtQ0FBbUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFFMUIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNWLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBYyxLQUFLLEVBQUU7Z0JBQzFDLElBQUksRUFBRSxlQUFlO2FBQ3RCLENBQUMsQ0FBQztZQUNILE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBYyxLQUFLLEVBQUU7Z0JBQzFDLElBQUksRUFBRSxnQkFBZ0I7YUFDdkIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxNQUFNLENBQUMsVUFBVSxDQUFjLEtBQUssRUFBRTtnQkFDMUMsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVMLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FDMUIsS0FBSyxJQUFJLEVBQUU7WUFDVCxNQUFNLEdBQUcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQXNCO2dCQUM3QyxNQUFNLEVBQUUsV0FBVzthQUNwQixDQUFDLENBQUM7WUFDSCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFDRDtZQUNFLFFBQVEsRUFBRSxHQUFHO1lBQ2IsT0FBTyxFQUFFLE1BQU07U0FDaEIsQ0FDRixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSwwQkFBMEIsQ0FDN0MsR0FBRyxDQUFDLE1BQU8sRUFDWCxHQUFHLENBQUMsS0FBSyxFQUNULFNBQVMsQ0FDVixDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNyQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRTtpQkFDekI7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFO2lCQUN6QjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsZUFBZTtvQkFDckIsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFO29CQUN4QixJQUFJLEVBQUUsSUFBSTtpQkFDWDthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhwZWN0LCB0ZXN0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHR5cGUgeyBIb29rIH0gZnJvbSAnLi4vd29ya2Zsb3dzL2hvb2tzLnRzJztcbmltcG9ydCB7IGpzb25saW5lcyB9IGZyb20gJy4vanNvbmxpbmVzLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVGZXRjaGVyLCBzdGFydFNlcnZlciB9IGZyb20gJy4vdXRpbC5tanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaG9va3Mod29ybGQ6IHN0cmluZykge1xuICB0ZXN0KCdob29rcycsIHsgdGltZW91dDogNjBfMDAwIH0sIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcih7IHdvcmxkIH0pLnRoZW4oY3JlYXRlRmV0Y2hlcik7XG4gICAgY29uc3QgdG9rZW4gPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KTtcbiAgICBjb25zdCBjdXN0b21EYXRhID0gYG15LWN1c3RvbS1kYXRhLSR7dG9rZW59YDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2ZXIuaW52b2tlKFxuICAgICAgJ3dvcmtmbG93cy9ob29rcy50cycsXG4gICAgICAnY29sbGVjdFdpdGhIb29rJyxcbiAgICAgIFt0b2tlbiwgY3VzdG9tRGF0YV1cbiAgICApO1xuICAgIGV4cGVjdChyZXN1bHQucnVuSWQpLnRvTWF0Y2goL153cnVuXy4rLyk7XG4gICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCBzZXJ2ZXIuZ2V0UmVhZGFibGUocmVzdWx0LnJ1bklkKTtcbiAgICBjb25zdCBldmVudHMgPSBqc29ubGluZXMocmVhZGFibGUpO1xuICAgIGNvbnN0IGhvb2tDcmVhdGVkID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPHZvaWQ+KCk7XG4gICAgY29uc3QgaG9va1Jlc3VtZWRFdmVudHMgPSBbXSBhcyB1bmtub3duW107XG5cbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBvYmogb2YgZXZlbnRzKSB7XG4gICAgICAgIGlmIChvYmo/LmV2ZW50ID09PSAnaG9va0NyZWF0ZWQnKSB7XG4gICAgICAgICAgaG9va0NyZWF0ZWQucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iaj8uZXZlbnQgPT09ICdob29rUmVzdW1lZCcpIHtcbiAgICAgICAgICBob29rUmVzdW1lZEV2ZW50cy5wdXNoKG9iai5wYXlsb2FkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCd1bmhhbmRsZWQgZXZlbnQnLCBvYmopO1xuICAgICAgfVxuICAgIH0pKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgLy8gaWdub3JlIGVycm9ycyBmb3IgcmVhZGluZyBzdHJlYW1cbiAgICB9KTtcblxuICAgIGF3YWl0IGhvb2tDcmVhdGVkLnByb21pc2U7XG5cbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmVyLnJlc3VtZUhvb2s8dHlwZW9mIEhvb2s+KHRva2VuLCB7XG4gICAgICAgIGRhdGE6ICdmaXJzdCBwYXlsb2FkJyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgc2VydmVyLnJlc3VtZUhvb2s8dHlwZW9mIEhvb2s+KHRva2VuLCB7XG4gICAgICAgIGRhdGE6ICdzZWNvbmQgcGF5bG9hZCcsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHNlcnZlci5yZXN1bWVIb29rPHR5cGVvZiBIb29rPih0b2tlbiwge1xuICAgICAgICBkYXRhOiAndGhpcmQgcGF5bG9hZCcsXG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KSgpO1xuXG4gICAgY29uc3QgcnVuID0gYXdhaXQgdmkud2FpdEZvcihcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgc2VydmVyLmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICBleHBlY3QocnVuKS50b01hdGNoT2JqZWN0PFBhcnRpYWw8dHlwZW9mIHJ1bj4+KHtcbiAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGludGVydmFsOiAyMDAsXG4gICAgICAgIHRpbWVvdXQ6IDU5XzAwMCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gICAgICBydW4ub3V0cHV0ISxcbiAgICAgIHJ1bi5ydW5JZCxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9FcXVhbCh7XG4gICAgICBjb2xsZWN0ZWQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6ICdmaXJzdCBwYXlsb2FkJyxcbiAgICAgICAgICBtZXRhZGF0YTogeyBjdXN0b21EYXRhIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRhOiAnc2Vjb25kIHBheWxvYWQnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IGN1c3RvbURhdGEgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6ICd0aGlyZCBwYXlsb2FkJyxcbiAgICAgICAgICBtZXRhZGF0YTogeyBjdXN0b21EYXRhIH0sXG4gICAgICAgICAgZG9uZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xufVxuIl19
@@ -22,4 +22,4 @@ export function idempotency(world) {
22
22
  });
23
23
  });
24
24
  }
25
- //# sourceMappingURL=idempotency.mjs.map
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbXBvdGVuY3kubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2lkZW1wb3RlbmN5Lm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3ZDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtZQUNULE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBc0I7Z0JBQzdDLE1BQU0sRUFBRSxXQUFXO2FBQ3BCLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUNEO1lBQ0UsUUFBUSxFQUFFLEdBQUc7WUFDYixPQUFPLEVBQUUsTUFBTTtTQUNoQixDQUNGLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLDBCQUEwQixDQUM3QyxHQUFHLENBQUMsTUFBTyxFQUNYLEdBQUcsQ0FBQyxLQUFLLEVBQ1QsU0FBUyxDQUNWLENBQUM7UUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3JCLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDOUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhwZWN0LCB0ZXN0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgY3JlYXRlRmV0Y2hlciwgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL3V0aWwubWpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW1wb3RlbmN5KHdvcmxkOiBzdHJpbmcpIHtcbiAgdGVzdCgnaWRlbXBvdGVuY3knLCB7IHRpbWVvdXQ6IDYwXzAwMCB9LCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoeyB3b3JsZCB9KS50aGVuKGNyZWF0ZUZldGNoZXIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZlci5pbnZva2UoJ3dvcmtmbG93cy9ub29wLnRzJywgJ2Jyb2tlbldmJywgWzEsIDJdKTtcbiAgICBleHBlY3QocmVzdWx0LnJ1bklkKS50b01hdGNoKC9ed3J1bl8uKy8pO1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IHZpLndhaXRGb3IoXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1biA9IGF3YWl0IHNlcnZlci5nZXRSdW4ocmVzdWx0LnJ1bklkKTtcbiAgICAgICAgZXhwZWN0KHJ1bikudG9NYXRjaE9iamVjdDxQYXJ0aWFsPHR5cGVvZiBydW4+Pih7XG4gICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBydW47XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpbnRlcnZhbDogMjAwLFxuICAgICAgICB0aW1lb3V0OiA1OV8wMDAsXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICAgICAgcnVuLm91dHB1dCEsXG4gICAgICBydW4ucnVuSWQsXG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgZXhwZWN0KG91dHB1dCkudG9FcXVhbCh7XG4gICAgICBudW1iZXJzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyMCB9LCAoKSA9PiBleHBlY3QuYW55KE51bWJlcikpLFxuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,QAM9C"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":"AAOA,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,QAO9C"}
@@ -2,6 +2,7 @@ import { addition } from './addition.mjs';
2
2
  import { errors } from './errors.mjs';
3
3
  import { hooks } from './hooks.mjs';
4
4
  import { idempotency } from './idempotency.mjs';
5
+ import { inlineExecution } from './inline-execution.mjs';
5
6
  import { nullByte } from './null-byte.mjs';
6
7
  export function createTestSuite(pkgName) {
7
8
  addition(pkgName);
@@ -9,5 +10,6 @@ export function createTestSuite(pkgName) {
9
10
  hooks(pkgName);
10
11
  nullByte(pkgName);
11
12
  errors(pkgName);
13
+ inlineExecution(pkgName);
12
14
  }
13
- //# sourceMappingURL=index.mjs.map
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luZGV4Lm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE1BQU0sVUFBVSxlQUFlLENBQUMsT0FBZTtJQUM3QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEIsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNmLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEIsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZGRpdGlvbiB9IGZyb20gJy4vYWRkaXRpb24ubWpzJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJy4vZXJyb3JzLm1qcyc7XG5pbXBvcnQgeyBob29rcyB9IGZyb20gJy4vaG9va3MubWpzJztcbmltcG9ydCB7IGlkZW1wb3RlbmN5IH0gZnJvbSAnLi9pZGVtcG90ZW5jeS5tanMnO1xuaW1wb3J0IHsgaW5saW5lRXhlY3V0aW9uIH0gZnJvbSAnLi9pbmxpbmUtZXhlY3V0aW9uLm1qcyc7XG5pbXBvcnQgeyBudWxsQnl0ZSB9IGZyb20gJy4vbnVsbC1ieXRlLm1qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXN0U3VpdGUocGtnTmFtZTogc3RyaW5nKSB7XG4gIGFkZGl0aW9uKHBrZ05hbWUpO1xuICBpZGVtcG90ZW5jeShwa2dOYW1lKTtcbiAgaG9va3MocGtnTmFtZSk7XG4gIG51bGxCeXRlKHBrZ05hbWUpO1xuICBlcnJvcnMocGtnTmFtZSk7XG4gIGlubGluZUV4ZWN1dGlvbihwa2dOYW1lKTtcbn1cbiJdfQ==
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Instrumented test: runs `threeBatchesOfFiveWorkflow` with
3
+ * DEBUG=workflow:runtime:* and prints a summary of V2 handler behavior:
4
+ * - total flow invocations
5
+ * - per-invocation replay iterations
6
+ * - event loads (full vs incremental) and sizes
7
+ * - redundant/skipped step executions
8
+ * - concurrent "all parallel steps done" replay races
9
+ * - unconsumed-event skips
10
+ *
11
+ * Not part of the default suite; run with:
12
+ * pnpm vitest run packages/world-testing/test/inline-batches-debug.test.ts
13
+ */
14
+ export declare function inlineBatchesDebug(world: string): void;
15
+ //# sourceMappingURL=inline-batches-debug.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-batches-debug.d.mts","sourceRoot":"","sources":["../../src/inline-batches-debug.mts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,QAuP/C"}
@@ -0,0 +1,208 @@
1
+ import { expect, test, vi } from 'vitest';
2
+ import { hydrateWorkflowReturnValue } from '@workflow/core/serialization';
3
+ import { createFetcher, startServer } from './util.mjs';
4
+ /**
5
+ * Instrumented test: runs `threeBatchesOfFiveWorkflow` with
6
+ * DEBUG=workflow:runtime:* and prints a summary of V2 handler behavior:
7
+ * - total flow invocations
8
+ * - per-invocation replay iterations
9
+ * - event loads (full vs incremental) and sizes
10
+ * - redundant/skipped step executions
11
+ * - concurrent "all parallel steps done" replay races
12
+ * - unconsumed-event skips
13
+ *
14
+ * Not part of the default suite; run with:
15
+ * pnpm vitest run packages/world-testing/test/inline-batches-debug.test.ts
16
+ */
17
+ export function inlineBatchesDebug(world) {
18
+ test('three batches of five parallel steps — report V2 handler behavior', { timeout: 60_000 }, async () => {
19
+ const server = await startServer({
20
+ world,
21
+ env: {
22
+ DEBUG: 'workflow:runtime:*',
23
+ },
24
+ });
25
+ const client = createFetcher(server);
26
+ const result = await client.invoke('workflows/inline-execution.ts', 'threeBatchesOfFiveWorkflow', []);
27
+ const run = await vi.waitFor(async () => {
28
+ const run = await client.getRun(result.runId);
29
+ expect(run.status).toBe('completed');
30
+ return run;
31
+ }, { interval: 200, timeout: 59_000 });
32
+ const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
33
+ // Expected output: 3 batches × [11, 21, 31, 41, 51] | [12, 22, ...] | ...
34
+ expect(output).toEqual([
35
+ 11, 21, 31, 41, 51, 12, 22, 32, 42, 52, 13, 23, 33, 43, 53,
36
+ ]);
37
+ const flowInvocations = await client.getFlowInvocationCount(result.runId);
38
+ // Wait a short moment to flush late log lines
39
+ await new Promise((r) => setTimeout(r, 500));
40
+ const logs = server.getOutput();
41
+ // --- Parse log lines ---
42
+ // 1) Replay iterations + the `eventCount` passed into each replay.
43
+ // The runtime logs: "Starting workflow replay" with `eventCount: N`.
44
+ const replayEventCounts = [];
45
+ for (const line of logs.split('\n')) {
46
+ if (!line.includes(result.runId))
47
+ continue;
48
+ if (!line.includes('Starting workflow replay'))
49
+ continue;
50
+ }
51
+ // eventCount is often on the next line in a multi-line object literal
52
+ // (console.debug prints the second argument with util.inspect). Pull all
53
+ // eventCount occurrences that are within ~6 lines of a replay start
54
+ // line referencing this runId.
55
+ const lines = logs.split('\n');
56
+ for (let i = 0; i < lines.length; i++) {
57
+ if (!lines[i].includes('Starting workflow replay'))
58
+ continue;
59
+ // find the runId in the surrounding 8 lines
60
+ const window = lines.slice(i, i + 8).join('\n');
61
+ if (!window.includes(result.runId))
62
+ continue;
63
+ const m = window.match(/eventCount:\s*(\d+)/);
64
+ if (m)
65
+ replayEventCounts.push(Number.parseInt(m[1], 10));
66
+ }
67
+ const replayStarts = replayEventCounts.length;
68
+ // 3) "All parallel steps done, replaying inline" (per-run)
69
+ const allDoneInlineReplays = matchCount(logs, /All parallel steps done, replaying inline/g, result.runId);
70
+ // 4) "Background step done but other steps pending" (per-run)
71
+ const backgroundStepPendingReturns = matchCount(logs, /Background step done but other steps pending/g, result.runId);
72
+ // 5) Step skipped because step was already in terminal state
73
+ // (background handler arrived after inline path already completed it).
74
+ // This is emitted from the step_started conflict path in step-executor.ts
75
+ // ("Step in terminal state, skipping"). The step_completed 409 path
76
+ // ("Tried completing step, but step has already finished") fires only
77
+ // when two handlers both ran the step body concurrently.
78
+ const stepsSkippedAlreadyDone = matchCount(logs, /Step in terminal state, skipping/g, result.runId);
79
+ const stepCompletedRaces = matchCount(logs, /Tried completing step, but step has already finished/g, result.runId);
80
+ // 6) Unconsumed event skips (debug message emitted by workflow.ts skip logic)
81
+ const unconsumedEventSkips = matchCount(logs, /Skipping unconsumed step event/g, result.runId);
82
+ // 7) Hook/step started with already-running: via concurrent handler
83
+ const maxDeliveries = matchCount(logs, /Max retries reached/g);
84
+ console.log('\n====================================');
85
+ console.log('V2 handler behavior — 3 batches × 5 steps');
86
+ console.log('====================================');
87
+ console.log(`Flow handler invocations: ${flowInvocations}`);
88
+ console.log(`Replay iterations (total): ${replayStarts}`);
89
+ console.log(`Event counts per replay: [${replayEventCounts.join(', ')}]`);
90
+ console.log(`"All steps done, replay inline" hits: ${allDoneInlineReplays}`);
91
+ console.log(`"Background step pending, return" hits: ${backgroundStepPendingReturns}`);
92
+ console.log(`Step skipped (already terminal, step_started 409): ${stepsSkippedAlreadyDone}`);
93
+ console.log(`Step body ran twice (step_completed 409): ${stepCompletedRaces}`);
94
+ console.log(`Unconsumed events skipped by consumer: ${unconsumedEventSkips}`);
95
+ console.log(`Max retries reached (bad): ${maxDeliveries}`);
96
+ console.log('====================================\n');
97
+ // Also print the key timeline: one line per "significant" runtime
98
+ // debug event, in order. Many debug lines put the runId in the
99
+ // metadata object on a following line, so look at a small forward
100
+ // window around each match.
101
+ const timeline = [];
102
+ const sigRegex = /Starting workflow replay|All parallel steps done|Background step done but|Workflow suspended|Workflow replay completed|Run already finished, skipping background step|Step in terminal state|Tried completing step|Max retries reached|Skipping unconsumed step event/;
103
+ for (let i = 0; i < lines.length; i++) {
104
+ if (!sigRegex.test(lines[i]))
105
+ continue;
106
+ const window = lines.slice(i, i + 8).join('\n');
107
+ if (!window.includes(result.runId))
108
+ continue;
109
+ timeline.push(lines[i]);
110
+ }
111
+ console.log('--- Timeline (runtime debug events for this run) ---');
112
+ for (const line of timeline) {
113
+ const short = line.replace(/\s+/g, ' ').slice(0, 180);
114
+ console.log(short);
115
+ }
116
+ console.log(`Timeline entries: ${timeline.length}`);
117
+ console.log('----------------------------------------------------\n');
118
+ // Raw counts — total occurrences in the whole log regardless of runId
119
+ // (for sanity-checking the windowed matcher above).
120
+ const rawUnconsumed = (logs.match(/Skipping unconsumed step event/g) || []).length;
121
+ const rawAllDone = (logs.match(/All parallel steps done, replaying inline/g) || []).length;
122
+ const rawPending = (logs.match(/Background step done but other steps pending/g) || []).length;
123
+ const rawTerminal = (logs.match(/Step in terminal state, skipping/g) || []).length;
124
+ const rawCompleted409 = (logs.match(/Tried completing step, but step has already finished/g) ||
125
+ []).length;
126
+ console.log('--- Raw counts (no runId filter) ---');
127
+ console.log(`Skipping unconsumed step event: ${rawUnconsumed}`);
128
+ console.log(`All parallel steps done, replaying inline: ${rawAllDone}`);
129
+ console.log(`Background step done but other steps pending: ${rawPending}`);
130
+ console.log(`Step in terminal state, skipping: ${rawTerminal}`);
131
+ console.log(`Tried completing step, but step has already finished: ${rawCompleted409}`);
132
+ console.log('-------------------------------------\n');
133
+ // Breakdown of unconsumed event types. The log format emits the
134
+ // message on one line and the metadata object (eventType,
135
+ // correlationId) on the following lines. Walk a 12-line window after
136
+ // each match and extract the fields.
137
+ const skippedByEventType = new Map();
138
+ const skippedEvents = [];
139
+ for (let i = 0; i < lines.length; i++) {
140
+ if (!lines[i].includes('Skipping unconsumed step event'))
141
+ continue;
142
+ const window = lines.slice(i, i + 12).join('\n');
143
+ const et = window.match(/eventType:\s*'([^']+)'/);
144
+ const cid = window.match(/correlationId:\s*'([^']+)'/);
145
+ if (et && cid) {
146
+ skippedByEventType.set(et[1], (skippedByEventType.get(et[1]) ?? 0) + 1);
147
+ skippedEvents.push({ eventType: et[1], correlationId: cid[1] });
148
+ }
149
+ }
150
+ console.log('--- Unconsumed event type breakdown ---');
151
+ for (const [eventType, count] of skippedByEventType) {
152
+ console.log(` ${eventType}: ${count}`);
153
+ }
154
+ // For each skipped event, look up all occurrences of its correlationId
155
+ // in the event log order so we can see whether it's a trailing
156
+ // duplicate lifecycle event after step_completed.
157
+ // We reconstruct event order from the "replaying iteration" logs isn't
158
+ // reliable, so instead ask the server directly.
159
+ const eventsResp = await fetch(`http://localhost:${server.info.port}/runs/${encodeURIComponent(result.runId)}/events`);
160
+ const eventsData = (await eventsResp.json().catch(() => null));
161
+ if (eventsData?.events) {
162
+ console.log(` Total events in log: ${eventsData.events.length}`);
163
+ // For each correlationId that had a skipped event, show the event
164
+ // sequence in the log for that correlationId.
165
+ const shownCids = new Set();
166
+ for (const skip of skippedEvents.slice(0, 6)) {
167
+ if (shownCids.has(skip.correlationId))
168
+ continue;
169
+ shownCids.add(skip.correlationId);
170
+ const seq = eventsData.events
171
+ .filter((e) => e.correlationId === skip.correlationId)
172
+ .map((e) => e.eventType);
173
+ console.log(` cid=${skip.correlationId.slice(0, 20)}... seq=[${seq.join(', ')}]`);
174
+ }
175
+ }
176
+ else {
177
+ console.log(' (events endpoint not available, skipping sequence dump)');
178
+ }
179
+ console.log('-----------------------------------------\n');
180
+ // Sanity: the run did complete. Everything else is diagnostic.
181
+ expect(run.status).toBe('completed');
182
+ // Hard assertion: no step should have hit max retries for this workflow.
183
+ expect(maxDeliveries).toBe(0);
184
+ });
185
+ }
186
+ /**
187
+ * Count matches of `pattern` in `logs`. If `runId` is provided, only count
188
+ * matches where `runId` appears within an 8-line window starting at the
189
+ * match — many debug lines put `workflowRunId` in the metadata object on
190
+ * a following line.
191
+ */
192
+ function matchCount(logs, pattern, runId) {
193
+ const lines = logs.split('\n');
194
+ let n = 0;
195
+ for (let i = 0; i < lines.length; i++) {
196
+ pattern.lastIndex = 0;
197
+ if (!pattern.test(lines[i]))
198
+ continue;
199
+ if (runId) {
200
+ const window = lines.slice(i, i + 8).join('\n');
201
+ if (!window.includes(runId))
202
+ continue;
203
+ }
204
+ n++;
205
+ }
206
+ return n;
207
+ }
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWJhdGNoZXMtZGVidWcubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2lubGluZS1iYXRjaGVzLWRlYnVnLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWE7SUFDOUMsSUFBSSxDQUNGLG1FQUFtRSxFQUNuRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFDbkIsS0FBSyxJQUFJLEVBQUU7UUFDVCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQztZQUMvQixLQUFLO1lBQ0wsR0FBRyxFQUFFO2dCQUNILEtBQUssRUFBRSxvQkFBb0I7YUFDNUI7U0FDRixDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUNoQywrQkFBK0IsRUFDL0IsNEJBQTRCLEVBQzVCLEVBQUUsQ0FDSCxDQUFDO1FBRUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtZQUNULE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQ0QsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FDbkMsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQzdDLEdBQUcsQ0FBQyxNQUFPLEVBQ1gsR0FBRyxDQUFDLEtBQUssRUFDVCxTQUFTLENBQ1YsQ0FBQztRQUNGLDBFQUEwRTtRQUMxRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3JCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtTQUMzRCxDQUFDLENBQUM7UUFFSCxNQUFNLGVBQWUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUUsOENBQThDO1FBQzlDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFaEMsMEJBQTBCO1FBRTFCLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsTUFBTSxpQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFBRSxTQUFTO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDO2dCQUFFLFNBQVM7UUFDM0QsQ0FBQztRQUNELHNFQUFzRTtRQUN0RSx5RUFBeUU7UUFDekUsb0VBQW9FO1FBQ3BFLCtCQUErQjtRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUUsQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUM7Z0JBQUUsU0FBUztZQUM5RCw0Q0FBNEM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUFFLFNBQVM7WUFDN0MsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQztnQkFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRTlDLDJEQUEyRDtRQUMzRCxNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FDckMsSUFBSSxFQUNKLDRDQUE0QyxFQUM1QyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7UUFFRiw4REFBOEQ7UUFDOUQsTUFBTSw0QkFBNEIsR0FBRyxVQUFVLENBQzdDLElBQUksRUFDSiwrQ0FBK0MsRUFDL0MsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO1FBRUYsNkRBQTZEO1FBQzdELHVFQUF1RTtRQUN2RSwwRUFBMEU7UUFDMUUsb0VBQW9FO1FBQ3BFLHNFQUFzRTtRQUN0RSx5REFBeUQ7UUFDekQsTUFBTSx1QkFBdUIsR0FBRyxVQUFVLENBQ3hDLElBQUksRUFDSixtQ0FBbUMsRUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO1FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQ25DLElBQUksRUFDSix1REFBdUQsRUFDdkQsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO1FBRUYsOEVBQThFO1FBQzlFLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUNyQyxJQUFJLEVBQ0osaUNBQWlDLEVBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQ2IsQ0FBQztRQUVGLG9FQUFvRTtRQUNwRSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFFL0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUM1RCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUUsT0FBTyxDQUFDLEdBQUcsQ0FDVCx5Q0FBeUMsb0JBQW9CLEVBQUUsQ0FDaEUsQ0FBQztRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQ1QsMkNBQTJDLDRCQUE0QixFQUFFLENBQzFFLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUNULHNEQUFzRCx1QkFBdUIsRUFBRSxDQUNoRixDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDVCx1REFBdUQsa0JBQWtCLEVBQUUsQ0FDNUUsQ0FBQztRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQ1QsMENBQTBDLG9CQUFvQixFQUFFLENBQ2pFLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE9BQU8sQ0FBQyxHQUFHLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUV0RCxrRUFBa0U7UUFDbEUsK0RBQStEO1FBQy9ELGtFQUFrRTtRQUNsRSw0QkFBNEI7UUFDNUIsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUNaLHVRQUF1USxDQUFDO1FBQzFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDO2dCQUFFLFNBQVM7WUFDeEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUFFLFNBQVM7WUFDN0MsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBQ3BFLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFFdEUsc0VBQXNFO1FBQ3RFLG9EQUFvRDtRQUNwRCxNQUFNLGFBQWEsR0FBRyxDQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLElBQUksRUFBRSxDQUNwRCxDQUFDLE1BQU0sQ0FBQztRQUNULE1BQU0sVUFBVSxHQUFHLENBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsSUFBSSxFQUFFLENBQy9ELENBQUMsTUFBTSxDQUFDO1FBQ1QsTUFBTSxVQUFVLEdBQUcsQ0FDakIsSUFBSSxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxJQUFJLEVBQUUsQ0FDbEUsQ0FBQyxNQUFNLENBQUM7UUFDVCxNQUFNLFdBQVcsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLElBQUksRUFBRSxDQUN0RCxDQUFDLE1BQU0sQ0FBQztRQUNULE1BQU0sZUFBZSxHQUFHLENBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsdURBQXVELENBQUM7WUFDbkUsRUFBRSxDQUNILENBQUMsTUFBTSxDQUFDO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDaEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4Q0FBOEMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN4RSxPQUFPLENBQUMsR0FBRyxDQUNULGlEQUFpRCxVQUFVLEVBQUUsQ0FDOUQsQ0FBQztRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDaEUsT0FBTyxDQUFDLEdBQUcsQ0FDVCx5REFBeUQsZUFBZSxFQUFFLENBQzNFLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFFdkQsZ0VBQWdFO1FBQ2hFLDBEQUEwRDtRQUMxRCxxRUFBcUU7UUFDckUscUNBQXFDO1FBQ3JDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDckQsTUFBTSxhQUFhLEdBQW1ELEVBQUUsQ0FBQztRQUN6RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxDQUFDO2dCQUFFLFNBQVM7WUFDcEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDbEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3ZELElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNkLGtCQUFrQixDQUFDLEdBQUcsQ0FDcEIsRUFBRSxDQUFDLENBQUMsQ0FBRSxFQUNOLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FDMUMsQ0FBQztnQkFDRixhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUUsRUFBRSxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBRSxFQUFFLENBQUMsQ0FBQztZQUNwRSxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUN2RCxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVELHVFQUF1RTtRQUN2RSwrREFBK0Q7UUFDL0Qsa0RBQWtEO1FBQ2xELHVFQUF1RTtRQUN2RSxnREFBZ0Q7UUFDaEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxLQUFLLENBQzVCLG9CQUFvQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FDdkYsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUVyRCxDQUFDO1FBQ1QsSUFBSSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLGtFQUFrRTtZQUNsRSw4Q0FBOEM7WUFDOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztZQUNwQyxLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUFFLFNBQVM7Z0JBQ2hELFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTTtxQkFDMUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUM7cUJBQ3JELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzQixPQUFPLENBQUMsR0FBRyxDQUNULFNBQVMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDdEUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxHQUFHLENBQ1QsMkRBQTJELENBQzVELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBRTNELCtEQUErRDtRQUMvRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyQyx5RUFBeUU7UUFDekUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLElBQVksRUFBRSxPQUFlLEVBQUUsS0FBYztJQUMvRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDO1lBQUUsU0FBUztRQUN2QyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsU0FBUztRQUN4QyxDQUFDO1FBQ0QsQ0FBQyxFQUFFLENBQUM7SUFDTixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhwZWN0LCB0ZXN0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgY3JlYXRlRmV0Y2hlciwgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL3V0aWwubWpzJztcblxuLyoqXG4gKiBJbnN0cnVtZW50ZWQgdGVzdDogcnVucyBgdGhyZWVCYXRjaGVzT2ZGaXZlV29ya2Zsb3dgIHdpdGhcbiAqIERFQlVHPXdvcmtmbG93OnJ1bnRpbWU6KiBhbmQgcHJpbnRzIGEgc3VtbWFyeSBvZiBWMiBoYW5kbGVyIGJlaGF2aW9yOlxuICogICAtIHRvdGFsIGZsb3cgaW52b2NhdGlvbnNcbiAqICAgLSBwZXItaW52b2NhdGlvbiByZXBsYXkgaXRlcmF0aW9uc1xuICogICAtIGV2ZW50IGxvYWRzIChmdWxsIHZzIGluY3JlbWVudGFsKSBhbmQgc2l6ZXNcbiAqICAgLSByZWR1bmRhbnQvc2tpcHBlZCBzdGVwIGV4ZWN1dGlvbnNcbiAqICAgLSBjb25jdXJyZW50IFwiYWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmVcIiByZXBsYXkgcmFjZXNcbiAqICAgLSB1bmNvbnN1bWVkLWV2ZW50IHNraXBzXG4gKlxuICogTm90IHBhcnQgb2YgdGhlIGRlZmF1bHQgc3VpdGU7IHJ1biB3aXRoOlxuICogICBwbnBtIHZpdGVzdCBydW4gcGFja2FnZXMvd29ybGQtdGVzdGluZy90ZXN0L2lubGluZS1iYXRjaGVzLWRlYnVnLnRlc3QudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlubGluZUJhdGNoZXNEZWJ1Zyh3b3JsZDogc3RyaW5nKSB7XG4gIHRlc3QoXG4gICAgJ3RocmVlIGJhdGNoZXMgb2YgZml2ZSBwYXJhbGxlbCBzdGVwcyDigJQgcmVwb3J0IFYyIGhhbmRsZXIgYmVoYXZpb3InLFxuICAgIHsgdGltZW91dDogNjBfMDAwIH0sXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoe1xuICAgICAgICB3b3JsZCxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgREVCVUc6ICd3b3JrZmxvdzpydW50aW1lOionLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBjbGllbnQgPSBjcmVhdGVGZXRjaGVyKHNlcnZlcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5pbnZva2UoXG4gICAgICAgICd3b3JrZmxvd3MvaW5saW5lLWV4ZWN1dGlvbi50cycsXG4gICAgICAgICd0aHJlZUJhdGNoZXNPZkZpdmVXb3JrZmxvdycsXG4gICAgICAgIFtdXG4gICAgICApO1xuXG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgY2xpZW50LmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICB9LFxuICAgICAgICB7IGludGVydmFsOiAyMDAsIHRpbWVvdXQ6IDU5XzAwMCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcnVuLm91dHB1dCEsXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgLy8gRXhwZWN0ZWQgb3V0cHV0OiAzIGJhdGNoZXMgw5cgWzExLCAyMSwgMzEsIDQxLCA1MV0gfCBbMTIsIDIyLCAuLi5dIHwgLi4uXG4gICAgICBleHBlY3Qob3V0cHV0KS50b0VxdWFsKFtcbiAgICAgICAgMTEsIDIxLCAzMSwgNDEsIDUxLCAxMiwgMjIsIDMyLCA0MiwgNTIsIDEzLCAyMywgMzMsIDQzLCA1MyxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBmbG93SW52b2NhdGlvbnMgPSBhd2FpdCBjbGllbnQuZ2V0Rmxvd0ludm9jYXRpb25Db3VudChyZXN1bHQucnVuSWQpO1xuXG4gICAgICAvLyBXYWl0IGEgc2hvcnQgbW9tZW50IHRvIGZsdXNoIGxhdGUgbG9nIGxpbmVzXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MDApKTtcbiAgICAgIGNvbnN0IGxvZ3MgPSBzZXJ2ZXIuZ2V0T3V0cHV0KCk7XG5cbiAgICAgIC8vIC0tLSBQYXJzZSBsb2cgbGluZXMgLS0tXG5cbiAgICAgIC8vIDEpIFJlcGxheSBpdGVyYXRpb25zICsgdGhlIGBldmVudENvdW50YCBwYXNzZWQgaW50byBlYWNoIHJlcGxheS5cbiAgICAgIC8vIFRoZSBydW50aW1lIGxvZ3M6IFwiU3RhcnRpbmcgd29ya2Zsb3cgcmVwbGF5XCIgd2l0aCBgZXZlbnRDb3VudDogTmAuXG4gICAgICBjb25zdCByZXBsYXlFdmVudENvdW50czogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsb2dzLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMocmVzdWx0LnJ1bklkKSkgY29udGludWU7XG4gICAgICAgIGlmICghbGluZS5pbmNsdWRlcygnU3RhcnRpbmcgd29ya2Zsb3cgcmVwbGF5JykpIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gZXZlbnRDb3VudCBpcyBvZnRlbiBvbiB0aGUgbmV4dCBsaW5lIGluIGEgbXVsdGktbGluZSBvYmplY3QgbGl0ZXJhbFxuICAgICAgLy8gKGNvbnNvbGUuZGVidWcgcHJpbnRzIHRoZSBzZWNvbmQgYXJndW1lbnQgd2l0aCB1dGlsLmluc3BlY3QpLiBQdWxsIGFsbFxuICAgICAgLy8gZXZlbnRDb3VudCBvY2N1cnJlbmNlcyB0aGF0IGFyZSB3aXRoaW4gfjYgbGluZXMgb2YgYSByZXBsYXkgc3RhcnRcbiAgICAgIC8vIGxpbmUgcmVmZXJlbmNpbmcgdGhpcyBydW5JZC5cbiAgICAgIGNvbnN0IGxpbmVzID0gbG9ncy5zcGxpdCgnXFxuJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghbGluZXNbaV0hLmluY2x1ZGVzKCdTdGFydGluZyB3b3JrZmxvdyByZXBsYXknKSkgY29udGludWU7XG4gICAgICAgIC8vIGZpbmQgdGhlIHJ1bklkIGluIHRoZSBzdXJyb3VuZGluZyA4IGxpbmVzXG4gICAgICAgIGNvbnN0IHdpbmRvdyA9IGxpbmVzLnNsaWNlKGksIGkgKyA4KS5qb2luKCdcXG4nKTtcbiAgICAgICAgaWYgKCF3aW5kb3cuaW5jbHVkZXMocmVzdWx0LnJ1bklkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG0gPSB3aW5kb3cubWF0Y2goL2V2ZW50Q291bnQ6XFxzKihcXGQrKS8pO1xuICAgICAgICBpZiAobSkgcmVwbGF5RXZlbnRDb3VudHMucHVzaChOdW1iZXIucGFyc2VJbnQobVsxXSEsIDEwKSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXBsYXlTdGFydHMgPSByZXBsYXlFdmVudENvdW50cy5sZW5ndGg7XG5cbiAgICAgIC8vIDMpIFwiQWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmUsIHJlcGxheWluZyBpbmxpbmVcIiAocGVyLXJ1bilcbiAgICAgIGNvbnN0IGFsbERvbmVJbmxpbmVSZXBsYXlzID0gbWF0Y2hDb3VudChcbiAgICAgICAgbG9ncyxcbiAgICAgICAgL0FsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lL2csXG4gICAgICAgIHJlc3VsdC5ydW5JZFxuICAgICAgKTtcblxuICAgICAgLy8gNCkgXCJCYWNrZ3JvdW5kIHN0ZXAgZG9uZSBidXQgb3RoZXIgc3RlcHMgcGVuZGluZ1wiIChwZXItcnVuKVxuICAgICAgY29uc3QgYmFja2dyb3VuZFN0ZXBQZW5kaW5nUmV0dXJucyA9IG1hdGNoQ291bnQoXG4gICAgICAgIGxvZ3MsXG4gICAgICAgIC9CYWNrZ3JvdW5kIHN0ZXAgZG9uZSBidXQgb3RoZXIgc3RlcHMgcGVuZGluZy9nLFxuICAgICAgICByZXN1bHQucnVuSWRcbiAgICAgICk7XG5cbiAgICAgIC8vIDUpIFN0ZXAgc2tpcHBlZCBiZWNhdXNlIHN0ZXAgd2FzIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGVcbiAgICAgIC8vIChiYWNrZ3JvdW5kIGhhbmRsZXIgYXJyaXZlZCBhZnRlciBpbmxpbmUgcGF0aCBhbHJlYWR5IGNvbXBsZXRlZCBpdCkuXG4gICAgICAvLyBUaGlzIGlzIGVtaXR0ZWQgZnJvbSB0aGUgc3RlcF9zdGFydGVkIGNvbmZsaWN0IHBhdGggaW4gc3RlcC1leGVjdXRvci50c1xuICAgICAgLy8gKFwiU3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSwgc2tpcHBpbmdcIikuIFRoZSBzdGVwX2NvbXBsZXRlZCA0MDkgcGF0aFxuICAgICAgLy8gKFwiVHJpZWQgY29tcGxldGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZFwiKSBmaXJlcyBvbmx5XG4gICAgICAvLyB3aGVuIHR3byBoYW5kbGVycyBib3RoIHJhbiB0aGUgc3RlcCBib2R5IGNvbmN1cnJlbnRseS5cbiAgICAgIGNvbnN0IHN0ZXBzU2tpcHBlZEFscmVhZHlEb25lID0gbWF0Y2hDb3VudChcbiAgICAgICAgbG9ncyxcbiAgICAgICAgL1N0ZXAgaW4gdGVybWluYWwgc3RhdGUsIHNraXBwaW5nL2csXG4gICAgICAgIHJlc3VsdC5ydW5JZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN0ZXBDb21wbGV0ZWRSYWNlcyA9IG1hdGNoQ291bnQoXG4gICAgICAgIGxvZ3MsXG4gICAgICAgIC9UcmllZCBjb21wbGV0aW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkL2csXG4gICAgICAgIHJlc3VsdC5ydW5JZFxuICAgICAgKTtcblxuICAgICAgLy8gNikgVW5jb25zdW1lZCBldmVudCBza2lwcyAoZGVidWcgbWVzc2FnZSBlbWl0dGVkIGJ5IHdvcmtmbG93LnRzIHNraXAgbG9naWMpXG4gICAgICBjb25zdCB1bmNvbnN1bWVkRXZlbnRTa2lwcyA9IG1hdGNoQ291bnQoXG4gICAgICAgIGxvZ3MsXG4gICAgICAgIC9Ta2lwcGluZyB1bmNvbnN1bWVkIHN0ZXAgZXZlbnQvZyxcbiAgICAgICAgcmVzdWx0LnJ1bklkXG4gICAgICApO1xuXG4gICAgICAvLyA3KSBIb29rL3N0ZXAgc3RhcnRlZCB3aXRoIGFscmVhZHktcnVubmluZzogdmlhIGNvbmN1cnJlbnQgaGFuZGxlclxuICAgICAgY29uc3QgbWF4RGVsaXZlcmllcyA9IG1hdGNoQ291bnQobG9ncywgL01heCByZXRyaWVzIHJlYWNoZWQvZyk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdcXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgICAgIGNvbnNvbGUubG9nKCdWMiBoYW5kbGVyIGJlaGF2aW9yIOKAlCAzIGJhdGNoZXMgw5cgNSBzdGVwcycpO1xuICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuICAgICAgY29uc29sZS5sb2coYEZsb3cgaGFuZGxlciBpbnZvY2F0aW9uczogJHtmbG93SW52b2NhdGlvbnN9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgUmVwbGF5IGl0ZXJhdGlvbnMgKHRvdGFsKTogJHtyZXBsYXlTdGFydHN9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgRXZlbnQgY291bnRzIHBlciByZXBsYXk6IFske3JlcGxheUV2ZW50Q291bnRzLmpvaW4oJywgJyl9XWApO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBcIkFsbCBzdGVwcyBkb25lLCByZXBsYXkgaW5saW5lXCIgaGl0czogJHthbGxEb25lSW5saW5lUmVwbGF5c31gXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBcIkJhY2tncm91bmQgc3RlcCBwZW5kaW5nLCByZXR1cm5cIiBoaXRzOiAke2JhY2tncm91bmRTdGVwUGVuZGluZ1JldHVybnN9YFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgU3RlcCBza2lwcGVkIChhbHJlYWR5IHRlcm1pbmFsLCBzdGVwX3N0YXJ0ZWQgNDA5KTogJHtzdGVwc1NraXBwZWRBbHJlYWR5RG9uZX1gXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBTdGVwIGJvZHkgcmFuIHR3aWNlIChzdGVwX2NvbXBsZXRlZCA0MDkpOiAgICAgICAgICAgJHtzdGVwQ29tcGxldGVkUmFjZXN9YFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgVW5jb25zdW1lZCBldmVudHMgc2tpcHBlZCBieSBjb25zdW1lcjogJHt1bmNvbnN1bWVkRXZlbnRTa2lwc31gXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coYE1heCByZXRyaWVzIHJlYWNoZWQgKGJhZCk6ICR7bWF4RGVsaXZlcmllc31gKTtcbiAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4nKTtcblxuICAgICAgLy8gQWxzbyBwcmludCB0aGUga2V5IHRpbWVsaW5lOiBvbmUgbGluZSBwZXIgXCJzaWduaWZpY2FudFwiIHJ1bnRpbWVcbiAgICAgIC8vIGRlYnVnIGV2ZW50LCBpbiBvcmRlci4gTWFueSBkZWJ1ZyBsaW5lcyBwdXQgdGhlIHJ1bklkIGluIHRoZVxuICAgICAgLy8gbWV0YWRhdGEgb2JqZWN0IG9uIGEgZm9sbG93aW5nIGxpbmUsIHNvIGxvb2sgYXQgYSBzbWFsbCBmb3J3YXJkXG4gICAgICAvLyB3aW5kb3cgYXJvdW5kIGVhY2ggbWF0Y2guXG4gICAgICBjb25zdCB0aW1lbGluZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHNpZ1JlZ2V4ID1cbiAgICAgICAgL1N0YXJ0aW5nIHdvcmtmbG93IHJlcGxheXxBbGwgcGFyYWxsZWwgc3RlcHMgZG9uZXxCYWNrZ3JvdW5kIHN0ZXAgZG9uZSBidXR8V29ya2Zsb3cgc3VzcGVuZGVkfFdvcmtmbG93IHJlcGxheSBjb21wbGV0ZWR8UnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcHxTdGVwIGluIHRlcm1pbmFsIHN0YXRlfFRyaWVkIGNvbXBsZXRpbmcgc3RlcHxNYXggcmV0cmllcyByZWFjaGVkfFNraXBwaW5nIHVuY29uc3VtZWQgc3RlcCBldmVudC87XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghc2lnUmVnZXgudGVzdChsaW5lc1tpXSEpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgd2luZG93ID0gbGluZXMuc2xpY2UoaSwgaSArIDgpLmpvaW4oJ1xcbicpO1xuICAgICAgICBpZiAoIXdpbmRvdy5pbmNsdWRlcyhyZXN1bHQucnVuSWQpKSBjb250aW51ZTtcbiAgICAgICAgdGltZWxpbmUucHVzaChsaW5lc1tpXSEpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coJy0tLSBUaW1lbGluZSAocnVudGltZSBkZWJ1ZyBldmVudHMgZm9yIHRoaXMgcnVuKSAtLS0nKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiB0aW1lbGluZSkge1xuICAgICAgICBjb25zdCBzaG9ydCA9IGxpbmUucmVwbGFjZSgvXFxzKy9nLCAnICcpLnNsaWNlKDAsIDE4MCk7XG4gICAgICAgIGNvbnNvbGUubG9nKHNob3J0KTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGBUaW1lbGluZSBlbnRyaWVzOiAke3RpbWVsaW5lLmxlbmd0aH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyk7XG5cbiAgICAgIC8vIFJhdyBjb3VudHMg4oCUIHRvdGFsIG9jY3VycmVuY2VzIGluIHRoZSB3aG9sZSBsb2cgcmVnYXJkbGVzcyBvZiBydW5JZFxuICAgICAgLy8gKGZvciBzYW5pdHktY2hlY2tpbmcgdGhlIHdpbmRvd2VkIG1hdGNoZXIgYWJvdmUpLlxuICAgICAgY29uc3QgcmF3VW5jb25zdW1lZCA9IChcbiAgICAgICAgbG9ncy5tYXRjaCgvU2tpcHBpbmcgdW5jb25zdW1lZCBzdGVwIGV2ZW50L2cpIHx8IFtdXG4gICAgICApLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJhd0FsbERvbmUgPSAoXG4gICAgICAgIGxvZ3MubWF0Y2goL0FsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lL2cpIHx8IFtdXG4gICAgICApLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJhd1BlbmRpbmcgPSAoXG4gICAgICAgIGxvZ3MubWF0Y2goL0JhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nL2cpIHx8IFtdXG4gICAgICApLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJhd1Rlcm1pbmFsID0gKFxuICAgICAgICBsb2dzLm1hdGNoKC9TdGVwIGluIHRlcm1pbmFsIHN0YXRlLCBza2lwcGluZy9nKSB8fCBbXVxuICAgICAgKS5sZW5ndGg7XG4gICAgICBjb25zdCByYXdDb21wbGV0ZWQ0MDkgPSAoXG4gICAgICAgIGxvZ3MubWF0Y2goL1RyaWVkIGNvbXBsZXRpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQvZykgfHxcbiAgICAgICAgW11cbiAgICAgICkubGVuZ3RoO1xuICAgICAgY29uc29sZS5sb2coJy0tLSBSYXcgY291bnRzIChubyBydW5JZCBmaWx0ZXIpIC0tLScpO1xuICAgICAgY29uc29sZS5sb2coYFNraXBwaW5nIHVuY29uc3VtZWQgc3RlcCBldmVudDogJHtyYXdVbmNvbnN1bWVkfWApO1xuICAgICAgY29uc29sZS5sb2coYEFsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lOiAke3Jhd0FsbERvbmV9YCk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYEJhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nOiAke3Jhd1BlbmRpbmd9YFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKGBTdGVwIGluIHRlcm1pbmFsIHN0YXRlLCBza2lwcGluZzogJHtyYXdUZXJtaW5hbH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgVHJpZWQgY29tcGxldGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZDogJHtyYXdDb21wbGV0ZWQ0MDl9YFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyk7XG5cbiAgICAgIC8vIEJyZWFrZG93biBvZiB1bmNvbnN1bWVkIGV2ZW50IHR5cGVzLiBUaGUgbG9nIGZvcm1hdCBlbWl0cyB0aGVcbiAgICAgIC8vIG1lc3NhZ2Ugb24gb25lIGxpbmUgYW5kIHRoZSBtZXRhZGF0YSBvYmplY3QgKGV2ZW50VHlwZSxcbiAgICAgIC8vIGNvcnJlbGF0aW9uSWQpIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMuIFdhbGsgYSAxMi1saW5lIHdpbmRvdyBhZnRlclxuICAgICAgLy8gZWFjaCBtYXRjaCBhbmQgZXh0cmFjdCB0aGUgZmllbGRzLlxuICAgICAgY29uc3Qgc2tpcHBlZEJ5RXZlbnRUeXBlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIGNvbnN0IHNraXBwZWRFdmVudHM6IHsgZXZlbnRUeXBlOiBzdHJpbmc7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFsaW5lc1tpXSEuaW5jbHVkZXMoJ1NraXBwaW5nIHVuY29uc3VtZWQgc3RlcCBldmVudCcpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgd2luZG93ID0gbGluZXMuc2xpY2UoaSwgaSArIDEyKS5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgZXQgPSB3aW5kb3cubWF0Y2goL2V2ZW50VHlwZTpcXHMqJyhbXiddKyknLyk7XG4gICAgICAgIGNvbnN0IGNpZCA9IHdpbmRvdy5tYXRjaCgvY29ycmVsYXRpb25JZDpcXHMqJyhbXiddKyknLyk7XG4gICAgICAgIGlmIChldCAmJiBjaWQpIHtcbiAgICAgICAgICBza2lwcGVkQnlFdmVudFR5cGUuc2V0KFxuICAgICAgICAgICAgZXRbMV0hLFxuICAgICAgICAgICAgKHNraXBwZWRCeUV2ZW50VHlwZS5nZXQoZXRbMV0hKSA/PyAwKSArIDFcbiAgICAgICAgICApO1xuICAgICAgICAgIHNraXBwZWRFdmVudHMucHVzaCh7IGV2ZW50VHlwZTogZXRbMV0hLCBjb3JyZWxhdGlvbklkOiBjaWRbMV0hIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygnLS0tIFVuY29uc3VtZWQgZXZlbnQgdHlwZSBicmVha2Rvd24gLS0tJyk7XG4gICAgICBmb3IgKGNvbnN0IFtldmVudFR5cGUsIGNvdW50XSBvZiBza2lwcGVkQnlFdmVudFR5cGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtldmVudFR5cGV9OiAke2NvdW50fWApO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgZWFjaCBza2lwcGVkIGV2ZW50LCBsb29rIHVwIGFsbCBvY2N1cnJlbmNlcyBvZiBpdHMgY29ycmVsYXRpb25JZFxuICAgICAgLy8gaW4gdGhlIGV2ZW50IGxvZyBvcmRlciBzbyB3ZSBjYW4gc2VlIHdoZXRoZXIgaXQncyBhIHRyYWlsaW5nXG4gICAgICAvLyBkdXBsaWNhdGUgbGlmZWN5Y2xlIGV2ZW50IGFmdGVyIHN0ZXBfY29tcGxldGVkLlxuICAgICAgLy8gV2UgcmVjb25zdHJ1Y3QgZXZlbnQgb3JkZXIgZnJvbSB0aGUgXCJyZXBsYXlpbmcgaXRlcmF0aW9uXCIgbG9ncyBpc24ndFxuICAgICAgLy8gcmVsaWFibGUsIHNvIGluc3RlYWQgYXNrIHRoZSBzZXJ2ZXIgZGlyZWN0bHkuXG4gICAgICBjb25zdCBldmVudHNSZXNwID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwOi8vbG9jYWxob3N0OiR7c2VydmVyLmluZm8ucG9ydH0vcnVucy8ke2VuY29kZVVSSUNvbXBvbmVudChyZXN1bHQucnVuSWQpfS9ldmVudHNgXG4gICAgICApO1xuICAgICAgY29uc3QgZXZlbnRzRGF0YSA9IChhd2FpdCBldmVudHNSZXNwLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKSkgYXMge1xuICAgICAgICBldmVudHM6IHsgZXZlbnRUeXBlOiBzdHJpbmc7IGNvcnJlbGF0aW9uSWQ/OiBzdHJpbmcgfVtdO1xuICAgICAgfSB8IG51bGw7XG4gICAgICBpZiAoZXZlbnRzRGF0YT8uZXZlbnRzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIFRvdGFsIGV2ZW50cyBpbiBsb2c6ICR7ZXZlbnRzRGF0YS5ldmVudHMubGVuZ3RofWApO1xuICAgICAgICAvLyBGb3IgZWFjaCBjb3JyZWxhdGlvbklkIHRoYXQgaGFkIGEgc2tpcHBlZCBldmVudCwgc2hvdyB0aGUgZXZlbnRcbiAgICAgICAgLy8gc2VxdWVuY2UgaW4gdGhlIGxvZyBmb3IgdGhhdCBjb3JyZWxhdGlvbklkLlxuICAgICAgICBjb25zdCBzaG93bkNpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgZm9yIChjb25zdCBza2lwIG9mIHNraXBwZWRFdmVudHMuc2xpY2UoMCwgNikpIHtcbiAgICAgICAgICBpZiAoc2hvd25DaWRzLmhhcyhza2lwLmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgICBzaG93bkNpZHMuYWRkKHNraXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgY29uc3Qgc2VxID0gZXZlbnRzRGF0YS5ldmVudHNcbiAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuY29ycmVsYXRpb25JZCA9PT0gc2tpcC5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5ldmVudFR5cGUpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYCAgY2lkPSR7c2tpcC5jb3JyZWxhdGlvbklkLnNsaWNlKDAsIDIwKX0uLi4gc2VxPVske3NlcS5qb2luKCcsICcpfV1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgJyAgKGV2ZW50cyBlbmRwb2ludCBub3QgYXZhaWxhYmxlLCBza2lwcGluZyBzZXF1ZW5jZSBkdW1wKSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicpO1xuXG4gICAgICAvLyBTYW5pdHk6IHRoZSBydW4gZGlkIGNvbXBsZXRlLiBFdmVyeXRoaW5nIGVsc2UgaXMgZGlhZ25vc3RpYy5cbiAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgIC8vIEhhcmQgYXNzZXJ0aW9uOiBubyBzdGVwIHNob3VsZCBoYXZlIGhpdCBtYXggcmV0cmllcyBmb3IgdGhpcyB3b3JrZmxvdy5cbiAgICAgIGV4cGVjdChtYXhEZWxpdmVyaWVzKS50b0JlKDApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBDb3VudCBtYXRjaGVzIG9mIGBwYXR0ZXJuYCBpbiBgbG9nc2AuIElmIGBydW5JZGAgaXMgcHJvdmlkZWQsIG9ubHkgY291bnRcbiAqIG1hdGNoZXMgd2hlcmUgYHJ1bklkYCBhcHBlYXJzIHdpdGhpbiBhbiA4LWxpbmUgd2luZG93IHN0YXJ0aW5nIGF0IHRoZVxuICogbWF0Y2gg4oCUIG1hbnkgZGVidWcgbGluZXMgcHV0IGB3b3JrZmxvd1J1bklkYCBpbiB0aGUgbWV0YWRhdGEgb2JqZWN0IG9uXG4gKiBhIGZvbGxvd2luZyBsaW5lLlxuICovXG5mdW5jdGlvbiBtYXRjaENvdW50KGxvZ3M6IHN0cmluZywgcGF0dGVybjogUmVnRXhwLCBydW5JZD86IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGxpbmVzID0gbG9ncy5zcGxpdCgnXFxuJyk7XG4gIGxldCBuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICBpZiAoIXBhdHRlcm4udGVzdChsaW5lc1tpXSEpKSBjb250aW51ZTtcbiAgICBpZiAocnVuSWQpIHtcbiAgICAgIGNvbnN0IHdpbmRvdyA9IGxpbmVzLnNsaWNlKGksIGkgKyA4KS5qb2luKCdcXG4nKTtcbiAgICAgIGlmICghd2luZG93LmluY2x1ZGVzKHJ1bklkKSkgY29udGludWU7XG4gICAgfVxuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tests that the V2 inline execution loop correctly minimizes flow
3
+ * handler invocations. Each test verifies a specific pattern:
4
+ *
5
+ * - Sequential steps (no streams): 1 invocation
6
+ * - Sequential steps with WritableStream: 1 invocation (sync flush)
7
+ * - Sleep + step: 2 invocations (sleep requires queue round-trip)
8
+ * - Parallel steps (Promise.all): 1-3 invocations depending on whether the
9
+ * embedded harness observes the background step and continuation separately
10
+ * - Hook + resume: 2 invocations (hook requires external resume)
11
+ */
12
+ export declare function inlineExecution(world: string): void;
13
+ //# sourceMappingURL=inline-execution.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-execution.d.mts","sourceRoot":"","sources":["../../src/inline-execution.mts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,QA4I5C"}
@@ -0,0 +1,80 @@
1
+ import { expect, test, vi } from 'vitest';
2
+ import { hydrateWorkflowReturnValue } from '@workflow/core/serialization';
3
+ import { createFetcher, startServer } from './util.mjs';
4
+ /**
5
+ * Tests that the V2 inline execution loop correctly minimizes flow
6
+ * handler invocations. Each test verifies a specific pattern:
7
+ *
8
+ * - Sequential steps (no streams): 1 invocation
9
+ * - Sequential steps with WritableStream: 1 invocation (sync flush)
10
+ * - Sleep + step: 2 invocations (sleep requires queue round-trip)
11
+ * - Parallel steps (Promise.all): 1-3 invocations depending on whether the
12
+ * embedded harness observes the background step and continuation separately
13
+ * - Hook + resume: 2 invocations (hook requires external resume)
14
+ */
15
+ export function inlineExecution(world) {
16
+ test('sequential steps complete in a single flow invocation', { timeout: 30_000 }, async () => {
17
+ const server = await startServer({ world }).then(createFetcher);
18
+ const result = await server.invoke('workflows/inline-execution.ts', 'sequentialStepsWorkflow', [10]);
19
+ const run = await vi.waitFor(async () => {
20
+ const run = await server.getRun(result.runId);
21
+ expect(run.status).toBe('completed');
22
+ return run;
23
+ }, { interval: 200, timeout: 29_000 });
24
+ const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
25
+ expect(output).toBe(20);
26
+ const count = await server.getFlowInvocationCount(result.runId);
27
+ expect(count).toBe(1);
28
+ });
29
+ test('sequential steps with stream complete in a single flow invocation', { timeout: 30_000 }, async () => {
30
+ const server = await startServer({ world }).then(createFetcher);
31
+ const result = await server.invoke('workflows/inline-execution.ts', 'sequentialStepsWithStreamWorkflow', []);
32
+ const run = await vi.waitFor(async () => {
33
+ const run = await server.getRun(result.runId);
34
+ expect(run.status).toBe('completed');
35
+ return run;
36
+ }, { interval: 200, timeout: 29_000 });
37
+ const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
38
+ expect(output).toBe('hello world');
39
+ const count = await server.getFlowInvocationCount(result.runId);
40
+ expect(count).toBe(1);
41
+ });
42
+ test('sleep workflow requires exactly 2 flow invocations', { timeout: 30_000 }, async () => {
43
+ const server = await startServer({ world }).then(createFetcher);
44
+ const result = await server.invoke('workflows/inline-execution.ts', 'sleepWorkflow', []);
45
+ const run = await vi.waitFor(async () => {
46
+ const run = await server.getRun(result.runId);
47
+ expect(run.status).toBe('completed');
48
+ return run;
49
+ }, { interval: 200, timeout: 29_000 });
50
+ const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
51
+ expect(output).toBe(3);
52
+ // Invocation 1: replay → sleep → return {timeoutSeconds}
53
+ // Invocation 2: sleep completed → replay → step inline → complete
54
+ const count = await server.getFlowInvocationCount(result.runId);
55
+ expect(count).toBe(2);
56
+ });
57
+ test('parallel steps (Promise.all) complete in 1-3 flow invocations', { timeout: 30_000 }, async () => {
58
+ const server = await startServer({ world }).then(createFetcher);
59
+ const result = await server.invoke('workflows/inline-execution.ts', 'parallelStepsWorkflow', []);
60
+ const run = await vi.waitFor(async () => {
61
+ const run = await server.getRun(result.runId);
62
+ expect(run.status).toBe('completed');
63
+ return run;
64
+ }, { interval: 200, timeout: 29_000 });
65
+ const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
66
+ expect(output).toBe(33); // (10+1) + (20+2)
67
+ // In the embedded harness the background step can finish quickly enough
68
+ // that the run completes before we observe a distinct continuation pass,
69
+ // so the lower bound is 1 even though production often shows 2.
70
+ // With higher queue concurrency, the background step's continuation may
71
+ // also race with the inline handler's loop, adding a 3rd no-op invocation.
72
+ const count = await server.getFlowInvocationCount(result.runId);
73
+ expect(count).toBeGreaterThanOrEqual(1);
74
+ expect(count).toBeLessThanOrEqual(3);
75
+ });
76
+ // Hook invocation counting is tested by the existing hooks test suite.
77
+ // The hook pattern requires external resume, which involves complex
78
+ // timing. The invocation count for hooks is 2: create + resume.
79
+ }
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWV4ZWN1dGlvbi5tanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5saW5lLWV4ZWN1dGlvbi5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzFDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXhEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWE7SUFDM0MsSUFBSSxDQUNGLHVEQUF1RCxFQUN2RCxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFDbkIsS0FBSyxJQUFJLEVBQUU7UUFDVCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FDaEMsK0JBQStCLEVBQy9CLHlCQUF5QixFQUN6QixDQUFDLEVBQUUsQ0FBQyxDQUNMLENBQUM7UUFFRixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQzFCLEtBQUssSUFBSSxFQUFFO1lBQ1QsTUFBTSxHQUFHLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyQyxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFDRCxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUNuQyxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcs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QWdFO1FBQ2hFLHdFQUF3RTtRQUN4RSwyRUFBMkU7UUFDM0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUNGLENBQUM7SUFFRix1RUFBdUU7SUFDdkUsb0VBQW9FO0lBQ3BFLGdFQUFnRTtBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhwZWN0LCB0ZXN0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgY3JlYXRlRmV0Y2hlciwgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL3V0aWwubWpzJztcblxuLyoqXG4gKiBUZXN0cyB0aGF0IHRoZSBWMiBpbmxpbmUgZXhlY3V0aW9uIGxvb3AgY29ycmVjdGx5IG1pbmltaXplcyBmbG93XG4gKiBoYW5kbGVyIGludm9jYXRpb25zLiBFYWNoIHRlc3QgdmVyaWZpZXMgYSBzcGVjaWZpYyBwYXR0ZXJuOlxuICpcbiAqIC0gU2VxdWVudGlhbCBzdGVwcyAobm8gc3RyZWFtcyk6IDEgaW52b2NhdGlvblxuICogLSBTZXF1ZW50aWFsIHN0ZXBzIHdpdGggV3JpdGFibGVTdHJlYW06IDEgaW52b2NhdGlvbiAoc3luYyBmbHVzaClcbiAqIC0gU2xlZXAgKyBzdGVwOiAyIGludm9jYXRpb25zIChzbGVlcCByZXF1aXJlcyBxdWV1ZSByb3VuZC10cmlwKVxuICogLSBQYXJhbGxlbCBzdGVwcyAoUHJvbWlzZS5hbGwpOiAxLTMgaW52b2NhdGlvbnMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlXG4gKiAgIGVtYmVkZGVkIGhhcm5lc3Mgb2JzZXJ2ZXMgdGhlIGJhY2tncm91bmQgc3RlcCBhbmQgY29udGludWF0aW9uIHNlcGFyYXRlbHlcbiAqIC0gSG9vayArIHJlc3VtZTogMiBpbnZvY2F0aW9ucyAoaG9vayByZXF1aXJlcyBleHRlcm5hbCByZXN1bWUpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmxpbmVFeGVjdXRpb24od29ybGQ6IHN0cmluZykge1xuICB0ZXN0KFxuICAgICdzZXF1ZW50aWFsIHN0ZXBzIGNvbXBsZXRlIGluIGEgc2luZ2xlIGZsb3cgaW52b2NhdGlvbicsXG4gICAgeyB0aW1lb3V0OiAzMF8wMDAgfSxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcih7IHdvcmxkIH0pLnRoZW4oY3JlYXRlRmV0Y2hlcik7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2ZXIuaW52b2tlKFxuICAgICAgICAnd29ya2Zsb3dzL2lubGluZS1leGVjdXRpb24udHMnLFxuICAgICAgICAnc2VxdWVudGlhbFN0ZXBzV29ya2Zsb3cnLFxuICAgICAgICBbMTBdXG4gICAgICApO1xuXG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgc2VydmVyLmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICB9LFxuICAgICAgICB7IGludGVydmFsOiAyMDAsIHRpbWVvdXQ6IDI5XzAwMCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcnVuLm91dHB1dCEsXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZSgyMCk7XG5cbiAgICAgIGNvbnN0IGNvdW50ID0gYXdhaXQgc2VydmVyLmdldEZsb3dJbnZvY2F0aW9uQ291bnQocmVzdWx0LnJ1bklkKTtcbiAgICAgIGV4cGVjdChjb3VudCkudG9CZSgxKTtcbiAgICB9XG4gICk7XG5cbiAgdGVzdChcbiAgICAnc2VxdWVudGlhbCBzdGVwcyB3aXRoIHN0cmVhbSBjb21wbGV0ZSBpbiBhIHNpbmdsZSBmbG93IGludm9jYXRpb24nLFxuICAgIHsgdGltZW91dDogMzBfMDAwIH0sXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoeyB3b3JsZCB9KS50aGVuKGNyZWF0ZUZldGNoZXIpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmVyLmludm9rZShcbiAgICAgICAgJ3dvcmtmbG93cy9pbmxpbmUtZXhlY3V0aW9uLnRzJyxcbiAgICAgICAgJ3NlcXVlbnRpYWxTdGVwc1dpdGhTdHJlYW1Xb3JrZmxvdycsXG4gICAgICAgIFtdXG4gICAgICApO1xuXG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgc2VydmVyLmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICB9LFxuICAgICAgICB7IGludGVydmFsOiAyMDAsIHRpbWVvdXQ6IDI5XzAwMCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcnVuLm91dHB1dCEsXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZSgnaGVsbG8gd29ybGQnKTtcblxuICAgICAgY29uc3QgY291bnQgPSBhd2FpdCBzZXJ2ZXIuZ2V0Rmxvd0ludm9jYXRpb25Db3VudChyZXN1bHQucnVuSWQpO1xuICAgICAgZXhwZWN0KGNvdW50KS50b0JlKDEpO1xuICAgIH1cbiAgKTtcblxuICB0ZXN0KFxuICAgICdzbGVlcCB3b3JrZmxvdyByZXF1aXJlcyBleGFjdGx5IDIgZmxvdyBpbnZvY2F0aW9ucycsXG4gICAgeyB0aW1lb3V0OiAzMF8wMDAgfSxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcih7IHdvcmxkIH0pLnRoZW4oY3JlYXRlRmV0Y2hlcik7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2ZXIuaW52b2tlKFxuICAgICAgICAnd29ya2Zsb3dzL2lubGluZS1leGVjdXRpb24udHMnLFxuICAgICAgICAnc2xlZXBXb3JrZmxvdycsXG4gICAgICAgIFtdXG4gICAgICApO1xuXG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgc2VydmVyLmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICB9LFxuICAgICAgICB7IGludGVydmFsOiAyMDAsIHRpbWVvdXQ6IDI5XzAwMCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcnVuLm91dHB1dCEsXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZSgzKTtcblxuICAgICAgLy8gSW52b2NhdGlvbiAxOiByZXBsYXkg4oaSIHNsZWVwIOKGkiByZXR1cm4ge3RpbWVvdXRTZWNvbmRzfVxuICAgICAgLy8gSW52b2NhdGlvbiAyOiBzbGVlcCBjb21wbGV0ZWQg4oaSIHJlcGxheSDihpIgc3RlcCBpbmxpbmUg4oaSIGNvbXBsZXRlXG4gICAgICBjb25zdCBjb3VudCA9IGF3YWl0IHNlcnZlci5nZXRGbG93SW52b2NhdGlvbkNvdW50KHJlc3VsdC5ydW5JZCk7XG4gICAgICBleHBlY3QoY291bnQpLnRvQmUoMik7XG4gICAgfVxuICApO1xuXG4gIHRlc3QoXG4gICAgJ3BhcmFsbGVsIHN0ZXBzIChQcm9taXNlLmFsbCkgY29tcGxldGUgaW4gMS0zIGZsb3cgaW52b2NhdGlvbnMnLFxuICAgIHsgdGltZW91dDogMzBfMDAwIH0sXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoeyB3b3JsZCB9KS50aGVuKGNyZWF0ZUZldGNoZXIpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmVyLmludm9rZShcbiAgICAgICAgJ3dvcmtmbG93cy9pbmxpbmUtZXhlY3V0aW9uLnRzJyxcbiAgICAgICAgJ3BhcmFsbGVsU3RlcHNXb3JrZmxvdycsXG4gICAgICAgIFtdXG4gICAgICApO1xuXG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgc2VydmVyLmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICB9LFxuICAgICAgICB7IGludGVydmFsOiAyMDAsIHRpbWVvdXQ6IDI5XzAwMCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcnVuLm91dHB1dCEsXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZSgzMyk7IC8vICgxMCsxKSArICgyMCsyKVxuXG4gICAgICAvLyBJbiB0aGUgZW1iZWRkZWQgaGFybmVzcyB0aGUgYmFja2dyb3VuZCBzdGVwIGNhbiBmaW5pc2ggcXVpY2tseSBlbm91Z2hcbiAgICAgIC8vIHRoYXQgdGhlIHJ1biBjb21wbGV0ZXMgYmVmb3JlIHdlIG9ic2VydmUgYSBkaXN0aW5jdCBjb250aW51YXRpb24gcGFzcyxcbiAgICAgIC8vIHNvIHRoZSBsb3dlciBib3VuZCBpcyAxIGV2ZW4gdGhvdWdoIHByb2R1Y3Rpb24gb2Z0ZW4gc2hvd3MgMi5cbiAgICAgIC8vIFdpdGggaGlnaGVyIHF1ZXVlIGNvbmN1cnJlbmN5LCB0aGUgYmFja2dyb3VuZCBzdGVwJ3MgY29udGludWF0aW9uIG1heVxuICAgICAgLy8gYWxzbyByYWNlIHdpdGggdGhlIGlubGluZSBoYW5kbGVyJ3MgbG9vcCwgYWRkaW5nIGEgM3JkIG5vLW9wIGludm9jYXRpb24uXG4gICAgICBjb25zdCBjb3VudCA9IGF3YWl0IHNlcnZlci5nZXRGbG93SW52b2NhdGlvbkNvdW50KHJlc3VsdC5ydW5JZCk7XG4gICAgICBleHBlY3QoY291bnQpLnRvQmVHcmVhdGVyVGhhbk9yRXF1YWwoMSk7XG4gICAgICBleHBlY3QoY291bnQpLnRvQmVMZXNzVGhhbk9yRXF1YWwoMyk7XG4gICAgfVxuICApO1xuXG4gIC8vIEhvb2sgaW52b2NhdGlvbiBjb3VudGluZyBpcyB0ZXN0ZWQgYnkgdGhlIGV4aXN0aW5nIGhvb2tzIHRlc3Qgc3VpdGUuXG4gIC8vIFRoZSBob29rIHBhdHRlcm4gcmVxdWlyZXMgZXh0ZXJuYWwgcmVzdW1lLCB3aGljaCBpbnZvbHZlcyBjb21wbGV4XG4gIC8vIHRpbWluZy4gVGhlIGludm9jYXRpb24gY291bnQgZm9yIGhvb2tzIGlzIDI6IGNyZWF0ZSArIHJlc3VtZS5cbn1cbiJdfQ==
@@ -29,4 +29,4 @@ export async function* jsonlines(readable) {
29
29
  }
30
30
  yield* bufferedObjects();
31
31
  }
32
- //# sourceMappingURL=jsonlines.mjs.map
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmxpbmVzLm1qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29ubGluZXMubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFvQztJQUNuRSxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNwQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRixLQUFLLFNBQVMsQ0FBQyxDQUFDLGVBQWU7UUFDN0IsTUFBTSxLQUFLLEdBQUcsYUFBYSxFQUFFLENBQUM7UUFDOUIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxRCxNQUFNLElBQUksSUFBSSxDQUFDO1lBQ2YsS0FBSyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsTUFBTTtRQUNSLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbioganNvbmxpbmVzKHJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pikge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICBsZXQgYnVmZmVyID0gJyc7XG5cbiAgY29uc3QgYnVmZmVyZWRMaW5lcyA9ICgpID0+IHtcbiAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdCgnXFxuJyk7XG4gICAgYnVmZmVyID0gbGluZXMucG9wKCkgfHwgJyc7XG4gICAgcmV0dXJuIGxpbmVzO1xuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uKiBidWZmZXJlZE9iamVjdHMoKSB7XG4gICAgY29uc3QgbGluZXMgPSBidWZmZXJlZExpbmVzKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB5aWVsZCBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgfVxuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgcmVhZCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKHJlYWQudmFsdWUpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShyZWFkLnZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgIGJ1ZmZlciArPSB0ZXh0O1xuICAgICAgeWllbGQqIGJ1ZmZlcmVkT2JqZWN0cygpO1xuICAgIH1cbiAgICBpZiAocmVhZC5kb25lKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB5aWVsZCogYnVmZmVyZWRPYmplY3RzKCk7XG59XG4iXX0=
@@ -19,4 +19,4 @@ export function nullByte(world) {
19
19
  expect(output).toEqual('null byte \0');
20
20
  });
21
21
  }
22
- //# sourceMappingURL=null-byte.mjs.map
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbC1ieXRlLm1qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9udWxsLWJ5dGUubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4RCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQWE7SUFDcEMsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUNoQyx3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLEVBQUUsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtZQUNULE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsR0FBRztZQUNiLE9BQU8sRUFBRSxNQUFNO1NBQ2hCLENBQ0YsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQzdDLEdBQUcsQ0FBQyxNQUFPLEVBQ1gsR0FBRyxDQUFDLEtBQUssRUFDVCxTQUFTLENBQ1YsQ0FBQztRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhwZWN0LCB0ZXN0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgY3JlYXRlRmV0Y2hlciwgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL3V0aWwubWpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIG51bGxCeXRlKHdvcmxkOiBzdHJpbmcpIHtcbiAgdGVzdCgnc3VwcG9ydHMgbnVsbCBieXRlcyBpbiBzdGVwIHJlc3VsdHMnLCB7IHRpbWVvdXQ6IDEyXzAwMCB9LCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoeyB3b3JsZCB9KS50aGVuKGNyZWF0ZUZldGNoZXIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZlci5pbnZva2UoXG4gICAgICAnd29ya2Zsb3dzL251bGwtYnl0ZS50cycsXG4gICAgICAnbnVsbEJ5dGVXb3JrZmxvdycsXG4gICAgICBbXVxuICAgICk7XG4gICAgZXhwZWN0KHJlc3VsdC5ydW5JZCkudG9NYXRjaCgvXndydW5fLisvKTtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBydW4gPSBhd2FpdCBzZXJ2ZXIuZ2V0UnVuKHJlc3VsdC5ydW5JZCk7XG4gICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgZXhwZWN0KHJ1bi5vdXRwdXQpLnRvQmVJbnN0YW5jZU9mKFVpbnQ4QXJyYXkpO1xuICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaW50ZXJ2YWw6IDIwMCxcbiAgICAgICAgdGltZW91dDogMTBfMDAwLFxuICAgICAgfVxuICAgICk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gICAgICBydW4ub3V0cHV0ISxcbiAgICAgIHJ1bi5ydW5JZCxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9FcXVhbCgnbnVsbCBieXRlIFxcMCcpO1xuICB9KTtcbn1cbiJdfQ==