diff --git a/bun.lock b/bun.lock index 0c0e556e..7d9049c4 100644 --- a/bun.lock +++ b/bun.lock @@ -220,7 +220,7 @@ "@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="], - "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], + "@types/node": ["@types/node@26.0.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA=="], "@typescript/vfs": ["@typescript/vfs@1.6.4", "", { "dependencies": { "debug": "^4.4.3" }, "peerDependencies": { "typescript": "*" } }, "sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ=="], diff --git a/packages/cre-sdk/api-baseline.d.ts b/packages/cre-sdk/api-baseline.d.ts index 4174fc4d..a15d8918 100644 --- a/packages/cre-sdk/api-baseline.d.ts +++ b/packages/cre-sdk/api-baseline.d.ts @@ -87,7 +87,7 @@ export interface Runtime extends BaseRuntime, SecretsProvider { * @param unwrapOptions - Optional unwrapping config for complex return types * @returns Wrapped function that returns aggregated result */ - runInNodeMode(fn: (nodeRuntime: NodeRuntime, ...args: TArgs) => TOutput, consensusAggregation: ConsensusAggregation, unwrapOptions?: TOutput extends PrimitiveTypes ? never : UnwrapOptions): (...args: TArgs) => { + runInNodeMode(fn: (nodeRuntime: NodeRuntime, ...args: TArgs) => TInput, consensusAggregation: ConsensusAggregation, unwrapOptions?: TInput extends PrimitiveTypes ? never : UnwrapOptions): (...args: TArgs) => { result: () => TOutput; }; report(input: ReportRequest | ReportRequestJson): { diff --git a/packages/cre-sdk/src/generated-sdk/capabilities/internal/nodeaction/v1/basicaction_sdk_gen.ts b/packages/cre-sdk/src/generated-sdk/capabilities/internal/nodeaction/v1/basicaction_sdk_gen.ts index c5fef29c..451f23df 100644 --- a/packages/cre-sdk/src/generated-sdk/capabilities/internal/nodeaction/v1/basicaction_sdk_gen.ts +++ b/packages/cre-sdk/src/generated-sdk/capabilities/internal/nodeaction/v1/basicaction_sdk_gen.ts @@ -42,11 +42,11 @@ export class BasicActionCapability { runtime: NodeRuntime, input: CapabilityInput, ): { result: () => NodeOutputs } - performAction( + performAction( runtime: Runtime, - fn: (performActioner: PerformActioner, ...args: TArgs) => TOutput, - consensusAggregation: ConsensusAggregation, - unwrapOptions?: TOutput extends PrimitiveTypes ? never : UnwrapOptions, + fn: (performActioner: PerformActioner, ...args: TArgs) => TInput, + consensusAggregation: ConsensusAggregation, + unwrapOptions?: TInput extends PrimitiveTypes ? never : UnwrapOptions, ): (...args: TArgs) => { result: () => TOutput } performAction(...args: unknown[]): unknown { // Check if this is the sugar syntax overload (has function parameter) @@ -54,7 +54,7 @@ export class BasicActionCapability { const [runtime, fn, consensusAggregation, unwrapOptions] = args as [ Runtime, (performActioner: PerformActioner, ...args: unknown[]) => unknown, - ConsensusAggregation, + ConsensusAggregation, UnwrapOptions | undefined, ] return this.performActionSugarHelper(runtime, fn, consensusAggregation, unwrapOptions) @@ -96,11 +96,11 @@ export class BasicActionCapability { }, } } - private performActionSugarHelper( + private performActionSugarHelper( runtime: Runtime, - fn: (performActioner: PerformActioner, ...args: TArgs) => TOutput, - consensusAggregation: ConsensusAggregation, - unwrapOptions?: TOutput extends PrimitiveTypes ? never : UnwrapOptions, + fn: (performActioner: PerformActioner, ...args: TArgs) => TInput, + consensusAggregation: ConsensusAggregation, + unwrapOptions?: TInput extends PrimitiveTypes ? never : UnwrapOptions, ): (...args: TArgs) => { result: () => TOutput } { const wrappedFn = (runtime: NodeRuntime, ...args: TArgs) => { const performActioner = new PerformActioner(runtime, this) diff --git a/packages/cre-sdk/src/generated-sdk/capabilities/networking/http/v1alpha/client_sdk_gen.ts b/packages/cre-sdk/src/generated-sdk/capabilities/networking/http/v1alpha/client_sdk_gen.ts index ec047ad6..e6f3c285 100644 --- a/packages/cre-sdk/src/generated-sdk/capabilities/networking/http/v1alpha/client_sdk_gen.ts +++ b/packages/cre-sdk/src/generated-sdk/capabilities/networking/http/v1alpha/client_sdk_gen.ts @@ -50,11 +50,11 @@ export class ClientCapability { runtime: NodeRuntime | TeeRuntime, input: CapabilityInput, ): { result: () => Response } - sendRequest( + sendRequest( runtime: Runtime, - fn: (sendRequester: SendRequester, ...args: TArgs) => TOutput, - consensusAggregation: ConsensusAggregation, - unwrapOptions?: TOutput extends PrimitiveTypes ? never : UnwrapOptions, + fn: (sendRequester: SendRequester, ...args: TArgs) => TInput, + consensusAggregation: ConsensusAggregation, + unwrapOptions?: TInput extends PrimitiveTypes ? never : UnwrapOptions, ): (...args: TArgs) => { result: () => TOutput } sendRequest(...args: unknown[]): unknown { // Check if this is the sugar syntax overload (has function parameter) @@ -62,7 +62,7 @@ export class ClientCapability { const [runtime, fn, consensusAggregation, unwrapOptions] = args as [ Runtime, (sendRequester: SendRequester, ...args: unknown[]) => unknown, - ConsensusAggregation, + ConsensusAggregation, UnwrapOptions | undefined, ] return this.sendRequestSugarHelper(runtime, fn, consensusAggregation, unwrapOptions) @@ -107,11 +107,11 @@ export class ClientCapability { }, } } - private sendRequestSugarHelper( + private sendRequestSugarHelper( runtime: Runtime, - fn: (sendRequester: SendRequester, ...args: TArgs) => TOutput, - consensusAggregation: ConsensusAggregation, - unwrapOptions?: TOutput extends PrimitiveTypes ? never : UnwrapOptions, + fn: (sendRequester: SendRequester, ...args: TArgs) => TInput, + consensusAggregation: ConsensusAggregation, + unwrapOptions?: TInput extends PrimitiveTypes ? never : UnwrapOptions, ): (...args: TArgs) => { result: () => TOutput } { const wrappedFn = (runtime: NodeRuntime, ...args: TArgs) => { const sendRequester = new SendRequester(runtime, this) diff --git a/packages/cre-sdk/src/generated/sdk/v1alpha/sdk_pb.ts b/packages/cre-sdk/src/generated/sdk/v1alpha/sdk_pb.ts index 8b8ed832..99e51740 100644 --- a/packages/cre-sdk/src/generated/sdk/v1alpha/sdk_pb.ts +++ b/packages/cre-sdk/src/generated/sdk/v1alpha/sdk_pb.ts @@ -16,7 +16,7 @@ import { file_values_v1_values } from '../../values/v1/values_pb' export const file_sdk_v1alpha_sdk: GenFile = /*@__PURE__*/ fileDesc( - 'ChVzZGsvdjFhbHBoYS9zZGsucHJvdG8SC3Nkay52MWFscGhhIrQBChVTaW1wbGVDb25zZW5zdXNJbnB1dHMSIQoFdmFsdWUYASABKAsyEC52YWx1ZXMudjEuVmFsdWVIABIPCgVlcnJvchgCIAEoCUgAEjUKC2Rlc2NyaXB0b3JzGAMgASgLMiAuc2RrLnYxYWxwaGEuQ29uc2Vuc3VzRGVzY3JpcHRvchIhCgdkZWZhdWx0GAQgASgLMhAudmFsdWVzLnYxLlZhbHVlQg0KC29ic2VydmF0aW9uIpABCglGaWVsZHNNYXASMgoGZmllbGRzGAEgAygLMiIuc2RrLnYxYWxwaGEuRmllbGRzTWFwLkZpZWxkc0VudHJ5Gk8KC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIvCgV2YWx1ZRgCIAEoCzIgLnNkay52MWFscGhhLkNvbnNlbnN1c0Rlc2NyaXB0b3I6AjgBIoYBChNDb25zZW5zdXNEZXNjcmlwdG9yEjMKC2FnZ3JlZ2F0aW9uGAEgASgOMhwuc2RrLnYxYWxwaGEuQWdncmVnYXRpb25UeXBlSAASLAoKZmllbGRzX21hcBgCIAEoCzIWLnNkay52MWFscGhhLkZpZWxkc01hcEgAQgwKCmRlc2NyaXB0b3IiagoNUmVwb3J0UmVxdWVzdBIXCg9lbmNvZGVkX3BheWxvYWQYASABKAwSFAoMZW5jb2Rlcl9uYW1lGAIgASgJEhQKDHNpZ25pbmdfYWxnbxgDIAEoCRIUCgxoYXNoaW5nX2FsZ28YBCABKAkilwEKDlJlcG9ydFJlc3BvbnNlEhUKDWNvbmZpZ19kaWdlc3QYASABKAwSEgoGc2VxX25yGAIgASgEQgIwABIWCg5yZXBvcnRfY29udGV4dBgDIAEoDBISCgpyYXdfcmVwb3J0GAQgASgMEi4KBHNpZ3MYBSADKAsyIC5zZGsudjFhbHBoYS5BdHRyaWJ1dGVkU2lnbmF0dXJlIjsKE0F0dHJpYnV0ZWRTaWduYXR1cmUSEQoJc2lnbmF0dXJlGAEgASgMEhEKCXNpZ25lcl9pZBgCIAEoDSJrChFDYXBhYmlsaXR5UmVxdWVzdBIKCgJpZBgBIAEoCRIlCgdwYXlsb2FkGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueRIOCgZtZXRob2QYAyABKAkSEwoLY2FsbGJhY2tfaWQYBCABKAUiWgoSQ2FwYWJpbGl0eVJlc3BvbnNlEicKB3BheWxvYWQYASABKAsyFC5nb29nbGUucHJvdG9idWYuQW55SAASDwoFZXJyb3IYAiABKAlIAEIKCghyZXNwb25zZSKbAQoTVHJpZ2dlclN1YnNjcmlwdGlvbhIKCgJpZBgBIAEoCRIlCgdwYXlsb2FkGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueRIOCgZtZXRob2QYAyABKAkSLwoMcmVxdWlyZW1lbnRzGAQgASgLMhkuc2RrLnYxYWxwaGEuUmVxdWlyZW1lbnRzEhAKCHByZV9ob29rGAUgASgIIkgKEVRlZVR5cGVBbmRSZWdpb25zEiIKBHR5cGUYASABKA4yFC5zZGsudjFhbHBoYS5UZWVUeXBlEg8KB3JlZ2lvbnMYAyADKAkiVQoaVHJpZ2dlclN1YnNjcmlwdGlvblJlcXVlc3QSNwoNc3Vic2NyaXB0aW9ucxgBIAMoCzIgLnNkay52MWFscGhhLlRyaWdnZXJTdWJzY3JpcHRpb24iQAoHVHJpZ2dlchIOCgJpZBgBIAEoBEICMAASJQoHcGF5bG9hZBgCIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnkiGgoHUmVnaW9ucxIPCgdyZWdpb25zGAEgAygJIlIKElRlZVR5cGVzQW5kUmVnaW9ucxI8ChR0ZWVfdHlwZV9hbmRfcmVnaW9ucxgBIAMoCzIeLnNkay52MWFscGhhLlRlZVR5cGVBbmRSZWdpb25zInwKA1RlZRIrCgthbnlfcmVnaW9ucxgBIAEoCzIULnNkay52MWFscGhhLlJlZ2lvbnNIABJAChV0ZWVfdHlwZXNfYW5kX3JlZ2lvbnMYAiABKAsyHy5zZGsudjFhbHBoYS5UZWVUeXBlc0FuZFJlZ2lvbnNIAEIGCgRpdGVtIi0KDFJlcXVpcmVtZW50cxIdCgN0ZWUYASABKAsyEC5zZGsudjFhbHBoYS5UZWUiJwoYQXdhaXRDYXBhYmlsaXRpZXNSZXF1ZXN0EgsKA2lkcxgBIAMoBSK4AQoZQXdhaXRDYXBhYmlsaXRpZXNSZXNwb25zZRJICglyZXNwb25zZXMYASADKAsyNS5zZGsudjFhbHBoYS5Bd2FpdENhcGFiaWxpdGllc1Jlc3BvbnNlLlJlc3BvbnNlc0VudHJ5GlEKDlJlc3BvbnNlc0VudHJ5EgsKA2tleRgBIAEoBRIuCgV2YWx1ZRgCIAEoCzIfLnNkay52MWFscGhhLkNhcGFiaWxpdHlSZXNwb25zZToCOAEi5AEKDkV4ZWN1dGVSZXF1ZXN0Eg4KBmNvbmZpZxgBIAEoDBIrCglzdWJzY3JpYmUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuRW1wdHlIABInCgd0cmlnZ2VyGAMgASgLMhQuc2RrLnYxYWxwaGEuVHJpZ2dlckgAEigKCHByZV9ob29rGAUgASgLMhQuc2RrLnYxYWxwaGEuVHJpZ2dlckgAEh0KEW1heF9yZXNwb25zZV9zaXplGAQgASgEQgIwABIYChBzdXNwZW5kX29uX2F3YWl0GAYgASgIQgkKB3JlcXVlc3QizAEKD0V4ZWN1dGlvblJlc3VsdBIhCgV2YWx1ZRgBIAEoCzIQLnZhbHVlcy52MS5WYWx1ZUgAEg8KBWVycm9yGAIgASgJSAASSAoVdHJpZ2dlcl9zdWJzY3JpcHRpb25zGAMgASgLMicuc2RrLnYxYWxwaGEuVHJpZ2dlclN1YnNjcmlwdGlvblJlcXVlc3RIABIxCgxyZXN0cmljdGlvbnMYBCABKAsyGS5zZGsudjFhbHBoYS5SZXN0cmljdGlvbnNIAEIICgZyZXN1bHQiVgoRR2V0U2VjcmV0c1JlcXVlc3QSLAoIcmVxdWVzdHMYASADKAsyGi5zZGsudjFhbHBoYS5TZWNyZXRSZXF1ZXN0EhMKC2NhbGxiYWNrX2lkGAIgASgFIiIKE0F3YWl0U2VjcmV0c1JlcXVlc3QSCwoDaWRzGAEgAygFIqsBChRBd2FpdFNlY3JldHNSZXNwb25zZRJDCglyZXNwb25zZXMYASADKAsyMC5zZGsudjFhbHBoYS5Bd2FpdFNlY3JldHNSZXNwb25zZS5SZXNwb25zZXNFbnRyeRpOCg5SZXNwb25zZXNFbnRyeRILCgNrZXkYASABKAUSKwoFdmFsdWUYAiABKAsyHC5zZGsudjFhbHBoYS5TZWNyZXRSZXNwb25zZXM6AjgBIi4KDVNlY3JldFJlcXVlc3QSCgoCaWQYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIkUKBlNlY3JldBIKCgJpZBgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFb3duZXIYAyABKAkSDQoFdmFsdWUYBCABKAkiSgoLU2VjcmV0RXJyb3ISCgoCaWQYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEg0KBW93bmVyGAMgASgJEg0KBWVycm9yGAQgASgJIm4KDlNlY3JldFJlc3BvbnNlEiUKBnNlY3JldBgBIAEoCzITLnNkay52MWFscGhhLlNlY3JldEgAEikKBWVycm9yGAIgASgLMhguc2RrLnYxYWxwaGEuU2VjcmV0RXJyb3JIAEIKCghyZXNwb25zZSJBCg9TZWNyZXRSZXNwb25zZXMSLgoJcmVzcG9uc2VzGAEgAygLMhsuc2RrLnYxYWxwaGEuU2VjcmV0UmVzcG9uc2UiQgoRTWV0aG9kUmVzdHJpY3Rpb24SCgoCaWQYASABKAkSDgoGbWV0aG9kGAIgASgJEhEKCW1heF9jYWxscxgDIAEoBSJYChVDYXBhYmlsaXR5UmVzdHJpY3Rpb24SMAoGbWV0aG9kGAEgASgLMh4uc2RrLnYxYWxwaGEuTWV0aG9kUmVzdHJpY3Rpb25IAEINCgtyZXN0cmljdGlvbiKhAQoWQ2FwYWJpbGl0eVJlc3RyaWN0aW9ucxI4CgxyZXN0cmljdGlvbnMYASADKAsyIi5zZGsudjFhbHBoYS5DYXBhYmlsaXR5UmVzdHJpY3Rpb24SFwoPbWF4X3RvdGFsX2NhbGxzGAIgASgFEjQKBHR5cGUYAyABKA4yJi5zZGsudjFhbHBoYS5DYXBhYmlsaXR5UmVzdHJpY3Rpb25UeXBlIlEKF1NlY3JldFByZWZpeFJlc3RyaWN0aW9uEg4KBnByZWZpeBgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLbWF4X3NlY3JldHMYAyABKAUikAEKEVNlY3JldFJlc3RyaWN0aW9uEisKDGV4YWN0X3NlY3JldBgBIAEoCzITLnNkay52MWFscGhhLlNlY3JldEgAEj8KD3ByZWZpeGVkX3NlY3JldBgCIAEoCzIkLnNkay52MWFscGhhLlNlY3JldFByZWZpeFJlc3RyaWN0aW9uSABCDQoLcmVzdHJpY3Rpb24iXwoSU2VjcmV0c1Jlc3RyaXRpb25zEjQKDHJlc3RyaWN0aW9ucxgBIAMoCzIeLnNkay52MWFscGhhLlNlY3JldFJlc3RyaWN0aW9uEhMKC21heF9zZWNyZXRzGAIgASgFInsKDFJlc3RyaWN0aW9ucxIwCgdzZWNyZXRzGAEgASgLMh8uc2RrLnYxYWxwaGEuU2VjcmV0c1Jlc3RyaXRpb25zEjkKDGNhcGFiaWxpdGllcxgCIAEoCzIjLnNkay52MWFscGhhLkNhcGFiaWxpdHlSZXN0cmljdGlvbnMquAEKD0FnZ3JlZ2F0aW9uVHlwZRIgChxBR0dSRUdBVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASGwoXQUdHUkVHQVRJT05fVFlQRV9NRURJQU4QARIeChpBR0dSRUdBVElPTl9UWVBFX0lERU5USUNBTBACEiIKHkFHR1JFR0FUSU9OX1RZUEVfQ09NTU9OX1BSRUZJWBADEiIKHkFHR1JFR0FUSU9OX1RZUEVfQ09NTU9OX1NVRkZJWBAEKjkKBE1vZGUSFAoQTU9ERV9VTlNQRUNJRklFRBAAEgwKCE1PREVfRE9OEAESDQoJTU9ERV9OT0RFEAIqOwoHVGVlVHlwZRIYChRURUVfVFlQRV9VTlNQRUNJRklFRBAAEhYKElRFRV9UWVBFX0FXU19OSVRSTxABKmkKGUNhcGFiaWxpdHlSZXN0cmljdGlvblR5cGUSJgoiQ0FQQUJJTElUWV9SRVNUUklDVElPTl9UWVBFX0NMT1NFRBAAEiQKIENBUEFCSUxJVFlfUkVTVFJJQ1RJT05fVFlQRV9PUEVOEAFCaAoPY29tLnNkay52MWFscGhhQghTZGtQcm90b1ABogIDU1hYqgILU2RrLlYxYWxwaGHKAgtTZGtcVjFhbHBoYeICF1Nka1xWMWFscGhhXEdQQk1ldGFkYXRh6gIMU2RrOjpWMWFscGhhYgZwcm90bzM', + 'ChVzZGsvdjFhbHBoYS9zZGsucHJvdG8SC3Nkay52MWFscGhhIrQBChVTaW1wbGVDb25zZW5zdXNJbnB1dHMSIQoFdmFsdWUYASABKAsyEC52YWx1ZXMudjEuVmFsdWVIABIPCgVlcnJvchgCIAEoCUgAEjUKC2Rlc2NyaXB0b3JzGAMgASgLMiAuc2RrLnYxYWxwaGEuQ29uc2Vuc3VzRGVzY3JpcHRvchIhCgdkZWZhdWx0GAQgASgLMhAudmFsdWVzLnYxLlZhbHVlQg0KC29ic2VydmF0aW9uIpABCglGaWVsZHNNYXASMgoGZmllbGRzGAEgAygLMiIuc2RrLnYxYWxwaGEuRmllbGRzTWFwLkZpZWxkc0VudHJ5Gk8KC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIvCgV2YWx1ZRgCIAEoCzIgLnNkay52MWFscGhhLkNvbnNlbnN1c0Rlc2NyaXB0b3I6AjgBIoYBChNDb25zZW5zdXNEZXNjcmlwdG9yEjMKC2FnZ3JlZ2F0aW9uGAEgASgOMhwuc2RrLnYxYWxwaGEuQWdncmVnYXRpb25UeXBlSAASLAoKZmllbGRzX21hcBgCIAEoCzIWLnNkay52MWFscGhhLkZpZWxkc01hcEgAQgwKCmRlc2NyaXB0b3IiagoNUmVwb3J0UmVxdWVzdBIXCg9lbmNvZGVkX3BheWxvYWQYASABKAwSFAoMZW5jb2Rlcl9uYW1lGAIgASgJEhQKDHNpZ25pbmdfYWxnbxgDIAEoCRIUCgxoYXNoaW5nX2FsZ28YBCABKAkilwEKDlJlcG9ydFJlc3BvbnNlEhUKDWNvbmZpZ19kaWdlc3QYASABKAwSEgoGc2VxX25yGAIgASgEQgIwABIWCg5yZXBvcnRfY29udGV4dBgDIAEoDBISCgpyYXdfcmVwb3J0GAQgASgMEi4KBHNpZ3MYBSADKAsyIC5zZGsudjFhbHBoYS5BdHRyaWJ1dGVkU2lnbmF0dXJlIjsKE0F0dHJpYnV0ZWRTaWduYXR1cmUSEQoJc2lnbmF0dXJlGAEgASgMEhEKCXNpZ25lcl9pZBgCIAEoDSJrChFDYXBhYmlsaXR5UmVxdWVzdBIKCgJpZBgBIAEoCRIlCgdwYXlsb2FkGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueRIOCgZtZXRob2QYAyABKAkSEwoLY2FsbGJhY2tfaWQYBCABKAUiWgoSQ2FwYWJpbGl0eVJlc3BvbnNlEicKB3BheWxvYWQYASABKAsyFC5nb29nbGUucHJvdG9idWYuQW55SAASDwoFZXJyb3IYAiABKAlIAEIKCghyZXNwb25zZSKbAQoTVHJpZ2dlclN1YnNjcmlwdGlvbhIKCgJpZBgBIAEoCRIlCgdwYXlsb2FkGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueRIOCgZtZXRob2QYAyABKAkSLwoMcmVxdWlyZW1lbnRzGAQgASgLMhkuc2RrLnYxYWxwaGEuUmVxdWlyZW1lbnRzEhAKCHByZV9ob29rGAUgASgIIkgKEVRlZVR5cGVBbmRSZWdpb25zEiIKBHR5cGUYASABKA4yFC5zZGsudjFhbHBoYS5UZWVUeXBlEg8KB3JlZ2lvbnMYAyADKAkiVQoaVHJpZ2dlclN1YnNjcmlwdGlvblJlcXVlc3QSNwoNc3Vic2NyaXB0aW9ucxgBIAMoCzIgLnNkay52MWFscGhhLlRyaWdnZXJTdWJzY3JpcHRpb24iQAoHVHJpZ2dlchIOCgJpZBgBIAEoBEICMAASJQoHcGF5bG9hZBgCIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnkiGgoHUmVnaW9ucxIPCgdyZWdpb25zGAEgAygJIlIKElRlZVR5cGVzQW5kUmVnaW9ucxI8ChR0ZWVfdHlwZV9hbmRfcmVnaW9ucxgBIAMoCzIeLnNkay52MWFscGhhLlRlZVR5cGVBbmRSZWdpb25zInwKA1RlZRIrCgthbnlfcmVnaW9ucxgBIAEoCzIULnNkay52MWFscGhhLlJlZ2lvbnNIABJAChV0ZWVfdHlwZXNfYW5kX3JlZ2lvbnMYAiABKAsyHy5zZGsudjFhbHBoYS5UZWVUeXBlc0FuZFJlZ2lvbnNIAEIGCgRpdGVtIi0KDFJlcXVpcmVtZW50cxIdCgN0ZWUYASABKAsyEC5zZGsudjFhbHBoYS5UZWUiJwoYQXdhaXRDYXBhYmlsaXRpZXNSZXF1ZXN0EgsKA2lkcxgBIAMoBSK4AQoZQXdhaXRDYXBhYmlsaXRpZXNSZXNwb25zZRJICglyZXNwb25zZXMYASADKAsyNS5zZGsudjFhbHBoYS5Bd2FpdENhcGFiaWxpdGllc1Jlc3BvbnNlLlJlc3BvbnNlc0VudHJ5GlEKDlJlc3BvbnNlc0VudHJ5EgsKA2tleRgBIAEoBRIuCgV2YWx1ZRgCIAEoCzIfLnNkay52MWFscGhhLkNhcGFiaWxpdHlSZXNwb25zZToCOAEi5AEKDkV4ZWN1dGVSZXF1ZXN0Eg4KBmNvbmZpZxgBIAEoDBIrCglzdWJzY3JpYmUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuRW1wdHlIABInCgd0cmlnZ2VyGAMgASgLMhQuc2RrLnYxYWxwaGEuVHJpZ2dlckgAEigKCHByZV9ob29rGAUgASgLMhQuc2RrLnYxYWxwaGEuVHJpZ2dlckgAEh0KEW1heF9yZXNwb25zZV9zaXplGAQgASgEQgIwABIYChBzdXNwZW5kX29uX2F3YWl0GAYgASgIQgkKB3JlcXVlc3QizAEKD0V4ZWN1dGlvblJlc3VsdBIhCgV2YWx1ZRgBIAEoCzIQLnZhbHVlcy52MS5WYWx1ZUgAEg8KBWVycm9yGAIgASgJSAASSAoVdHJpZ2dlcl9zdWJzY3JpcHRpb25zGAMgASgLMicuc2RrLnYxYWxwaGEuVHJpZ2dlclN1YnNjcmlwdGlvblJlcXVlc3RIABIxCgxyZXN0cmljdGlvbnMYBCABKAsyGS5zZGsudjFhbHBoYS5SZXN0cmljdGlvbnNIAEIICgZyZXN1bHQiVgoRR2V0U2VjcmV0c1JlcXVlc3QSLAoIcmVxdWVzdHMYASADKAsyGi5zZGsudjFhbHBoYS5TZWNyZXRSZXF1ZXN0EhMKC2NhbGxiYWNrX2lkGAIgASgFIiIKE0F3YWl0U2VjcmV0c1JlcXVlc3QSCwoDaWRzGAEgAygFIqsBChRBd2FpdFNlY3JldHNSZXNwb25zZRJDCglyZXNwb25zZXMYASADKAsyMC5zZGsudjFhbHBoYS5Bd2FpdFNlY3JldHNSZXNwb25zZS5SZXNwb25zZXNFbnRyeRpOCg5SZXNwb25zZXNFbnRyeRILCgNrZXkYASABKAUSKwoFdmFsdWUYAiABKAsyHC5zZGsudjFhbHBoYS5TZWNyZXRSZXNwb25zZXM6AjgBIi4KDVNlY3JldFJlcXVlc3QSCgoCaWQYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIkUKBlNlY3JldBIKCgJpZBgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFb3duZXIYAyABKAkSDQoFdmFsdWUYBCABKAkiSgoLU2VjcmV0RXJyb3ISCgoCaWQYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEg0KBW93bmVyGAMgASgJEg0KBWVycm9yGAQgASgJIm4KDlNlY3JldFJlc3BvbnNlEiUKBnNlY3JldBgBIAEoCzITLnNkay52MWFscGhhLlNlY3JldEgAEikKBWVycm9yGAIgASgLMhguc2RrLnYxYWxwaGEuU2VjcmV0RXJyb3JIAEIKCghyZXNwb25zZSJBCg9TZWNyZXRSZXNwb25zZXMSLgoJcmVzcG9uc2VzGAEgAygLMhsuc2RrLnYxYWxwaGEuU2VjcmV0UmVzcG9uc2UiQgoRTWV0aG9kUmVzdHJpY3Rpb24SCgoCaWQYASABKAkSDgoGbWV0aG9kGAIgASgJEhEKCW1heF9jYWxscxgDIAEoBSJYChVDYXBhYmlsaXR5UmVzdHJpY3Rpb24SMAoGbWV0aG9kGAEgASgLMh4uc2RrLnYxYWxwaGEuTWV0aG9kUmVzdHJpY3Rpb25IAEINCgtyZXN0cmljdGlvbiKhAQoWQ2FwYWJpbGl0eVJlc3RyaWN0aW9ucxI4CgxyZXN0cmljdGlvbnMYASADKAsyIi5zZGsudjFhbHBoYS5DYXBhYmlsaXR5UmVzdHJpY3Rpb24SFwoPbWF4X3RvdGFsX2NhbGxzGAIgASgFEjQKBHR5cGUYAyABKA4yJi5zZGsudjFhbHBoYS5DYXBhYmlsaXR5UmVzdHJpY3Rpb25UeXBlIlEKF1NlY3JldFByZWZpeFJlc3RyaWN0aW9uEg4KBnByZWZpeBgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLbWF4X3NlY3JldHMYAyABKAUikAEKEVNlY3JldFJlc3RyaWN0aW9uEisKDGV4YWN0X3NlY3JldBgBIAEoCzITLnNkay52MWFscGhhLlNlY3JldEgAEj8KD3ByZWZpeGVkX3NlY3JldBgCIAEoCzIkLnNkay52MWFscGhhLlNlY3JldFByZWZpeFJlc3RyaWN0aW9uSABCDQoLcmVzdHJpY3Rpb24iXwoSU2VjcmV0c1Jlc3RyaXRpb25zEjQKDHJlc3RyaWN0aW9ucxgBIAMoCzIeLnNkay52MWFscGhhLlNlY3JldFJlc3RyaWN0aW9uEhMKC21heF9zZWNyZXRzGAIgASgFInsKDFJlc3RyaWN0aW9ucxIwCgdzZWNyZXRzGAEgASgLMh8uc2RrLnYxYWxwaGEuU2VjcmV0c1Jlc3RyaXRpb25zEjkKDGNhcGFiaWxpdGllcxgCIAEoCzIjLnNkay52MWFscGhhLkNhcGFiaWxpdHlSZXN0cmljdGlvbnMq3QEKD0FnZ3JlZ2F0aW9uVHlwZRIgChxBR0dSRUdBVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASGwoXQUdHUkVHQVRJT05fVFlQRV9NRURJQU4QARIeChpBR0dSRUdBVElPTl9UWVBFX0lERU5USUNBTBACEiIKHkFHR1JFR0FUSU9OX1RZUEVfQ09NTU9OX1BSRUZJWBADEiIKHkFHR1JFR0FUSU9OX1RZUEVfQ09NTU9OX1NVRkZJWBAEEiMKH0FHR1JFR0FUSU9OX1RZUEVfRlJFUVVFTkNZX0xJU1QQBSo5CgRNb2RlEhQKEE1PREVfVU5TUEVDSUZJRUQQABIMCghNT0RFX0RPThABEg0KCU1PREVfTk9ERRACKjsKB1RlZVR5cGUSGAoUVEVFX1RZUEVfVU5TUEVDSUZJRUQQABIWChJURUVfVFlQRV9BV1NfTklUUk8QASppChlDYXBhYmlsaXR5UmVzdHJpY3Rpb25UeXBlEiYKIkNBUEFCSUxJVFlfUkVTVFJJQ1RJT05fVFlQRV9DTE9TRUQQABIkCiBDQVBBQklMSVRZX1JFU1RSSUNUSU9OX1RZUEVfT1BFThABQmgKD2NvbS5zZGsudjFhbHBoYUIIU2RrUHJvdG9QAaICA1NYWKoCC1Nkay5WMWFscGhhygILU2RrXFYxYWxwaGHiAhdTZGtcVjFhbHBoYVxHUEJNZXRhZGF0YeoCDFNkazo6VjFhbHBoYWIGcHJvdG8z', [file_google_protobuf_any, file_google_protobuf_empty, file_values_v1_values], ) @@ -1636,6 +1636,11 @@ export enum AggregationType { * @generated from enum value: AGGREGATION_TYPE_COMMON_SUFFIX = 4; */ COMMON_SUFFIX = 4, + + /** + * @generated from enum value: AGGREGATION_TYPE_FREQUENCY_LIST = 5; + */ + FREQUENCY_LIST = 5, } /** @@ -1647,6 +1652,7 @@ export type AggregationTypeJson = | 'AGGREGATION_TYPE_IDENTICAL' | 'AGGREGATION_TYPE_COMMON_PREFIX' | 'AGGREGATION_TYPE_COMMON_SUFFIX' + | 'AGGREGATION_TYPE_FREQUENCY_LIST' /** * Describes the enum sdk.v1alpha.AggregationType. diff --git a/packages/cre-sdk/src/generator/generate-action.ts b/packages/cre-sdk/src/generator/generate-action.ts index 8d3f6a37..97dec5b3 100644 --- a/packages/cre-sdk/src/generator/generate-action.ts +++ b/packages/cre-sdk/src/generator/generate-action.ts @@ -121,13 +121,13 @@ export function generateActionMethod( if (modePrefix === 'Node') { const sugarClassName = `${methodName.charAt(0).toUpperCase() + methodName.slice(1)}er` - const sugarSig = `( + const sugarSig = `( runtime: Runtime, - fn: (${methodName}er: ${sugarClassName}, ...args: TArgs) => TOutput, - consensusAggregation: ConsensusAggregation, - unwrapOptions?: TOutput extends PrimitiveTypes + fn: (${methodName}er: ${sugarClassName}, ...args: TArgs) => TInput, + consensusAggregation: ConsensusAggregation, + unwrapOptions?: TInput extends PrimitiveTypes ? never - : UnwrapOptions, + : UnwrapOptions, ): (...args: TArgs) => { result: () => TOutput }` return ` ${nameAndPublicSigs} @@ -135,7 +135,7 @@ export function generateActionMethod( ${methodName}(...args: unknown[]): unknown { // Check if this is the sugar syntax overload (has function parameter) if (typeof args[1] === 'function') { - const [runtime, fn, consensusAggregation, unwrapOptions] = args as [Runtime, (${methodName}er: ${sugarClassName}, ...args: unknown[]) => unknown, ConsensusAggregation, UnwrapOptions | undefined] + const [runtime, fn, consensusAggregation, unwrapOptions] = args as [Runtime, (${methodName}er: ${sugarClassName}, ...args: unknown[]) => unknown, ConsensusAggregation, UnwrapOptions | undefined] return this.${methodName}SugarHelper(runtime, fn, consensusAggregation, unwrapOptions) } // Otherwise, this is the basic call overload diff --git a/packages/cre-sdk/src/sdk/impl/runtime-impl.ts b/packages/cre-sdk/src/sdk/impl/runtime-impl.ts index 32908f3a..d926113b 100644 --- a/packages/cre-sdk/src/sdk/impl/runtime-impl.ts +++ b/packages/cre-sdk/src/sdk/impl/runtime-impl.ts @@ -277,10 +277,10 @@ export class RuntimeImpl extends BaseRuntimeImpl implements Runtime { * 5. Runs consensus to aggregate observations * 6. Returns aggregated result */ - runInNodeMode( - fn: (nodeRuntime: NodeRuntime, ...args: TArgs) => TOutput, - consensusAggregation: ConsensusAggregation, - unwrapOptions?: TOutput extends PrimitiveTypes ? never : UnwrapOptions, + runInNodeMode( + fn: (nodeRuntime: NodeRuntime, ...args: TArgs) => TInput, + consensusAggregation: ConsensusAggregation, + unwrapOptions?: TInput extends PrimitiveTypes ? never : UnwrapOptions, ): (...args: TArgs) => { result: () => TOutput } { return (...args: TArgs): { result: () => TOutput } => { // Step 1: Create node runtime and prevent DON operations @@ -307,21 +307,21 @@ export class RuntimeImpl extends BaseRuntimeImpl implements Runtime { } // Step 5: Run consensus and return lazy result - return this.runConsensusAndWrap(consensusInput, unwrapOptions) + return this.runConsensusAndWrap(consensusInput, unwrapOptions) } } - private prepareConsensusInput( - consensusAggregation: ConsensusAggregation, + private prepareConsensusInput( + consensusAggregation: ConsensusAggregation, ) { const consensusInput = create(SimpleConsensusInputsSchema, { descriptors: consensusAggregation.descriptor, }) if (consensusAggregation.defaultValue) { - // Safe cast: ConsensusAggregation implies T extends CreSerializable + // Safe cast: ConsensusAggregation implies TInput extends CreSerializable const defaultValue = Value.from( - consensusAggregation.defaultValue as CreSerializable, + consensusAggregation.defaultValue as CreSerializable, ).proto() clearIgnoredFields(defaultValue, consensusAggregation.descriptor) consensusInput.default = defaultValue @@ -330,13 +330,13 @@ export class RuntimeImpl extends BaseRuntimeImpl implements Runtime { return consensusInput } - private captureObservation( + private captureObservation( consensusInput: any, - observation: TOutput, + observation: TInput, descriptor: ConsensusDescriptor, ) { - // Safe cast: ConsensusAggregation implies T extends CreSerializable - const observationValue = Value.from(observation as CreSerializable).proto() + // Safe cast: ConsensusAggregation implies TInput extends CreSerializable + const observationValue = Value.from(observation as CreSerializable).proto() clearIgnoredFields(observationValue, descriptor) consensusInput.observation = { case: 'value', @@ -358,9 +358,9 @@ export class RuntimeImpl extends BaseRuntimeImpl implements Runtime { this.helpers.switchModes(Mode.DON) } - private runConsensusAndWrap( + private runConsensusAndWrap( consensusInput: any, - unwrapOptions?: TOutput extends PrimitiveTypes ? never : UnwrapOptions, + unwrapOptions?: TInput extends PrimitiveTypes ? never : UnwrapOptions, ): { result: () => TOutput } { const consensus = new ConsensusCapability() const call = consensus.simple(this, consensusInput) @@ -370,9 +370,9 @@ export class RuntimeImpl extends BaseRuntimeImpl implements Runtime { const result = call.result() const wrappedValue = Value.wrap(result) - return unwrapOptions - ? wrappedValue.unwrapToType(unwrapOptions) - : (wrappedValue.unwrap() as TOutput) + return ( + unwrapOptions ? wrappedValue.unwrapToType(unwrapOptions) : wrappedValue.unwrap() + ) as TOutput }, } } diff --git a/packages/cre-sdk/src/sdk/runtime.ts b/packages/cre-sdk/src/sdk/runtime.ts index 0ed965bb..43b4fc2e 100644 --- a/packages/cre-sdk/src/sdk/runtime.ts +++ b/packages/cre-sdk/src/sdk/runtime.ts @@ -81,10 +81,10 @@ export interface Runtime extends BaseRuntime, SecretsProvider { * @param unwrapOptions - Optional unwrapping config for complex return types * @returns Wrapped function that returns aggregated result */ - runInNodeMode( - fn: (nodeRuntime: NodeRuntime, ...args: TArgs) => TOutput, - consensusAggregation: ConsensusAggregation, - unwrapOptions?: TOutput extends PrimitiveTypes ? never : UnwrapOptions, + runInNodeMode( + fn: (nodeRuntime: NodeRuntime, ...args: TArgs) => TInput, + consensusAggregation: ConsensusAggregation, + unwrapOptions?: TInput extends PrimitiveTypes ? never : UnwrapOptions, ): (...args: TArgs) => { result: () => TOutput } report(input: ReportRequest | ReportRequestJson): { result: () => Report } diff --git a/packages/cre-sdk/src/sdk/test/solana-binding-fixture/DataStorage.ts b/packages/cre-sdk/src/sdk/test/solana-binding-fixture/DataStorage.ts index b90a535e..9f09077b 100644 --- a/packages/cre-sdk/src/sdk/test/solana-binding-fixture/DataStorage.ts +++ b/packages/cre-sdk/src/sdk/test/solana-binding-fixture/DataStorage.ts @@ -129,10 +129,7 @@ export const DATA_STORAGE_IDL = { writable: true, pda: { seeds: [ - { - kind: 'const', - value: [100, 97, 116, 97, 95, 97, 99, 99, 111, 117, 110, 116], - }, + { kind: 'const', value: [100, 97, 116, 97, 95, 97, 99, 99, 111, 117, 110, 116] }, { kind: 'account', path: 'user' }, ], }, diff --git a/packages/cre-sdk/src/sdk/utils/values/consensus_aggregators.test.ts b/packages/cre-sdk/src/sdk/utils/values/consensus_aggregators.test.ts index 7f581036..c7eb9873 100644 --- a/packages/cre-sdk/src/sdk/utils/values/consensus_aggregators.test.ts +++ b/packages/cre-sdk/src/sdk/utils/values/consensus_aggregators.test.ts @@ -8,8 +8,11 @@ import { commonSuffix, consensusCommonPrefixAggregation, consensusCommonSuffixAggregation, + consensusFrequencyListAggregation, consensusIdenticalAggregation, consensusMedianAggregation, + type FrequencyListEntry, + frequencyList, identical, ignore, median, @@ -21,40 +24,56 @@ import { describe('test consensus', () => { test('median', () => { assertSimpleConsensus(consensusMedianAggregation(), AggregationType.MEDIAN) - usableForConsensus(consensusMedianAggregation()) - usableForConsensus(consensusMedianAggregation()) - usableForConsensus(consensusMedianAggregation()) + usableForConsensus(consensusMedianAggregation()) + usableForConsensus(consensusMedianAggregation()) + usableForConsensus(consensusMedianAggregation()) // Restrictions on consensusMedianAggregation won't allow other types }) test('identical', () => { assertSimpleConsensus(consensusIdenticalAggregation(), AggregationType.IDENTICAL) - usableForConsensus(consensusIdenticalAggregation()) - usableForConsensus(consensusIdenticalAggregation()) - usableForConsensus(consensusIdenticalAggregation()) - usableForConsensus(consensusIdenticalAggregation()) - usableForConsensus(consensusIdenticalAggregation()) - usableForConsensus(consensusIdenticalAggregation()) + usableForConsensus(consensusIdenticalAggregation()) + usableForConsensus(consensusIdenticalAggregation()) + usableForConsensus(consensusIdenticalAggregation()) + usableForConsensus(consensusIdenticalAggregation()) + usableForConsensus(consensusIdenticalAggregation()) + usableForConsensus(consensusIdenticalAggregation()) }) test('common prefix', () => { assertSimpleConsensus(consensusCommonPrefixAggregation(), AggregationType.COMMON_PREFIX) - usableForConsensus(consensusCommonPrefixAggregation()) - usableForConsensus(consensusCommonPrefixAggregation()) - usableForConsensus(consensusCommonPrefixAggregation()) - usableForConsensus(consensusCommonPrefixAggregation()) - usableForConsensus(consensusCommonPrefixAggregation()) - usableForConsensus(consensusCommonPrefixAggregation()) + usableForConsensus(consensusCommonPrefixAggregation()) + usableForConsensus(consensusCommonPrefixAggregation()) + usableForConsensus(consensusCommonPrefixAggregation()) + usableForConsensus(consensusCommonPrefixAggregation()) + usableForConsensus(consensusCommonPrefixAggregation()) + usableForConsensus(consensusCommonPrefixAggregation()) }) - test('common prefix', () => { + test('common suffix', () => { assertSimpleConsensus(consensusCommonSuffixAggregation(), AggregationType.COMMON_SUFFIX) - usableForConsensus(consensusCommonSuffixAggregation()) - usableForConsensus(consensusCommonSuffixAggregation()) - usableForConsensus(consensusCommonSuffixAggregation()) - usableForConsensus(consensusCommonSuffixAggregation()) - usableForConsensus(consensusCommonSuffixAggregation()) - usableForConsensus(consensusCommonSuffixAggregation()) + usableForConsensus(consensusCommonSuffixAggregation()) + usableForConsensus(consensusCommonSuffixAggregation()) + usableForConsensus(consensusCommonSuffixAggregation()) + usableForConsensus(consensusCommonSuffixAggregation()) + usableForConsensus(consensusCommonSuffixAggregation()) + usableForConsensus(consensusCommonSuffixAggregation()) + }) + + test('frequency list', () => { + assertSimpleConsensus( + consensusFrequencyListAggregation(), + AggregationType.FREQUENCY_LIST, + ) + usableForConsensus[], true>( + consensusFrequencyListAggregation(), + ) + usableForConsensus[], true>( + consensusFrequencyListAggregation(), + ) + usableForConsensus[], false>( + consensusFrequencyListAggregation(), + ) }) test('with default adds default', () => { @@ -134,6 +153,15 @@ describe('test consensus', () => { usableForFieldConsensus(commonSuffix) }) + test('frequency list', () => { + const consensusAggregation = ConsensusAggregationByFields>({ + f1: frequencyList, + f2: frequencyList, + }) + assertFieldConsensus(consensusAggregation, AggregationType.FREQUENCY_LIST) + usableForFieldConsensus(frequencyList) + }) + test('ignore', () => { const consensusAggregation = ConsensusAggregationByFields({ f1: identical, @@ -146,13 +174,16 @@ describe('test consensus', () => { }) }) -function assertSimpleConsensus(c: ConsensusAggregation, expected: AggregationType) { +function assertSimpleConsensus( + c: ConsensusAggregation, + expected: AggregationType, +) { expect(c.defaultValue).toBeUndefined() const actual = expectCase(c.descriptor, 'aggregation') expect(actual).toEqual(expected) } -function assertFieldConsensus(c: ConsensusAggregation, expected: AggregationType) { +function assertFieldConsensus(c: ConsensusAggregation, expected: AggregationType) { expect(c.defaultValue).toBeUndefined() const actual = expectCase(c.descriptor, 'fieldsMap').fields const entries = Object.entries(actual) @@ -198,7 +229,9 @@ class InvalidFieldType { ) {} } -function usableForConsensus(a: ConsensusAggregation): ConsensusAggregation { +function usableForConsensus( + a: ConsensusAggregation, +): ConsensusAggregation { return a } diff --git a/packages/cre-sdk/src/sdk/utils/values/consensus_aggregators.ts b/packages/cre-sdk/src/sdk/utils/values/consensus_aggregators.ts index 3f2df472..46e610dc 100644 --- a/packages/cre-sdk/src/sdk/utils/values/consensus_aggregators.ts +++ b/packages/cre-sdk/src/sdk/utils/values/consensus_aggregators.ts @@ -7,18 +7,17 @@ import { FieldsMapSchema, } from '@cre/generated/sdk/v1alpha/sdk_pb' import type { CreSerializable, NumericType, TypeVerifier } from './serializer_types' +import { Int64 } from './value' -export type ConsensusAggregation = { +export type ConsensusAggregation = { readonly descriptor: ConsensusDescriptor - readonly defaultValue?: T - withDefault(t: T): ConsensusAggregation + readonly defaultValue?: TInput + withDefault(t: TInput): ConsensusAggregation _usesUToForceShape(u: U): void } -// Maybe make ConsensusAggregation take a second parameter, and it'll be true or false, then make anything using it require true -// Only take one type, but make the return type ConsensusAggregation> -// Similar for fields, but ignore would always return ConsensusAggregationFields instead of ConsensusAggregationFields>, and so would ConsensusAggregationByFields :D export function consensusMedianAggregation(): ConsensusAggregation< + T, T, TypeVerifier> > { @@ -26,6 +25,7 @@ export function consensusMedianAggregation(): ConsensusAg } export function consensusIdenticalAggregation(): ConsensusAggregation< + T, T, TypeVerifier> > { @@ -33,34 +33,53 @@ export function consensusIdenticalAggregation(): ConsensusAggregation< } export function consensusCommonPrefixAggregation(): ConsensusAggregation< + T[], T[], TypeVerifier> > { - return simpleConsensus(AggregationType.COMMON_PREFIX) + return simpleConsensus(AggregationType.COMMON_PREFIX) } export function consensusCommonSuffixAggregation(): ConsensusAggregation< + T[], T[], TypeVerifier> > { - return simpleConsensus(AggregationType.COMMON_SUFFIX) + return simpleConsensus(AggregationType.COMMON_SUFFIX) } -class ConsensusImpl implements ConsensusAggregation { +export class FrequencyListEntry { + constructor( + public value: T, + public count: Int64, + ) {} +} + +export function consensusFrequencyListAggregation(): ConsensusAggregation< + T[], + FrequencyListEntry[], + TypeVerifier> +> { + return simpleConsensus[]>(AggregationType.FREQUENCY_LIST) +} + +class ConsensusImpl implements ConsensusAggregation { constructor( readonly descriptor: ConsensusDescriptor, - readonly defaultValue?: T, + readonly defaultValue?: TInput, ) {} - withDefault(t: T): ConsensusAggregation { + withDefault(t: TInput): ConsensusAggregation { return new ConsensusImpl(this.descriptor, t) } _usesUToForceShape(_: U): void {} } -function simpleConsensus( +function simpleConsensus( agg: AggregationType, -): ConsensusAggregation>> { - return new ConsensusImpl>>(simpleDescriptor(agg)) +): ConsensusAggregation>> { + return new ConsensusImpl>>( + simpleDescriptor(agg), + ) } function simpleDescriptor(agg: AggregationType): ConsensusDescriptor { @@ -95,6 +114,13 @@ export function commonSuffix(): ConsensusFieldAggregation< return new ConsensusFieldAggregation(simpleDescriptor(AggregationType.COMMON_SUFFIX)) } +export function frequencyList(): ConsensusFieldAggregation< + T, + TypeVerifier> +> { + return new ConsensusFieldAggregation(simpleDescriptor(AggregationType.FREQUENCY_LIST)) +} + export function ignore(): ConsensusFieldAggregation { return new ConsensusFieldAggregation() } @@ -113,9 +139,14 @@ export type ConsensusAggregationFields = { [K in keyof T as K extends '$typeName' ? never : K]: () => ConsensusFieldAggregation } -export function ConsensusAggregationByFields( +// TOutput lets the consensus result type differ from the observed input type. It defaults to T +// (most field aggregators return the same shape they consume), but aggregators that reshape a +// field — e.g. `frequencyList`, which turns a field of type F into FrequencyListEntry[] — +// change the result. Pass TOutput explicitly in that case so `.result()` is typed correctly +// instead of forcing callers to cast (`.result() as unknown as ...`). +export function ConsensusAggregationByFields( aggregation: ConsensusAggregationFields, -): ConsensusAggregation { +): ConsensusAggregation { const fieldMap = create(FieldsMapSchema) Object.keys(aggregation).forEach((key) => { @@ -126,7 +157,7 @@ export function ConsensusAggregationByFields( } }) - return new ConsensusImpl( + return new ConsensusImpl( create(ConsensusDescriptorSchema, { descriptor: { case: 'fieldsMap', diff --git a/packages/cre-sdk/src/sdk/utils/values/serializer_types.ts b/packages/cre-sdk/src/sdk/utils/values/serializer_types.ts index 95133099..d298b43f 100644 --- a/packages/cre-sdk/src/sdk/utils/values/serializer_types.ts +++ b/packages/cre-sdk/src/sdk/utils/values/serializer_types.ts @@ -1,7 +1,7 @@ import type { Decimal, Int64, UInt64 } from './value' export type NumericType = number | bigint | Date | Decimal | Int64 | UInt64 -export type PrimitiveTypes = NumericType | boolean | string +export type PrimitiveTypes = NumericType | boolean | string | Uint8Array export type NonSerializable = | null | Map diff --git a/packages/cre-sdk/src/standard_tests/frequency_list/test.ts b/packages/cre-sdk/src/standard_tests/frequency_list/test.ts new file mode 100644 index 00000000..fcb4f3f5 --- /dev/null +++ b/packages/cre-sdk/src/standard_tests/frequency_list/test.ts @@ -0,0 +1,75 @@ +import { BasicCapability as BasicTriggerCapability } from '@cre/generated-sdk/capabilities/internal/basictrigger/v1/basic_sdk_gen' +import { BasicActionCapability as NodeActionCapability } from '@cre/generated-sdk/capabilities/internal/nodeaction/v1/basicaction_sdk_gen' +import { cre, type Runtime } from '@cre/sdk/cre' +import type { NodeRuntime } from '@cre/sdk/runtime' +import { + ConsensusAggregationByFields, + type FrequencyListEntry, + frequencyList, + identical, +} from '@cre/sdk/utils' +import { Runner } from '@cre/sdk/wasm' + +class NodeObservation { + constructor( + public payload: Uint8Array, + public signatures: Uint8Array, + ) {} +} + +type ConsensusResult = { + payload: Uint8Array + signatures: FrequencyListEntry[] +} + +const bytesToHex = (bytes: Uint8Array): string => + Array.from(bytes) + .map((b) => b.toString(16).padStart(2, '0')) + .join('') + +const formatFrequencyList = (entries: FrequencyListEntry[]): string => + entries.map((entry) => `${bytesToHex(entry.value)}x${entry.count.value}`).join(',') + +const formatResult = (result: ConsensusResult): string => + `${bytesToHex(result.payload)}|${formatFrequencyList(result.signatures)}` + +const handler = (runtime: Runtime) => { + const encoder = new TextEncoder() + const result = runtime + .runInNodeMode( + (nodeRuntime: NodeRuntime): NodeObservation => { + const nodeResponse = new NodeActionCapability() + .performAction(nodeRuntime, { inputThing: true }) + .result() + + return new NodeObservation( + encoder.encode(`payload-${nodeResponse.outputThing}`), + encoder.encode(`sig-${nodeResponse.outputThing}`), + ) + }, + ConsensusAggregationByFields({ + payload: identical, + signatures: frequencyList, + }), + )() + .result() + + return formatResult(result) +} + +const initWorkflow = () => { + const basicTrigger = new BasicTriggerCapability() + + return [cre.handler(basicTrigger.trigger({}), handler)] +} + +export async function main() { + console.log(`TS workflow: standard test: frequency_list [${new Date().toISOString()}]`) + + const runner = await Runner.newRunner({ + configParser: (c) => c, + }) + await runner.run(initWorkflow) +} + +await main() diff --git a/submodules/chainlink-protos b/submodules/chainlink-protos index ca350bea..29c5577b 160000 --- a/submodules/chainlink-protos +++ b/submodules/chainlink-protos @@ -1 +1 @@ -Subproject commit ca350beacd4bd971331b4b2b6ad11b2f33fe7bd1 +Subproject commit 29c5577b5f551b7ce0f0b7ccf041f9ef4ffcb626