Meta-api descriptor service

WampSharp implements WAMP meta-api (i.e. session meta api, registration meta api and subscription meta api). It is possible both to consume WAMP meta-api from a WampSharp client, and to expose it from a WampSharp router.

Exposing meta-api

In order to expose meta-api, you can call an extension method of IWampHostedRealm, named “HostMetaApiService”. This method returns an IDisposable which you can dispose in order to unregister the meta-api service.

Note: it is important to call HostMetaApiService before hosting any other components (callees/subscribers), since otherwise the meta-api service isn’t be able to track components registered before it.

DefaultWampHost host = new DefaultWampHost("ws://127.0.0.1:8080/ws");

IWampHostedRealm realm = host.RealmContainer.GetRealmByName("realm1");

IDisposable disposable = realm.HostMetaApiService();

host.Open();

Consuming meta-api

In order to consume meta-api, you can use declare the WAMP meta-api contracts yourself and consume it with plain WampSharp client-side code. In order to save that amount of work, a client-side api is provided which allows you to consume the meta-api without having to write any contracts yourself. This is api is available via an extension method of IWampRealmProxy which is named “GetMetaApiServiceProxy”.

private static async Task Main()
{
    WampChannelFactory channelFactory = new WampChannelFactory();

    IWampChannel channel =
        channelFactory.ConnectToRealm("realm1")
                      .WebSocketTransport("ws://127.0.0.1:8080/ws")
                      .JsonSerialization()
                      .Build();

    await channel.Open().ConfigureAwait(false);

    WampMetaApiServiceProxy proxy = channel.RealmProxy.GetMetaApiServiceProxy();

    long sessionCount = await proxy.CountSessionsAsync().ConfigureAwait(false);

    IAsyncDisposable onCreateDisposable =
        await proxy.SubscribeTo.Subscription.OnCreate(
            (id, details) =>
            {
                Console.WriteLine($"Subscription with id {id} created, topic uri {details.Uri}");
            })
            .ConfigureAwait(false);

    IAsyncDisposable onJoinDisposable =
        await proxy.SubscribeTo.Session.OnJoin(
            details =>
            {
                Console.WriteLine($"Session with id {details.Session} joined");
            })
            .ConfigureAwait(false);

    // This line is required in order to release the WebSocket thread, otherwise it will be blocked by the following Console.ReadLine() line.
    await Task.Yield();

    Console.ReadLine();
}