Spine Dart Client Library

Dart-based client for Spine applications. A facade for sending domain commands and querying entity states.

Visit the Pub package registry for the latest version of the package.

The package provides the following:

  • Dart client library;
  • generated Protobuf Dart types:
    • standard types (google.protobuf and google.protobuf.plugin);
    • required Spine types (from base, time, core, client, web, and firebase-web).

The package does not include Protobuf sources or descriptor sets. Refer to respective Maven artifacts for those.

Usage

Prerequisites

Users of this library are required to use the Spine Protobuf Dart plugin.

In order to compile Protobuf into Dart, one needs to:

  1. Activate the protoc_plugin Pub package: pub activate global protoc_plugin.
  2. Apply the Proto Dart plugin:
    buildscript {
        classpath "io.spine.tools:spine-proto-dart-plugin:$spineVersion"
    }
    
    apply plugin: 'io.spine.tools.proto-dart-plugin'
    

The Protoc plugin generates .pb.dart files. Spine Proto Dart plugin configures the Protoc plugin. By default, the .pb.dart files are generated under lib for the main scope and under test for the test scope.

Also Spine Proto Dart plugin generates types.dart — a type registry file. The type registry serves for reflection needs of the spine_client package.

Example

The example beneath demonstrates how to perform a simple query and post a bunch of commands using the client library.

// Import `spine_client` and helper libraries.
import 'package:spine_client/spine_client.dart';
import 'package:spine_client/web_firebase_client.dart';
import 'package:spine_client/time.dart';

// Import the Firebase client library.
import 'package:firebase/firebase.dart' as fb;

// Import your model types, generated from Protobuf.
import 'example/acme/task/commands.pb.dart';
import 'example/acme/task/view.pb.dart';

// Import the type registry which contains all your model types.
// Generated by Spine Proto Dart Gradle plugin.
import 'types.dart' as exampleTypes;

void main() {
    var actorId = UserId()
            ..value = '$myUserId';
    var requests = ActorRequestFactory(actorId);
    var firebase = RestClient(
            fb.Database.getInstance(myFirebaseDbJsObject()),
            'https://example-org-42.firebaseio.com'
    );
    var client = BackendClient('https://example.org',
                               firebase,
                               typeRegistries: [myTypes.types()]);
    // Fetch all `TaskView` projections and mark all tasks as done.
    client.fetch(requests.query().all(TaskView()))
          .forEach((taskView) {
              var markDone = MarkTaskDone()
                      ..id = taskView.id
                      ..who_completed = actorId;
              client.post(requests.command().create(markDone));
          });
}

Maintenance

Publishing locally

This package is published by Travis CI on a pull request merge.

Should there be a need in publishing the package from a local machine, this may be done as follows:

  • in client-dart/build.gradle change the value of publicationDir to a location on your computer but outside the project directory;
  • run ./gradlew stagePubPublication;
  • in the selected directory, run pub publish and follow the instructions;
  • don't forget to revert the changes to client-dart/build.gradle.

Note: in order to be able to do this, you have to be an uploader for this package.

Adding uploader

As an uploader, you may add other uploaders for this package by running:

pub uploader --package spine_client add <email>

Removing uploader

As an uploader, you may remove other uploaders for this package by running:

pub uploader --package spine_client remove <email>

Libraries

spine/core/ack.pb
spine/core/ack.pbenum
spine/core/ack.pbjson
spine/core/ack.pbserver
spine/core/actor_context.pb
spine/core/actor_context.pbenum
spine/core/actor_context.pbjson
spine/core/actor_context.pbserver
spine/server/aggregate/aggregate.pb
spine/server/aggregate/aggregate.pbenum
spine/server/aggregate/aggregate.pbjson
spine/server/aggregate/aggregate.pbserver
google/api/annotations.pb
google/api/annotations.pbenum
google/api/annotations.pbjson
google/api/annotations.pbserver
google/protobuf/any.pb
google/protobuf/any.pbenum
google/protobuf/any.pbjson
google/protobuf/any.pbserver
google/protobuf/api.pb
google/protobuf/api.pbenum
google/protobuf/api.pbjson
google/protobuf/api.pbserver
google/iam/v1/logging/audit_data.pb
google/iam/v1/logging/audit_data.pbenum
google/iam/v1/logging/audit_data.pbjson
google/iam/v1/logging/audit_data.pbserver
google/cloud/audit/audit_log.pb
google/cloud/audit/audit_log.pbenum
google/cloud/audit/audit_log.pbjson
google/cloud/audit/audit_log.pbserver
google/api/auth.pb
google/api/auth.pbenum
google/api/auth.pbjson
google/api/auth.pbserver
google/api/backend.pb
google/api/backend.pbenum
google/api/backend.pbjson
google/api/backend.pbserver
google/api/billing.pb
google/api/billing.pbenum
google/api/billing.pbjson
google/api/billing.pbserver
spine/core/bounded_context.pb
spine/core/bounded_context.pbenum
spine/core/bounded_context.pbjson
spine/core/bounded_context.pbserver
spine/server/integration/broker.pb
spine/server/integration/broker.pbenum
spine/server/integration/broker.pbjson
spine/server/integration/broker.pbserver
google/type/calendar_period.pb
google/type/calendar_period.pbenum
google/type/calendar_period.pbjson
google/type/calendar_period.pbserver
spine/server/catchup/catch_up.pb
spine/server/catchup/catch_up.pbenum
spine/server/catchup/catch_up.pbjson
spine/server/catchup/catch_up.pbserver
spine/server/catchup/catch_up_events.pb
spine/server/catchup/catch_up_events.pbenum
spine/server/catchup/catch_up_events.pbjson
spine/server/catchup/catch_up_events.pbserver
spine/change/change.pb
spine/change/change.pbenum
spine/change/change.pbjson
spine/change/change.pbserver
client
google/api/client.pb
spine/web/firebase/client.pb
spine/web/firebase/rest/client.pb
spine/web/firebase/rest/client.pbenum
google/api/client.pbenum
spine/web/firebase/client.pbenum
google/api/client.pbjson
spine/web/firebase/client.pbjson
spine/web/firebase/rest/client.pbjson
google/api/client.pbserver
spine/web/firebase/rest/client.pbserver
spine/web/firebase/client.pbserver
google/rpc/code.pb
google/rpc/code.pbenum
google/rpc/code.pbjson
google/rpc/code.pbserver
spine/ui/color.pb
google/type/color.pb
spine/ui/color.pbenum
google/type/color.pbenum
google/type/color.pbjson
spine/ui/color.pbjson
google/type/color.pbserver
spine/ui/color.pbserver
spine/core/command.pb
spine/core/command.pbenum
spine/core/command.pbjson
spine/core/command.pbserver
spine/system/server/command_log.pb
spine/system/server/command_log.pbenum
spine/system/server/command_log.pbjson
spine/system/server/command_log.pbserver
spine/system/server/command_log_events.pb
spine/system/server/command_log_events.pbenum
spine/system/server/command_log_events.pbjson
spine/system/server/command_log_events.pbserver
spine/client/command_service.pb
spine/client/command_service.pbenum
spine/client/command_service.pbjson
spine/client/command_service.pbserver
google/firestore/v1beta1/common.pb
google/firestore/v1/common.pb
google/firestore/v1beta1/common.pbenum
google/firestore/v1/common.pbenum
google/firestore/v1/common.pbjson
google/firestore/v1beta1/common.pbjson
google/firestore/v1beta1/common.pbserver
google/firestore/v1/common.pbserver
google/api/config_change.pb
google/api/config_change.pbenum
google/api/config_change.pbjson
google/api/config_change.pbserver
google/api/consumer.pb
google/api/consumer.pbenum
google/api/consumer.pbjson
google/api/consumer.pbserver
google/api/context.pb
google/api/context.pbenum
google/api/context.pbjson
google/api/context.pbserver
google/api/control.pb
google/api/control.pbenum
google/api/control.pbjson
google/api/control.pbserver
google/type/date.pb
google/type/date.pbenum
google/type/date.pbjson
google/type/date.pbserver
google/type/dayofweek.pb
google/type/dayofweek.pbenum
google/type/dayofweek.pbjson
google/type/dayofweek.pbserver
spine/server/delivery/delivery.pb
spine/server/delivery/delivery.pbenum
spine/server/delivery/delivery.pbjson
spine/server/delivery/delivery.pbserver
spine/server/delivery/delivery_events.pb
spine/server/delivery/delivery_events.pbenum
spine/server/delivery/delivery_events.pbjson
spine/server/delivery/delivery_events.pbserver
google/protobuf/descriptor.pb
google/protobuf/descriptor.pbenum
google/protobuf/descriptor.pbjson
google/protobuf/descriptor.pbserver
spine/system/server/diagnostic_events.pb
spine/system/server/diagnostic_events.pbenum
spine/system/server/diagnostic_events.pbjson
spine/system/server/diagnostic_events.pbserver
spine/core/diagnostics.pb
spine/core/diagnostics.pbenum
spine/core/diagnostics.pbjson
spine/core/diagnostics.pbserver
spine/web/firebase/subscription/diff.pb
spine/web/firebase/subscription/diff.pbenum
spine/web/firebase/subscription/diff.pbjson
spine/web/firebase/subscription/diff.pbserver
spine/server/dispatch/dispatching.pb
spine/server/dispatch/dispatching.pbenum
spine/server/dispatch/dispatching.pbjson
spine/server/dispatch/dispatching.pbserver
google/api/distribution.pb
google/api/distribution.pbenum
google/api/distribution.pbjson
google/api/distribution.pbserver
google/firestore/v1beta1/document.pb
google/firestore/v1/document.pb
google/firestore/v1/document.pbenum
google/firestore/v1beta1/document.pbenum
google/firestore/v1beta1/document.pbjson
google/firestore/v1/document.pbjson
google/firestore/v1beta1/document.pbserver
google/firestore/v1/document.pbserver
google/api/documentation.pb
google/api/documentation.pbenum
google/api/documentation.pbjson
google/api/documentation.pbserver
google/protobuf/duration.pb
google/protobuf/duration.pbenum
google/protobuf/duration.pbjson
google/protobuf/duration.pbserver
spine/net/email_address.pb
spine/net/email_address.pbenum
spine/net/email_address.pbjson
spine/net/email_address.pbserver
google/protobuf/empty.pb
google/protobuf/empty.pbenum
google/protobuf/empty.pbjson
google/protobuf/empty.pbserver
spine/core/empty_context.pb
spine/core/empty_context.pbenum
spine/core/empty_context.pbjson
spine/core/empty_context.pbserver
google/api/endpoint.pb
google/api/endpoint.pbenum
google/api/endpoint.pbjson
google/api/endpoint.pbserver
spine/core/enrichment.pb
spine/core/enrichment.pbenum
spine/core/enrichment.pbjson
spine/core/enrichment.pbserver
spine/client/entities.pb
spine/client/entities.pbenum
spine/client/entities.pbjson
spine/client/entities.pbserver
spine/server/entity/entity.pb
spine/server/entity/entity.pbenum
spine/server/entity/entity.pbjson
spine/server/entity/entity.pbserver
spine/system/server/entity_log_events.pb
spine/system/server/entity_log_events.pbenum
spine/system/server/entity_log_events.pbjson
spine/system/server/entity_log_events.pbserver
spine/system/server/entity_type.pb
spine/system/server/entity_type.pbenum
spine/system/server/entity_type.pbjson
spine/system/server/entity_type.pbserver
spine/base/error.pb
spine/base/error.pbenum
spine/base/error.pbjson
spine/base/error.pbserver
google/rpc/error_details.pb
google/rpc/error_details.pbenum
google/rpc/error_details.pbjson
google/rpc/error_details.pbserver
spine/core/event.pb
spine/core/event.pbenum
spine/core/event.pbjson
spine/core/event.pbserver
spine/server/event/event_filter.pb
spine/server/event/event_filter.pbenum
spine/server/event/event_filter.pbjson
spine/server/event/event_filter.pbserver
spine/system/server/event_lifecycle_events.pb
spine/system/server/event_lifecycle_events.pbenum
spine/system/server/event_lifecycle_events.pbjson
spine/system/server/event_lifecycle_events.pbserver
spine/server/event/event_stream_query.pb
spine/server/event/event_stream_query.pbenum
spine/server/event/event_stream_query.pbjson
spine/server/event/event_stream_query.pbserver
spine/server/tenant/events.pb
spine/server/tenant/events.pbenum
spine/server/tenant/events.pbjson
spine/server/tenant/events.pbserver
google/type/expr.pb
google/type/expr.pbenum
google/type/expr.pbjson
google/type/expr.pbserver
google/firestore/admin/v1/field.pb
google/firestore/admin/v1/field.pbenum
google/firestore/admin/v1/field.pbjson
google/firestore/admin/v1/field.pbserver
google/api/field_behavior.pb
google/api/field_behavior.pbenum
google/api/field_behavior.pbjson
google/api/field_behavior.pbserver
spine/base/field_filter.pb
spine/base/field_filter.pbenum
spine/base/field_filter.pbjson
spine/base/field_filter.pbserver
google/protobuf/field_mask.pb
google/protobuf/field_mask.pbenum
google/protobuf/field_mask.pbjson
google/protobuf/field_mask.pbserver
spine/base/field_path.pb
spine/base/field_path.pbenum
spine/base/field_path.pbjson
spine/base/field_path.pbserver
spine/client/filters.pb
spine/client/filters.pbenum
spine/client/filters.pbjson
spine/client/filters.pbserver
firebase_client
spine/web/firebase/subscription/firebase_subscription.pb
spine/web/firebase/subscription/firebase_subscription.pbenum
spine/web/firebase/subscription/firebase_subscription.pbjson
spine/web/firebase/subscription/firebase_subscription.pbserver
google/firestore/v1beta1/firestore.pb
google/firestore/v1/firestore.pb
google/firestore/v1/firestore.pbenum
google/firestore/v1beta1/firestore.pbenum
google/firestore/v1beta1/firestore.pbjson
google/firestore/v1/firestore.pbjson
google/firestore/v1beta1/firestore.pbserver
google/firestore/v1/firestore.pbserver
google/firestore/admin/v1/firestore_admin.pb
google/firestore/admin/v1/firestore_admin.pbenum
google/firestore/admin/v1/firestore_admin.pbjson
google/firestore/admin/v1/firestore_admin.pbserver
google/type/fraction.pb
google/type/fraction.pbenum
google/type/fraction.pbjson
google/type/fraction.pbserver
google/api/http.pb
google/api/http.pbenum
google/api/http.pbjson
google/api/http.pbserver
http_client
google/logging/type/http_request.pb
google/logging/type/http_request.pbenum
google/logging/type/http_request.pbjson
google/logging/type/http_request.pbserver
google/api/httpbody.pb
google/api/httpbody.pbenum
google/api/httpbody.pbjson
google/api/httpbody.pbserver
google/iam/v1/iam_policy.pb
google/iam/v1/iam_policy.pbenum
google/iam/v1/iam_policy.pbjson
google/iam/v1/iam_policy.pbserver
spine/server/delivery/inbox.pb
spine/server/delivery/inbox.pbenum
spine/server/delivery/inbox.pbjson
spine/server/delivery/inbox.pbserver
google/firestore/admin/v1/index.pb
google/firestore/admin/v1/index.pbenum
google/firestore/admin/v1/index.pbjson
google/firestore/admin/v1/index.pbserver
spine/net/internet_domain.pb
spine/net/internet_domain.pbenum
spine/net/internet_domain.pbjson
spine/net/internet_domain.pbserver
json
spine/web/keeping_up.pb
spine/web/keeping_up.pbenum
spine/web/keeping_up.pbjson
spine/web/keeping_up.pbserver
known_types
google/api/label.pb
google/api/label.pbenum
google/api/label.pbjson
google/api/label.pbserver
spine/ui/language.pb
spine/ui/language.pbenum
spine/ui/language.pbjson
spine/ui/language.pbserver
google/type/latlng.pb
google/type/latlng.pbenum
google/type/latlng.pbjson
google/type/latlng.pbserver
google/api/launch_stage.pb
google/api/launch_stage.pbenum
google/api/launch_stage.pbjson
google/api/launch_stage.pbserver
google/firestore/admin/v1/location.pb
google/firestore/admin/v1/location.pbenum
google/firestore/admin/v1/location.pbjson
google/firestore/admin/v1/location.pbserver
google/api/log.pb
google/api/log.pbenum
google/api/log.pbjson
google/api/log.pbserver
google/logging/type/log_severity.pb
google/logging/type/log_severity.pbenum
google/logging/type/log_severity.pbjson
google/logging/type/log_severity.pbserver
google/api/logging.pb
google/api/logging.pbenum
google/api/logging.pbjson
google/api/logging.pbserver
google/api/metric.pb
google/api/metric.pbenum
google/api/metric.pbjson
google/api/metric.pbserver
spine/system/server/mirror.pb
spine/system/server/mirror.pbenum
spine/system/server/mirror.pbjson
spine/system/server/mirror.pbserver
google/type/money.pb
google/type/money.pbenum
google/type/money.pbjson
google/type/money.pbserver
google/api/monitored_resource.pb
google/api/monitored_resource.pbenum
google/api/monitored_resource.pbjson
google/api/monitored_resource.pbserver
google/api/monitoring.pb
google/api/monitoring.pbenum
google/api/monitoring.pbjson
google/api/monitoring.pbserver
google/firestore/admin/v1/operation.pb
google/firestore/admin/v1/operation.pbenum
google/firestore/admin/v1/operation.pbjson
google/firestore/admin/v1/operation.pbserver
google/longrunning/operations.pb
google/longrunning/operations.pbenum
google/longrunning/operations.pbjson
google/longrunning/operations.pbserver
spine/options.pb
google/iam/v1/options.pb
spine/options.pbenum
google/iam/v1/options.pbenum
google/iam/v1/options.pbjson
spine/options.pbjson
spine/options.pbserver
google/iam/v1/options.pbserver
spine/people/person_name.pb
spine/people/person_name.pbenum
spine/people/person_name.pbjson
spine/people/person_name.pbserver
google/protobuf/compiler/plugin.pb
google/protobuf/compiler/plugin.pbenum
google/protobuf/compiler/plugin.pbjson
google/protobuf/compiler/plugin.pbserver
google/iam/v1/policy.pb
google/iam/v1/policy.pbenum
google/iam/v1/policy.pbjson
google/iam/v1/policy.pbserver
google/type/postal_address.pb
google/type/postal_address.pbenum
google/type/postal_address.pbjson
google/type/postal_address.pbserver
google/type/quaternion.pb
google/type/quaternion.pbenum
google/type/quaternion.pbjson
google/type/quaternion.pbserver
spine/client/query.pb
google/firestore/v1/query.pb
google/firestore/v1beta1/query.pb
google/firestore/v1/query.pbenum
spine/client/query.pbenum
google/firestore/v1beta1/query.pbenum
spine/client/query.pbjson
google/firestore/v1beta1/query.pbjson
google/firestore/v1/query.pbjson
spine/client/query.pbserver
google/firestore/v1/query.pbserver
google/firestore/v1beta1/query.pbserver
spine/client/query_service.pb
spine/client/query_service.pbenum
spine/client/query_service.pbjson
spine/client/query_service.pbserver
google/api/quota.pb
google/api/quota.pbenum
google/api/quota.pbjson
google/api/quota.pbserver
google/api/resource.pb
google/api/resource.pbenum
google/api/resource.pbjson
google/api/resource.pbserver
spine/core/response.pb
spine/web/firebase/query/response.pb
spine/core/response.pbenum
spine/web/firebase/query/response.pbenum
spine/web/firebase/query/response.pbjson
spine/core/response.pbjson
spine/web/firebase/query/response.pbserver
spine/core/response.pbserver
spine/system/server/scheduled_command.pb
spine/system/server/scheduled_command.pbenum
spine/system/server/scheduled_command.pbjson
spine/system/server/scheduled_command.pbserver
spine/server/server_environment.pb
spine/server/server_environment.pbenum
spine/server/server_environment.pbjson
spine/server/server_environment.pbserver
google/api/service.pb
google/api/service.pbenum
google/api/service.pbjson
google/api/service.pbserver
google/protobuf/source_context.pb
google/protobuf/source_context.pbenum
google/protobuf/source_context.pbjson
google/protobuf/source_context.pbserver
google/api/source_info.pb
google/api/source_info.pbenum
google/api/source_info.pbjson
google/api/source_info.pbserver
spine_client
The entry point for a Spine client.
spine/server/model/standard_commands.pb
spine/server/model/standard_commands.pbenum
spine/server/model/standard_commands.pbjson
spine/server/model/standard_commands.pbserver
spine/server/model/standard_events.pb
spine/server/model/standard_events.pbenum
spine/server/model/standard_events.pbjson
spine/server/model/standard_events.pbserver
spine/server/entity/standard_rejections.pb
spine/server/entity/standard_rejections.pbenum
spine/server/entity/standard_rejections.pbjson
spine/server/entity/standard_rejections.pbserver
google/rpc/status.pb
google/rpc/status.pbenum
google/rpc/status.pbjson
google/rpc/status.pbserver
google/protobuf/struct.pb
google/protobuf/struct.pbenum
google/protobuf/struct.pbjson
google/protobuf/struct.pbserver
subscription
spine/client/subscription.pb
spine/client/subscription.pbenum
spine/client/subscription.pbjson
spine/client/subscription.pbserver
spine/client/subscription_service.pb
spine/client/subscription_service.pbenum
spine/client/subscription_service.pbjson
spine/client/subscription_service.pbserver
google/api/system_parameter.pb
google/api/system_parameter.pbenum
google/api/system_parameter.pbjson
google/api/system_parameter.pbserver
spine/server/tenant/tenant.pb
spine/server/tenant/tenant.pbenum
spine/server/tenant/tenant.pbjson
spine/server/tenant/tenant.pbserver
spine/core/tenant_id.pb
spine/core/tenant_id.pbenum
spine/core/tenant_id.pbjson
spine/core/tenant_id.pbserver
time
spine/time/time.pb
spine/time/time.pbenum
spine/time/time.pbjson
spine/time/time.pbserver
spine/time/time_change.pb
spine/time/time_change.pbenum
spine/time/time_change.pbjson
spine/time/time_change.pbserver
spine/time_options.pb
spine/time_options.pbenum
spine/time_options.pbjson
spine/time_options.pbserver
google/type/timeofday.pb
google/type/timeofday.pbenum
google/type/timeofday.pbjson
google/type/timeofday.pbserver
google/protobuf/timestamp.pb
google/protobuf/timestamp.pbenum
google/protobuf/timestamp.pbjson
google/protobuf/timestamp.pbserver
spine/server/transport/transport.pb
spine/server/transport/transport.pbenum
spine/server/transport/transport.pbjson
spine/server/transport/transport.pbserver
google/protobuf/type.pb
google/protobuf/type.pbenum
google/protobuf/type.pbjson
google/protobuf/type.pbserver
types
unknown_type
spine/net/url.pb
spine/net/url.pbenum
spine/net/url.pbjson
spine/net/url.pbserver
google/api/usage.pb
google/api/usage.pbenum
google/api/usage.pbjson
google/api/usage.pbserver
spine/core/user_id.pb
spine/core/user_id.pbenum
spine/core/user_id.pbjson
spine/core/user_id.pbserver
uuids
validate
spine/validate/validation_error.pb
spine/validate/validation_error.pbenum
spine/validate/validation_error.pbjson
spine/validate/validation_error.pbserver
spine/change/value_mismatch.pb
spine/change/value_mismatch.pbenum
spine/change/value_mismatch.pbjson
spine/change/value_mismatch.pbserver
spine/core/version.pb
spine/core/version.pbenum
spine/core/version.pbjson
spine/core/version.pbserver
google/geo/type/viewport.pb
google/geo/type/viewport.pbenum
google/geo/type/viewport.pbjson
google/geo/type/viewport.pbserver
google/protobuf/wrappers.pb
google/protobuf/wrappers.pbenum
google/protobuf/wrappers.pbjson
google/protobuf/wrappers.pbserver
google/firestore/v1beta1/write.pb
google/firestore/v1/write.pb
google/firestore/v1/write.pbenum
google/firestore/v1beta1/write.pbenum
google/firestore/v1beta1/write.pbjson
google/firestore/v1/write.pbjson
google/firestore/v1/write.pbserver
google/firestore/v1beta1/write.pbserver