azure-functions-worker-0.0.0.0: protobuf/src/proto/FunctionRpc.proto
syntax = "proto3";
// protobuf vscode extension: https://marketplace.visualstudio.com/items?itemName=zxh404.vscode-proto3
option java_multiple_files = true;
option java_package = "com.microsoft.azure.functions.rpc.messages";
option java_outer_classname = "FunctionProto";
option csharp_namespace = "Microsoft.Azure.WebJobs.Script.Grpc.Messages";
option go_package ="github.com/Azure/azure-functions-go-worker/internal/rpc";
package AzureFunctionsRpcMessages;
import "google/protobuf/duration.proto";
import "identity/ClaimsIdentityRpc.proto";
import "shared/NullableTypes.proto";
// Interface exported by the server.
service FunctionRpc {
rpc EventStream (stream StreamingMessage) returns (stream StreamingMessage) {}
}
message StreamingMessage {
// Used to identify message between host and worker
string request_id = 1;
// Payload of the message
oneof content {
// Worker initiates stream
StartStream start_stream = 20;
// Host sends capabilities/init data to worker
WorkerInitRequest worker_init_request = 17;
// Worker responds after initializing with its capabilities & status
WorkerInitResponse worker_init_response = 16;
// Worker periodically sends empty heartbeat message to host
WorkerHeartbeat worker_heartbeat = 15;
// Host sends terminate message to worker.
// Worker terminates if it can, otherwise host terminates after a grace period
WorkerTerminate worker_terminate = 14;
// Add any worker relevant status to response
WorkerStatusRequest worker_status_request = 12;
WorkerStatusResponse worker_status_response = 13;
// On file change event, host sends notification to worker
FileChangeEventRequest file_change_event_request = 6;
// Worker requests a desired action (restart worker, reload function)
WorkerActionResponse worker_action_response = 7;
// Host sends required metadata to worker to load function
FunctionLoadRequest function_load_request = 8;
// Worker responds after loading with the load result
FunctionLoadResponse function_load_response = 9;
// Host requests a given invocation
InvocationRequest invocation_request = 4;
// Worker responds to a given invocation
InvocationResponse invocation_response = 5;
// Host sends cancel message to attempt to cancel an invocation.
// If an invocation is cancelled, host will receive an invocation response with status cancelled.
InvocationCancel invocation_cancel = 21;
// Worker logs a message back to the host
RpcLog rpc_log = 2;
FunctionEnvironmentReloadRequest function_environment_reload_request = 25;
FunctionEnvironmentReloadResponse function_environment_reload_response = 26;
}
}
// Process.Start required info
// connection details
// protocol type
// protocol version
// Worker sends the host information identifying itself
message StartStream {
// id of the worker
string worker_id = 2;
}
// Host requests the worker to initialize itself
message WorkerInitRequest {
// version of the host sending init request
string host_version = 1;
// A map of host supported features/capabilities
map<string, string> capabilities = 2;
// inform worker of supported categories and their levels
// i.e. Worker = Verbose, Function.MyFunc = None
map<string, RpcLog.Level> log_categories = 3;
}
// Worker responds with the result of initializing itself
message WorkerInitResponse {
// Version of worker
string worker_version = 1;
// A map of worker supported features/capabilities
map<string, string> capabilities = 2;
// Status of the response
StatusResult result = 3;
}
// Used by the host to determine success/failure/cancellation
message StatusResult {
// Indicates Failure/Success/Cancelled
enum Status {
Failure = 0;
Success = 1;
Cancelled = 2;
}
// Status for the given result
Status status = 4;
// Specific message about the result
string result = 1;
// Exception message (if exists) for the status
RpcException exception = 2;
// Captured logs or relevant details can use the logs property
repeated RpcLog logs = 3;
}
// TODO: investigate grpc heartbeat - don't limit to grpc implemention
// Message is empty by design - Will add more fields in future if needed
message WorkerHeartbeat {}
// Warning before killing the process after grace_period
// Worker self terminates ..no response on this
message WorkerTerminate {
google.protobuf.Duration grace_period = 1;
}
// Host notifies worker of file content change
message FileChangeEventRequest {
// Types of File change operations (See link for more info: https://msdn.microsoft.com/en-us/library/t6xf43e0(v=vs.110).aspx)
enum Type {
Unknown = 0;
Created = 1;
Deleted = 2;
Changed = 4;
Renamed = 8;
All = 15;
}
// type for this event
Type type = 1;
// full file path for the file change notification
string full_path = 2;
// Name of the function affected
string name = 3;
}
// Indicates whether worker reloaded successfully or needs a restart
message WorkerActionResponse {
// indicates whether a restart is needed, or reload succesfully
enum Action {
Restart = 0;
Reload = 1;
}
// action for this response
Action action = 1;
// text reason for the response
string reason = 2;
}
// NOT USED
message WorkerStatusRequest{
}
// NOT USED
message WorkerStatusResponse {
}
message FunctionEnvironmentReloadRequest {
// Environment variables from the current process
map<string, string> environment_variables = 1;
// Current directory of function app
string function_app_directory = 2;
}
message FunctionEnvironmentReloadResponse {
// Status of the response
StatusResult result = 3;
}
// Host tells the worker to load a Function
message FunctionLoadRequest {
// unique function identifier (avoid name collisions, facilitate reload case)
string function_id = 1;
// Metadata for the request
RpcFunctionMetadata metadata = 2;
// A flag indicating if managed dependency is enabled or not
bool managed_dependency_enabled = 3;
}
// Worker tells host result of reload
message FunctionLoadResponse {
// unique function identifier
string function_id = 1;
// Result of load operation
StatusResult result = 2;
// TODO: return type expected?
// Result of load operation
bool is_dependency_downloaded = 3;
}
// Information on how a Function should be loaded and its bindings
message RpcFunctionMetadata {
// TODO: do we want the host's name - the language worker might do a better job of assignment than the host
string name = 4;
// base directory for the Function
string directory = 1;
// Script file specified
string script_file = 2;
// Entry point specified
string entry_point = 3;
// Bindings info
map<string, BindingInfo> bindings = 6;
// Is set to true for proxy
bool is_proxy = 7;
}
// Host requests worker to invoke a Function
message InvocationRequest {
// Unique id for each invocation
string invocation_id = 1;
// Unique id for each Function
string function_id = 2;
// Input bindings (include trigger)
repeated ParameterBinding input_data = 3;
// binding metadata from trigger
map<string, TypedData> trigger_metadata = 4;
// Populates activityId, tracestate and tags from host
RpcTraceContext trace_context = 5;
}
// Host sends ActivityId, traceStateString and Tags from host
message RpcTraceContext {
// This corresponds to Activity.Current?.Id
string trace_parent = 1;
// This corresponds to Activity.Current?.TraceStateString
string trace_state = 2;
// This corresponds to Activity.Current?.Tags
map<string, string> attributes = 3;
}
// Host requests worker to cancel invocation
message InvocationCancel {
// Unique id for invocation
string invocation_id = 2;
// Time period before force shutdown
google.protobuf.Duration grace_period = 1; // could also use absolute time
}
// Worker responds with status of Invocation
message InvocationResponse {
// Unique id for invocation
string invocation_id = 1;
// Output binding data
repeated ParameterBinding output_data = 2;
// data returned from Function (for $return and triggers with return support)
TypedData return_value = 4;
// Status of the invocation (success/failure/canceled)
StatusResult result = 3;
}
// Used to encapsulate data which could be a variety of types
message TypedData {
oneof data {
string string = 1;
string json = 2;
bytes bytes = 3;
bytes stream = 4;
RpcHttp http = 5;
sint64 int = 6;
double double = 7;
CollectionBytes collection_bytes = 8;
CollectionString collection_string = 9;
CollectionDouble collection_double = 10;
CollectionSInt64 collection_sint64 = 11;
}
}
// Used to encapsulate collection string
message CollectionString {
repeated string string = 1;
}
// Used to encapsulate collection bytes
message CollectionBytes {
repeated bytes bytes = 1;
}
// Used to encapsulate collection double
message CollectionDouble {
repeated double double = 1;
}
// Used to encapsulate collection sint64
message CollectionSInt64 {
repeated sint64 sint64 = 1;
}
// Used to describe a given binding on invocation
message ParameterBinding {
// Name for the binding
string name = 1;
// Data for the binding
TypedData data = 2;
}
// Used to describe a given binding on load
message BindingInfo {
// Indicates whether it is an input or output binding (or a fancy inout binding)
enum Direction {
in = 0;
out = 1;
inout = 2;
}
// Indicates the type of the data for the binding
enum DataType {
undefined = 0;
string = 1;
binary = 2;
stream = 3;
}
// Type of binding (e.g. HttpTrigger)
string type = 2;
// Direction of the given binding
Direction direction = 3;
DataType data_type = 4;
}
// Used to send logs back to the Host
message RpcLog {
// Matching ILogger semantics
// https://github.com/aspnet/Logging/blob/9506ccc3f3491488fe88010ef8b9eb64594abf95/src/Microsoft.Extensions.Logging/Logger.cs
// Level for the Log
enum Level {
Trace = 0;
Debug = 1;
Information = 2;
Warning = 3;
Error = 4;
Critical = 5;
None = 6;
}
// Category of the log. Defaults to User if not specified.
enum RpcLogCategory {
User = 0;
System = 1;
}
// Unique id for invocation (if exists)
string invocation_id = 1;
// TOD: This should be an enum
// Category for the log (startup, load, invocation, etc.)
string category = 2;
// Level for the given log message
Level level = 3;
// Message for the given log
string message = 4;
// Id for the even associated with this log (if exists)
string event_id = 5;
// Exception (if exists)
RpcException exception = 6;
// json serialized property bag, or could use a type scheme like map<string, TypedData>
string properties = 7;
// Category of the log. Either user(default) or system.
RpcLogCategory log_category = 8;
}
// Encapsulates an Exception
message RpcException {
// Source of the exception
string source = 3;
// Stack trace for the exception
string stack_trace = 1;
// Textual message describing the exception
string message = 2;
}
// Http cookie type. Note that only name and value are used for Http requests
message RpcHttpCookie {
// Enum that lets servers require that a cookie shouldn't be sent with cross-site requests
enum SameSite {
None = 0;
Lax = 1;
Strict = 2;
ExplicitNone = 3;
}
// Cookie name
string name = 1;
// Cookie value
string value = 2;
// Specifies allowed hosts to receive the cookie
NullableString domain = 3;
// Specifies URL path that must exist in the requested URL
NullableString path = 4;
// Sets the cookie to expire at a specific date instead of when the client closes.
// It is generally recommended that you use "Max-Age" over "Expires".
NullableTimestamp expires = 5;
// Sets the cookie to only be sent with an encrypted request
NullableBool secure = 6;
// Sets the cookie to be inaccessible to JavaScript's Document.cookie API
NullableBool http_only = 7;
// Allows servers to assert that a cookie ought not to be sent along with cross-site requests
SameSite same_site = 8;
// Number of seconds until the cookie expires. A zero or negative number will expire the cookie immediately.
NullableDouble max_age = 9;
}
// TODO - solidify this or remove it
message RpcHttp {
string method = 1;
string url = 2;
map<string,string> headers = 3;
TypedData body = 4;
map<string,string> params = 10;
string status_code = 12;
map<string,string> query = 15;
bool enable_content_negotiation= 16;
TypedData rawBody = 17;
repeated RpcClaimsIdentity identities = 18;
repeated RpcHttpCookie cookies = 19;
}