AtsTypeScriptCodeGenerator.cs (479)
203WriteLine($"{indent}/** {lines[0]} */");
207WriteLine($"{indent}/**");
210WriteLine(line.Length == 0 ? $"{indent} *" : $"{indent} * {line}");
212WriteLine($"{indent} */");
479WriteLine("import { unregisterCallback } from './transport.mjs';");
483WriteLine("""
536WriteLine();
614WriteLine("// ============================================================================");
615WriteLine("// Handle Type Aliases (Internal - not exported to users)");
616WriteLine("// ============================================================================");
617WriteLine();
625WriteLine($"type {handleName} = Handle<'{typeId}'>;");
626WriteLine();
649WriteLine("// ============================================================================");
650WriteLine("// Enum Types");
651WriteLine("// ============================================================================");
652WriteLine();
657WriteLine($"export enum {enumType.Name} {{");
667WriteLine($" {value.Name} = \"{value.Name}\",");
670WriteLine("}");
671WriteLine();
689WriteLine("// ============================================================================");
690WriteLine("// DTO Interfaces");
691WriteLine("// ============================================================================");
692WriteLine();
699WriteLine($"export interface {interfaceName} {{");
710WriteLine($" {propName}?: {tsType};");
717WriteLine($" /** {clientOnly.Summary} */");
718WriteLine($" {clientOnly.Name}?: {clientOnly.Type};");
721WriteLine("}");
722WriteLine();
735WriteLine("// ============================================================================");
736WriteLine("// Exported Values");
737WriteLine("// ============================================================================");
738WriteLine();
742WriteLine(exportedNamespace.Content);
743WriteLine();
757WriteLine("// ============================================================================");
758WriteLine("// Options Interfaces");
759WriteLine("// ============================================================================");
760WriteLine();
764WriteLine($"export interface {interfaceName} {{");
769WriteLine($" {param.Name}?: {tsType};");
771WriteLine("}");
772WriteLine();
780WriteLine($" {propertyName}(): {returnType};");
798WriteLine($" readonly {propertyName}: AspireDict<{keyType}, {valueType}>;");
806WriteLine($" readonly {propertyName}: AspireList<{elementType}>;");
812WriteLine($" {propertyName}: {{");
818WriteLine($" get: () => {promiseInterfaceName};");
823WriteLine($" get: () => Promise<{returnTypeName}>;");
833WriteLine($" set: (value: {valueType}) => Promise<void>;");
837WriteLine(" };");
844WriteLine("// ============================================================================");
845WriteLine($"// {interfaceName}");
846WriteLine("// ============================================================================");
847WriteLine();
849WriteLine($"export interface {interfaceName} {{");
850WriteLine(" toJSON(): MarshalledHandle;");
875WriteLine($" {capability.MethodName}({signature.ParameterList}): {promiseInterfaceName};");
880WriteLine($" {capability.MethodName}({signature.ParameterList}): Promise<{returnType}>;");
885WriteLine($" {capability.MethodName}({signature.ParameterList}): {_projector.GetBuilderPromiseInterfaceForMethod(builder, capability)};");
889WriteLine("}");
890WriteLine();
912WriteLine($"export interface {promiseInterfaceName} extends PromiseLike<{interfaceName}> {{");
929WriteLine($" {capability.MethodName}({signature.ParameterList}): {returnPromiseInterfaceName};");
934WriteLine($" {capability.MethodName}({signature.ParameterList}): Promise<{returnType}>;");
939WriteLine($" {capability.MethodName}({signature.ParameterList}): {_projector.GetBuilderPromiseInterfaceForMethod(builder, capability)};");
943WriteLine("}");
944WriteLine();
955WriteLine($" {signature.MethodName}({signature.ParameterList}): {_projector.GetPublicPromiseInterfaceName(capability.ReturnType.TypeId)};");
959WriteLine($" {signature.MethodName}({signature.ParameterList}): {TypeScriptApiProjector.GetPromiseInterfaceName(className)};");
964WriteLine($" {signature.MethodName}({signature.ParameterList}): Promise<{returnType}>;");
973WriteLine("// ============================================================================");
974WriteLine($"// {interfaceName}");
975WriteLine("// ============================================================================");
976WriteLine();
978WriteLine($"export interface {interfaceName} {{");
979WriteLine(" toJSON(): MarshalledHandle;");
1002WriteLine("}");
1003WriteLine();
1011WriteLine($"export interface {promiseInterfaceName} extends PromiseLike<{interfaceName}> {{");
1020WriteLine("}");
1021WriteLine();
1031WriteLine("// ============================================================================");
1032WriteLine($"// {implementationClassName}");
1033WriteLine("// ============================================================================");
1034WriteLine();
1040WriteLine($"class {implementationClassName} extends ResourceBuilderBase<{handleType}> implements {builder.BuilderClassName} {{");
1043WriteLine($" constructor(handle: {handleType}, client: AspireClientRpc) {{");
1044WriteLine($" super(handle, client);");
1045WriteLine(" }");
1046WriteLine();
1070WriteLine("}");
1071WriteLine();
1169WriteLine($"): {returnPromiseInterfaceName} {{");
1170WriteLine(" const promise = (async () => {");
1175WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
1187WriteLine($" const handle = await this._client.invokeCapability<{returnHandleType}>(");
1188WriteLine($" '{capability.CapabilityId}',");
1189WriteLine(" rpcArgs");
1190WriteLine(" );");
1191WriteLine($" return new {returnImplementationClassNameForWrapper}(handle, this._client);");
1192WriteLine(" })();");
1193WriteLine($" return new {returnPromiseImplementationClassName}(promise, this._client);");
1194WriteLine(" }");
1195WriteLine();
1205WriteLine($"): Promise<{returnType}> {{");
1211WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
1229WriteLine(" const result = await this._client.invokeCapability<string | null>(");
1230WriteLine($" '{capability.CapabilityId}',");
1231WriteLine(" rpcArgs");
1232WriteLine(" );");
1233WriteLine(" return CancellationToken.fromValue(result);");
1237WriteLine($" return await this._client.invokeCapability<{returnType}>(");
1238WriteLine($" '{capability.CapabilityId}',");
1239WriteLine($" rpcArgs");
1240WriteLine(" );");
1242WriteLine(" }");
1243WriteLine();
1248WriteLine($" /** @internal */");
1252WriteLine();
1269WriteLine($" const result = await this._client.invokeCapability<{returnHandle}>(");
1270WriteLine($" '{capability.CapabilityId}',");
1271WriteLine($" rpcArgs");
1272WriteLine(" );");
1273WriteLine($" return new {returnImplementationClassName}(result, this._client);");
1277WriteLine($" await this._client.invokeCapability<void>(");
1278WriteLine($" '{capability.CapabilityId}',");
1279WriteLine($" rpcArgs");
1280WriteLine(" );");
1281WriteLine($" return this;");
1283WriteLine(" }");
1284WriteLine();
1293WriteLine();
1299WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
1312WriteLine($" const flushAndBuild = async () => {{ await this._client.flushPendingPromises(); return {internalCall}; }};");
1316WriteLine($" return new {promiseImplementationClass}(flushAndBuild(), this._client, false);");
1320WriteLine($" return new {promiseImplementationClass}({internalCall}, this._client);");
1322WriteLine(" }");
1323WriteLine();
1350WriteLine($"{indent}{param.Name} = isPromiseLike({param.Name}) ? await {param.Name} : {param.Name};");
1369WriteLine($"{indent}{paramName} = isPromiseLike({paramName}) ? await {paramName} : {paramName};");
1411WriteLine($"{indent}const rpcArgs: Record<string, unknown> = {{ {string.Join(", ", requiredArgs)} }};");
1418WriteLine($"{indent}if ({localParameterName} !== undefined) rpcArgs.{param.Name} = {rpcExpression};");
1444WriteLine($"{indent}const rpcArgs: Record<string, unknown> = {{ {string.Join(", ", requiredArgs)} }};");
1451WriteLine($"{indent}if ({localParameterName} !== undefined) rpcArgs.{param.Name} = {rpcExpression};");
1478WriteLine($"{indent}const {dtoRpcLocalName} = {localParameterName} === undefined || {localParameterName} === null ? {localParameterName} : {{ ...{localParameterName} }};");
1479WriteLine($"{indent}if ({dtoRpcLocalName} !== undefined && {dtoRpcLocalName} !== null) {{");
1481WriteLine($"{indent}}}");
1485WriteLine($"{indent}const {dtoRpcLocalName} = {localParameterName} === null ? {localParameterName} : {{ ...{localParameterName} }};");
1486WriteLine($"{indent}if ({dtoRpcLocalName} !== null) {{");
1488WriteLine($"{indent}}}");
1501WriteLine($"{indent}const {dtoDataLocalName} = {dtoRpcLocalName} as Record<string, unknown>;");
1509WriteLine($"{indent}const {callbackLocalName} = {dtoRpcLocalName}.{propertyName};");
1510WriteLine($"{indent}if ({callbackLocalName} !== undefined) {{");
1512WriteLine($"{indent} {dtoDataLocalName}[\"{propertyName}\"] = {callbackLocalName}Id;");
1513WriteLine($"{indent}}}");
1545WriteLine($"{indent}const {dtoPropertyLocalName} = {dtoRpcLocalName}.{propertyName};");
1546WriteLine($"{indent}if ({dtoPropertyLocalName} !== undefined && {dtoPropertyLocalName} !== null) {{");
1547WriteLine($"{indent} const {nestedDtoRpcLocalName} = {{ ...{dtoPropertyLocalName} }};");
1549WriteLine($"{indent} {dtoDataLocalName}[\"{propertyName}\"] = {nestedDtoRpcLocalName};");
1550WriteLine($"{indent}}}");
1659WriteLine("/** @internal */");
1660WriteLine($"const {promiseImplementationClass} = $aspireCreateFluentPromiseClass<{className}, {promiseClass}>((): $aspireFluentPromiseTransitions => ({{");
1666WriteLine($" [{methodNameLiteral}]: null,");
1678WriteLine($" [{methodNameLiteral}]: {transitionExpression},");
1680WriteLine("}));");
1681WriteLine();
1691WriteLine("// ============================================================================");
1692WriteLine("// Entry Point Functions");
1693WriteLine("// ============================================================================");
1694WriteLine();
1751WriteLine($"): {signature.ReturnType} {{");
1753WriteLine($" const promise = (async () => {{");
1759WriteLine($" {param.Name} = isPromiseLike({param.Name}) ? await {param.Name} : {param.Name};");
1766WriteLine($" const rpcArgs: Record<string, unknown> = {{ {string.Join(", ", requiredArgs)} }};");
1769WriteLine($" if ({param.Name} !== undefined) rpcArgs.{param.Name} = {GetRpcArgumentExpressionForParam(param, param.Name, useRegisteredCallback: false)};");
1771WriteLine($" const handle = await client.invokeCapability<{handleType}>(");
1772WriteLine($" '{capability.CapabilityId}',");
1773WriteLine(" rpcArgs");
1774WriteLine(" );");
1775WriteLine($" return new {returnWrapperImplementationClass}(handle, client);");
1776WriteLine($" }})();");
1777WriteLine($" return new {returnPromiseImplementationClass}(promise, client);");
1778WriteLine("}");
1789WriteLine($"): {signature.ReturnType} {{");
1795WriteLine($" {param.Name} = isPromiseLike({param.Name}) ? await {param.Name} : {param.Name};");
1802WriteLine($" const rpcArgs: Record<string, unknown> = {{ {string.Join(", ", requiredArgs)} }};");
1805WriteLine($" if ({param.Name} !== undefined) rpcArgs.{param.Name} = {GetRpcArgumentExpressionForParam(param, param.Name, useRegisteredCallback: false)};");
1809WriteLine($" await client.invokeCapability<void>(");
1813WriteLine(" const result = await client.invokeCapability<string | null>(");
1814WriteLine($" '{capability.CapabilityId}',");
1815WriteLine(" rpcArgs");
1816WriteLine(" );");
1817WriteLine(" return CancellationToken.fromValue(result);");
1818WriteLine("}");
1819WriteLine();
1824WriteLine($" return await client.invokeCapability<{returnType}>(");
1826WriteLine($" '{capability.CapabilityId}',");
1827WriteLine(" rpcArgs");
1828WriteLine(" );");
1829WriteLine("}");
1831WriteLine();
1858WriteLine($"{indent}const {callbackName}Id = {callbackName} ? registerCallback(async ({paramSignature}) => {{");
1862WriteLine($"{indent}const {callbackName}Id = registerCallback(async ({paramSignature}) => {{");
1871WriteLine(indent + "}) : undefined;");
1875WriteLine(indent + "});");
1895WriteLine($"{bodyIndent}{returnPrefix}await {callbackName}();");
1903WriteLine($"{bodyIndent}{returnPrefix}await {callbackName}({cbParam.Name});");
1917WriteLine($"{bodyIndent}{returnPrefix}await {callbackName}({string.Join(", ", callArgs)});");
1928WriteLine($"{indent}const {callbackParameter.Name} = CancellationToken.fromValue({callbackArgName});");
1936WriteLine($"{indent}const {callbackParameter.Name}Handle = wrapIfHandle({callbackArgName}) as {handleType};");
1937WriteLine($"{indent}const {callbackParameter.Name} = new AspireDict<{keyType}, {valueType}>({callbackParameter.Name}Handle, {clientExpression}, '{cbTypeId}');");
1942WriteLine($"{indent}const {callbackParameter.Name}Handle = wrapIfHandle({callbackArgName}) as {handleType};");
1943WriteLine($"{indent}const {callbackParameter.Name} = new {TypeScriptApiProjector.GetImplementationClassName(wrapperClassName)}({callbackParameter.Name}Handle, {clientExpression});");
1947WriteLine($"{indent}const {callbackParameter.Name} = wrapIfHandle({callbackArgName}) as {tsType};");
1955WriteLine($$"""
1988WriteLine($$"""
2032WriteLine("""
2038WriteLine("export { refExpr, ReferenceExpression } from './base.mjs';");
2040WriteLine("export type { HandleReference, Awaitable } from './base.mjs';");
2041WriteLine();
2046WriteLine("""
2104WriteLine();
2105WriteLine("// ============================================================================");
2106WriteLine("// Handle Wrapper Registrations");
2107WriteLine("// ============================================================================");
2108WriteLine();
2109WriteLine("// Register wrapper factories for typed handle wrapping in callbacks");
2116WriteLine($"registerHandleWrapper('{typeClass.TypeId}', (handle, client) => new {TypeScriptApiProjector.GetImplementationClassName(className)}(handle as {handleType}, client));");
2124WriteLine($"registerHandleWrapper('{builder.TypeId}', (handle, client) => new {TypeScriptApiProjector.GetImplementationClassName(className)}(handle as {handleType}, client));");
2136WriteLine($"registerHandleWrapper('{aliasTypeId}', (handle, client) => new {TypeScriptApiProjector.GetImplementationClassName(className)}(handle as {handleType}, client));");
2139WriteLine();
2155WriteLine("// ============================================================================");
2156WriteLine($"// {implementationClassName}");
2157WriteLine("// ============================================================================");
2158WriteLine();
2169WriteLine($"class {implementationClassName} implements {className} {{");
2170WriteLine($" constructor(private _handle: {handleType}, private _client: AspireClientRpc) {{}}");
2171WriteLine();
2172WriteLine($" /** Serialize for JSON-RPC transport */");
2173WriteLine($" toJSON(): MarshalledHandle {{ return this._handle.toJSON(); }}");
2174WriteLine();
2209WriteLine("}");
2210WriteLine();
2281WriteLine($" {propertyName} = {{");
2286WriteLine($" get: async (): Promise<{returnType}> => {{");
2289WriteLine(" const result = await this._client.invokeCapability<string | null>(");
2290WriteLine($" '{getter.CapabilityId}',");
2291WriteLine(" { context: this._handle }");
2292WriteLine(" );");
2293WriteLine(" return CancellationToken.fromValue(result);");
2297WriteLine($" return await this._client.invokeCapability<{returnType}>(");
2298WriteLine($" '{getter.CapabilityId}',");
2299WriteLine($" {{ context: this._handle }}");
2300WriteLine(" );");
2302WriteLine(" },");
2312WriteLine($" set: async (value: {valueType}): Promise<void> => {{");
2314WriteLine($" await this._client.invokeCapability<void>(");
2315WriteLine($" '{setter.CapabilityId}',");
2316WriteLine($" {{ context: this._handle, {GetRpcArgumentEntry("value", valueParam.Type)} }}");
2317WriteLine(" );");
2318WriteLine(" }");
2322WriteLine(" };");
2323WriteLine();
2354WriteLine($" {propertyName}(): {promiseInterfaceName} {{");
2355WriteLine($" return new {promiseImplementationClassName}(this._client.invokeCapability<{collectionType}>(");
2356WriteLine($" '{getter.CapabilityId}',");
2357WriteLine(" { context: this._handle }");
2358WriteLine(" ), this._client, false);");
2359WriteLine(" }");
2360WriteLine();
2366WriteLine($" async {propertyName}(): Promise<{returnType}> {{");
2369WriteLine(" const result = await this._client.invokeCapability<string | null>(");
2370WriteLine($" '{getter.CapabilityId}',");
2371WriteLine(" { context: this._handle }");
2372WriteLine(" );");
2373WriteLine(" return CancellationToken.fromValue(result);");
2377WriteLine($" return await this._client.invokeCapability<{returnType}>(");
2378WriteLine($" '{getter.CapabilityId}',");
2379WriteLine(" { context: this._handle }");
2380WriteLine(" );");
2382WriteLine(" }");
2383WriteLine();
2393WriteLine($" {propertyName}(): {promiseInterfaceName} {{");
2394WriteLine(" const promise = (async () => {");
2395WriteLine($" const handle = await this._client.invokeCapability<{handleType}>(");
2396WriteLine($" '{getter.CapabilityId}',");
2397WriteLine(" { context: this._handle }");
2398WriteLine(" );");
2399WriteLine($" return new {wrapperImplementationClassName}(handle, this._client);");
2400WriteLine(" })();");
2401WriteLine($" return new {promiseImplementationClassName}(promise, this._client, false);");
2402WriteLine(" }");
2403WriteLine();
2407WriteLine($" async {propertyName}(): Promise<{wrapperClassName}> {{");
2408WriteLine($" const handle = await this._client.invokeCapability<{handleType}>(");
2409WriteLine($" '{getter.CapabilityId}',");
2410WriteLine(" { context: this._handle }");
2411WriteLine(" );");
2412WriteLine($" return new {wrapperImplementationClassName}(handle, this._client);");
2413WriteLine(" }");
2414WriteLine();
2445WriteLine($" {propertyName} = {{");
2448WriteLine($" get: (): {promiseInterfaceName} => {{");
2449WriteLine(" const promise = (async () => {");
2450WriteLine($" const handle = await this._client.invokeCapability<{handleType}>(");
2451WriteLine($" '{getter.CapabilityId}',");
2452WriteLine($" {{ context: this._handle }}");
2453WriteLine(" );");
2454WriteLine($" return new {wrapperImplementationClassName}(handle, this._client);");
2455WriteLine(" })();");
2456WriteLine($" return new {promiseImplementationClassName}(promise, this._client, false);");
2457WriteLine(" },");
2461WriteLine($" get: async (): Promise<{wrapperClassName}> => {{");
2462WriteLine($" const handle = await this._client.invokeCapability<{handleType}>(");
2463WriteLine($" '{getter.CapabilityId}',");
2464WriteLine($" {{ context: this._handle }}");
2465WriteLine(" );");
2466WriteLine($" return new {wrapperImplementationClassName}(handle, this._client);");
2467WriteLine(" },");
2476WriteLine($" set: async (value: {valueType}): Promise<void> => {{");
2478WriteLine($" await this._client.invokeCapability<void>(");
2479WriteLine($" '{setter.CapabilityId}',");
2480WriteLine($" {{ context: this._handle, {GetRpcArgumentEntry("value", valueParam.Type)} }}");
2481WriteLine(" );");
2482WriteLine(" }");
2486WriteLine(" };");
2487WriteLine();
2514WriteLine($" private _{propertyName}?: AspireDict<{keyType}, {valueType}>;");
2515WriteLine($" async {propertyName}(): Promise<AspireDict<{keyType}, {valueType}>> {{");
2516WriteLine($" if (!this._{propertyName}) {{");
2517WriteLine($" this._{propertyName} = new AspireDict<{keyType}, {valueType}>(");
2518WriteLine($" this._handle,");
2519WriteLine($" this._client,");
2520WriteLine($" {typeId},");
2521WriteLine($" {getterCapabilityId}");
2522WriteLine(" );");
2523WriteLine(" }");
2524WriteLine($" return this._{propertyName};");
2525WriteLine(" }");
2526WriteLine();
2547WriteLine($" private _{propertyName}?: AspireDict<{keyType}, {valueType}>;");
2548WriteLine($" get {propertyName}(): AspireDict<{keyType}, {valueType}> {{");
2549WriteLine($" if (!this._{propertyName}) {{");
2550WriteLine($" this._{propertyName} = new AspireDict<{keyType}, {valueType}>(");
2551WriteLine($" this._handle,");
2552WriteLine($" this._client,");
2553WriteLine($" {typeId},");
2554WriteLine($" {getterCapabilityId}");
2555WriteLine(" );");
2556WriteLine(" }");
2557WriteLine($" return this._{propertyName};");
2558WriteLine(" }");
2559WriteLine();
2579WriteLine($" private _{propertyName}?: AspireList<{elementType}>;");
2580WriteLine($" async {propertyName}(): Promise<AspireList<{elementType}>> {{");
2581WriteLine($" if (!this._{propertyName}) {{");
2582WriteLine($" this._{propertyName} = new AspireList<{elementType}>(");
2583WriteLine($" this._handle,");
2584WriteLine($" this._client,");
2585WriteLine($" {typeId},");
2586WriteLine($" {getterCapabilityId}");
2587WriteLine(" );");
2588WriteLine(" }");
2589WriteLine($" return this._{propertyName};");
2590WriteLine(" }");
2591WriteLine();
2606WriteLine($" private _{propertyName}?: AspireList<{elementType}>;");
2607WriteLine($" get {propertyName}(): AspireList<{elementType}> {{");
2608WriteLine($" if (!this._{propertyName}) {{");
2609WriteLine($" this._{propertyName} = new AspireList<{elementType}>(");
2610WriteLine($" this._handle,");
2611WriteLine($" this._client,");
2612WriteLine($" {typeId},");
2613WriteLine($" {getterCapabilityId}");
2614WriteLine(" );");
2615WriteLine(" }");
2616WriteLine($" return this._{propertyName};");
2617WriteLine(" }");
2618WriteLine();
2673WriteLine($"): {returnPromiseInterfaceName} {{");
2674WriteLine(" const promise = (async () => {");
2679WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
2684WriteLine($" const handle = await this._client.invokeCapability<{returnHandleType}>(");
2685WriteLine($" '{method.CapabilityId}',");
2686WriteLine(" rpcArgs");
2687WriteLine(" );");
2688WriteLine($" return new {returnImplementationClassName}(handle, this._client);");
2689WriteLine(" })();");
2690WriteLine($" return new {returnPromiseImplementationClassName}(promise, this._client);");
2691WriteLine(" }");
2692WriteLine();
2700WriteLine($"): Promise<{returnType}> {{");
2706WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
2714WriteLine($" await this._client.invokeCapability<void>(");
2718WriteLine(" const result = await this._client.invokeCapability<string | null>(");
2719WriteLine($" '{method.CapabilityId}',");
2720WriteLine(" rpcArgs");
2721WriteLine(" );");
2722WriteLine(" return CancellationToken.fromValue(result);");
2723WriteLine(" }");
2724WriteLine();
2729WriteLine($" return await this._client.invokeCapability<{returnType}>(");
2731WriteLine($" '{method.CapabilityId}',");
2732WriteLine($" rpcArgs");
2733WriteLine(" );");
2734WriteLine(" }");
2735WriteLine();
2786WriteLine($"): {returnPromiseInterfaceName} {{");
2787WriteLine(" const promise = (async () => {");
2792WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
2797WriteLine($" const handle = await this._client.invokeCapability<{returnHandleType}>(");
2798WriteLine($" '{capability.CapabilityId}',");
2799WriteLine(" rpcArgs");
2800WriteLine(" );");
2801WriteLine($" return new {returnImplementationClassName}(handle, this._client);");
2802WriteLine(" })();");
2803WriteLine($" return new {returnPromiseImplementationClassName}(promise, this._client);");
2804WriteLine(" }");
2805WriteLine();
2813WriteLine($"): Promise<{returnType}> {{");
2819WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
2827WriteLine($" await this._client.invokeCapability<void>(");
2831WriteLine($" return await this._client.invokeCapability<{returnType}>(");
2833WriteLine($" '{capability.CapabilityId}',");
2834WriteLine($" rpcArgs");
2835WriteLine(" );");
2836WriteLine(" }");
2837WriteLine();
2916WriteLine($" /** @internal */");
2919WriteLine($"): Promise<{returnWrapperClass}> {{");
2931WriteLine(" try");
2932WriteLine(" {");
2942WriteLine($"{bodyIndent}const result = await this._client.invokeCapability<{returnHandleType}>(");
2943WriteLine($"{bodyIndent} '{capability.CapabilityId}',");
2944WriteLine($"{bodyIndent} rpcArgs");
2945WriteLine($"{bodyIndent});");
2946WriteLine($"{bodyIndent}return new {returnWrapperImplementationClass}(result, this._client);");
2949WriteLine(" }");
2950WriteLine(" finally");
2951WriteLine(" {");
2954WriteLine($" if ({callback.Name}Id) unregisterCallback({callback.Name}Id);");
2956WriteLine(" }");
2958WriteLine(" }");
2959WriteLine();
2965WriteLine($"): {returnPromiseWrapper} {{");
2971WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
2980WriteLine($" const flushAndBuild = async () => {{ await this._client.flushPendingPromises(); return {internalCall}; }};");
2981WriteLine($" return new {returnPromiseImplementationClass}(flushAndBuild(), this._client, false);");
2985WriteLine($" return new {returnPromiseImplementationClass}({internalCall}, this._client);");
2987WriteLine(" }");
2993WriteLine($" /** @internal */");
2996WriteLine($"): Promise<{className}> {{");
3011WriteLine($" await this._client.invokeCapability<void>(");
3012WriteLine($" '{capability.CapabilityId}',");
3013WriteLine($" rpcArgs");
3014WriteLine(" );");
3015WriteLine($" return this;");
3016WriteLine(" }");
3017WriteLine();
3023WriteLine($"): {promiseClass} {{");
3029WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
3034WriteLine("), this._client);");
3035WriteLine(" }");
3043WriteLine($"): Promise<{returnType}> {{");
3049WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
3067WriteLine(" const result = await this._client.invokeCapability<string | null>(");
3068WriteLine($" '{capability.CapabilityId}',");
3069WriteLine(" rpcArgs");
3070WriteLine(" );");
3071WriteLine(" return CancellationToken.fromValue(result);");
3075WriteLine($" return await this._client.invokeCapability<{returnType}>(");
3076WriteLine($" '{capability.CapabilityId}',");
3077WriteLine($" rpcArgs");
3078WriteLine(" );");
3080WriteLine(" }");
3082WriteLine();