rename: prefix gateway projects/namespaces with ZB.MOM.WW + sln→slnx
Apply the ZB.MOM.WW. prefix to all gateway-side projects, folders,
.csproj/.sln contents, C# namespaces, using directives, generated proto
C# (csharp_namespace + checked-in generated files), InternalsVisibleTo
attributes, project-name string literals (LoadProject, .sln lookups,
worker exe paths, staticwebassets manifest), and the install/script/doc
references that point at any of the above. Migrate the solution from
.sln to .slnx via `dotnet sln migrate` and delete the old file.
External-runtime identifiers are intentionally NOT prefixed so external
configuration keeps working:
- GatewayMetrics.cs MeterName ("MxGateway.Server")
- DashboardAuthenticationDefaults Scheme/Policy ("MxGateway.Dashboard")
- GatewayRequestLoggingMiddleware logger category ("MxGateway.Request")
- StaRuntime thread name ("MxGateway.Worker.STA")
- appsettings.json root section "MxGateway" + env-var prefix
MxGateway__... and secret-name MxGateway:ApiKeyPepper
- C:\ProgramData\MxGateway\ data dir paths
Also fixes two tests that were not rename-related but became visible
while validating the rename:
- WorkerLiveMxAccessSmokeTests.ShutDownAsync: cancellation that the
gateway service correctly maps to RpcException(Cancelled) per gRPC
convention was being misclassified as a stream fault. Added a sibling
catch on RpcException with StatusCode.Cancelled.
- IntegrationTestEnvironment.ResolveRepositoryRoot: extracted IsRepositoryRoot
and made it accept either a .git marker OR a .sln/.slnx next to src/
so the worker-exe walker works in non-git working copies.
clients/proto/proto-inputs.json's protoRoot updated to point at
src/ZB.MOM.WW.MxGateway.Contracts/Protos.
Verified by `dotnet build` and a full `dotnet test` of the .slnx with
MXGATEWAY_RUN_LIVE_{MXACCESS,LDAP,GALAXY}_TESTS=1:
Tests: 472/472 pass
Worker.Tests: 280/280 pass (4 dev-rig [Fact(Skip=...)] skipped)
IntegrationTests: 18/18 pass
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using ZB.MOM.WW.MxGateway.Worker.Bootstrap;
|
||||
|
||||
namespace ZB.MOM.WW.MxGateway.Worker.Tests.Bootstrap;
|
||||
|
||||
/// <summary>
|
||||
/// In-memory test implementation of the worker environment.
|
||||
/// </summary>
|
||||
internal sealed class MemoryWorkerEnvironment : IWorkerEnvironment
|
||||
{
|
||||
private readonly Dictionary<string, string> _values = new();
|
||||
private readonly Exception? _exception;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes an empty environment.
|
||||
/// </summary>
|
||||
public MemoryWorkerEnvironment()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes an environment that throws when accessed.
|
||||
/// </summary>
|
||||
/// <param name="exception">Exception to throw on access.</param>
|
||||
public MemoryWorkerEnvironment(Exception exception)
|
||||
{
|
||||
_exception = exception;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets an environment variable in the in-memory store.
|
||||
/// </summary>
|
||||
/// <param name="name">Variable name.</param>
|
||||
/// <param name="value">Variable value.</param>
|
||||
public void Set(string name, string value)
|
||||
{
|
||||
_values[name] = value;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public string? GetEnvironmentVariable(string name)
|
||||
{
|
||||
if (_exception is not null)
|
||||
{
|
||||
throw _exception;
|
||||
}
|
||||
|
||||
return _values.TryGetValue(name, out string value)
|
||||
? value
|
||||
: null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ZB.MOM.WW.MxGateway.Worker.Tests.Bootstrap;
|
||||
|
||||
/// <summary>
|
||||
/// Captures a log entry for testing.
|
||||
/// </summary>
|
||||
internal sealed class MemoryWorkerLogEntry
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a log entry with level, event name, and fields.
|
||||
/// </summary>
|
||||
/// <param name="level">Log level (e.g., Debug, Info, Warning, Error).</param>
|
||||
/// <param name="eventName">Event name or category.</param>
|
||||
/// <param name="fields">Dictionary of log fields.</param>
|
||||
public MemoryWorkerLogEntry(
|
||||
string level,
|
||||
string eventName,
|
||||
IReadOnlyDictionary<string, object?> fields)
|
||||
{
|
||||
Level = level;
|
||||
EventName = eventName;
|
||||
Fields = fields;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the log level.
|
||||
/// </summary>
|
||||
public string Level { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the event name.
|
||||
/// </summary>
|
||||
public string EventName { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the log entry fields.
|
||||
/// </summary>
|
||||
public IReadOnlyDictionary<string, object?> Fields { get; }
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using System.Collections.Generic;
|
||||
using ZB.MOM.WW.MxGateway.Worker.Bootstrap;
|
||||
|
||||
namespace ZB.MOM.WW.MxGateway.Worker.Tests.Bootstrap;
|
||||
|
||||
/// <summary>
|
||||
/// In-memory logger that records all log entries for test inspection.
|
||||
/// </summary>
|
||||
internal sealed class MemoryWorkerLogger : IWorkerLogger
|
||||
{
|
||||
/// <summary>
|
||||
/// All logged entries recorded in memory.
|
||||
/// </summary>
|
||||
public List<MemoryWorkerLogEntry> Entries { get; } = new();
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Information(string eventName, IReadOnlyDictionary<string, object?> fields)
|
||||
{
|
||||
Entries.Add(new MemoryWorkerLogEntry("Information", eventName, WorkerLogRedactor.RedactFields(fields)));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Error(string eventName, IReadOnlyDictionary<string, object?> fields)
|
||||
{
|
||||
Entries.Add(new MemoryWorkerLogEntry("Error", eventName, WorkerLogRedactor.RedactFields(fields)));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using ZB.MOM.WW.MxGateway.Contracts;
|
||||
using ZB.MOM.WW.MxGateway.Worker.Bootstrap;
|
||||
using ZB.MOM.WW.MxGateway.Worker.Ipc;
|
||||
|
||||
namespace ZB.MOM.WW.MxGateway.Worker.Tests.Bootstrap;
|
||||
|
||||
public sealed class WorkerApplicationTests
|
||||
{
|
||||
/// <summary>Verifies that valid bootstrap arguments succeed and redact nonce.</summary>
|
||||
[Fact]
|
||||
public void Run_WithValidBootstrapArguments_ReturnsSuccessAndLogsRedactedNonce()
|
||||
{
|
||||
MemoryWorkerEnvironment environment = CreateEnvironment("nonce-secret");
|
||||
MemoryWorkerLogger logger = new();
|
||||
|
||||
int exitCode = ZB.MOM.WW.MxGateway.Worker.WorkerApplication.Run(
|
||||
ValidArgs(),
|
||||
environment,
|
||||
logger,
|
||||
new SucceedingPipeClient());
|
||||
|
||||
Assert.Equal((int)WorkerExitCode.Success, exitCode);
|
||||
Assert.Equal(2, logger.Entries.Count);
|
||||
MemoryWorkerLogEntry entry = logger.Entries[0];
|
||||
Assert.Equal("Information", entry.Level);
|
||||
Assert.Equal("WorkerBootstrapSucceeded", entry.EventName);
|
||||
Assert.Equal("session-1", entry.Fields["session_id"]);
|
||||
Assert.Equal("mxaccess-gateway-123-session-1", entry.Fields["pipe_name"]);
|
||||
Assert.Equal(GatewayContractInfo.WorkerProtocolVersion, entry.Fields["protocol_version"]);
|
||||
Assert.Equal("[redacted]", entry.Fields["nonce"]);
|
||||
Assert.Equal("WorkerPipeSessionCompleted", logger.Entries[1].EventName);
|
||||
}
|
||||
|
||||
/// <summary>Verifies that missing arguments returns invalid arguments error.</summary>
|
||||
[Fact]
|
||||
public void Run_WithMissingRequiredArguments_ReturnsInvalidArguments()
|
||||
{
|
||||
MemoryWorkerEnvironment environment = CreateEnvironment("nonce-secret");
|
||||
MemoryWorkerLogger logger = new();
|
||||
|
||||
int exitCode = ZB.MOM.WW.MxGateway.Worker.WorkerApplication.Run(
|
||||
[],
|
||||
environment,
|
||||
logger);
|
||||
|
||||
Assert.Equal((int)WorkerExitCode.InvalidArguments, exitCode);
|
||||
MemoryWorkerLogEntry entry = Assert.Single(logger.Entries);
|
||||
Assert.Equal("Error", entry.Level);
|
||||
Assert.Equal("WorkerBootstrapFailed", entry.EventName);
|
||||
Assert.Equal(WorkerExitCode.InvalidArguments, entry.Fields["exit_code"]);
|
||||
}
|
||||
|
||||
/// <summary>Verifies that invalid protocol version is rejected.</summary>
|
||||
[Fact]
|
||||
public void Run_WithInvalidProtocolVersion_ReturnsInvalidProtocolVersion()
|
||||
{
|
||||
MemoryWorkerEnvironment environment = CreateEnvironment("nonce-secret");
|
||||
MemoryWorkerLogger logger = new();
|
||||
|
||||
int exitCode = ZB.MOM.WW.MxGateway.Worker.WorkerApplication.Run(
|
||||
ValidArgs(protocolVersion: "999"),
|
||||
environment,
|
||||
logger);
|
||||
|
||||
Assert.Equal((int)WorkerExitCode.InvalidProtocolVersion, exitCode);
|
||||
}
|
||||
|
||||
/// <summary>Verifies that missing nonce is detected.</summary>
|
||||
[Fact]
|
||||
public void Run_WithMissingNonce_ReturnsMissingNonce()
|
||||
{
|
||||
MemoryWorkerEnvironment environment = new();
|
||||
MemoryWorkerLogger logger = new();
|
||||
|
||||
int exitCode = ZB.MOM.WW.MxGateway.Worker.WorkerApplication.Run(
|
||||
ValidArgs(),
|
||||
environment,
|
||||
logger);
|
||||
|
||||
Assert.Equal((int)WorkerExitCode.MissingNonce, exitCode);
|
||||
}
|
||||
|
||||
/// <summary>Verifies that pipe protocol failure returns protocol violation error.</summary>
|
||||
[Fact]
|
||||
public void Run_WithPipeProtocolFailure_ReturnsProtocolViolation()
|
||||
{
|
||||
MemoryWorkerEnvironment environment = CreateEnvironment("nonce-secret");
|
||||
MemoryWorkerLogger logger = new();
|
||||
|
||||
int exitCode = ZB.MOM.WW.MxGateway.Worker.WorkerApplication.Run(
|
||||
ValidArgs(),
|
||||
environment,
|
||||
logger,
|
||||
new ThrowingPipeClient(new WorkerFrameProtocolException(
|
||||
WorkerFrameProtocolErrorCode.NonceMismatch,
|
||||
"Bad nonce.")));
|
||||
|
||||
Assert.Equal((int)WorkerExitCode.ProtocolViolation, exitCode);
|
||||
Assert.Equal("WorkerPipeProtocolFailure", logger.Entries[1].EventName);
|
||||
}
|
||||
|
||||
/// <summary>Verifies that unexpected exceptions during bootstrap are logged.</summary>
|
||||
[Fact]
|
||||
public void Run_WithUnexpectedBootstrapFailure_ReturnsUnexpectedFailure()
|
||||
{
|
||||
MemoryWorkerEnvironment environment = new(new InvalidOperationException("environment failed"));
|
||||
MemoryWorkerLogger logger = new();
|
||||
|
||||
int exitCode = ZB.MOM.WW.MxGateway.Worker.WorkerApplication.Run(
|
||||
ValidArgs(),
|
||||
environment,
|
||||
logger);
|
||||
|
||||
Assert.Equal((int)WorkerExitCode.UnexpectedFailure, exitCode);
|
||||
MemoryWorkerLogEntry entry = Assert.Single(logger.Entries);
|
||||
Assert.Equal("WorkerBootstrapUnexpectedFailure", entry.EventName);
|
||||
Assert.Equal(WorkerExitCode.UnexpectedFailure, entry.Fields["exit_code"]);
|
||||
Assert.Equal(typeof(InvalidOperationException).FullName, entry.Fields["exception_type"]);
|
||||
}
|
||||
|
||||
private static string[] ValidArgs(string? protocolVersion = null)
|
||||
{
|
||||
return
|
||||
[
|
||||
"--session-id",
|
||||
"session-1",
|
||||
"--pipe-name",
|
||||
"mxaccess-gateway-123-session-1",
|
||||
"--protocol-version",
|
||||
protocolVersion ?? GatewayContractInfo.WorkerProtocolVersion.ToString(),
|
||||
];
|
||||
}
|
||||
|
||||
private static MemoryWorkerEnvironment CreateEnvironment(string nonce)
|
||||
{
|
||||
MemoryWorkerEnvironment environment = new();
|
||||
environment.Set(WorkerOptions.NonceEnvironmentVariableName, nonce);
|
||||
return environment;
|
||||
}
|
||||
|
||||
private sealed class SucceedingPipeClient : IWorkerPipeClient
|
||||
{
|
||||
/// <summary>Runs the worker pipe client successfully.</summary>
|
||||
/// <param name="options">Worker options.</param>
|
||||
/// <param name="cancellationToken">Cancellation token.</param>
|
||||
/// <returns>Completed task.</returns>
|
||||
public Task RunAsync(
|
||||
WorkerOptions options,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
||||
private sealed class ThrowingPipeClient : IWorkerPipeClient
|
||||
{
|
||||
private readonly Exception _exception;
|
||||
|
||||
/// <summary>Initializes the pipe client with an exception to throw.</summary>
|
||||
/// <param name="exception">Exception to throw when run.</param>
|
||||
public ThrowingPipeClient(Exception exception)
|
||||
{
|
||||
_exception = exception;
|
||||
}
|
||||
|
||||
/// <summary>Runs the worker pipe client and throws configured exception.</summary>
|
||||
/// <param name="options">Worker options.</param>
|
||||
/// <param name="cancellationToken">Cancellation token.</param>
|
||||
/// <returns>Never completes; always throws.</returns>
|
||||
public Task RunAsync(
|
||||
WorkerOptions options,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
throw _exception;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using ZB.MOM.WW.MxGateway.Worker.Bootstrap;
|
||||
|
||||
namespace ZB.MOM.WW.MxGateway.Worker.Tests.Bootstrap;
|
||||
|
||||
public sealed class WorkerConsoleLoggerTests
|
||||
{
|
||||
/// <summary>Verifies that console logger redacts nonce in structured output.</summary>
|
||||
[Fact]
|
||||
public void Information_RedactsNonceInStructuredOutput()
|
||||
{
|
||||
StringWriter writer = new();
|
||||
WorkerConsoleLogger logger = new(writer);
|
||||
|
||||
logger.Information("WorkerBootstrapSucceeded", new Dictionary<string, object?>
|
||||
{
|
||||
["session_id"] = "session-1",
|
||||
["nonce"] = "nonce-secret",
|
||||
});
|
||||
|
||||
string output = writer.ToString();
|
||||
|
||||
Assert.Contains("event=WorkerBootstrapSucceeded", output);
|
||||
Assert.Contains("session_id=session-1", output);
|
||||
Assert.Contains("nonce=[redacted]", output);
|
||||
Assert.DoesNotContain("nonce-secret", output);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
using System.Collections.Generic;
|
||||
using ZB.MOM.WW.MxGateway.Worker.Bootstrap;
|
||||
|
||||
namespace ZB.MOM.WW.MxGateway.Worker.Tests.Bootstrap;
|
||||
|
||||
public sealed class WorkerLogRedactorTests
|
||||
{
|
||||
/// <summary>
|
||||
/// Verifies sensitive fields are redacted in log dictionaries.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void RedactFields_RedactsNonceSecretPasswordTokenCredentialAndApiKeyFields()
|
||||
{
|
||||
Dictionary<string, object?> fields = new()
|
||||
{
|
||||
["nonce"] = "nonce-secret",
|
||||
["client_secret"] = "secret",
|
||||
["password"] = "password",
|
||||
["auth_token"] = "token",
|
||||
["credential_value"] = "credential",
|
||||
["api_key"] = "key",
|
||||
["session_id"] = "session-1",
|
||||
};
|
||||
|
||||
Dictionary<string, object?> redacted = WorkerLogRedactor.RedactFields(fields);
|
||||
|
||||
Assert.Equal("[redacted]", redacted["nonce"]);
|
||||
Assert.Equal("[redacted]", redacted["client_secret"]);
|
||||
Assert.Equal("[redacted]", redacted["password"]);
|
||||
Assert.Equal("[redacted]", redacted["auth_token"]);
|
||||
Assert.Equal("[redacted]", redacted["credential_value"]);
|
||||
Assert.Equal("[redacted]", redacted["api_key"]);
|
||||
Assert.Equal("session-1", redacted["session_id"]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies <see cref="WorkerLogRedactor.RedactValue"/> redacts individual
|
||||
/// credential-bearing fields before they reach a log sink.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void RedactValue_WithCredentialBearingFieldNames_ReturnsRedactedValue()
|
||||
{
|
||||
Assert.Equal(WorkerLogRedactor.RedactedValue, WorkerLogRedactor.RedactValue("credential_value", "secret"));
|
||||
Assert.Equal(WorkerLogRedactor.RedactedValue, WorkerLogRedactor.RedactValue("password_value", "secret"));
|
||||
Assert.Equal(WorkerLogRedactor.RedactedValue, WorkerLogRedactor.RedactValue("secured_write_token", "secret"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
using ZB.MOM.WW.MxGateway.Contracts;
|
||||
using ZB.MOM.WW.MxGateway.Worker.Bootstrap;
|
||||
|
||||
namespace ZB.MOM.WW.MxGateway.Worker.Tests.Bootstrap;
|
||||
|
||||
public sealed class WorkerOptionsParserTests
|
||||
{
|
||||
/// <summary>Verifies that parsing with all required inputs returns worker options.</summary>
|
||||
[Fact]
|
||||
public void Parse_WithAllRequiredInputs_ReturnsWorkerOptions()
|
||||
{
|
||||
WorkerOptionsParser parser = new(CreateEnvironment("nonce-secret"));
|
||||
|
||||
WorkerBootstrapResult result = parser.Parse(ValidArgs());
|
||||
|
||||
Assert.True(result.Succeeded);
|
||||
Assert.Equal(WorkerExitCode.Success, result.ExitCode);
|
||||
Assert.NotNull(result.Options);
|
||||
Assert.Equal("session-1", result.Options.SessionId);
|
||||
Assert.Equal("mxaccess-gateway-123-session-1", result.Options.PipeName);
|
||||
Assert.Equal(GatewayContractInfo.WorkerProtocolVersion, result.Options.ProtocolVersion);
|
||||
Assert.Equal("nonce-secret", result.Options.Nonce);
|
||||
}
|
||||
|
||||
/// <summary>Verifies that parsing with missing session ID returns invalid arguments.</summary>
|
||||
[Fact]
|
||||
public void Parse_WithMissingSessionId_ReturnsInvalidArguments()
|
||||
{
|
||||
WorkerOptionsParser parser = new(CreateEnvironment("nonce-secret"));
|
||||
|
||||
WorkerBootstrapResult result = parser.Parse(
|
||||
[
|
||||
"--pipe-name",
|
||||
"mxaccess-gateway-123-session-1",
|
||||
"--protocol-version",
|
||||
GatewayContractInfo.WorkerProtocolVersion.ToString(),
|
||||
]);
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Equal(WorkerExitCode.InvalidArguments, result.ExitCode);
|
||||
Assert.Contains(result.Errors, error => error.Contains("--session-id"));
|
||||
}
|
||||
|
||||
/// <summary>Verifies that parsing with unknown option returns invalid arguments.</summary>
|
||||
[Fact]
|
||||
public void Parse_WithUnknownOption_ReturnsInvalidArguments()
|
||||
{
|
||||
WorkerOptionsParser parser = new(CreateEnvironment("nonce-secret"));
|
||||
|
||||
WorkerBootstrapResult result = parser.Parse(
|
||||
[
|
||||
"--session-id",
|
||||
"session-1",
|
||||
"--pipe-name",
|
||||
"mxaccess-gateway-123-session-1",
|
||||
"--protocol-version",
|
||||
GatewayContractInfo.WorkerProtocolVersion.ToString(),
|
||||
"--unexpected",
|
||||
"value",
|
||||
]);
|
||||
|
||||
Assert.Equal(WorkerExitCode.InvalidArguments, result.ExitCode);
|
||||
Assert.Contains(result.Errors, error => error.Contains("Unknown option"));
|
||||
}
|
||||
|
||||
/// <summary>Verifies that parsing with non-numeric protocol version returns invalid protocol version.</summary>
|
||||
[Fact]
|
||||
public void Parse_WithNonNumericProtocolVersion_ReturnsInvalidProtocolVersion()
|
||||
{
|
||||
WorkerOptionsParser parser = new(CreateEnvironment("nonce-secret"));
|
||||
|
||||
WorkerBootstrapResult result = parser.Parse(ValidArgs(protocolVersion: "abc"));
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Equal(WorkerExitCode.InvalidProtocolVersion, result.ExitCode);
|
||||
}
|
||||
|
||||
/// <summary>Verifies that parsing with unsupported protocol version returns invalid protocol version.</summary>
|
||||
[Fact]
|
||||
public void Parse_WithUnsupportedProtocolVersion_ReturnsInvalidProtocolVersion()
|
||||
{
|
||||
WorkerOptionsParser parser = new(CreateEnvironment("nonce-secret"));
|
||||
|
||||
WorkerBootstrapResult result = parser.Parse(ValidArgs(protocolVersion: "999"));
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Equal(WorkerExitCode.InvalidProtocolVersion, result.ExitCode);
|
||||
}
|
||||
|
||||
/// <summary>Verifies that parsing with missing nonce returns missing nonce error.</summary>
|
||||
[Fact]
|
||||
public void Parse_WithMissingNonce_ReturnsMissingNonce()
|
||||
{
|
||||
WorkerOptionsParser parser = new(new MemoryWorkerEnvironment());
|
||||
|
||||
WorkerBootstrapResult result = parser.Parse(ValidArgs());
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Equal(WorkerExitCode.MissingNonce, result.ExitCode);
|
||||
}
|
||||
|
||||
private static string[] ValidArgs(string? protocolVersion = null)
|
||||
{
|
||||
return
|
||||
[
|
||||
"--session-id",
|
||||
"session-1",
|
||||
"--pipe-name",
|
||||
"mxaccess-gateway-123-session-1",
|
||||
"--protocol-version",
|
||||
protocolVersion ?? GatewayContractInfo.WorkerProtocolVersion.ToString(),
|
||||
];
|
||||
}
|
||||
|
||||
private static MemoryWorkerEnvironment CreateEnvironment(string nonce)
|
||||
{
|
||||
MemoryWorkerEnvironment environment = new();
|
||||
environment.Set(WorkerOptions.NonceEnvironmentVariableName, nonce);
|
||||
return environment;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user