@fluidframework/fluid-runner 2.0.0-dev.1.3.0.96595

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 (134) hide show
  1. package/.eslintrc.js +18 -0
  2. package/.mocharc.js +12 -0
  3. package/LICENSE +21 -0
  4. package/README.md +68 -0
  5. package/bin/fluid-runner +2 -0
  6. package/dist/codeLoaderBundle.d.ts +44 -0
  7. package/dist/codeLoaderBundle.d.ts.map +1 -0
  8. package/dist/codeLoaderBundle.js +23 -0
  9. package/dist/codeLoaderBundle.js.map +1 -0
  10. package/dist/exportFile.d.ts +28 -0
  11. package/dist/exportFile.d.ts.map +1 -0
  12. package/dist/exportFile.js +87 -0
  13. package/dist/exportFile.js.map +1 -0
  14. package/dist/fakeUrlResolver.d.ts +15 -0
  15. package/dist/fakeUrlResolver.d.ts.map +1 -0
  16. package/dist/fakeUrlResolver.js +43 -0
  17. package/dist/fakeUrlResolver.js.map +1 -0
  18. package/dist/fluidRunner.d.ts +10 -0
  19. package/dist/fluidRunner.d.ts.map +1 -0
  20. package/dist/fluidRunner.js +106 -0
  21. package/dist/fluidRunner.js.map +1 -0
  22. package/dist/getArgsValidationError.d.ts +6 -0
  23. package/dist/getArgsValidationError.d.ts.map +1 -0
  24. package/dist/getArgsValidationError.js +46 -0
  25. package/dist/getArgsValidationError.js.map +1 -0
  26. package/dist/index.d.ts +12 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +30 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/logger/baseFileLogger.d.ts +28 -0
  31. package/dist/logger/baseFileLogger.d.ts.map +1 -0
  32. package/dist/logger/baseFileLogger.js +72 -0
  33. package/dist/logger/baseFileLogger.js.map +1 -0
  34. package/dist/logger/csvFileLogger.d.ts +18 -0
  35. package/dist/logger/csvFileLogger.d.ts.map +1 -0
  36. package/dist/logger/csvFileLogger.js +60 -0
  37. package/dist/logger/csvFileLogger.js.map +1 -0
  38. package/dist/logger/fileLogger.d.ts +38 -0
  39. package/dist/logger/fileLogger.d.ts.map +1 -0
  40. package/dist/logger/fileLogger.js +17 -0
  41. package/dist/logger/fileLogger.js.map +1 -0
  42. package/dist/logger/jsonFileLogger.d.ts +14 -0
  43. package/dist/logger/jsonFileLogger.d.ts.map +1 -0
  44. package/dist/logger/jsonFileLogger.js +44 -0
  45. package/dist/logger/jsonFileLogger.js.map +1 -0
  46. package/dist/logger/loggerUtils.d.ts +36 -0
  47. package/dist/logger/loggerUtils.d.ts.map +1 -0
  48. package/dist/logger/loggerUtils.js +90 -0
  49. package/dist/logger/loggerUtils.js.map +1 -0
  50. package/dist/packageVersion.d.ts +9 -0
  51. package/dist/packageVersion.d.ts.map +1 -0
  52. package/dist/packageVersion.js +12 -0
  53. package/dist/packageVersion.js.map +1 -0
  54. package/dist/parseBundleAndExportFile.d.ts +12 -0
  55. package/dist/parseBundleAndExportFile.d.ts.map +1 -0
  56. package/dist/parseBundleAndExportFile.js +84 -0
  57. package/dist/parseBundleAndExportFile.js.map +1 -0
  58. package/dist/utils.d.ts +24 -0
  59. package/dist/utils.d.ts.map +1 -0
  60. package/dist/utils.js +63 -0
  61. package/dist/utils.js.map +1 -0
  62. package/lib/codeLoaderBundle.d.ts +44 -0
  63. package/lib/codeLoaderBundle.d.ts.map +1 -0
  64. package/lib/codeLoaderBundle.js +18 -0
  65. package/lib/codeLoaderBundle.js.map +1 -0
  66. package/lib/exportFile.d.ts +28 -0
  67. package/lib/exportFile.d.ts.map +1 -0
  68. package/lib/exportFile.js +63 -0
  69. package/lib/exportFile.js.map +1 -0
  70. package/lib/fakeUrlResolver.d.ts +15 -0
  71. package/lib/fakeUrlResolver.d.ts.map +1 -0
  72. package/lib/fakeUrlResolver.js +39 -0
  73. package/lib/fakeUrlResolver.js.map +1 -0
  74. package/lib/fluidRunner.d.ts +10 -0
  75. package/lib/fluidRunner.d.ts.map +1 -0
  76. package/lib/fluidRunner.js +83 -0
  77. package/lib/fluidRunner.js.map +1 -0
  78. package/lib/getArgsValidationError.d.ts +6 -0
  79. package/lib/getArgsValidationError.d.ts.map +1 -0
  80. package/lib/getArgsValidationError.js +23 -0
  81. package/lib/getArgsValidationError.js.map +1 -0
  82. package/lib/index.d.ts +12 -0
  83. package/lib/index.d.ts.map +1 -0
  84. package/lib/index.js +12 -0
  85. package/lib/index.js.map +1 -0
  86. package/lib/logger/baseFileLogger.d.ts +28 -0
  87. package/lib/logger/baseFileLogger.d.ts.map +1 -0
  88. package/lib/logger/baseFileLogger.js +49 -0
  89. package/lib/logger/baseFileLogger.js.map +1 -0
  90. package/lib/logger/csvFileLogger.d.ts +18 -0
  91. package/lib/logger/csvFileLogger.d.ts.map +1 -0
  92. package/lib/logger/csvFileLogger.js +37 -0
  93. package/lib/logger/csvFileLogger.js.map +1 -0
  94. package/lib/logger/fileLogger.d.ts +38 -0
  95. package/lib/logger/fileLogger.d.ts.map +1 -0
  96. package/lib/logger/fileLogger.js +14 -0
  97. package/lib/logger/fileLogger.js.map +1 -0
  98. package/lib/logger/jsonFileLogger.d.ts +14 -0
  99. package/lib/logger/jsonFileLogger.d.ts.map +1 -0
  100. package/lib/logger/jsonFileLogger.js +21 -0
  101. package/lib/logger/jsonFileLogger.js.map +1 -0
  102. package/lib/logger/loggerUtils.d.ts +36 -0
  103. package/lib/logger/loggerUtils.d.ts.map +1 -0
  104. package/lib/logger/loggerUtils.js +65 -0
  105. package/lib/logger/loggerUtils.js.map +1 -0
  106. package/lib/packageVersion.d.ts +9 -0
  107. package/lib/packageVersion.d.ts.map +1 -0
  108. package/lib/packageVersion.js +9 -0
  109. package/lib/packageVersion.js.map +1 -0
  110. package/lib/parseBundleAndExportFile.d.ts +12 -0
  111. package/lib/parseBundleAndExportFile.d.ts.map +1 -0
  112. package/lib/parseBundleAndExportFile.js +61 -0
  113. package/lib/parseBundleAndExportFile.js.map +1 -0
  114. package/lib/utils.d.ts +24 -0
  115. package/lib/utils.d.ts.map +1 -0
  116. package/lib/utils.js +38 -0
  117. package/lib/utils.js.map +1 -0
  118. package/package.json +87 -0
  119. package/src/codeLoaderBundle.ts +57 -0
  120. package/src/exportFile.ts +104 -0
  121. package/src/fakeUrlResolver.ts +50 -0
  122. package/src/fluidRunner.ts +106 -0
  123. package/src/getArgsValidationError.ts +27 -0
  124. package/src/index.ts +14 -0
  125. package/src/logger/baseFileLogger.ts +58 -0
  126. package/src/logger/csvFileLogger.ts +40 -0
  127. package/src/logger/fileLogger.ts +45 -0
  128. package/src/logger/jsonFileLogger.ts +27 -0
  129. package/src/logger/loggerUtils.ts +81 -0
  130. package/src/packageVersion.ts +9 -0
  131. package/src/parseBundleAndExportFile.ts +80 -0
  132. package/src/utils.ts +45 -0
  133. package/tsconfig.esnext.json +7 -0
  134. package/tsconfig.json +14 -0
@@ -0,0 +1,81 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import * as fs from "fs";
7
+ import { ITelemetryLogger } from "@fluidframework/common-definitions";
8
+ import { ChildLogger } from "@fluidframework/telemetry-utils";
9
+ import { CSVFileLogger } from "./csvFileLogger";
10
+ import { IFileLogger, ITelemetryOptions, OutputFormat } from "./fileLogger";
11
+ import { JSONFileLogger } from "./jsonFileLogger";
12
+
13
+ /**
14
+ * Create a ITelemetryLogger wrapped around provided IFileLogger
15
+ * ! It is expected that all events be sent through the returned "logger" value
16
+ * ! The "fileLogger" value should have its "close()" method called at the end of execution
17
+ * Note: if an output format is not supplied, default is JSON
18
+ * @returns - both the IFileLogger implementation and ITelemetryLogger wrapper to be called
19
+ */
20
+ export function createLogger(
21
+ filePath: string,
22
+ options?: ITelemetryOptions,
23
+ ): { logger: ITelemetryLogger; fileLogger: IFileLogger; } {
24
+ const fileLogger = options?.outputFormat === OutputFormat.CSV
25
+ ? new CSVFileLogger(filePath, options?.eventsPerFlush, options?.defaultProps)
26
+ : new JSONFileLogger(filePath, options?.eventsPerFlush, options?.defaultProps);
27
+
28
+ const logger = ChildLogger.create(fileLogger, "LocalSnapshotRunnerApp",
29
+ { all: { Event_Time: () => Date.now() } });
30
+
31
+ return { logger, fileLogger };
32
+ }
33
+
34
+ /**
35
+ * Validate the telemetryFile command line argument
36
+ * @param telemetryFile - path where telemetry will be written
37
+ */
38
+ export function getTelemetryFileValidationError(telemetryFile: string): string | undefined {
39
+ if (!telemetryFile) {
40
+ return "Telemetry file argument is missing.";
41
+ } else if (fs.existsSync(telemetryFile)) {
42
+ return `Telemetry file already exists [${telemetryFile}].`;
43
+ }
44
+
45
+ return undefined;
46
+ }
47
+
48
+ /**
49
+ * Validate the provided output format and default properties
50
+ * @param format - desired output format of the telemetry
51
+ * @param props - default properties to be added to every telemetry entry
52
+ * @internal
53
+ */
54
+ export function validateAndParseTelemetryOptions(
55
+ format?: string,
56
+ props?: (string | number)[],
57
+ ): { success: false; error: string; } | { success: true; telemetryOptions: ITelemetryOptions; } {
58
+ let outputFormat: OutputFormat | undefined;
59
+ const defaultProps: Record<string, string | number> = {};
60
+
61
+ if (format) {
62
+ outputFormat = OutputFormat[format];
63
+ if (outputFormat === undefined) {
64
+ return { success: false, error: `Invalid telemetry format [${format}]` };
65
+ }
66
+ }
67
+
68
+ if (props && props.length > 0) {
69
+ if (props.length % 2 !== 0) {
70
+ return { success: false, error: `Invalid number of telemetry properties to add [${props.length}]` };
71
+ }
72
+ for (let i = 0; i < props.length; i += 2) {
73
+ if (typeof props[i] === "number") {
74
+ return { success: false, error: `Property name cannot be number at index [${i}] -> [${props[i]}]` };
75
+ }
76
+ defaultProps[props[i]] = props[i + 1];
77
+ }
78
+ }
79
+
80
+ return { success: true, telemetryOptions: { outputFormat, defaultProps } };
81
+ }
@@ -0,0 +1,9 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ *
5
+ * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
+ */
7
+
8
+ export const pkgName = "@fluidframework/fluid-runner";
9
+ export const pkgVersion = "1.2.0";
@@ -0,0 +1,80 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import * as fs from "fs";
7
+ import { PerformanceEvent } from "@fluidframework/telemetry-utils";
8
+ import { isCodeLoaderBundle, isFluidFileConverter } from "./codeLoaderBundle";
9
+ import { createContainerAndExecute, IExportFileResponse } from "./exportFile";
10
+ import { getArgsValidationError } from "./getArgsValidationError";
11
+ /* eslint-disable import/no-internal-modules */
12
+ import { ITelemetryOptions } from "./logger/fileLogger";
13
+ import { createLogger, getTelemetryFileValidationError } from "./logger/loggerUtils";
14
+ /* eslint-enable import/no-internal-modules */
15
+ import { getSnapshotFileContent } from "./utils";
16
+
17
+ const clientArgsValidationError = "Client_ArgsValidationError";
18
+
19
+ /**
20
+ * Parse a provided JS bundle, execute code on Container based on ODSP snapshot, and write result to file
21
+ * @param codeLoader - path to provided JS bundle that implements ICodeLoaderBundle (see codeLoaderBundle.ts)
22
+ */
23
+ export async function parseBundleAndExportFile(
24
+ codeLoader: string,
25
+ inputFile: string,
26
+ outputFile: string,
27
+ telemetryFile: string,
28
+ options?: string,
29
+ telemetryOptions?: ITelemetryOptions,
30
+ ): Promise<IExportFileResponse> {
31
+ const telemetryArgError = getTelemetryFileValidationError(telemetryFile);
32
+ if (telemetryArgError) {
33
+ const eventName = clientArgsValidationError;
34
+ return { success: false, eventName, errorMessage: telemetryArgError };
35
+ }
36
+ const { fileLogger, logger } = createLogger(telemetryFile, telemetryOptions);
37
+
38
+ try {
39
+ return await PerformanceEvent.timedExecAsync(logger, { eventName: "ParseBundleAndExportFile" }, async () => {
40
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
41
+ const codeLoaderBundle = require(codeLoader);
42
+ if (!isCodeLoaderBundle(codeLoaderBundle)) {
43
+ const eventName = clientArgsValidationError;
44
+ const errorMessage = "Code loader bundle is not of type ICodeLoaderBundle";
45
+ logger.sendErrorEvent({ eventName, message: errorMessage });
46
+ return { success: false, eventName, errorMessage };
47
+ }
48
+
49
+ const fluidExport = await codeLoaderBundle.fluidExport;
50
+ if (!isFluidFileConverter(fluidExport)) {
51
+ const eventName = clientArgsValidationError;
52
+ const errorMessage = "Fluid export from CodeLoaderBundle is not of type IFluidFileConverter";
53
+ logger.sendErrorEvent({ eventName, message: errorMessage });
54
+ return { success: false, eventName, errorMessage };
55
+ }
56
+
57
+ const argsValidationError = getArgsValidationError(inputFile, outputFile);
58
+ if (argsValidationError) {
59
+ const eventName = clientArgsValidationError;
60
+ logger.sendErrorEvent({ eventName, message: argsValidationError });
61
+ return { success: false, eventName, errorMessage: argsValidationError };
62
+ }
63
+
64
+ fs.writeFileSync(outputFile, await createContainerAndExecute(
65
+ getSnapshotFileContent(inputFile),
66
+ fluidExport,
67
+ logger,
68
+ options,
69
+ ));
70
+
71
+ return { success: true };
72
+ });
73
+ } catch (error) {
74
+ const eventName = "Client_UnexpectedError";
75
+ logger.sendErrorEvent({ eventName }, error);
76
+ return { success: false, eventName, errorMessage: "Unexpected error", error };
77
+ } finally {
78
+ await fileLogger.close();
79
+ }
80
+ }
package/src/utils.ts ADDED
@@ -0,0 +1,45 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import * as fs from "fs";
7
+ import { IFluidFileConverter } from "./codeLoaderBundle";
8
+
9
+ /**
10
+ * Is the given snapshot in JSON format
11
+ * @param content - snapshot file content
12
+ * @internal
13
+ */
14
+ export function isJsonSnapshot(content: Buffer): boolean {
15
+ return content.toString(undefined, 0, 1) === "{";
16
+ }
17
+
18
+ /**
19
+ * Get the ODSP snapshot file content
20
+ * Works on both JSON and binary snapshot formats
21
+ * @param filePath - path to the ODSP snapshot file
22
+ */
23
+ export function getSnapshotFileContent(filePath: string): string | Buffer {
24
+ // TODO: read file stream
25
+ const content = fs.readFileSync(filePath);
26
+ return isJsonSnapshot(content) ? content.toString() : content;
27
+ }
28
+
29
+ /**
30
+ * Validate provided command line arguments
31
+ * @internal
32
+ */
33
+ export function validateCommandLineArgs(
34
+ codeLoader?: string,
35
+ fluidFileConverter?: IFluidFileConverter,
36
+ ): string | undefined {
37
+ if (codeLoader && fluidFileConverter !== undefined) {
38
+ return "\"codeLoader\" and \"fluidFileConverter\" cannot both be provided. See README for details.";
39
+ }
40
+ if (!codeLoader && fluidFileConverter === undefined) {
41
+ // eslint-disable-next-line max-len
42
+ return "\"codeLoader\" must be provided if there is no explicit \"fluidFileConverter\". See README for details.";
43
+ }
44
+ return undefined;
45
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./lib",
5
+ "module": "esnext"
6
+ },
7
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "@fluidframework/build-common/ts-common-config.json",
3
+ "exclude": [
4
+ "src/test/**/*"
5
+ ],
6
+ "compilerOptions": {
7
+ "rootDir": "./src",
8
+ "outDir": "./dist",
9
+ "composite": true
10
+ },
11
+ "include": [
12
+ "src/**/*"
13
+ ]
14
+ }