diff --git a/features/features.go b/features/features.go index bb8c976f..afd7a1ea 100644 --- a/features/features.go +++ b/features/features.go @@ -33,6 +33,7 @@ import ( eager_activity_non_remote_activities_worker "github.com/temporalio/features/features/eager_activity/non_remote_activities_worker" eager_workflow_successful_start "github.com/temporalio/features/features/eager_workflow/successful_start" nexus_sync_success "github.com/temporalio/features/features/nexus/sync_success" + query_oversized_result_external_storage "github.com/temporalio/features/features/query/oversized_result_external_storage" query_successful_query "github.com/temporalio/features/features/query/successful_query" query_timeout_due_to_no_active_workers "github.com/temporalio/features/features/query/timeout_due_to_no_active_workers" query_unexpected_arguments "github.com/temporalio/features/features/query/unexpected_arguments" @@ -96,6 +97,7 @@ func init() { eager_activity_non_remote_activities_worker.Feature, eager_workflow_successful_start.Feature, nexus_sync_success.Feature, + query_oversized_result_external_storage.Feature, query_successful_query.Feature, query_timeout_due_to_no_active_workers.Feature, query_unexpected_arguments.Feature, diff --git a/features/query/oversized_result_external_storage/README.md b/features/query/oversized_result_external_storage/README.md new file mode 100644 index 00000000..430abf36 --- /dev/null +++ b/features/query/oversized_result_external_storage/README.md @@ -0,0 +1,9 @@ +# Oversized query result with external storage + +An oversized query result succeeds when external storage is configured. The +SDK must offload the result before applying the server payload-size limit. + +The query returns 3 MiB, above the server's default 2 MiB error limit. The +checker verifies the value and confirms that storage and retrieval occurred. + +Go, Python, and TypeScript currently expose functional external storage. diff --git a/features/query/oversized_result_external_storage/config.json b/features/query/oversized_result_external_storage/config.json new file mode 100644 index 00000000..c4dd39b5 --- /dev/null +++ b/features/query/oversized_result_external_storage/config.json @@ -0,0 +1,11 @@ +{ + "go": { + "minVersion": "1.48.0" + }, + "py": { + "minVersion": "1.24.0" + }, + "ts": { + "minVersion": "1.21.0" + } +} diff --git a/features/query/oversized_result_external_storage/feature.go b/features/query/oversized_result_external_storage/feature.go new file mode 100644 index 00000000..d287fcbb --- /dev/null +++ b/features/query/oversized_result_external_storage/feature.go @@ -0,0 +1,142 @@ +package oversized_result_external_storage + +import ( + "context" + "fmt" + "strings" + "sync" + + "github.com/temporalio/features/harness/go/harness" + commonpb "go.temporal.io/api/common/v1" + "go.temporal.io/sdk/client" + "go.temporal.io/sdk/converter" + "go.temporal.io/sdk/workflow" + "google.golang.org/protobuf/proto" +) + +const ( + queryName = "oversized-result" + finishSignal = "finish" + driverName = "query-result-memory" + // Exceed the server limit so the SDK must offload the result. + resultSize = 3 * 1024 * 1024 + storageThreshold = 1024 +) + +var storage = newMemoryDriver() + +var Feature = harness.Feature{ + Workflows: Workflow, + ClientOptions: client.Options{ + ExternalStorage: converter.ExternalStorage{ + Drivers: []converter.StorageDriver{storage}, + PayloadSizeThreshold: storageThreshold, + }, + }, + CheckResult: checkResult, +} + +func Workflow(ctx workflow.Context) error { + result := strings.Repeat("a", resultSize) + if err := workflow.SetQueryHandler(ctx, queryName, func() (string, error) { + return result, nil + }); err != nil { + return err + } + + workflow.GetSignalChannel(ctx, finishSignal).Receive(ctx, nil) + return nil +} + +func checkResult(ctx context.Context, r *harness.Runner, run client.WorkflowRun) error { + value, err := r.Client.QueryWorkflow(ctx, run.GetID(), run.GetRunID(), queryName) + if err != nil { + return err + } + + var result string + if err := value.Get(&result); err != nil { + return err + } + if result != strings.Repeat("a", resultSize) { + return fmt.Errorf("unexpected query result") + } + if storage.storeCalls() == 0 || storage.retrieveCalls() == 0 { + return fmt.Errorf("query result did not use external storage") + } + + if err := r.Client.SignalWorkflow(ctx, run.GetID(), run.GetRunID(), finishSignal, nil); err != nil { + return err + } + return r.CheckResultDefault(ctx, run) +} + +type memoryDriver struct { + mu sync.Mutex + payloads map[string]*commonpb.Payload + nextID int + stores int + retrieves int +} + +func newMemoryDriver() *memoryDriver { + return &memoryDriver{payloads: make(map[string]*commonpb.Payload)} +} + +func (*memoryDriver) Name() string { + return driverName +} + +func (*memoryDriver) Type() string { + return driverName +} + +func (d *memoryDriver) Store( + _ converter.StorageDriverStoreContext, + payloads []*commonpb.Payload, +) ([]converter.StorageDriverClaim, error) { + d.mu.Lock() + defer d.mu.Unlock() + + d.stores++ + claims := make([]converter.StorageDriverClaim, len(payloads)) + for i, payload := range payloads { + key := fmt.Sprintf("payload-%d", d.nextID) + d.nextID++ + d.payloads[key] = proto.Clone(payload).(*commonpb.Payload) + claims[i] = converter.StorageDriverClaim{ClaimData: map[string]string{"key": key}} + } + return claims, nil +} + +func (d *memoryDriver) Retrieve( + _ converter.StorageDriverRetrieveContext, + claims []converter.StorageDriverClaim, +) ([]*commonpb.Payload, error) { + d.mu.Lock() + defer d.mu.Unlock() + + d.retrieves++ + payloads := make([]*commonpb.Payload, len(claims)) + for i, claim := range claims { + key := claim.ClaimData["key"] + payload, ok := d.payloads[key] + if !ok { + return nil, fmt.Errorf("payload %q not found", key) + } + payloads[i] = proto.Clone(payload).(*commonpb.Payload) + } + return payloads, nil +} + +func (d *memoryDriver) storeCalls() int { + d.mu.Lock() + defer d.mu.Unlock() + return d.stores +} + +func (d *memoryDriver) retrieveCalls() int { + d.mu.Lock() + defer d.mu.Unlock() + return d.retrieves +} diff --git a/features/query/oversized_result_external_storage/feature.py b/features/query/oversized_result_external_storage/feature.py new file mode 100644 index 00000000..06b06568 --- /dev/null +++ b/features/query/oversized_result_external_storage/feature.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +import dataclasses +from collections.abc import Sequence + +import temporalio.converter +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import WorkflowHandle +from temporalio.converter import ( + ExternalStorage, + StorageDriver, + StorageDriverClaim, + StorageDriverRetrieveContext, + StorageDriverStoreContext, +) + +from harness.python.feature import Runner, register_feature + +# Exceed the server limit so the SDK must offload the result. +RESULT_SIZE = 3 * 1024 * 1024 +STORAGE_THRESHOLD = 1024 + + +class MemoryDriver(StorageDriver): + def __init__(self) -> None: + self.payloads: dict[str, bytes] = {} + self.stores = 0 + self.retrieves = 0 + + def name(self) -> str: + return "query-result-memory" + + async def store( + self, + context: StorageDriverStoreContext, + payloads: Sequence[Payload], + ) -> list[StorageDriverClaim]: + self.stores += 1 + claims = [] + for payload in payloads: + key = f"payload-{len(self.payloads)}" + self.payloads[key] = payload.SerializeToString() + claims.append(StorageDriverClaim(claim_data={"key": key})) + return claims + + async def retrieve( + self, + context: StorageDriverRetrieveContext, + claims: Sequence[StorageDriverClaim], + ) -> list[Payload]: + self.retrieves += 1 + payloads = [] + for claim in claims: + payload = Payload() + payload.ParseFromString(self.payloads[claim.claim_data["key"]]) + payloads.append(payload) + return payloads + + +driver = MemoryDriver() +data_converter = dataclasses.replace( + temporalio.converter.default(), + external_storage=ExternalStorage( + drivers=[driver], + payload_size_threshold=STORAGE_THRESHOLD, + ), +) + + +@workflow.defn +class Workflow: + def __init__(self) -> None: + self.finished = False + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self.finished) + + @workflow.query + def oversized_result(self) -> str: + return "a" * RESULT_SIZE + + @workflow.signal + def finish(self) -> None: + self.finished = True + + +async def check_result(_: Runner, handle: WorkflowHandle) -> None: + result = await handle.query(Workflow.oversized_result) + assert result == "a" * RESULT_SIZE + assert driver.stores > 0 + assert driver.retrieves > 0 + + await handle.signal(Workflow.finish) + await handle.result() + + +register_feature( + workflows=[Workflow], + check_result=check_result, + data_converter=data_converter, +) diff --git a/features/query/oversized_result_external_storage/feature.ts b/features/query/oversized_result_external_storage/feature.ts new file mode 100644 index 00000000..28787456 --- /dev/null +++ b/features/query/oversized_result_external_storage/feature.ts @@ -0,0 +1,63 @@ +import * as assert from 'assert'; +import { ExternalStorage, type Payload, type StorageDriver, StorageDriverClaim } from '@temporalio/common'; +import { Feature } from '@temporalio/harness'; +import * as wf from '@temporalio/workflow'; + +// Exceed the server limit so the SDK must offload the result. +const RESULT_SIZE = 3 * 1024 * 1024; +const STORAGE_THRESHOLD = 1024; + +const query = wf.defineQuery('oversized-result'); +const finishSignal = wf.defineSignal('finish'); + +const payloads = new Map(); +let stores = 0; +let retrieves = 0; + +const driver: StorageDriver = { + name: 'query-result-memory', + type: 'query-result-memory', + async store(_context, values) { + stores++; + return values.map((value) => { + const key = `payload-${payloads.size}`; + payloads.set(key, value); + return new StorageDriverClaim({ key }); + }); + }, + async retrieve(_context, claims) { + retrieves++; + return claims.map((claim) => { + const key = claim.claimData.key; + const value = payloads.get(key); + if (value === undefined) { + throw new Error(`Payload ${key} not found`); + } + return value; + }); + }, +}; + +const externalStorage = new ExternalStorage({ + drivers: [driver], + payloadSizeThreshold: STORAGE_THRESHOLD, +}); + +export async function workflow(): Promise { + wf.setHandler(query, () => 'a'.repeat(RESULT_SIZE)); + await new Promise((resolve) => wf.setHandler(finishSignal, resolve)); +} + +export const feature = new Feature({ + workflow, + dataConverter: { externalStorage }, + checkResult: async (runner, handle) => { + const result = await handle.query(query); + assert.equal(result, 'a'.repeat(RESULT_SIZE)); + assert.ok(stores > 0); + assert.ok(retrieves > 0); + + await handle.signal(finishSignal); + await runner.waitForRunResult(handle); + }, +}); diff --git a/package-lock.json b/package-lock.json index 01544086..3f43b0fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,13 +8,13 @@ "dependencies": { "@grpc/grpc-js": "^1.12.4", "@protobuf-ts/protoc": "^2.8.1", - "@temporalio/activity": "^1.18.1", - "@temporalio/client": "^1.18.1", - "@temporalio/common": "^1.18.1", - "@temporalio/plugin": "^1.18.1", - "@temporalio/proto": "^1.18.1", - "@temporalio/worker": "^1.18.1", - "@temporalio/workflow": "^1.18.1", + "@temporalio/activity": "^1.21.1", + "@temporalio/client": "^1.21.1", + "@temporalio/common": "^1.21.1", + "@temporalio/plugin": "^1.21.1", + "@temporalio/proto": "^1.21.1", + "@temporalio/worker": "^1.21.1", + "@temporalio/workflow": "^1.21.1", "commander": "^8.3.0", "ms": "^3.0.0-canary.1", "nexus-rpc": "^0.0.1", @@ -1196,59 +1196,59 @@ } }, "node_modules/@temporalio/activity": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@temporalio/activity/-/activity-1.18.1.tgz", - "integrity": "sha512-Y24veV/dOSavnXK0YRifM/eoM+i7A814w2CMnlw8H9GYYIKMo71JMMq6CEJkhueVuMJxGb4Ajg+uvWUT/Ocebw==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@temporalio/activity/-/activity-1.23.0.tgz", + "integrity": "sha512-BVeiizVD08yk0Ls6MhKCK+g3fPIWbVM9MLx+o990KwhCaZtRM6o1+du1/qfIIShHl6YjHk+H0ewkx2x14QQ6bA==", "license": "MIT", "dependencies": { - "@temporalio/client": "1.18.1", - "@temporalio/common": "1.18.1" + "@temporalio/client": "1.23.0", + "@temporalio/common": "1.23.0" }, "engines": { - "node": ">= 20.0.0" + "node": ">= 20.3.0" } }, "node_modules/@temporalio/client": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@temporalio/client/-/client-1.18.1.tgz", - "integrity": "sha512-ToYL+qTCO8AE7IBsk1kmCZYh2Nu6e2W8QB+H5cKp2l8VUYWljNKXfb1aguGVN1gnCsBhbcu3s7dJmltLvlOcSw==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@temporalio/client/-/client-1.23.0.tgz", + "integrity": "sha512-E9nXZPiKDGEDbPpRi0EyQ9i1x70fEIG26aMXZO88kKslKZnEKNPphs06xIic7bhuDoSrPsgVfdDap6o3l6IO2A==", "license": "MIT", "dependencies": { "@grpc/grpc-js": "^1.12.4", - "@temporalio/common": "1.18.1", - "@temporalio/proto": "1.18.1", + "@temporalio/common": "1.23.0", + "@temporalio/proto": "1.23.0", "abort-controller": "^3.0.0", - "long": "^5.2.3", - "nexus-rpc": "^0.0.2", + "long": "^5.3.2", + "nexus-rpc": "^0.0.3", "uuid": "^11.1.0" }, "engines": { - "node": ">= 20.0.0" + "node": ">= 20.3.0" } }, "node_modules/@temporalio/client/node_modules/nexus-rpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/nexus-rpc/-/nexus-rpc-0.0.2.tgz", - "integrity": "sha512-IWjIExdVYlmwXuzHdY/Q3lXCv1gbqoAXPazQhy2w4Xgtgha3H0OOujEESVPQcFUFMWm+pAk2gKnb57g8S41JZg==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/nexus-rpc/-/nexus-rpc-0.0.3.tgz", + "integrity": "sha512-ksIBeYHDv6FHAR1h3Vwk0kQ6REhdo1STqDHXMzu/yn/VN/XzgOor2IUjewG6paoA7IgxlIPZoOU/PD78PC6HTg==", "license": "MIT", "engines": { "node": ">= 20.0.0" } }, "node_modules/@temporalio/common": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@temporalio/common/-/common-1.18.1.tgz", - "integrity": "sha512-2hYWRKmY8WLt/8Nkrx2tziGAoNcbHDWbQR8AGvJ2xcap5E3hTIQPiNDARUm0tyCEK9umnCQztndbDxzLcxUZeA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@temporalio/common/-/common-1.23.0.tgz", + "integrity": "sha512-TaZYb/ruzgzJ8jd42EqRUCI4ispLZETt2Jigc9szES6q9edDmfncRw143HyvPi7b8n9naohYmA/IxTe9COH/dg==", "license": "MIT", "dependencies": { - "@temporalio/proto": "1.18.1", - "long": "^5.2.3", + "@temporalio/proto": "1.23.0", + "long": "^5.3.2", "ms": "3.0.0-canary.1", - "nexus-rpc": "^0.0.2", - "proto3-json-serializer": "^2.0.0" + "nexus-rpc": "^0.0.3", + "protobufjs": "^8.7.1" }, "engines": { - "node": ">= 20.0.0" + "node": ">= 20.3.0" } }, "node_modules/@temporalio/common/node_modules/ms": { @@ -1261,168 +1261,144 @@ } }, "node_modules/@temporalio/common/node_modules/nexus-rpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/nexus-rpc/-/nexus-rpc-0.0.2.tgz", - "integrity": "sha512-IWjIExdVYlmwXuzHdY/Q3lXCv1gbqoAXPazQhy2w4Xgtgha3H0OOujEESVPQcFUFMWm+pAk2gKnb57g8S41JZg==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/nexus-rpc/-/nexus-rpc-0.0.3.tgz", + "integrity": "sha512-ksIBeYHDv6FHAR1h3Vwk0kQ6REhdo1STqDHXMzu/yn/VN/XzgOor2IUjewG6paoA7IgxlIPZoOU/PD78PC6HTg==", "license": "MIT", "engines": { "node": ">= 20.0.0" } }, - "node_modules/@temporalio/common/node_modules/proto3-json-serializer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", - "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", - "license": "Apache-2.0", + "node_modules/@temporalio/common/node_modules/protobufjs": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.8.0.tgz", + "integrity": "sha512-N3xhQ5yyBx3vQq4gubBfASzYhJGNzeDbjqBpu61g7UVylsN/qyffU96TKWD3GbbLOKF82VGNRNvv1+BFgE31Eg==", + "license": "BSD-3-Clause", "dependencies": { - "protobufjs": "^7.2.5" + "long": "^5.3.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=12.0.0" } }, "node_modules/@temporalio/core-bridge": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@temporalio/core-bridge/-/core-bridge-1.18.1.tgz", - "integrity": "sha512-iMTF6piD03YyjFFDjbmY+yGYptEtNtM4QEC8/8EUR36Ze6DkyqW1gll0VUyUCLpkhHhy4+XLBtqQ0bfpen+Csw==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@temporalio/core-bridge/-/core-bridge-1.23.0.tgz", + "integrity": "sha512-sid14odlYnci9WgB+iDLyxFbzkq+qBbRPp+CW9U1v+DLRfHlFJwpznQ1AZl4mHjtAZRGQFvDsDG0XNncl9ESSA==", "license": "MIT", "dependencies": { "@grpc/grpc-js": "^1.12.4", - "@temporalio/common": "1.18.1" + "@temporalio/common": "1.23.0" }, "engines": { - "node": ">= 20.0.0" + "node": ">= 20.3.0" } }, "node_modules/@temporalio/nexus": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@temporalio/nexus/-/nexus-1.18.1.tgz", - "integrity": "sha512-LNrB+41kTEV32fCRHboLOT3D8RRVzaI953iqiHEaz0tkVVQmYUzRVQpSID/UjWExWw1mbaIvpFmKkYvY0g2j2A==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@temporalio/nexus/-/nexus-1.23.0.tgz", + "integrity": "sha512-mObGNp3thR+mTXdtKXpUvFpsdjEI9xpVjewhblKXao7Nqv6xrs7RpFiLdKfJhkEvDyfRgIk/dH5RkiCbZ58I9w==", "license": "MIT", "dependencies": { - "@temporalio/client": "1.18.1", - "@temporalio/common": "1.18.1", - "@temporalio/proto": "1.18.1", - "long": "^5.2.3", - "nexus-rpc": "^0.0.2" + "@temporalio/client": "1.23.0", + "@temporalio/common": "1.23.0", + "@temporalio/proto": "1.23.0", + "long": "^5.3.2", + "nexus-rpc": "^0.0.3" }, "engines": { - "node": ">= 20.0.0" + "node": ">= 20.3.0" } }, "node_modules/@temporalio/nexus/node_modules/nexus-rpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/nexus-rpc/-/nexus-rpc-0.0.2.tgz", - "integrity": "sha512-IWjIExdVYlmwXuzHdY/Q3lXCv1gbqoAXPazQhy2w4Xgtgha3H0OOujEESVPQcFUFMWm+pAk2gKnb57g8S41JZg==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/nexus-rpc/-/nexus-rpc-0.0.3.tgz", + "integrity": "sha512-ksIBeYHDv6FHAR1h3Vwk0kQ6REhdo1STqDHXMzu/yn/VN/XzgOor2IUjewG6paoA7IgxlIPZoOU/PD78PC6HTg==", "license": "MIT", "engines": { "node": ">= 20.0.0" } }, "node_modules/@temporalio/plugin": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@temporalio/plugin/-/plugin-1.18.1.tgz", - "integrity": "sha512-sIAZtpSjVgkbfLqhTaJAu1rWxDQ/y5CNpu3v9atJagfGQAA7HF8974JI2bfTtL5OozhcclYbXOo9AciELFsuAA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@temporalio/plugin/-/plugin-1.23.0.tgz", + "integrity": "sha512-sT3eXN4YG5G4UYo5TxBco/eUDxEn5nmrBYKdUyXwKRCRoqKMRq9oLR/iTmytbecfz07MnqGVW1glGBx0WPr9ow==", "license": "MIT", "engines": { - "node": ">= 20.0.0" + "node": ">= 20.3.0" } }, "node_modules/@temporalio/proto": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@temporalio/proto/-/proto-1.18.1.tgz", - "integrity": "sha512-pLa1JkmVwGdoFPCmb9DJ4P0z2mk3Zyu1VW6pXvJiYjt6W52Vm7YYi0caqfcSs/Wb/ZamdMbGqMcezftzVdzkYg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@temporalio/proto/-/proto-1.23.0.tgz", + "integrity": "sha512-90JWnYEs1wyq97/SXkQGknRVMr/BCV9sZ0pOnK3fHTedVinfvz3/PBVFkeAJyU3CJqMQGnzRs9IIfsBTT1icrA==", "license": "MIT", "dependencies": { - "long": "^5.2.3", - "protobufjs": "7.5.8" + "long": "^5.3.2", + "protobufjs": "^8.7.1" }, "engines": { - "node": ">= 20.0.0" + "node": ">= 20.3.0" } }, "node_modules/@temporalio/proto/node_modules/protobufjs": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.8.tgz", - "integrity": "sha512-dvpCIeLPbXZS/Ete7yLaO7RenOdken2NHKykBXbsaGxZT0UTltcarBciw+A78SRQs9iMAAVpsYA+l8b1hTePIA==", - "hasInstallScript": true, + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.8.0.tgz", + "integrity": "sha512-N3xhQ5yyBx3vQq4gubBfASzYhJGNzeDbjqBpu61g7UVylsN/qyffU96TKWD3GbbLOKF82VGNRNvv1+BFgE31Eg==", "license": "BSD-3-Clause", "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.5", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.1", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.1", - "@types/node": ">=13.7.0", - "long": "^5.0.0" + "long": "^5.3.2" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@temporalio/worker": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@temporalio/worker/-/worker-1.18.1.tgz", - "integrity": "sha512-ydeTHhlZF4G9ye5YnyBNgZT8/7lpGdEaF4LwJLUsW33AtLiqUp5zkzwefktpn/vyHWmNWjDdacxZ3l8WgdN+0w==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@temporalio/worker/-/worker-1.23.0.tgz", + "integrity": "sha512-k1MrK10lD1s7U66PFqAwGlQMRsVrfU5nCB+CjIAg5RyL7JpOzidDCz/E/jB2HobXzZnxtMcDBfBHh/BYUoyhxw==", "license": "MIT", "dependencies": { "@grpc/grpc-js": "^1.12.4", "@swc/core": "^1.3.102", - "@temporalio/activity": "1.18.1", - "@temporalio/client": "1.18.1", - "@temporalio/common": "1.18.1", - "@temporalio/core-bridge": "1.18.1", - "@temporalio/nexus": "1.18.1", - "@temporalio/proto": "1.18.1", - "@temporalio/workflow": "1.18.1", + "@temporalio/activity": "1.23.0", + "@temporalio/client": "1.23.0", + "@temporalio/common": "1.23.0", + "@temporalio/core-bridge": "1.23.0", + "@temporalio/nexus": "1.23.0", + "@temporalio/proto": "1.23.0", + "@temporalio/workflow": "1.23.0", "heap-js": "^2.6.0", "memfs": "^4.6.0", - "nexus-rpc": "^0.0.2", - "protobufjs": "^7.5.8", + "nexus-rpc": "^0.0.3", + "protobufjs": "^8.7.1", "rxjs": "^7.8.1", "source-map": "^0.7.4", "source-map-loader": "^5.0.0", "supports-color": "^8.1.1", "swc-loader": "^0.2.3", "unionfs": "^4.5.1", - "webpack": "^5.106.2" + "webpack": "^5.108.4" }, "engines": { - "node": ">= 20.0.0" + "node": ">= 20.3.0" } }, "node_modules/@temporalio/worker/node_modules/nexus-rpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/nexus-rpc/-/nexus-rpc-0.0.2.tgz", - "integrity": "sha512-IWjIExdVYlmwXuzHdY/Q3lXCv1gbqoAXPazQhy2w4Xgtgha3H0OOujEESVPQcFUFMWm+pAk2gKnb57g8S41JZg==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/nexus-rpc/-/nexus-rpc-0.0.3.tgz", + "integrity": "sha512-ksIBeYHDv6FHAR1h3Vwk0kQ6REhdo1STqDHXMzu/yn/VN/XzgOor2IUjewG6paoA7IgxlIPZoOU/PD78PC6HTg==", "license": "MIT", "engines": { "node": ">= 20.0.0" } }, "node_modules/@temporalio/worker/node_modules/protobufjs": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.2.tgz", - "integrity": "sha512-N9EiLovGEQOJSPF26Ij7qUGvahfEnq0eeYZ02aigIedkmz1qZSwjnP9SBITHJuF/6MYbIW4HDN8zdYjsjqJKXQ==", - "hasInstallScript": true, + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.8.0.tgz", + "integrity": "sha512-N3xhQ5yyBx3vQq4gubBfASzYhJGNzeDbjqBpu61g7UVylsN/qyffU96TKWD3GbbLOKF82VGNRNvv1+BFgE31Eg==", "license": "BSD-3-Clause", "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.5", - "@protobufjs/eventemitter": "^1.1.1", - "@protobufjs/fetch": "^1.1.1", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.2", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.1", - "@types/node": ">=13.7.0", "long": "^5.3.2" }, "engines": { @@ -1430,23 +1406,23 @@ } }, "node_modules/@temporalio/workflow": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@temporalio/workflow/-/workflow-1.18.1.tgz", - "integrity": "sha512-UabVy4/Jbg9IiQFKfHQn4DKhnAqczo/TkzP/j8lebH+oK6Gqq/sLaFwIWEdVB0hSMO99q/A85NJvUbkr4n0DCA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@temporalio/workflow/-/workflow-1.23.0.tgz", + "integrity": "sha512-dHQnYmxU/QN7VfTmdfCfpdfTS1w0hoW/NQ7Zefr55QnqLwZw+E0Vn6S4fAbJrpfHrsAmezUZQFVLi+Z4Sq+jzA==", "license": "MIT", "dependencies": { - "@temporalio/common": "1.18.1", - "@temporalio/proto": "1.18.1", - "nexus-rpc": "^0.0.2" + "@temporalio/common": "1.23.0", + "@temporalio/proto": "1.23.0", + "nexus-rpc": "^0.0.3" }, "engines": { - "node": ">= 20.0.0" + "node": ">= 20.3.0" } }, "node_modules/@temporalio/workflow/node_modules/nexus-rpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/nexus-rpc/-/nexus-rpc-0.0.2.tgz", - "integrity": "sha512-IWjIExdVYlmwXuzHdY/Q3lXCv1gbqoAXPazQhy2w4Xgtgha3H0OOujEESVPQcFUFMWm+pAk2gKnb57g8S41JZg==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/nexus-rpc/-/nexus-rpc-0.0.3.tgz", + "integrity": "sha512-ksIBeYHDv6FHAR1h3Vwk0kQ6REhdo1STqDHXMzu/yn/VN/XzgOor2IUjewG6paoA7IgxlIPZoOU/PD78PC6HTg==", "license": "MIT", "engines": { "node": ">= 20.0.0" @@ -2217,18 +2193,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2930,9 +2894,9 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz", - "integrity": "sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -3515,6 +3479,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -3527,6 +3492,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3581,9 +3547,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz", + "integrity": "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==", "funding": [ { "type": "github", @@ -3846,12 +3812,6 @@ "tslib": "2" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" - }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -4576,19 +4536,6 @@ "node": ">= 0.8.0" } }, - "node_modules/loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4711,6 +4658,76 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimizer-webpack-plugin": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.8.0.tgz", + "integrity": "sha512-2cT9+goJfBhtMz+gJqejSf09ClgmYhPhccRb/fb0ztVbixt0BkO8mRuI26FoPPuUNkRk6iEDryWAIouc5W8eJA==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.3", + "terser": "^5.51.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/minimizer-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/ms": { "version": "3.0.0-canary.202508261828", "resolved": "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.202508261828.tgz", @@ -5698,9 +5715,9 @@ } }, "node_modules/terser": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", - "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "version": "5.51.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", + "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -5715,76 +5732,6 @@ "node": ">=10" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", - "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@minify-html/node": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "@swc/html": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "cssnano": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "html-minifier-terser": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "postcss": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -6174,12 +6121,11 @@ "license": "MIT" }, "node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" }, "engines": { @@ -6187,9 +6133,9 @@ } }, "node_modules/webpack": { - "version": "5.107.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", - "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "version": "5.110.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.110.3.tgz", + "integrity": "sha512-GuizBzRvo9YPpyoNMf3ag7AzxbaW85qrRSqTha345KyJbAFPt3/cMzBM0h+RWg7SK/7DdzRLINP3LvQ0hvr4hg==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", @@ -6198,23 +6144,19 @@ "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.16.0", - "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.22.0", + "enhanced-resolve": "^5.24.4", "es-module-lexer": "^2.1.0", - "eslint-scope": "5.1.1", "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "loader-runner": "^4.3.2", "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.7.0", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.5.0", - "watchpack": "^2.5.1", - "webpack-sources": "^3.5.0" + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" }, "bin": { "webpack": "bin/webpack.js" @@ -6233,36 +6175,14 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", - "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 9edd2c25..d728868a 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,13 @@ "dependencies": { "@grpc/grpc-js": "^1.12.4", "@protobuf-ts/protoc": "^2.8.1", - "@temporalio/activity": "^1.18.1", - "@temporalio/client": "^1.18.1", - "@temporalio/common": "^1.18.1", - "@temporalio/plugin": "^1.18.1", - "@temporalio/proto": "^1.18.1", - "@temporalio/worker": "^1.18.1", - "@temporalio/workflow": "^1.18.1", + "@temporalio/activity": "^1.21.1", + "@temporalio/client": "^1.21.1", + "@temporalio/common": "^1.21.1", + "@temporalio/plugin": "^1.21.1", + "@temporalio/proto": "^1.21.1", + "@temporalio/worker": "^1.21.1", + "@temporalio/workflow": "^1.21.1", "commander": "^8.3.0", "ms": "^3.0.0-canary.1", "nexus-rpc": "^0.0.1",