/// <summary>
        /// Hosts a WAMP meta-api service describing the given realm.
        /// </summary>
        /// <param name="hostedRealm">The given realm.</param>
        /// <returns>A disposable: disposing it will unregister the hosted meta-api service.</returns>
        public static IDisposable HostMetaApiService(this IWampHostedRealm hostedRealm)
        {
            WampRealmDescriptorService service = new WampRealmDescriptorService(hostedRealm);

            CompositeDisposable disposable =
                HostDisposableService(hostedRealm, service, CalleeRegistrationInterceptor.Default);

            BrokerFeatures brokerFeatures = hostedRealm.Roles.Broker.Features;
            DealerFeatures dealerFeatures = hostedRealm.Roles.Dealer.Features;

            brokerFeatures.SessionMetaApi      = true;
            brokerFeatures.SubscriptionMetaApi = true;
            dealerFeatures.SessionMetaApi      = true;
            dealerFeatures.RegistrationMetaApi = true;

            IDisposable featureDisposable = Disposable.Create(() =>
            {
                brokerFeatures.SessionMetaApi      = null;
                brokerFeatures.SubscriptionMetaApi = null;
                dealerFeatures.SessionMetaApi      = null;
                dealerFeatures.RegistrationMetaApi = null;
            });

            disposable.Add(featureDisposable);

            return(disposable);
        }
예제 #2
0
 public IBrokerProcessor Create(
     IReadableChannel <ITransportConnection> incomingConnections,
     IProtocolSerializerFactory protocolSerializerFactory,
     IInteropContext interopContext,
     BrokerFeatures features)
 {
     return(new BrokerProcessor(
                incomingConnections,
                protocolSerializerFactory,
                interopContext,
                features));
 }
예제 #3
0
 public AuthenticationHandler(
     IAppLifecycleManager connectionTracker,
     IProtocolImplementation protocol,
     IRegistryService registryService,
     BrokerFeatures features)
 {
     _messageFactory    = protocol.MessageFactory;
     _serializer        = protocol.Serializer;
     _connectionTracker = connectionTracker;
     _registryService   = registryService;
     _features          = features;
 }
예제 #4
0
        public BrokerProcessor(
            IReadableChannel <ITransportConnection> incomingConnections,
            IProtocolSerializerFactory serializerFactory,
            IInteropContext interopContext,
            BrokerFeatures features)
        {
            _incomingConnections = incomingConnections;
            var registryService = new RegistryService(interopContext.RegistryProvider);
            var protocol        = new ProtocolImplementation(DefaultProtocolMessageFactory, serializerFactory);

            _appLifecycleManager   = interopContext.AppLifecycleManager;
            _authenticationHandler = new AuthenticationHandler(interopContext.AppLifecycleManager, protocol, registryService, features);
            _clientRequestHandler  = new ClientRequestHandler(interopContext.AppLifecycleManager, protocol, registryService, interopContext.InvocationEventProvider, interopContext.ContextLinkageManager);
        }
예제 #5
0
        public Broker(BrokerOptions options, IRegistryProvider registryProvider = null)
        {
            _features = EnvironmentHelper.GetBrokerFeatures();
            Log.Info($"Broker features: {_features}");
            var trustedLauncherId = EnvironmentHelper.GetLauncherAppInstanceId();

            Log.Info($"App launcher application instance id: {trustedLauncherId}");
            if (_features.HasFlag(BrokerFeatures.CheckAppInstanceId) && trustedLauncherId == null)
            {
                throw new BrokerException($"{EnvironmentHelper.LauncherId} must be defined if {BrokerFeatures.CheckAppInstanceId} set.");
            }
            _workingDir = Directory.GetCurrentDirectory();
            var binDir    = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            var studioDir = Path.Combine(binDir, "studio");

            Log.Info("Studio dir: {0}", studioDir);
            var metadataDir = Path.GetFullPath(options.MetadataDir ?? Path.Combine(_workingDir, "metadata"));

            Log.Info("Metadata dir: {0}", metadataDir);
            var metadataFile = Path.Combine(metadataDir, "interop.json");
            IReadOnlyDictionary <string, string> staticFileMapping = new Dictionary <string, string>
            {
                { "/metadata/interop", metadataFile },
                { "/studio", studioDir }
            };
            var webSocketTransmissionServerOptions = new WebSocketTransmissionServerOptions(_workingDir, options.Port, staticFileMapping);
            var transportServers = new List <ITransportServer>
            {
                TransportServerFactory.Instance.Create(
                    TransportType.Pipe,
                    PipeTransmissionServerFactory.Instance.Create(_workingDir),
                    DefaultTransportSerializationProvider),
                TransportServerFactory.Instance.Create(
                    TransportType.Ws,
                    WebSocketTransmissionServerFactory.Instance.Create(webSocketTransmissionServerOptions),
                    DefaultTransportSerializationProvider),
            };

            if (_features.HasFlag(BrokerFeatures.UseWSS))
            {
                var certificate = GetCertificate();
                if (certificate != null)
                {
                    var wssTransmissionServerOptions = new WebSocketTransmissionServerOptions(_workingDir, options.WssPort, staticFileMapping);
                    var sslProtocols = EnvironmentHelper.GetSslProtocols();
                    Log.Info($"{EnvironmentHelper.SslProtocols}={sslProtocols}");
                    transportServers.Add(TransportServerFactory.Instance.Create(
                                             TransportType.Wss,
                                             WebSocketTransmissionServerFactory.Instance.CreateSecure(wssTransmissionServerOptions, certificate, sslProtocols),
                                             DefaultTransportSerializationProvider));
                }
            }
            _transportServers   = transportServers;
            _connectionListener = new ServerConnectionListener(_transportServers);
            registryProvider    = registryProvider ?? new JsonRegistryProvider(Path.Combine(metadataDir, "interop.json"));
            _interopContext     = InteropContextFactory.Instance.Create(trustedLauncherId ?? default, metadataDir, registryProvider);
            _brokerProcessor    = BrokerProcessorFactory.Instance.Create(
                _connectionListener.In,
                DefaultProtocolSerializationProvider,
                _interopContext,
                _features);
            OnStop(_connectionListener.Stop);
        }