// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.modular;

// Provided to all component instances in their respective initialization
// information by the framework. For example, a Module gets it from its
// ModuleContext and an Agent gets it from its AgentContext.
[Discoverable]
interface ComponentContext {
  // Gets the Ledger associated with this component. This ledger instance is
  // unique to this component (nb. not the component instance) under this user.
  1: GetLedger(request<fuchsia.ledger.Ledger> @request)
      -> (fuchsia.ledger.Status @status);

  // Used to start an agent in the user scope if it isn't already running, and
  // connect to it.
  2: ConnectToAgent(string url,
                    request<fuchsia.sys.ServiceProvider> incoming_services,
                    request<AgentController> controller);

  // Used to create or delete a message queue or retrieve an existing queue
  // identified by |name|. |name| is local to the calling component instance.
  3: ObtainMessageQueue(string name, request<MessageQueue> queue);
  4: DeleteMessageQueue(string name);

  // Gets a MessageSender service that can be used to send a message to a queue
  // identified by |queue_token|. Token for a MessageQueue is obtained from its
  // GetToken() method. The token is unique within the scope of the user, i.e.
  // it can be used by other component instances than the one that created the
  // message queue.
  5: GetMessageSender(string queue_token, request<MessageSender> sender);

  // Gets the EntityResolver service, which can be used to resolve an entity
  // reference to an Entity interface.
  6: GetEntityResolver(request<EntityResolver> @request);

  // Creates a new entity from |type_to_data| such that duplicate types are
  // overriden by subsequent entries.
  //
  // This is a useful way to represent small immutable entities without having
  // to provide the entity using an Agent. The types and data together must be
  // within 16KB in size.
  7: CreateEntityWithData(vector<TypeToDataEntry> type_to_data)
      -> (string? entity_reference);

  // Gets the package name of this component.
  //
  // TODO(vardhan): MI4-939. This information should likely be exposed by a
  // lower level (component-level, or application level). This information is
  // most meant for a component to identify itself automatically when publishing
  // metrics.
  8: GetPackageName() -> (string package_name);
};

// Used by ComponentContext.CreateEntityWithData().
struct TypeToDataEntry {
  string type;
  string data;
};
