@fluidframework/task-manager 2.0.0-rc.1.0.3 → 2.0.0-rc.2.0.0

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.
Files changed (77) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +5 -9
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +4 -0
  4. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/task-manager.api.md +1 -4
  8. package/dist/index.d.ts +2 -2
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +2 -2
  11. package/dist/index.js.map +1 -1
  12. package/dist/package.json +3 -0
  13. package/dist/packageVersion.d.ts +1 -1
  14. package/dist/packageVersion.js +1 -1
  15. package/dist/packageVersion.js.map +1 -1
  16. package/dist/task-manager-beta.d.ts +2 -0
  17. package/dist/task-manager-public.d.ts +2 -0
  18. package/dist/task-manager-untrimmed.d.ts +1 -1
  19. package/dist/taskManager.d.ts +2 -2
  20. package/dist/taskManager.d.ts.map +1 -1
  21. package/dist/taskManager.js +27 -11
  22. package/dist/taskManager.js.map +1 -1
  23. package/dist/taskManagerFactory.d.ts +1 -1
  24. package/dist/taskManagerFactory.d.ts.map +1 -1
  25. package/dist/taskManagerFactory.js +5 -5
  26. package/dist/taskManagerFactory.js.map +1 -1
  27. package/dist/tsdoc-metadata.json +1 -1
  28. package/lib/index.d.ts +13 -0
  29. package/lib/index.d.ts.map +1 -0
  30. package/lib/{index.mjs → index.js} +2 -2
  31. package/lib/index.js.map +1 -0
  32. package/lib/{interfaces.d.mts → interfaces.d.ts} +1 -1
  33. package/lib/interfaces.d.ts.map +1 -0
  34. package/lib/{interfaces.mjs → interfaces.js} +1 -1
  35. package/lib/interfaces.js.map +1 -0
  36. package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
  37. package/lib/packageVersion.d.ts.map +1 -0
  38. package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
  39. package/lib/packageVersion.js.map +1 -0
  40. package/lib/{task-manager-alpha.d.mts → task-manager-alpha.d.ts} +7 -0
  41. package/lib/{task-manager-beta.d.mts → task-manager-beta.d.ts} +9 -0
  42. package/lib/{task-manager-public.d.mts → task-manager-public.d.ts} +9 -0
  43. package/lib/{task-manager-untrimmed.d.mts → task-manager-untrimmed.d.ts} +8 -1
  44. package/lib/{taskManager.d.mts → taskManager.d.ts} +3 -3
  45. package/lib/taskManager.d.ts.map +1 -0
  46. package/lib/{taskManager.mjs → taskManager.js} +22 -6
  47. package/lib/taskManager.js.map +1 -0
  48. package/lib/{taskManagerFactory.d.mts → taskManagerFactory.d.ts} +2 -2
  49. package/lib/taskManagerFactory.d.ts.map +1 -0
  50. package/lib/{taskManagerFactory.mjs → taskManagerFactory.js} +3 -3
  51. package/lib/taskManagerFactory.js.map +1 -0
  52. package/lib/test/dirname.cjs +16 -0
  53. package/lib/test/dirname.cjs.map +1 -0
  54. package/lib/test/taskManager.fuzz.spec.js +203 -0
  55. package/lib/test/taskManager.fuzz.spec.js.map +1 -0
  56. package/lib/test/taskManager.spec.js +845 -0
  57. package/lib/test/taskManager.spec.js.map +1 -0
  58. package/lib/test/types/validateTaskManagerPrevious.generated.js +12 -0
  59. package/lib/test/types/validateTaskManagerPrevious.generated.js.map +1 -0
  60. package/package.json +44 -57
  61. package/src/index.ts +2 -2
  62. package/src/packageVersion.ts +1 -1
  63. package/src/taskManager.ts +22 -7
  64. package/src/taskManagerFactory.ts +3 -3
  65. package/tsconfig.cjs.json +7 -0
  66. package/tsconfig.json +2 -5
  67. package/lib/index.d.mts +0 -7
  68. package/lib/index.d.mts.map +0 -1
  69. package/lib/index.mjs.map +0 -1
  70. package/lib/interfaces.d.mts.map +0 -1
  71. package/lib/interfaces.mjs.map +0 -1
  72. package/lib/packageVersion.d.mts.map +0 -1
  73. package/lib/packageVersion.mjs.map +0 -1
  74. package/lib/taskManager.d.mts.map +0 -1
  75. package/lib/taskManager.mjs.map +0 -1
  76. package/lib/taskManagerFactory.d.mts.map +0 -1
  77. package/lib/taskManagerFactory.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskManager.fuzz.spec.js","sourceRoot":"","sources":["../../src/test/taskManager.fuzz.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport * as path from \"path\";\nimport { strict as assert } from \"assert\";\nimport {\n\tcombineReducersAsync as combineReducers,\n\tcreateWeightedAsyncGenerator as createWeightedGenerator,\n\tAsyncGenerator as Generator,\n\tmakeRandom,\n\tAsyncReducer as Reducer,\n\ttakeAsync as take,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { createDDSFuzzSuite, DDSFuzzModel, DDSFuzzTestState } from \"@fluid-private/test-dds-utils\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport { TaskManagerFactory } from \"../taskManagerFactory.js\";\nimport { ITaskManager } from \"../interfaces.js\";\nimport { _dirname } from \"./dirname.cjs\";\n\ntype FuzzTestState = DDSFuzzTestState<TaskManagerFactory>;\n\ninterface TaskOperation {\n\t/** The Id of the task that the operation applies to. */\n\ttaskId: string;\n}\n\ninterface Volunteer extends TaskOperation {\n\ttype: \"volunteer\";\n}\n\ninterface Abandon extends TaskOperation {\n\ttype: \"abandon\";\n}\n\ninterface Subscribe extends TaskOperation {\n\ttype: \"subscribe\";\n}\n\ninterface Complete extends TaskOperation {\n\ttype: \"complete\";\n}\n\ntype Operation = Volunteer | Abandon | Subscribe | Complete;\n\ninterface OperationGenerationConfig {\n\t/**\n\t * Number of task ids to be generated\n\t */\n\ttaskPoolSize?: number;\n\t/**\n\t * Length of taskId strings\n\t */\n\ttaskStringLength?: number;\n\t/**\n\t * Number of ops in between each synchronization/validation of the TaskManagers\n\t */\n\tvalidateInterval?: number;\n\t/**\n\t * Number of tests to generate\n\t */\n\ttestCount?: number;\n\t/**\n\t * Number of operations to perform in each test\n\t */\n\toperations?: number;\n}\n\nconst defaultOptions: Required<OperationGenerationConfig> = {\n\ttaskPoolSize: 3,\n\ttaskStringLength: 5,\n\tvalidateInterval: 10,\n\ttestCount: 10,\n\toperations: 100,\n};\n\nfunction makeOperationGenerator(\n\toptionsParam?: OperationGenerationConfig,\n): Generator<Operation, FuzzTestState> {\n\tconst options = { ...defaultOptions, ...(optionsParam ?? {}) };\n\ttype OpSelectionState = FuzzTestState & {\n\t\ttaskId: string;\n\t};\n\n\tconst taskIdPoolRandom = makeRandom(0);\n\tconst dedupe = <T>(arr: T[]): T[] => Array.from(new Set(arr));\n\tconst taskIdPool = dedupe(\n\t\tArray.from({ length: options.taskPoolSize }, () =>\n\t\t\ttaskIdPoolRandom.string(defaultOptions.taskStringLength),\n\t\t),\n\t);\n\n\tasync function volunteer(state: OpSelectionState): Promise<Volunteer> {\n\t\treturn {\n\t\t\ttype: \"volunteer\",\n\t\t\ttaskId: state.taskId,\n\t\t};\n\t}\n\n\tasync function abandon(state: OpSelectionState): Promise<Abandon> {\n\t\treturn {\n\t\t\ttype: \"abandon\",\n\t\t\ttaskId: state.taskId,\n\t\t};\n\t}\n\n\tasync function subscribe(state: OpSelectionState): Promise<Subscribe> {\n\t\treturn {\n\t\t\ttype: \"subscribe\",\n\t\t\ttaskId: state.taskId,\n\t\t};\n\t}\n\n\tasync function complete(state: OpSelectionState): Promise<Complete> {\n\t\treturn {\n\t\t\ttype: \"complete\",\n\t\t\ttaskId: state.taskId,\n\t\t};\n\t}\n\n\tconst canVolunteer = ({ client }: OpSelectionState): boolean => client.channel.canVolunteer();\n\tconst isQueued = ({ client, taskId }: OpSelectionState): boolean =>\n\t\tclient.channel.queued(taskId);\n\tconst isAssigned = ({ client, taskId }: OpSelectionState): boolean =>\n\t\tclient.channel.assigned(taskId);\n\n\tconst clientBaseOperationGenerator = createWeightedGenerator<Operation, OpSelectionState>([\n\t\t[volunteer, 1, canVolunteer],\n\t\t[abandon, 1, isQueued],\n\t\t[subscribe, 1],\n\t\t[complete, 1, isAssigned],\n\t]);\n\n\treturn async (state: FuzzTestState) =>\n\t\tclientBaseOperationGenerator({\n\t\t\t...state,\n\t\t\ttaskId: state.random.pick(taskIdPool),\n\t\t});\n}\n\ninterface LoggingInfo {\n\t/** ids of the Task Managers to track over time */\n\ttaskManagerNames: string[];\n\t/** ids of tasks to track over time */\n\ttaskId: string;\n}\n\nfunction logCurrentState(state: FuzzTestState, loggingInfo: LoggingInfo): void {\n\tfor (const client of state.clients) {\n\t\tconst taskManager = client.channel;\n\t\tassert(taskManager);\n\t\tif (loggingInfo.taskManagerNames.includes(client.containerRuntime.clientId)) {\n\t\t\tconsole.log(\n\t\t\t\t`TaskManager ${taskManager.id} (CanVolunteer: ${taskManager.canVolunteer()}):`,\n\t\t\t);\n\t\t\tconsole.log((taskManager as any).taskQueues.get(loggingInfo.taskId));\n\t\t\tconsole.log(\"\\n\");\n\t\t}\n\t}\n}\n\nfunction makeReducer(loggingInfo?: LoggingInfo): Reducer<Operation, FuzzTestState> {\n\tconst withLogging =\n\t\t<T>(baseReducer: Reducer<T, FuzzTestState>): Reducer<T, FuzzTestState> =>\n\t\tasync (state, operation) => {\n\t\t\tif (loggingInfo !== undefined && (operation as any).taskId === loggingInfo.taskId) {\n\t\t\t\tlogCurrentState(state, loggingInfo);\n\t\t\t\tconsole.log(\"-\".repeat(20));\n\t\t\t\tconsole.log(\"Next operation:\", JSON.stringify(operation, undefined, 4));\n\t\t\t}\n\t\t\tawait baseReducer(state, operation);\n\t\t};\n\n\tconst reducer = combineReducers<Operation, FuzzTestState>({\n\t\tvolunteer: async ({ client }, { taskId }) => {\n\t\t\t// Note: this is fire-and-forget as `volunteerForTask` resolves/rejects its returned\n\t\t\t// promise based on server responses, which will occur on later operations (and\n\t\t\t// processing those operations will raise the error directly)\n\t\t\tclient.channel.volunteerForTask(taskId).catch((e: Error) => {\n\t\t\t\t// We expect an error to be thrown if we are disconnected while volunteering\n\t\t\t\tconst expectedErrors = [\n\t\t\t\t\t\"Disconnected before acquiring task assignment\",\n\t\t\t\t\t\"Abandoned before acquiring task assignment\",\n\t\t\t\t];\n\t\t\t\tif (!expectedErrors.includes(e.message)) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tabandon: async ({ client }, { taskId }) => {\n\t\t\tclient.channel.abandon(taskId);\n\t\t},\n\t\tsubscribe: async ({ client }, { taskId }) => {\n\t\t\tclient.channel.subscribeToTask(taskId);\n\t\t},\n\t\tcomplete: async ({ client }, { taskId }) => {\n\t\t\tclient.channel.complete(taskId);\n\t\t},\n\t});\n\n\treturn withLogging(reducer);\n}\n\nfunction assertEqualTaskManagers(a: ITaskManager, b: ITaskManager) {\n\tconst queue1 = (a as any).taskQueues;\n\tconst queue2 = (b as any).taskQueues;\n\tassert.strictEqual(queue1.size, queue2.size, \"The number of tasks queues are not the same\");\n\tfor (const [key, val] of queue1) {\n\t\tconst testVal = queue2.get(key);\n\t\tif (testVal === undefined) {\n\t\t\tassert(val === undefined, \"Task queues are not both undefined\");\n\t\t\tcontinue;\n\t\t}\n\t\tassert.strictEqual(testVal.length, val.length, \"Task queues are not the same size\");\n\t\tif (testVal.length > 0) {\n\t\t\ttestVal.forEach((task: string, index: number) => {\n\t\t\t\tassert.strictEqual(task, val[index], `Task queues are not identical`);\n\t\t\t});\n\t\t}\n\t}\n}\n\ndescribe(\"TaskManager fuzz testing\", () => {\n\tconst model: DDSFuzzModel<TaskManagerFactory, Operation, FuzzTestState> = {\n\t\tworkloadName: \"default configuration\",\n\t\tgeneratorFactory: () => take(100, makeOperationGenerator()),\n\t\treducer:\n\t\t\t// makeReducer supports a param for logging output which tracks the provided intervalId over time:\n\t\t\t// { taskManagerNames: [\"A\", \"B\", \"C\"], taskId: \"\" },\n\t\t\tmakeReducer(),\n\t\tvalidateConsistency: assertEqualTaskManagers,\n\t\tfactory: new TaskManagerFactory(),\n\t};\n\n\tcreateDDSFuzzSuite(model, {\n\t\tvalidationStrategy: { type: \"fixedInterval\", interval: defaultOptions.validateInterval },\n\t\t// AB#3985: TaskManager has some eventual consistency issue with reconnect enabled.\n\t\t// To make this configuration similar to pre-generic DDS fuzz harness refactor, this constant\n\t\t// should be 0.2.\n\t\t// Leaving the tests enabled without reconnect on mimics previous behavior (and provides more coverage\n\t\t// than skipping them)\n\t\treconnectProbability: 0,\n\t\tdetachedStartOptions: {\n\t\t\tnumOpsBeforeAttach: 5,\n\t\t\t// similar to reconnect there are eventual consistency errors when we enter attaching before rehydrate\n\t\t\t// when fixed, detachedStartOptions can be removed from this config, and attachingBeforeRehydrateDisable\n\t\t\t// can be completely removed, as it is only used by this test. Rather than file more bugs. I'll just combine\n\t\t\t// this with AB#3985, as it looks like the dds has fundamental issue around lifecycle handling\n\t\t\tattachingBeforeRehydrateDisable: true,\n\t\t},\n\t\tclientJoinOptions: {\n\t\t\tmaxNumberOfClients: 6,\n\t\t\tclientAddProbability: 0.05,\n\t\t\tstashableClientProbability: 0.2,\n\t\t},\n\t\tdefaultTestCount: defaultOptions.testCount,\n\t\tsaveFailures: { directory: path.join(_dirname, \"../../src/test/results\") },\n\t\t// Uncomment this line to replay a specific seed:\n\t\t// replay: 0,\n\t\t// This can be useful for quickly minimizing failure json while attempting to root-cause a failure.\n\t});\n});\n\ndescribe(\"TaskManager fuzz testing with rebasing\", () => {\n\tconst model: DDSFuzzModel<TaskManagerFactory, Operation, FuzzTestState> = {\n\t\tworkloadName: \"default configuration and rebasing\",\n\t\tgeneratorFactory: () => take(100, makeOperationGenerator()),\n\t\treducer:\n\t\t\t// makeReducer supports a param for logging output which tracks the provided intervalId over time:\n\t\t\t// { taskManagerNames: [\"A\", \"B\", \"C\"], taskId: \"\" },\n\t\t\tmakeReducer(),\n\t\tvalidateConsistency: assertEqualTaskManagers,\n\t\tfactory: new TaskManagerFactory(),\n\t};\n\n\tcreateDDSFuzzSuite(model, {\n\t\tvalidationStrategy: { type: \"fixedInterval\", interval: defaultOptions.validateInterval },\n\t\t// AB#5185: enabling rebasing indicates some unknown eventual consistency issue\n\t\tskip: [5, 7],\n\t\trebaseProbability: 0.15,\n\t\tcontainerRuntimeOptions: {\n\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\tenableGroupedBatching: true,\n\t\t},\n\t\tclientJoinOptions: {\n\t\t\tmaxNumberOfClients: 6,\n\t\t\tclientAddProbability: 0.05,\n\t\t\tstashableClientProbability: 0.2,\n\t\t},\n\t\tdefaultTestCount: defaultOptions.testCount,\n\t\tsaveFailures: { directory: path.join(_dirname, \"../../src/test/results\") },\n\t\t// AB#5341: enabling 'start from detached' within the fuzz harness demonstrates eventual consistency failures.\n\t\tdetachedStartOptions: {\n\t\t\tnumOpsBeforeAttach: 0,\n\t\t},\n\t\t// Uncomment this line to replay a specific seed:\n\t\t// replay: 0,\n\t\t// This can be useful for quickly minimizing failure json while attempting to root-cause a failure.\n\t});\n});\n"]}