Skip to main content

Service

The cloud.Service class represents a cloud service that has a start and optional stop lifecycle.

Services are a common way to define long running code, such as microservices.

Usage​

Creating a service​

When defining a service, the first argument is an inflight closure that represents the service handler. This handler is responsible to perform any initialization activity and return asynchronously when initialization is complete.

bring cloud;

new cloud.Service(inflight () => {
// ...
// kick off any initialization activities asynchronously
// ...
log("Service started...");
});

Disable auto-start​

By default the service resource will start automatically, however this can be disabled by passing autoStart: false to the constructor.

bring cloud;

let handler = inflight () => {
log("service started...");
};

let service = new cloud.Service(handler, autoStart: false);

Service cleanup​

Optionally, the service handler inflight closure can return another inflight closure which will be called when the service is stopped. Using a return closure allows naturally passing context between the async calls.

bring cloud;

new cloud.Service(inflight() => {
let server = startHttpServer();
log("Service started...");
return () => {
log("Service stopped...");
server.close();
};
});

Stopping and starting a service​

The inflight methods start() and stop() are used exactly how they sound, to stop and start the service. The method started() returns a bool indicating if the service is currently started.

Here is an example of using a service that will track how often it is started and stopped using counters.

An important aspect to note is that consecutive starts and stops have no affect on a service. For example, if a service.start() is called on a service that is already started, nothing will happen.

bring cloud;

let startCounter = new cloud.Counter() as "start counter";
let stopCounter = new cloud.Counter() as "stop counter";

let handler = inflight() => {
let i = startCounter.inc();
log("Service started for the ${i}th time...");
return () => {
let i = stopCounter.inc();
log("Service stopped for the ${i}th time...");
};
};

let service = new cloud.Service(handler, autoStart: false);

// Functions to stop and start the service
new cloud.Function(inflight() => {
service.start();
assert(service.started());
}) as "start service";

new cloud.Function(inflight() => {
service.stop();
assert(!service.started());
}) as "stop service";

Target-specific details​

Simulator (sim)​

Within the context of the simulator, services are just spawned processes ran within a node vm.

AWS (tf-aws and awscdk)​

Within the context of AWS, services are created using AWS ECS, with a capacity provider of FARGATE. This also requires a VPC and a related resources such as security groups, subnets, and an internet gateway, etc. If a VPC is not specified in wing.toml, a default VPC will be created.

The inflight closures are packaged up into a docker image and pushed to an AWS ECR repository.

Azure (tf-azure)​

🚧 Not supported yet (tracking issue: #1307)

GCP (tf-gcp)​

🚧 Not supported yet (tracking issue: #1308)

API Reference ​

Service ​

A long-running service.

Initializers ​

bring cloud;

new cloud.Service(handler: IServiceHandler, props?: ServiceProps);
NameTypeDescription
handler
IServiceHandler
No description.
props
ServiceProps
No description.

handlerRequired ​

propsOptional ​

Methods ​

Preflight Methods​
NameDescription
addEnvironment
Add an environment variable to the function.
Inflight Methods​
NameDescription
start
Start the service.
started
Indicates whether the service is started.
stop
Stop the service.

addEnvironment ​
addEnvironment(name: str, value: str): void

Add an environment variable to the function.

nameRequired ​
  • Type: str

valueRequired ​
  • Type: str

start ​
inflight start(): void

Start the service.

started ​
inflight started(): bool

Indicates whether the service is started.

stop ​
inflight stop(): void

Stop the service.

Static Functions ​

NameDescription
onLiftType
A hook called by the Wing compiler once for each inflight host that needs to use this type inflight.
toInflight
Generates an asynchronous JavaScript statement which can be used to create an inflight client for a resource.

onLiftType ​
bring cloud;

cloud.Service.onLiftType(host: IInflightHost, ops: MutArray<str>);

A hook called by the Wing compiler once for each inflight host that needs to use this type inflight.

The list of requested inflight methods needed by the inflight host are given by ops.

This method is commonly used for adding permissions, environment variables, or other capabilities to the inflight host.

hostRequired ​

opsRequired ​
  • Type: MutArray<str>

toInflight ​
bring cloud;

cloud.Service.toInflight(obj: IResource);

Generates an asynchronous JavaScript statement which can be used to create an inflight client for a resource.

NOTE: This statement must be executed within an async context.

objRequired ​

Properties ​

NameTypeDescription
node
constructs.NodeThe tree node.
env
MutMap<str>Returns the set of environment variables for this function.

nodeRequired ​
node: Node;
  • Type: constructs.Node

The tree node.


envRequired ​
env: MutMap<str>;
  • Type: MutMap<str>

Returns the set of environment variables for this function.


Structs ​

ServiceOnStartOptions ​

Options for Service.onStart.

Initializer ​

bring cloud;

let ServiceOnStartOptions = cloud.ServiceOnStartOptions{ ... };

Properties ​

NameTypeDescription
concurrency
numThe maximum concurrent invocations that can run at one time.
env
MutMap<str>Environment variables to pass to the function.
logRetentionDays
numSpecifies the number of days that function logs will be kept.
memory
numThe amount of memory to allocate to the function, in MB.
timeout
duration
The maximum amount of time the function can run.

concurrencyOptional ​
concurrency: num;
  • Type: num
  • Default: platform specific limits (100 on the simulator)

The maximum concurrent invocations that can run at one time.


envOptional ​
env: MutMap<str>;
  • Type: MutMap<str>
  • Default: No environment variables.

Environment variables to pass to the function.


logRetentionDaysOptional ​
logRetentionDays: num;
  • Type: num
  • Default: 30

Specifies the number of days that function logs will be kept.

Setting negative value means logs will not expire.


memoryOptional ​
memory: num;
  • Type: num
  • Default: 1024

The amount of memory to allocate to the function, in MB.


timeoutOptional ​
timeout: duration;

The maximum amount of time the function can run.


ServiceProps ​

Options for Service.

Initializer ​

bring cloud;

let ServiceProps = cloud.ServiceProps{ ... };

Properties ​

NameTypeDescription
autoStart
boolWhether the service should start automatically.
env
MutMap<str>Environment variables to pass to the function.

autoStartOptional ​
autoStart: bool;
  • Type: bool
  • Default: true

Whether the service should start automatically.

If false, the service will need to be started manually by calling the inflight start() method.


envOptional ​
env: MutMap<str>;
  • Type: MutMap<str>
  • Default: No environment variables.

Environment variables to pass to the function.


Protocols ​

IServiceHandler ​

Inflight client: @winglang/sdk.cloud.IServiceHandlerClient

Executed when a cloud.Service is started.

IServiceHandlerClient ​

Inflight client for IServiceHandler.

Methods ​

NameDescription
handle
Handler to run when the service starts.

handle ​
inflight handle(): IServiceStopHandler?

Handler to run when the service starts.

This is where you implement the initialization logic of the service, start any activities asynchronously.

DO NOT BLOCK! This handler should return as quickly as possible. If you need to run a long running process, start it asynchronously.

Example

bring cloud;

new cloud.Service(inflight () => {
log("starting service...");
return () => {
log("stoping service...");
};
});

IServiceStopHandler ​

Inflight client: @winglang/sdk.cloud.IServiceStopHandlerClient

Executed when a cloud.Service is stopped.

IServiceStopHandlerClient ​

Inflight client for IServiceStopHandler.

Methods ​

NameDescription
handle
Handler to run when the service stops.

handle ​
inflight handle(): void

Handler to run when the service stops.

This is where you implement the cleanup logic of the service, stop any activities asychronously.