57 lines
1.9 KiB
Markdown
57 lines
1.9 KiB
Markdown
# Service registry API
|
|
Exposes a simple service registry API leveraged by various parts of SilverBullet, see [[Services]].
|
|
|
|
## Example
|
|
```space-lua
|
|
service.define {
|
|
selector = "greeter-service",
|
|
name = "generic-greeter",
|
|
match = function(name)
|
|
-- fallback option, priority undefined (so: low)
|
|
return {}
|
|
end,
|
|
run = function(name)
|
|
return "Hello " .. name
|
|
end
|
|
}
|
|
|
|
service.define {
|
|
selector = "greeter-service",
|
|
name = "pete-greeter",
|
|
match = function(name)
|
|
if name == "Pete" then
|
|
-- takes precendence with an exact match
|
|
return {priority=10}
|
|
else
|
|
return nil
|
|
end
|
|
end,
|
|
run = function(name)
|
|
return "Hello Pete, so happy to see you!"
|
|
end
|
|
}
|
|
```
|
|
|
|
To invoke: ${service.invokeBestMatch("greeter-service", "Pete")} and ${service.invokeBestMatch("greeter-service", "Hank")}
|
|
|
|
## API
|
|
### service.define(spec)
|
|
Defines a service matching a selector.
|
|
|
|
Spec arguments:
|
|
* `selector`: service selector, can contain wildcards (e.g. `hello:*`)
|
|
* `name`: globally unique service name
|
|
* `name` (gid for invocation)
|
|
* `match(data)`: callback (`data` argument), returns a match table if this service is a match or `nil` otherwise. A match table is service specific, but at least contains a `priority` key to set the service priority (used for sorting by `service.discover` and `service.invokeBestMatch`).
|
|
* `run(data)`: callback to be invoked when the service is invoked
|
|
|
|
### service.discover(selector, data)
|
|
Discovers previously defined service matching a given selector. Return value is a list of tables (can be empty) with keys:
|
|
* `name`: name of the service
|
|
* `priority`: priority of service match (list will already be pre-sorted based on this key if present)
|
|
|
|
### service.invoke(name, data)
|
|
Invokes a service by name (as returned by [[#service.discover(selector, options)]]).
|
|
|
|
### service.invokeBest(selector, options)
|
|
Performs a `discover` based on the selector, then immediately performs and `invoke` on the best match (based on priority). |