blob: 1f08b6f5b82ba37077ad00e57e7db61851305139 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
# VNLib.Plugins
A compact and simple contract interface and supporting types for runtime loadable plugins. It implements types that may be used outside the scope of **VNLib.Plugins.Essentials** library, but the contract types were designed for use with it, which is why they are opinionated.
**This library has no internal or external dependencies**
#### Builds
Debug build w/ symbols & xml docs, release builds, NuGet packages, and individually packaged source code are available on my [website](https://www.vaughnnugent.com/resources/software). All tar-gzip (.tgz) files will have an associated .sha384 appended checksum of the desired download file.
### Usage with VNLib.Plugins.Essentials.
The **VNLib.Plugins.Essentials** library discovers IEndpoint types at runtime inside `EventProcessor` types. For correct usage with the `EventProcessor` class you should implement the interface `IVirtualEndpoint<HttpEntity>` otherwise your endpoint will not get loaded.
All plugins that intend to be loaded with the **VNLib.Plugins.Essentials.ServiceStack** application library, should conform to these signatures. The ServiceStack library also implements the additional lifecycle hooks if you choose to implement them.
## Breakdown
The `IPlugin` interface: a simple contract
``` programming language C#
//Should be public and concrete for runtime loading
public sealed class MyPlugin : IPluign
{
private readonly LinkedList<IEndpoint> _endpoints;
public MyPlugin()
{
_endpoints = new LinkedList<IEndpoint>();
}
public string PluginName { get; } = "MyPlugin";
public void Load()
{
//Load plugin, build endpoints
IEndpoint ep1 = new MyEndpoint();
IEndpoint ep2 = new MyEndpoint();
//Add endpoints
_endpoints.AddLast(ep1);
_endpoints.AddLast(ep2);
}
public void Unload()
{
//Unload resources
}
public IEnumerable<IEndpoint> GetEndpoints()
{
//Return the endpoints for this plugin
return _endpoints;
}
... Additional lifecycle methods using the Attributes namespace
}
```
The `IEndpoint` interface: represents a resource location in a url search path
``` programming language C#
//Should be public and concrete
internal class MyEndpoint : IEndpoint
{
public string Path { get; } = "/my/resource";
}
```
A step farther is the `IVirtualEndpoint<TEntity>` which processes an entity of the specified type, and implements the IEndpoint interface:
_This interface was built for usage with the `IHttpEvent` interface as the entity type._
```
//Should be public and concrete
internal class MyVirtualEndpoint : IVirtualEndpoint<IHttpEvent>
{
public string Path { get; } = "/my/resource";
//process HTTP connection
public ValutTask<VfReturnType> Process(IHttpEvent entity)
{
//Process the entity
return VfReturnType.ProcessAsFile;
}
}
```
## License
The software in this repository is licensed under the GNU GPL version 2.0 (or any later version).
See the LICENSE files for more information.
|