├── .dockerignore
├── .github
├── pull_request_template.md
└── workflows
│ ├── cleanup.yaml
│ ├── containers.yaml
│ ├── docs.yaml
│ └── test.yaml
├── .gitignore
├── .gitmodules
├── .husky
├── commit-msg
└── pre-commit
├── LICENSE
├── README.md
├── cmd
├── ensign
│ └── main.go
├── halyard
│ └── main.go
├── quarterdeck
│ └── main.go
├── sendgrid
│ └── main.go
├── tenant
│ └── main.go
└── uptime
│ └── main.go
├── containers
├── beacon
│ ├── Dockerfile
│ └── nginx.conf
├── build.sh
├── cleangcr.py
├── docker-compose.yaml
├── ensign
│ ├── .gitignore
│ └── Dockerfile
├── local.sh
├── monitor
│ ├── .gitignore
│ ├── grafana
│ │ ├── .gitkeep
│ │ └── dashboards
│ │ │ ├── .gitkeep
│ │ │ └── ensign.json
│ └── prometheus.yml
├── placeholder
│ └── Dockerfile
├── quarterdeck
│ ├── .gitignore
│ ├── Dockerfile
│ └── keys
│ │ ├── 01GE6191AQTGMCJ9BN0QC3CCVG.pem
│ │ └── 01GE62EXXR0X0561XD53RDFBQJ.pem
├── tenant
│ ├── .gitignore
│ ├── Dockerfile
│ └── db
│ │ └── .gitkeep
└── uptime
│ ├── .gitignore
│ ├── Dockerfile
│ ├── db
│ └── .gitkeep
│ └── services.json
├── docs
├── archetypes
│ └── default.md
├── assets
│ ├── images
│ │ ├── banner.jpg
│ │ ├── cta-illustration.jpg
│ │ ├── favicon.png
│ │ └── logo.png
│ └── scss
│ │ └── custom.scss
├── config.toml
├── config
│ └── _default
│ │ ├── config.toml
│ │ ├── menus.en.toml
│ │ ├── menus.fr.toml
│ │ ├── module.toml
│ │ └── params.toml
├── content
│ ├── _index.en.md
│ ├── ensql
│ │ ├── _index.en.md
│ │ ├── operators.en.md
│ │ └── syntax
│ │ │ ├── _index.en.md
│ │ │ └── images
│ │ │ └── SELECT.png
│ ├── eventing
│ │ ├── _index.md
│ │ ├── data_sources.md
│ │ ├── glossary.md
│ │ └── use_cases.md
│ ├── examples
│ │ ├── _index.md
│ │ ├── data_engineers.md
│ │ └── data_scientists.md
│ ├── faq
│ │ └── _index.md
│ ├── getting-started
│ │ ├── _index.md
│ │ ├── edas.md
│ │ └── topics.md
│ ├── sdk
│ │ ├── _index.md
│ │ ├── golang.md
│ │ └── python.md
│ ├── system
│ │ ├── _index.md
│ │ ├── broker.md
│ │ ├── configuration.md
│ │ ├── groups.md
│ │ └── staging.md
│ └── topics
│ │ └── _index.md
├── go.mod
├── go.sum
├── i18n
│ ├── en.yaml
│ └── fr.yaml
├── netlify.toml
├── package-lock.json
├── package.json
├── postcss.config.js
├── static
│ └── img
│ │ ├── baleen_diagram.png
│ │ ├── broker.png
│ │ ├── comic.png
│ │ ├── database_record.png
│ │ ├── dbs_v_events.png
│ │ ├── detective.png
│ │ ├── ensign-squad.png
│ │ ├── enson-laptop.png
│ │ ├── favicon.png
│ │ ├── logo.png
│ │ ├── mascot.jpg
│ │ ├── sample-eda.png
│ │ ├── smol-laptop.png
│ │ └── weather.png
└── themes
│ └── godocs-2
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .jshintrc
│ ├── .prettierrc
│ ├── archetypes
│ └── default.md
│ ├── assets
│ ├── js
│ │ ├── bootstrap.js
│ │ └── script.js
│ ├── plugins
│ │ ├── masonry
│ │ │ └── masonry.min.js
│ │ └── webfont
│ │ │ └── webfont-loader-2.js
│ └── scss
│ │ ├── _buttons.scss
│ │ ├── _common.scss
│ │ ├── _mixins.scss
│ │ ├── _typography.scss
│ │ ├── style.scss
│ │ └── templates
│ │ ├── _bootstrap.scss
│ │ ├── _main.scss
│ │ ├── _navigation.scss
│ │ └── search-modal.scss
│ ├── config.toml
│ ├── layouts
│ ├── 404.html
│ ├── _default
│ │ ├── baseof.html
│ │ ├── changelog.html
│ │ ├── contact.html
│ │ ├── index.json
│ │ ├── list.html
│ │ ├── search.html
│ │ └── single.html
│ ├── index.html
│ ├── partials
│ │ ├── components
│ │ │ ├── page-header.html
│ │ │ └── search-modal.html
│ │ ├── default.html
│ │ └── essentials
│ │ │ ├── footer.html
│ │ │ ├── head.html
│ │ │ ├── header.html
│ │ │ ├── script.html
│ │ │ └── style.html
│ └── shortcodes
│ │ ├── changelog.html
│ │ └── faq.html
│ ├── netlify.toml
│ ├── package.json
│ └── postcss.config.js
├── go.mod
├── go.sum
├── pkg
├── ensign
│ ├── api
│ │ ├── generate.go
│ │ ├── generate.sh
│ │ └── v1beta1
│ │ │ ├── codes.go
│ │ │ ├── deduplication.go
│ │ │ ├── deduplication_test.go
│ │ │ ├── ensign.pb.go
│ │ │ ├── ensign_grpc.pb.go
│ │ │ ├── errors.go
│ │ │ ├── event.go
│ │ │ ├── event.pb.go
│ │ │ ├── event_test.go
│ │ │ ├── groups.go
│ │ │ ├── groups.pb.go
│ │ │ ├── groups_test.go
│ │ │ ├── query.pb.go
│ │ │ ├── testdata
│ │ │ └── events.json
│ │ │ ├── topic.go
│ │ │ ├── topic.pb.go
│ │ │ └── topic_test.go
│ ├── broker
│ │ ├── broker.go
│ │ ├── broker_suite_test.go
│ │ ├── broker_test.go
│ │ ├── errors.go
│ │ ├── msgs.go
│ │ └── msgs_test.go
│ ├── buffer
│ │ ├── buffer.go
│ │ ├── buffer_test.go
│ │ ├── channel.go
│ │ ├── channel_test.go
│ │ ├── errors.go
│ │ ├── ring.go
│ │ └── ring_test.go
│ ├── config
│ │ ├── config.go
│ │ ├── config_test.go
│ │ └── testdata
│ │ │ ├── config.yaml
│ │ │ └── partial.yaml
│ ├── contexts
│ │ ├── contexts.go
│ │ ├── contexts_test.go
│ │ ├── errors.go
│ │ ├── stream.go
│ │ └── stream_test.go
│ ├── duplicates.go
│ ├── duplicates_test.go
│ ├── ensql
│ │ ├── ensql.go
│ │ ├── ensql_test.go
│ │ ├── errors.go
│ │ ├── predicate.go
│ │ ├── predicate_test.go
│ │ ├── query.go
│ │ ├── query_test.go
│ │ ├── step.go
│ │ ├── tokens.go
│ │ └── tokens_test.go
│ ├── events.go
│ ├── events_test.go
│ ├── info.go
│ ├── info
│ │ ├── info.go
│ │ ├── info_test.go
│ │ └── testdata
│ │ │ ├── phase1.json
│ │ │ └── phase2.json
│ ├── info_test.go
│ ├── interceptors
│ │ ├── auth.go
│ │ ├── auth_test.go
│ │ ├── interceptors_test.go
│ │ ├── maintenance.go
│ │ ├── maintenance_test.go
│ │ ├── monitoring.go
│ │ ├── monitoring_test.go
│ │ ├── recovery.go
│ │ └── recovery_test.go
│ ├── mimetype
│ │ ├── generate.go
│ │ ├── generate.sh
│ │ └── v1beta1
│ │ │ ├── mimetype.go
│ │ │ ├── mimetype.pb.go
│ │ │ └── mimetype_test.go
│ ├── mock
│ │ ├── creds.go
│ │ ├── mock.go
│ │ └── stream.go
│ ├── o11y
│ │ ├── o11y.go
│ │ └── o11y_test.go
│ ├── query.go
│ ├── region
│ │ ├── generate.go
│ │ ├── generate.sh
│ │ └── v1beta1
│ │ │ └── region.pb.go
│ ├── rlid
│ │ ├── errors.go
│ │ ├── rlid.go
│ │ ├── rlid_test.go
│ │ ├── sequence.go
│ │ └── sequence_test.go
│ ├── server.go
│ ├── server_test.go
│ ├── status.go
│ ├── status_test.go
│ ├── store
│ │ ├── errors
│ │ │ ├── errors.go
│ │ │ ├── errors_test.go
│ │ │ └── iter.go
│ │ ├── events
│ │ │ ├── events.go
│ │ │ ├── events_suite_test.go
│ │ │ ├── events_test.go
│ │ │ ├── indash.go
│ │ │ ├── indash_test.go
│ │ │ ├── iterator.go
│ │ │ ├── keys.go
│ │ │ ├── keys_test.go
│ │ │ └── testdata
│ │ │ │ ├── events.pb.json
│ │ │ │ └── readonly.zip
│ │ ├── iterator
│ │ │ └── iface.go
│ │ ├── meta
│ │ │ ├── groups.go
│ │ │ ├── groups_test.go
│ │ │ ├── info.go
│ │ │ ├── info_test.go
│ │ │ ├── keys.go
│ │ │ ├── keys_test.go
│ │ │ ├── meta.go
│ │ │ ├── meta_test.go
│ │ │ ├── names.go
│ │ │ ├── names_test.go
│ │ │ ├── segment.go
│ │ │ ├── segment_test.go
│ │ │ ├── testdata
│ │ │ │ ├── groups.json
│ │ │ │ ├── readonly.zip
│ │ │ │ ├── topic_infos.json
│ │ │ │ └── topics.json
│ │ │ ├── topics.go
│ │ │ └── topics_test.go
│ │ ├── mock
│ │ │ ├── iterator.go
│ │ │ ├── iterator_test.go
│ │ │ ├── json.go
│ │ │ ├── json_test.go
│ │ │ ├── mock.go
│ │ │ ├── mock_test.go
│ │ │ └── testdata
│ │ │ │ ├── events.pb.json
│ │ │ │ ├── topic_infos.pb.json
│ │ │ │ ├── topic_names.pb.json
│ │ │ │ └── topics.pb.json
│ │ └── store.go
│ ├── testdata
│ │ ├── albums.json
│ │ ├── listens.json
│ │ ├── queries.txt
│ │ ├── topic.json
│ │ ├── topic_infos.json
│ │ └── topics.json
│ ├── topics.go
│ ├── topics
│ │ ├── topics.go
│ │ └── topics_test.go
│ └── topics_test.go
├── quarterdeck
│ ├── accounts.go
│ ├── accounts_test.go
│ ├── api
│ │ └── v1
│ │ │ ├── api.go
│ │ │ ├── api_test.go
│ │ │ ├── client.go
│ │ │ ├── client_test.go
│ │ │ ├── context.go
│ │ │ ├── context_test.go
│ │ │ ├── creds.go
│ │ │ ├── errors.go
│ │ │ ├── errors_test.go
│ │ │ ├── options.go
│ │ │ └── refresh.go
│ ├── apikeys.go
│ ├── apikeys_test.go
│ ├── auth.go
│ ├── auth_test.go
│ ├── authtest
│ │ ├── authtest.go
│ │ └── authtest_test.go
│ ├── config
│ │ ├── config.go
│ │ └── config_test.go
│ ├── db
│ │ ├── db.go
│ │ ├── db_test.go
│ │ ├── errors.go
│ │ ├── migrations
│ │ │ ├── 0000_migrations.sql
│ │ │ ├── 0001_initial_schema.sql
│ │ │ ├── 0002_default_data.sql
│ │ │ ├── 0003_email_verification.sql
│ │ │ ├── 0004_user_invitations.sql
│ │ │ ├── 0005_user_org_logins.sql
│ │ │ ├── 0006_revoked_timestamp.sql
│ │ │ └── 0007_account_type.sql
│ │ ├── models
│ │ │ ├── apikeys.go
│ │ │ ├── apikeys_test.go
│ │ │ ├── count.go
│ │ │ ├── count_test.go
│ │ │ ├── errors.go
│ │ │ ├── models.go
│ │ │ ├── models_test.go
│ │ │ ├── orgs.go
│ │ │ ├── orgs_test.go
│ │ │ ├── projects.go
│ │ │ ├── projects_test.go
│ │ │ ├── roles.go
│ │ │ ├── subject.go
│ │ │ ├── subject_test.go
│ │ │ ├── testdata
│ │ │ │ └── fixtures.sql
│ │ │ ├── users.go
│ │ │ └── users_test.go
│ │ ├── schema.go
│ │ ├── schema_test.go
│ │ ├── tokens.go
│ │ └── tokens_test.go
│ ├── emails.go
│ ├── emails_test.go
│ ├── invites.go
│ ├── invites_test.go
│ ├── keygen
│ │ ├── keygen.go
│ │ └── keygen_test.go
│ ├── middleware
│ │ ├── auth.go
│ │ ├── auth_test.go
│ │ ├── csrf.go
│ │ ├── csrf_test.go
│ │ ├── errors.go
│ │ ├── ratelimiter.go
│ │ └── ratelimiter_test.go
│ ├── mock
│ │ ├── quarterdeck.go
│ │ └── quarterdeck_test.go
│ ├── orgs.go
│ ├── orgs_test.go
│ ├── passwd
│ │ ├── dk.go
│ │ ├── dk_test.go
│ │ ├── strength.go
│ │ └── strength_test.go
│ ├── permissions
│ │ ├── permissions.go
│ │ └── permissions_test.go
│ ├── projects.go
│ ├── projects_test.go
│ ├── quarterdeck.go
│ ├── quarterdeck_test.go
│ ├── replica
│ │ └── query
│ │ │ ├── generate.go
│ │ │ └── v1beta1
│ │ │ └── query.pb.go
│ ├── report
│ │ ├── errors.go
│ │ ├── report.go
│ │ └── report_test.go
│ ├── status.go
│ ├── status_test.go
│ ├── testdata
│ │ ├── 01GE6191AQTGMCJ9BN0QC3CCVG.pem
│ │ ├── 01GE62EXXR0X0561XD53RDFBQJ.pem
│ │ ├── fixtures.sql
│ │ └── security.txt
│ ├── tokens
│ │ ├── cache.go
│ │ ├── cache_test.go
│ │ ├── claims.go
│ │ ├── claims_test.go
│ │ ├── errors.go
│ │ ├── expires.go
│ │ ├── expires_test.go
│ │ ├── jwks.go
│ │ ├── jwks_test.go
│ │ ├── mock.go
│ │ ├── testdata
│ │ │ ├── 01GE6191AQTGMCJ9BN0QC3CCVG.pem
│ │ │ ├── 01GE62EXXR0X0561XD53RDFBQJ.pem
│ │ │ ├── jwks.json
│ │ │ └── partial_jwks.json
│ │ ├── tokens.go
│ │ ├── tokens_test.go
│ │ └── validator.go
│ ├── users.go
│ ├── users_test.go
│ ├── wellknown.go
│ └── wellknown_test.go
├── raft
│ ├── api
│ │ ├── generate.go
│ │ └── v1beta1
│ │ │ ├── log.go
│ │ │ ├── log.pb.go
│ │ │ ├── raft.pb.go
│ │ │ └── raft_grpc.pb.go
│ ├── config.go
│ ├── config_test.go
│ ├── election
│ │ ├── election.go
│ │ └── election_test.go
│ ├── errors.go
│ ├── interval
│ │ ├── interval.go
│ │ └── interval_test.go
│ ├── log
│ │ ├── errors.go
│ │ ├── iface.go
│ │ ├── log.go
│ │ ├── log_test.go
│ │ ├── mock
│ │ │ ├── statemachine.go
│ │ │ └── sync.go
│ │ ├── options.go
│ │ └── testdata
│ │ │ ├── entries.pb.json
│ │ │ └── meta.pb.json
│ ├── peers
│ │ ├── peers.go
│ │ ├── peers_test.go
│ │ └── testdata
│ │ │ ├── quorum.foo
│ │ │ ├── quorum.json
│ │ │ └── quorum.yaml
│ ├── raft.go
│ ├── raft_test.go
│ ├── state.go
│ └── testdata
│ │ └── quorum.json
├── tenant
│ ├── api
│ │ └── v1
│ │ │ ├── api.go
│ │ │ ├── client.go
│ │ │ ├── client_test.go
│ │ │ ├── errors.go
│ │ │ ├── errors_test.go
│ │ │ └── options.go
│ ├── apikeys.go
│ ├── apikeys_test.go
│ ├── auth.go
│ ├── auth_test.go
│ ├── client.go
│ ├── config
│ │ ├── config.go
│ │ └── config_test.go
│ ├── db
│ │ ├── db.go
│ │ ├── db_test.go
│ │ ├── errors.go
│ │ ├── keys.go
│ │ ├── keys_test.go
│ │ ├── members.go
│ │ ├── members_test.go
│ │ ├── organizations.go
│ │ ├── organizations_test.go
│ │ ├── projects.go
│ │ ├── projects_test.go
│ │ ├── tenants.go
│ │ ├── tenants_test.go
│ │ ├── testdata
│ │ │ └── tenant.json
│ │ ├── time.go
│ │ ├── topics.go
│ │ ├── topics_test.go
│ │ ├── users.go
│ │ └── users_test.go
│ ├── ensign.go
│ ├── ensign_test.go
│ ├── fixtures.go
│ ├── invites.go
│ ├── invites_test.go
│ ├── members.go
│ ├── members_test.go
│ ├── organization_test.go
│ ├── organizations.go
│ ├── profiles.go
│ ├── profiles_test.go
│ ├── projects.go
│ ├── projects_test.go
│ ├── status.go
│ ├── status_test.go
│ ├── tenant.go
│ ├── tenant_test.go
│ ├── tenants.go
│ ├── tenants_test.go
│ ├── topics.go
│ └── topics_test.go
├── uptime
│ ├── config
│ │ └── config.go
│ ├── db
│ │ ├── db.go
│ │ ├── iface.go
│ │ ├── status.go
│ │ └── tx.go
│ ├── health
│ │ ├── api.go
│ │ ├── api_test.go
│ │ ├── ensign.go
│ │ ├── errors.go
│ │ ├── health.go
│ │ ├── health_test.go
│ │ ├── http.go
│ │ ├── http_test.go
│ │ ├── options.go
│ │ ├── status.go
│ │ ├── status_test.go
│ │ └── version.go
│ ├── incident
│ │ ├── db.go
│ │ ├── incident.go
│ │ └── incident_test.go
│ ├── monitor.go
│ ├── services
│ │ └── services.go
│ ├── static
│ │ ├── favicon.png
│ │ ├── logo-white.png
│ │ └── logo.png
│ ├── templates
│ │ ├── incidents.html
│ │ ├── index.html
│ │ └── services.html
│ ├── uptime.go
│ ├── web.go
│ └── web_test.go
├── utils
│ ├── backups
│ │ ├── backups.go
│ │ ├── backups_test.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── errors.go
│ │ ├── leveldb.go
│ │ ├── leveldb_test.go
│ │ ├── sqlite3.go
│ │ ├── sqlite3_test.go
│ │ ├── storage.go
│ │ └── testdata
│ │ │ ├── .gitkeep
│ │ │ ├── leveldb.tgz
│ │ │ └── sqlite.db
│ ├── bufconn
│ │ └── listener.go
│ ├── emails
│ │ ├── .gitignore
│ │ ├── builders.go
│ │ ├── builders_test.go
│ │ ├── client.go
│ │ ├── client_test.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── contacts.go
│ │ ├── emails_test.go
│ │ ├── errors.go
│ │ ├── iface.go
│ │ ├── mock
│ │ │ └── mock.go
│ │ ├── subjects.go
│ │ ├── templates
│ │ │ ├── daily_users.html
│ │ │ ├── daily_users.txt
│ │ │ ├── invite.html
│ │ │ ├── invite.txt
│ │ │ ├── partials
│ │ │ │ ├── base.html
│ │ │ │ ├── footer.html
│ │ │ │ └── style.html
│ │ │ ├── password_reset_request.html
│ │ │ ├── password_reset_request.txt
│ │ │ ├── password_reset_success.html
│ │ │ ├── password_reset_success.txt
│ │ │ ├── verify_email.html
│ │ │ ├── verify_email.txt
│ │ │ ├── welcome.html
│ │ │ └── welcome.txt
│ │ └── testdata
│ │ │ └── foo.zip
│ ├── gravatar
│ │ ├── gravatar.go
│ │ └── gravatar_test.go
│ ├── keymu
│ │ ├── keymu.go
│ │ └── keymu_test.go
│ ├── logger
│ │ ├── grpc.go
│ │ ├── level.go
│ │ ├── level_test.go
│ │ ├── logger.go
│ │ ├── logger_test.go
│ │ ├── middleware.go
│ │ └── testing.go
│ ├── metatopic
│ │ ├── errors.go
│ │ ├── metatopic.go
│ │ └── metatopic_test.go
│ ├── metrics
│ │ └── metrics.go
│ ├── mtls
│ │ ├── errors.go
│ │ ├── mtls.go
│ │ ├── mtls_test.go
│ │ ├── pem
│ │ │ ├── errors.go
│ │ │ ├── io.go
│ │ │ ├── io_test.go
│ │ │ ├── pem.go
│ │ │ └── pem_test.go
│ │ ├── pool.go
│ │ ├── provider.go
│ │ ├── provider_test.go
│ │ └── testdata
│ │ │ ├── README.md
│ │ │ ├── astros.com.pool.pem
│ │ │ ├── banks.com.pool.pem
│ │ │ ├── client.astros.com.pem
│ │ │ ├── client.banks.com.pem
│ │ │ ├── server.astros.com.pem
│ │ │ └── server.banks.com.pem
│ ├── pagination
│ │ ├── generate.go
│ │ ├── pagination.go
│ │ ├── pagination.pb.go
│ │ └── pagination_test.go
│ ├── probez
│ │ ├── client.go
│ │ ├── generate.go
│ │ ├── grpc
│ │ │ └── v1
│ │ │ │ ├── health.pb.go
│ │ │ │ ├── health_grpc.pb.go
│ │ │ │ ├── probez.go
│ │ │ │ └── probez_test.go
│ │ ├── probez.go
│ │ ├── probez_test.go
│ │ ├── server.go
│ │ └── server_test.go
│ ├── radish
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── error.go
│ │ ├── error_test.go
│ │ ├── options.go
│ │ ├── options_test.go
│ │ ├── radish.go
│ │ ├── radish_test.go
│ │ ├── scheduler.go
│ │ ├── scheduler_test.go
│ │ ├── tasks.go
│ │ └── tasks_test.go
│ ├── random
│ │ ├── names.go
│ │ └── names_test.go
│ ├── responses
│ │ ├── errors.go
│ │ └── marshal.go
│ ├── rows
│ │ └── rows.go
│ ├── sendgrid
│ │ ├── api.go
│ │ ├── contacts.go
│ │ ├── contacts_test.go
│ │ └── mail.go
│ ├── sentry
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── error.go
│ │ ├── interceptors.go
│ │ ├── logger.go
│ │ ├── sample.go
│ │ ├── sample_test.go
│ │ └── sentry.go
│ ├── service
│ │ ├── error.go
│ │ ├── options.go
│ │ ├── service.go
│ │ └── service_test.go
│ ├── sqlite
│ │ ├── sqlite.go
│ │ └── sqlite_test.go
│ ├── tlstest
│ │ ├── testcert.go
│ │ └── tlstest.go
│ ├── tokens
│ │ ├── tokens.go
│ │ └── tokens_test.go
│ ├── ulids
│ │ ├── ulids.go
│ │ └── ulids_test.go
│ └── units
│ │ ├── units.go
│ │ └── units_test.go
└── version.go
├── postman
├── collections
│ ├── quarterdeck.json
│ └── tenant.json
└── schemas
│ ├── quarterdeck.yaml
│ └── tenant.yaml
├── proto
├── .gitkeep
├── api
│ └── v1beta1
│ │ ├── ensign.proto
│ │ ├── event.proto
│ │ ├── groups.proto
│ │ ├── query.proto
│ │ └── topic.proto
├── grpc
│ └── health
│ │ └── v1
│ │ └── health.proto
├── mimetype
│ └── v1beta1
│ │ └── mimetype.proto
├── pagination
│ └── pagination.proto
├── quarterdeck
│ └── query
│ │ └── v1beta1
│ │ └── query.proto
├── raft
│ └── v1beta1
│ │ ├── log.proto
│ │ └── raft.proto
└── region
│ └── v1beta1
│ └── region.proto
└── web
├── beacon-app
├── .babelrc
├── .env.template
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .linguirc
├── .nvmrc
├── .nyc_output
│ └── processinfo
│ │ └── index.json
├── .prettierrc
├── .storybook
│ ├── main.js
│ ├── preview-head.html
│ └── preview.js
├── README.md
├── cypress.config.ts
├── cypress
│ ├── e2e
│ │ ├── ExistingMember.feature
│ │ ├── ExistingMember
│ │ │ ├── ExistingMemberHasAcount.ts
│ │ │ └── ExistingMemberHasNotAcount.ts
│ │ ├── ForgotPassword.feature
│ │ ├── ForgotPassword
│ │ │ └── ForgotPassword.ts
│ │ ├── GenerateAPIKey.feature
│ │ ├── GenerateAPIKey
│ │ │ └── GenerateAPIKey.ts
│ │ ├── HomePage.feature
│ │ ├── HomePage
│ │ │ └── HomePage.ts
│ │ ├── InviteMember.feature
│ │ ├── InviteMember
│ │ │ └── InviteMember.ts
│ │ ├── Login.feature
│ │ ├── Login
│ │ │ └── Login.ts
│ │ ├── Onboarding.feature
│ │ ├── Onboarding
│ │ │ └── Onboarding.ts
│ │ ├── OnboardingInvitationUser.feature
│ │ ├── OnboardingInvitationUser
│ │ │ └── OnboardingInvitationUser.ts
│ │ ├── OrganizationDashboard.feature
│ │ ├── OrganizationDashboard
│ │ │ └── OrganizationDashboard.ts
│ │ ├── ProjectDetail.feature
│ │ ├── ProjectDetail
│ │ │ └── ProjectDetail.ts
│ │ ├── ProjectDetailPage.feature
│ │ ├── ProjectDetailPage
│ │ │ └── ProjectDetailPage.ts
│ │ ├── ProjectsPage.feature
│ │ ├── ProjectsPage
│ │ │ └── ProjectsPage.ts
│ │ ├── Registration.feature
│ │ ├── Registration
│ │ │ └── Registation.ts
│ │ ├── ResetPassword.feature
│ │ ├── ResetPassword
│ │ │ └── ResetPassword.ts
│ │ ├── Team.feature
│ │ ├── Team
│ │ │ └── Team.ts
│ │ ├── TopicDetail.feature
│ │ ├── TopicDetail
│ │ │ └── TopicDetail.ts
│ │ ├── TopicQuery.feature
│ │ ├── TopicQuery
│ │ │ └── TopicQuery.ts
│ │ ├── UserProfile.feature
│ │ └── UserProfile
│ │ │ └── UserProfile.ts
│ ├── fixtures
│ │ └── user.json
│ ├── plugins
│ │ └── index.ts
│ ├── support
│ │ ├── commands.ts
│ │ └── e2e.ts
│ └── tsconfig.json
├── index.html
├── lingui.config.js
├── package.json
├── postcss.config.js
├── public
│ ├── android-chrome-192x192.png
│ ├── android-chrome-512x512.png
│ ├── apple-touch-icon.png
│ ├── browserconfig.xml
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon.ico
│ ├── favicon.png
│ ├── logo.png
│ ├── manifest.json
│ ├── mstile-150x150.png
│ ├── robots.txt
│ └── safari-pinned-tab.svg
├── setupTests.js
├── src
│ ├── App.tsx
│ ├── I18n.ts
│ ├── application
│ │ ├── api
│ │ │ ├── ApiAdapters.ts
│ │ │ └── ApiService.ts
│ │ ├── config
│ │ │ ├── appConfig.tsx
│ │ │ ├── appEnv.ts
│ │ │ ├── index.tsx
│ │ │ ├── react-query.tsx
│ │ │ └── sentry.ts
│ │ ├── index.ts
│ │ ├── routes
│ │ │ ├── PublicRoutes.tsx
│ │ │ ├── index.ts
│ │ │ ├── paths.ts
│ │ │ ├── privateRoute.tsx
│ │ │ └── root.tsx
│ │ └── store
│ │ │ ├── index.ts
│ │ │ └── rootReducer.ts
│ ├── assets
│ │ ├── fonts
│ │ │ └── .gitkeep
│ │ ├── icons
│ │ │ ├── chevron-in-circle.svg
│ │ │ ├── emailIcon.tsx
│ │ │ ├── githubIcon.tsx
│ │ │ ├── linkedinIcon.tsx
│ │ │ └── twitterIcon.tsx
│ │ ├── images
│ │ │ ├── busy-sea-otters.png
│ │ │ ├── footer.png
│ │ │ ├── lightning-bolt.png
│ │ │ ├── not-found-otters.svg
│ │ │ ├── otter-floating.svg
│ │ │ ├── rotational-ipn.png
│ │ │ ├── rotational.svg
│ │ │ ├── tileable-hexagon.png
│ │ │ └── world-icon.png
│ │ └── scss
│ │ │ └── .gitkeep
│ ├── components
│ │ ├── Error
│ │ │ ├── 404.tsx
│ │ │ ├── ErrorPage
│ │ │ │ ├── ErrorPage.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Fallback.tsx
│ │ │ ├── RTKErrorBoundary.tsx
│ │ │ ├── SendReport.tsx
│ │ │ ├── SentryErrorBoundary.tsx
│ │ │ └── index.ts
│ │ ├── GaWrapper
│ │ │ └── index.tsx
│ │ ├── MaintenanceMode
│ │ │ ├── MaintenanceMode.stories.tsx
│ │ │ ├── MaintenanceMode.tsx
│ │ │ └── index.ts
│ │ ├── MenuDropdown
│ │ │ ├── MenuDropdown.tsx
│ │ │ ├── OrganizationMenuDropdown.tsx
│ │ │ └── useDropdownMenu.tsx
│ │ ├── PasswordStrength
│ │ │ ├── PasswordStrength.stories.tsx
│ │ │ ├── PasswordStrength.tsx
│ │ │ └── index.ts
│ │ ├── ScheduleOfficeHours
│ │ │ └── ScheduleOfficeHours.tsx
│ │ ├── __tests__
│ │ │ └── .gitkeep
│ │ ├── auth
│ │ │ ├── LandingFooter
│ │ │ │ ├── LandingFooter.stories.tsx
│ │ │ │ ├── LandingFooter.tsx
│ │ │ │ └── index.ts
│ │ │ └── LandingHeader
│ │ │ │ ├── Landing.spec.tsx
│ │ │ │ ├── LandingHeader.stories.tsx
│ │ │ │ ├── LandingHeader.tsx
│ │ │ │ └── index.ts
│ │ ├── common
│ │ │ ├── Alert
│ │ │ │ └── Alert.tsx
│ │ │ ├── CardListItem
│ │ │ │ ├── CardListItem.stories.tsx
│ │ │ │ ├── CardListItem.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Checkbox
│ │ │ │ └── Checkbox.tsx
│ │ │ ├── FilterTable
│ │ │ │ ├── FilterTable.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Formik
│ │ │ │ └── FormDebug.tsx
│ │ │ ├── Logo.tsx
│ │ │ ├── Modal
│ │ │ │ ├── ApiKeyModal
│ │ │ │ │ ├── ApiKeyModal.stories.tsx
│ │ │ │ │ ├── ApiKeyModal.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ └── BCModalVideos.tsx
│ │ │ ├── ProfileCard
│ │ │ │ └── ProfileCard.tsx
│ │ │ ├── QuickView
│ │ │ │ ├── QuickView.stories.tsx
│ │ │ │ ├── QuickView.tsx
│ │ │ │ ├── QuickViewCard.tsx
│ │ │ │ ├── __tests__
│ │ │ │ │ └── QuickView.spec.tsx
│ │ │ │ └── index.ts
│ │ │ ├── TableHeader
│ │ │ │ ├── TableHeading.stories.tsx
│ │ │ │ ├── TableHeading.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── TagState
│ │ │ │ ├── TagState.tsx
│ │ │ │ └── index.tsx
│ │ │ └── Tooltip
│ │ │ │ ├── HelpTooltip.tsx
│ │ │ │ └── IconTooltip.tsx
│ │ ├── icons
│ │ │ ├── Icons.tsx
│ │ │ ├── arrow-down-up.tsx
│ │ │ ├── blueBars.tsx
│ │ │ ├── check-circle.tsx
│ │ │ ├── check.tsx
│ │ │ ├── chevron-down.tsx
│ │ │ ├── chevron-in-circle.tsx
│ │ │ ├── close.tsx
│ │ │ ├── closeEyeIcon.tsx
│ │ │ ├── confirmedIndicatorIcon.tsx
│ │ │ ├── copy-icon.tsx
│ │ │ ├── docs.tsx
│ │ │ ├── download-icon.tsx
│ │ │ ├── eventing-icon.tsx
│ │ │ ├── eventingIcon.svg
│ │ │ ├── external-icon.tsx
│ │ │ ├── folder.tsx
│ │ │ ├── funnel-simple.tsx
│ │ │ ├── hamburger.tsx
│ │ │ ├── heavy-check-mark.tsx
│ │ │ ├── help-icon.tsx
│ │ │ ├── hint.tsx
│ │ │ ├── home-icon.tsx
│ │ │ ├── hosted-data-icon.tsx
│ │ │ ├── lightning-bold-icon.tsx
│ │ │ ├── onboarding-icon.tsx
│ │ │ ├── onboarding-polygon.svg
│ │ │ ├── openEyeIcon.tsx
│ │ │ ├── otter-looking-down.tsx
│ │ │ ├── oval.tsx
│ │ │ ├── pendingIndicatorIcon.tsx
│ │ │ ├── profile.tsx
│ │ │ ├── refresh.tsx
│ │ │ ├── revokedIndicatorIcon.tsx
│ │ │ ├── setting.tsx
│ │ │ ├── support.tsx
│ │ │ ├── team.tsx
│ │ │ ├── three-dots.tsx
│ │ │ ├── union.tsx
│ │ │ ├── unusedIndicatorIcon.tsx
│ │ │ ├── white-heavy-check-mark.svg
│ │ │ ├── world-icon.svg
│ │ │ └── world-icon.tsx
│ │ ├── layout
│ │ │ ├── AppLayout.tsx
│ │ │ ├── DashLayout.styles.tsx
│ │ │ ├── DashLayout.tsx
│ │ │ ├── MainLayout.tsx
│ │ │ ├── MobileFooter
│ │ │ │ ├── MobileFooter.tsx
│ │ │ │ └── index.ts
│ │ │ ├── MobileNav
│ │ │ │ └── MobileNav.tsx
│ │ │ ├── OnboardingLayout.tsx
│ │ │ ├── ProfileAvatar
│ │ │ │ └── ProfileAvatar.tsx
│ │ │ ├── SanboxBanner
│ │ │ │ └── SandboxBanner.tsx
│ │ │ ├── SandboxLayout.tsx
│ │ │ ├── Sidebar
│ │ │ │ ├── OnboardingSideBar.tsx
│ │ │ │ ├── SandboxSidebar.tsx
│ │ │ │ ├── Sidebar.stories.tsx
│ │ │ │ ├── Sidebar.style.css
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── UpdateAlert.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Topbar
│ │ │ │ ├── Topbar.tsx
│ │ │ │ └── index.ts
│ │ │ └── __tests__
│ │ │ │ ├── DashLayout.spec.tsx
│ │ │ │ ├── OnboardingLayout.spec.tsx
│ │ │ │ ├── SandboxLayout.spec.tsx
│ │ │ │ ├── UpdateAlert.spec.tsx
│ │ │ │ └── __snapshots__
│ │ │ │ ├── DashLayout.spec.tsx.snap
│ │ │ │ ├── OnboardingLayout.spec.tsx.snap
│ │ │ │ ├── SandboxLayout.spec.tsx.snap
│ │ │ │ └── UpdateAlert.spec.tsx.snap
│ │ └── ui
│ │ │ ├── AccessDashboard
│ │ │ ├── AccessDashboard.stories.tsx
│ │ │ └── AccessDashboard.tsx
│ │ │ ├── Avatar
│ │ │ ├── Avatar.stories.tsx
│ │ │ ├── Avatar.styles.tsx
│ │ │ ├── Avatar.tsx
│ │ │ ├── Avatar.type.ts
│ │ │ └── index.ts
│ │ │ ├── Breadcrumbs
│ │ │ ├── Breadcrumbs.stories.tsx
│ │ │ ├── Breadcrumbs.tsx
│ │ │ ├── breadcrumbs-icon.svg
│ │ │ ├── breadcrumbs-icon.tsx
│ │ │ └── index.ts
│ │ │ ├── CollapsibleMenu.tsx
│ │ │ ├── Copy
│ │ │ ├── Copy.tsx
│ │ │ └── index.ts
│ │ │ ├── Drawer
│ │ │ ├── Drawer.tsx
│ │ │ └── index.ts
│ │ │ ├── Dropdown
│ │ │ ├── Dropdown.styles.tsx
│ │ │ ├── Dropdown.tsx
│ │ │ └── index.tsx
│ │ │ ├── Image
│ │ │ ├── Image.tsx
│ │ │ └── index.ts
│ │ │ ├── Link
│ │ │ ├── Link.tsx
│ │ │ └── index.ts
│ │ │ ├── Loader
│ │ │ ├── Loader.spec.tsx
│ │ │ ├── Loader.stories.tsx
│ │ │ ├── Loader.style.css
│ │ │ ├── Loader.tsx
│ │ │ └── index.ts
│ │ │ ├── OvalLoader
│ │ │ ├── OvalLoader.tsx
│ │ │ └── index.ts
│ │ │ ├── PasswordField
│ │ │ ├── PasswordField.tsx
│ │ │ ├── PasswordField.type.ts
│ │ │ ├── index.ts
│ │ │ └── usePasswordField.tsx
│ │ │ ├── PasswordTooltip
│ │ │ └── PasswordTooltip.tsx
│ │ │ ├── Select
│ │ │ ├── Select.tsx
│ │ │ └── index.ts
│ │ │ ├── Settings
│ │ │ ├── Settings.tsx
│ │ │ └── index.ts
│ │ │ ├── Tag
│ │ │ ├── Tag.stories.tsx
│ │ │ ├── Tag.tsx
│ │ │ └── index.ts
│ │ │ ├── TextArea
│ │ │ ├── TextArea.tsx
│ │ │ └── index.tsx
│ │ │ ├── TextField
│ │ │ ├── TextField.tsx
│ │ │ └── index.ts
│ │ │ ├── Toast
│ │ │ ├── Toast.tsx
│ │ │ ├── Toast.types.ts
│ │ │ ├── index.ts
│ │ │ └── util.ts
│ │ │ ├── Tooltip
│ │ │ └── DetailTooltip.tsx
│ │ │ └── index.ts
│ ├── constants
│ │ ├── app.ts
│ │ ├── dashLayout.tsx
│ │ ├── index.ts
│ │ ├── lang-key.ts
│ │ ├── mimeTypes.ts
│ │ ├── queryKeys.ts
│ │ └── rolesAndStatus.ts
│ ├── contexts
│ │ ├── .gitkeep
│ │ ├── LanguageContext.tsx
│ │ └── __tests__
│ │ │ └── .gitkeep
│ ├── features
│ │ ├── apiKeys
│ │ │ ├── api
│ │ │ │ ├── __tests__
│ │ │ │ │ ├── CreateApiKeyService.spec.ts
│ │ │ │ │ └── deleteApiKey.spec.ts
│ │ │ │ ├── apiKeysApiService.ts
│ │ │ │ ├── createApiKey.ts
│ │ │ │ └── deleteApiKeyApi.ts
│ │ │ ├── components
│ │ │ │ ├── GenerateAPIKeyForm.tsx
│ │ │ │ └── GenerateAPIKeyModal.tsx
│ │ │ ├── hooks
│ │ │ │ ├── useCreateApiKey.ts
│ │ │ │ ├── useDeleteApiKey.ts
│ │ │ │ └── useFetchApiKeys.ts
│ │ │ ├── schemas
│ │ │ │ └── generateAPIKeyValidationSchema.ts
│ │ │ └── types
│ │ │ │ ├── apiKeyService.ts
│ │ │ │ ├── createApiKeyService.ts
│ │ │ │ └── deleteApiKeyService.ts
│ │ ├── auth
│ │ │ ├── api
│ │ │ │ ├── ForgotPasswordApiService.ts
│ │ │ │ ├── LoginApiService.ts
│ │ │ │ ├── RegisterApiService.ts
│ │ │ │ ├── ResetPasswordApi.ts
│ │ │ │ ├── __tests__
│ │ │ │ │ ├── ForgotPasswordApiService.spec.ts
│ │ │ │ │ ├── LoginApiService.spec.ts
│ │ │ │ │ ├── RegisterApiService.spec.ts
│ │ │ │ │ └── ResetPasswordApi.spec.ts
│ │ │ │ └── verifyTokenApiService.ts
│ │ │ ├── components
│ │ │ │ ├── Form
│ │ │ │ │ ├── ForgotPasswordForm.tsx
│ │ │ │ │ └── PasswordResetForm.tsx
│ │ │ │ ├── LeftRegistrationPanel.tsx
│ │ │ │ ├── Login
│ │ │ │ │ ├── LoginForm.tsx
│ │ │ │ │ ├── LoginFormValidation.ts
│ │ │ │ │ └── __tests__
│ │ │ │ │ │ └── LoginForm.spec.tsx
│ │ │ │ ├── LoginFooter.tsx
│ │ │ │ ├── Register
│ │ │ │ │ ├── RegistrationForm.tsx
│ │ │ │ │ ├── SuccessfullAccountCreation.tsx
│ │ │ │ │ ├── __tests__
│ │ │ │ │ │ └── RegistrationForm.spec.tsx
│ │ │ │ │ └── schemas
│ │ │ │ │ │ └── registrationFormValidation.ts
│ │ │ │ ├── Verify
│ │ │ │ │ ├── Fail.tsx
│ │ │ │ │ └── Success.tsx
│ │ │ │ └── index.ts
│ │ │ ├── hooks
│ │ │ │ ├── useCheckVerifyToken.ts
│ │ │ │ ├── useDisplayToast.ts
│ │ │ │ ├── useForgotPassword.ts
│ │ │ │ ├── useForgotPasswordForm.ts
│ │ │ │ ├── useLogin.ts
│ │ │ │ ├── usePasswordResetForm.tsx
│ │ │ │ ├── useRegister.ts
│ │ │ │ ├── useResetPassword.ts
│ │ │ │ ├── useSubmitLogin.tsx
│ │ │ │ └── useSubmitResetPassword.ts
│ │ │ ├── index.ts
│ │ │ ├── routes
│ │ │ │ ├── ForgotPasswordPage.tsx
│ │ │ │ ├── LoginPage.tsx
│ │ │ │ ├── PasswordResetPage.tsx
│ │ │ │ ├── RegistrationPage.tsx
│ │ │ │ ├── ResetVerificationPage.tsx
│ │ │ │ ├── VerifyPage.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ └── stories
│ │ │ │ │ ├── Registration.stories.tsx
│ │ │ │ │ └── SuccessfullAccountCreation.stories.tsx
│ │ │ └── types
│ │ │ │ ├── CreateAccountService.ts
│ │ │ │ ├── ForgotPasswordService.ts
│ │ │ │ ├── LoginFormService.ts
│ │ │ │ ├── LoginService.ts
│ │ │ │ ├── RegisterService.ts
│ │ │ │ ├── ResetPasswordService.ts
│ │ │ │ └── __tests__
│ │ │ │ ├── CreateAccountService.spec.ts
│ │ │ │ └── RegisterService.spec.ts
│ │ ├── home
│ │ │ ├── api
│ │ │ │ └── StatusApiService.ts
│ │ │ ├── components
│ │ │ │ ├── AccessDocumentationStep.tsx
│ │ │ │ ├── ProjectDetails.stories.tsx
│ │ │ │ ├── ProjectDetailsStep.tsx
│ │ │ │ ├── QuickStart.tsx
│ │ │ │ ├── QuickViewCard.tsx
│ │ │ │ ├── QuickViewSummary.tsx
│ │ │ │ ├── RevokeApiKeyModal.tsx
│ │ │ │ ├── SetupNewProject.tsx
│ │ │ │ ├── StarterVideos
│ │ │ │ │ └── StarterVideo.tsx
│ │ │ │ ├── Templates.tsx
│ │ │ │ ├── WelcomeAttention.tsx
│ │ │ │ └── stories
│ │ │ │ │ ├── AccessDocumentation.stories.tsx
│ │ │ │ │ └── RevokeApiKeyModal.stories.tsx
│ │ │ ├── hooks
│ │ │ │ ├── useCheckAttention.tsx
│ │ │ │ └── useFetchStatus.ts
│ │ │ ├── index.ts
│ │ │ ├── routes
│ │ │ │ └── Home.tsx
│ │ │ ├── types
│ │ │ │ └── StatusService.ts
│ │ │ └── util
│ │ │ │ ├── index.ts
│ │ │ │ └── utils.tsx
│ │ ├── members
│ │ │ ├── api
│ │ │ │ ├── _tests_
│ │ │ │ │ ├── createMemberApi.spec.ts
│ │ │ │ │ ├── memberList.spec.ts
│ │ │ │ │ └── updateMember.spec.ts
│ │ │ │ ├── createMemberApiService.ts
│ │ │ │ ├── deleteMemberApi.ts
│ │ │ │ ├── getProfileAPI.ts
│ │ │ │ ├── memberApiService.ts
│ │ │ │ ├── memberListAPI.ts
│ │ │ │ ├── updateMemberAPI.ts
│ │ │ │ └── updateProfileAPI.ts
│ │ │ ├── components
│ │ │ │ ├── CancelModal
│ │ │ │ │ ├── CancelAcctModal.stories.tsx
│ │ │ │ │ ├── CancelAcctModal.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── ChangePassword
│ │ │ │ │ ├── ChangePasswordForm.tsx
│ │ │ │ │ └── ChangePasswordModal.tsx
│ │ │ │ ├── MemberDetails.stories.tsx
│ │ │ │ ├── MemberDetails.tsx
│ │ │ │ └── MemberInfo.tsx
│ │ │ ├── hooks
│ │ │ │ ├── useCreateMember.ts
│ │ │ │ ├── useDeleteMember.ts
│ │ │ │ ├── useFetchMember.ts
│ │ │ │ ├── useFetchMembers.ts
│ │ │ │ ├── useFetchProfile.ts
│ │ │ │ ├── useUpdateMember.tsx
│ │ │ │ └── useUpdateProfile.tsx
│ │ │ ├── routes
│ │ │ │ └── MemberPage.tsx
│ │ │ ├── types
│ │ │ │ ├── addMemberFormService.ts
│ │ │ │ ├── changePasswordFormService.ts
│ │ │ │ ├── deleteMemberFormService.tsx
│ │ │ │ ├── memberServices.ts
│ │ │ │ └── profileService.ts
│ │ │ └── utils.ts
│ │ ├── misc
│ │ │ ├── components
│ │ │ │ ├── index.ts
│ │ │ │ └── onboarding
│ │ │ │ │ ├── SuccessfulTenantCreationModal.stories.tsx
│ │ │ │ │ └── SuccessfulTenantCreationModal.tsx
│ │ │ ├── index.ts
│ │ │ └── routes
│ │ │ │ └── .gitkeep
│ │ ├── onboarding
│ │ │ ├── components
│ │ │ │ ├── OnboardingHeader.tsx
│ │ │ │ ├── Step.tsx
│ │ │ │ ├── StepButtons.tsx
│ │ │ │ ├── stepper
│ │ │ │ │ ├── Indicator.tsx
│ │ │ │ │ ├── Stepper.tsx
│ │ │ │ │ ├── StepperStep.tsx
│ │ │ │ │ ├── __tests__
│ │ │ │ │ │ ├── Stepper.spec.tsx
│ │ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ │ └── Stepper.spec.tsx.snap
│ │ │ │ │ └── index.tsx
│ │ │ │ └── steps
│ │ │ │ │ ├── StepCounter.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── name
│ │ │ │ │ ├── form.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── organization
│ │ │ │ │ ├── form.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── preference
│ │ │ │ │ ├── DeveloperSegment.tsx
│ │ │ │ │ ├── form.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── profession
│ │ │ │ │ │ ├── Header.tsx
│ │ │ │ │ │ ├── ProfessionSegment.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── workspace
│ │ │ │ │ ├── form.tsx
│ │ │ │ │ └── index.tsx
│ │ │ ├── hooks
│ │ │ │ ├── useHandlePreviousBtn.tsx
│ │ │ │ ├── useNameForm.tsx
│ │ │ │ ├── useOrganizationForm.tsx
│ │ │ │ ├── usePreferenceForm.tsx
│ │ │ │ └── useWorkspaceForm.tsx
│ │ │ ├── index.ts
│ │ │ ├── layout
│ │ │ │ └── index.tsx
│ │ │ ├── routes
│ │ │ │ └── OnboardingPage.tsx
│ │ │ └── shared
│ │ │ │ ├── constants.ts
│ │ │ │ └── utils.ts
│ │ ├── organization
│ │ │ ├── api
│ │ │ │ ├── _tests_
│ │ │ │ │ └── orgDetail.spec.ts
│ │ │ │ ├── orgDetailApi.ts
│ │ │ │ ├── organizationListApi.ts
│ │ │ │ └── switchOrganizationApi.ts
│ │ │ ├── components
│ │ │ │ ├── DeleteOrgModal
│ │ │ │ │ ├── DeleteOrgModal.stories.tsx
│ │ │ │ │ ├── DeleteOrgModal.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── OrganizationDetails.tsx
│ │ │ │ └── OrganizationTable.tsx
│ │ │ ├── hooks
│ │ │ │ ├── useFetchOrgDetail.ts
│ │ │ │ ├── useFetchOrganizations.tsx
│ │ │ │ └── useSwitchOrganization.ts
│ │ │ ├── index.tsx
│ │ │ ├── routes
│ │ │ │ └── OrganizationPage.tsx
│ │ │ ├── types
│ │ │ │ ├── organizationService.ts
│ │ │ │ └── switchService.ts
│ │ │ └── utils.tsx
│ │ ├── projects
│ │ │ ├── api
│ │ │ │ ├── __tests__
│ │ │ │ │ ├── createProject.spec.ts
│ │ │ │ │ ├── createProjectTopic.spec.ts
│ │ │ │ │ └── projectList.spec.ts
│ │ │ │ ├── createProjectAPI.tsx
│ │ │ │ ├── createTopicApiService.ts
│ │ │ │ ├── projectDetailApiService.ts
│ │ │ │ ├── projectListAPI.ts
│ │ │ │ ├── projectQueryApiService.tsx
│ │ │ │ ├── projectStatsApiService.ts
│ │ │ │ └── updateProjectApiService.ts
│ │ │ ├── components
│ │ │ │ ├── APIKeysTable.tsx
│ │ │ │ ├── ChangeOwner
│ │ │ │ │ ├── ChangeOwnerForm.tsx
│ │ │ │ │ ├── ChangeOwnerModal.tsx
│ │ │ │ │ ├── __tests__
│ │ │ │ │ │ ├── ChangeOwnerForm.spec.tsx
│ │ │ │ │ │ └── ChangeOwnerModal.spec.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── DeleteProjectModal.tsx
│ │ │ │ ├── EditProject
│ │ │ │ │ ├── EditProjectForm.tsx
│ │ │ │ │ ├── EditProjectModal.tsx
│ │ │ │ │ ├── EditProjectModalForm.tsx
│ │ │ │ │ ├── __tests__
│ │ │ │ │ │ ├── EditProjectForm.spec.tsx
│ │ │ │ │ │ └── EditProjectModal.spec.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── NewProject
│ │ │ │ │ ├── NewProjectForm.tsx
│ │ │ │ │ ├── NewProjectModal.tsx
│ │ │ │ │ └── __tests__
│ │ │ │ │ │ └── NewProjectForm.spec.tsx
│ │ │ │ ├── NewTopicModal.tsx
│ │ │ │ ├── NewTopicModalForm.tsx
│ │ │ │ ├── ProjectActive.tsx
│ │ │ │ ├── ProjectBreadcrumbs.tsx
│ │ │ │ ├── ProjectDetail.tsx
│ │ │ │ ├── ProjectDetail
│ │ │ │ │ ├── DetailInfo.tsx
│ │ │ │ │ └── ProjectDetailHeader.tsx
│ │ │ │ ├── ProjectDetailTooltip.tsx
│ │ │ │ ├── ProjectList.tsx
│ │ │ │ ├── ProjectSetup.tsx
│ │ │ │ ├── ProjectsTable.tsx
│ │ │ │ ├── Settings.tsx
│ │ │ │ ├── TopicTable.tsx
│ │ │ │ ├── TopicTableHeader.tsx
│ │ │ │ └── __tests__
│ │ │ │ │ ├── ProjectList.spec.tsx
│ │ │ │ │ ├── ProjectsTable.spec.tsx
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ └── ProjectsTable.spec.tsx.snap
│ │ │ ├── hooks
│ │ │ │ ├── useCreateProject.tsx
│ │ │ │ ├── useCreateTopic.ts
│ │ │ │ ├── useFetchProject.ts
│ │ │ │ ├── useFetchProjectStats.ts
│ │ │ │ ├── useFetchTenantProjects.ts
│ │ │ │ ├── useProjectActive.ts
│ │ │ │ ├── useProjectQuery.ts
│ │ │ │ ├── useProjectSetup.ts
│ │ │ │ └── useUpdateProject.tsx
│ │ │ ├── index.ts
│ │ │ ├── routes
│ │ │ │ ├── ProjectDetailPage.tsx
│ │ │ │ └── ProjectsPage.tsx
│ │ │ ├── schemas
│ │ │ │ └── createProjectTopicSchema.ts
│ │ │ ├── types
│ │ │ │ ├── Project.ts
│ │ │ │ ├── createProjectService.ts
│ │ │ │ ├── createTopicService.ts
│ │ │ │ ├── generateAPIKeyService.ts
│ │ │ │ ├── newProjectFormService.ts
│ │ │ │ ├── projectQueryService.ts
│ │ │ │ ├── projectService.ts
│ │ │ │ ├── updateProjectFormService.ts
│ │ │ │ ├── updateProjectOwnerFormService.ts
│ │ │ │ └── updateProjectService.ts
│ │ │ └── util.ts
│ │ ├── sandbox
│ │ │ ├── types
│ │ │ │ └── accountType.ts
│ │ │ └── util
│ │ │ │ └── utils.ts
│ │ ├── teams
│ │ │ ├── api
│ │ │ │ ├── getInviteTeamMemberRequest.ts
│ │ │ │ └── invitationAuthenticationRequest.ts
│ │ │ ├── components
│ │ │ │ ├── AddNewMember
│ │ │ │ │ ├── AddNewMemberForm.tsx
│ │ │ │ │ └── AddNewMemberModal.tsx
│ │ │ │ ├── ChangeRoleForm.tsx
│ │ │ │ ├── ChangeRoleModal.tsx
│ │ │ │ ├── DeleteMember
│ │ │ │ │ ├── DeleteMemberForm.tsx
│ │ │ │ │ ├── DeleteMemberModal.tsx
│ │ │ │ │ └── __tests__
│ │ │ │ │ │ └── DeleteMemberForm.spec.tsx
│ │ │ │ ├── ExistingUserInvitationPage.tsx
│ │ │ │ ├── InviteTeamMemberVerification.tsx
│ │ │ │ ├── NewUserInvitationPage.tsx
│ │ │ │ ├── RegisterNewUser
│ │ │ │ │ ├── NewInviteRegistrationForm.tsx
│ │ │ │ │ └── schemas
│ │ │ │ │ │ └── newInviteRegistrationFormValidation.ts
│ │ │ │ ├── TeamInvitationCard.tsx
│ │ │ │ ├── TeamsTable.tsx
│ │ │ │ └── __tests__
│ │ │ │ │ └── TeamInvitationCard.spec.tsx
│ │ │ ├── constants
│ │ │ │ └── query-key.ts
│ │ │ ├── hooks
│ │ │ │ ├── useFetchInviteAuthentication.ts
│ │ │ │ └── useUpdateMemberRole.ts
│ │ │ ├── index.ts
│ │ │ ├── loaders
│ │ │ │ └── inviteTeamMember.ts
│ │ │ ├── routes
│ │ │ │ └── TeamsPage.tsx
│ │ │ ├── types
│ │ │ │ ├── changeRoleFormDto.ts
│ │ │ │ ├── invites.ts
│ │ │ │ └── member.ts
│ │ │ └── util.ts
│ │ ├── tenants
│ │ │ ├── api
│ │ │ │ ├── __tests__
│ │ │ │ │ └── tenantServices.spec.ts
│ │ │ │ ├── createTenantApiService.ts
│ │ │ │ └── tenantListAPI.ts
│ │ │ ├── components
│ │ │ │ ├── TenantTable.stories.tsx
│ │ │ │ └── TenantTable.tsx
│ │ │ ├── hooks
│ │ │ │ ├── useCreateTenant.ts
│ │ │ │ └── useFetchTenants.ts
│ │ │ ├── types
│ │ │ │ ├── createTenantService.ts
│ │ │ │ └── tenantServices.ts
│ │ │ └── utils
│ │ │ │ └── tenant.ts
│ │ └── topics
│ │ │ ├── __mocks__
│ │ │ └── index.ts
│ │ │ ├── api
│ │ │ ├── __tests__
│ │ │ │ ├── topicStatsApiService.spec.ts
│ │ │ │ └── topicsApiService.spec.ts
│ │ │ ├── topicDetailApiService.ts
│ │ │ ├── topicEventsApiService.ts
│ │ │ ├── topicStatsApiService.ts
│ │ │ └── topicsApiService.ts
│ │ │ ├── components
│ │ │ ├── AdvancedTopicPolicy.tsx
│ │ │ ├── EventDetailTable.tsx
│ │ │ ├── EventDetailTableHeader.tsx
│ │ │ ├── Modal
│ │ │ │ ├── ArchiveTopicModal.tsx
│ │ │ │ ├── CloneTopicModal.tsx
│ │ │ │ ├── DeleteTopicModal.tsx
│ │ │ │ └── RevokeAPIKeyModal.tsx
│ │ │ ├── QueryForm.tsx
│ │ │ ├── TopicQuery.tsx
│ │ │ ├── TopicQueryInfo.tsx
│ │ │ ├── TopicQueryResult
│ │ │ │ ├── DisplayResultData.tsx
│ │ │ │ ├── MetaDataTable.tsx
│ │ │ │ ├── MimeTypeResult
│ │ │ │ │ ├── BinaryResult.tsx
│ │ │ │ │ ├── HTMLResult.tsx
│ │ │ │ │ ├── JSONResult.tsx
│ │ │ │ │ ├── XMLResult.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── PaginatedViewButtons.tsx
│ │ │ │ ├── QueryResultContent.tsx
│ │ │ │ ├── ResultHeader.tsx
│ │ │ │ ├── ViewingEvent.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── TopicQuickView.tsx
│ │ │ ├── TopicSettings.tsx
│ │ │ ├── TopicStateTag.tsx
│ │ │ ├── TopicsBreadcrumbs.tsx
│ │ │ └── __tests__
│ │ │ │ ├── EventDetailTable.spec.tsx
│ │ │ │ ├── TopicQueryResult.spec.tsx
│ │ │ │ ├── TopicQuickView.spec.tsx
│ │ │ │ └── __snapshots__
│ │ │ │ ├── EventDetailTable.spec.tsx.snap
│ │ │ │ ├── TopicQueryResult.spec.tsx.snap
│ │ │ │ └── TopicQuickView.spec.tsx.snap
│ │ │ ├── hooks
│ │ │ ├── useFetchTopic.ts
│ │ │ ├── useFetchTopicEvents.ts
│ │ │ ├── useFetchTopicStats.ts
│ │ │ ├── useFetchTopics.ts
│ │ │ ├── usePaginateTopicQuery.ts
│ │ │ └── useTopicQueryInputForm.ts
│ │ │ ├── index.tsx
│ │ │ ├── routes
│ │ │ └── TopicDetailPage.tsx
│ │ │ ├── schemas
│ │ │ └── topicQueryInputValidationSchema.ts
│ │ │ ├── types
│ │ │ ├── topicEventsService.ts
│ │ │ └── topicService.ts
│ │ │ └── utils.ts
│ ├── hooks
│ │ ├── __tests__
│ │ │ └── .gitkeep
│ │ ├── useAccountType.ts
│ │ ├── useAuth.ts
│ │ ├── useBreadcrumbs.tsx
│ │ ├── useDashOnboarding.ts
│ │ ├── useDrawer.ts
│ │ ├── useFetchPermissions
│ │ │ ├── index.ts
│ │ │ ├── permissionsApiService.ts
│ │ │ └── useFetchPermissions.ts
│ │ ├── useFetchQuickView
│ │ │ ├── __tests__
│ │ │ │ └── quickViewApiService.spec.ts
│ │ │ ├── index.ts
│ │ │ ├── quickViewApiService.ts
│ │ │ ├── quickViewService.ts
│ │ │ └── useFetchQuickView.ts
│ │ ├── useFocus.ts
│ │ ├── useForgotPassword.ts
│ │ ├── useGetCurrentTenant.tsx
│ │ ├── usePermissions.tsx
│ │ ├── useQueryParams.tsx
│ │ ├── useResendEmail.ts
│ │ ├── useResetPassword.ts
│ │ ├── useRoles.ts
│ │ └── useTracking.ts
│ ├── index.css
│ ├── lib
│ │ ├── __tests__
│ │ │ └── .gitkeep
│ │ ├── createGenericContext.tsx
│ │ ├── index.ts
│ │ └── validation.ts
│ ├── locales
│ │ ├── cs
│ │ │ ├── messages.js
│ │ │ └── messages.po
│ │ ├── en
│ │ │ ├── messages.js
│ │ │ └── messages.po
│ │ └── fr
│ │ │ ├── messages.js
│ │ │ └── messages.po
│ ├── main.tsx
│ ├── providers
│ │ ├── .gitkeep
│ │ ├── __tests__
│ │ │ └── .gitkeep
│ │ └── index.tsx
│ ├── store
│ │ ├── .gitkeep
│ │ ├── index.ts
│ │ └── useOrgStore.ts
│ ├── types
│ │ ├── MenuItem.ts
│ │ ├── app.d.ts
│ │ ├── cypress-browserify-preprocessor.d.ts
│ │ └── navigator.d.ts
│ ├── utils
│ │ ├── __mocks__
│ │ │ └── index.ts
│ │ ├── __tests__
│ │ │ ├── inputSanitizer.spec.ts
│ │ │ ├── password.spec.tsx
│ │ │ └── slugifyDomain.test.ts
│ │ ├── cookies.ts
│ │ ├── decodeToken.ts
│ │ ├── download-file.ts
│ │ ├── error-message.ts
│ │ ├── formatData.ts
│ │ ├── formatDate.ts
│ │ ├── getInitials.ts
│ │ ├── inputSanitzer.ts
│ │ ├── lazy-import.ts
│ │ ├── logger.ts
│ │ ├── misc.tsx
│ │ ├── passwordChecker.ts
│ │ ├── slugifyDomain.ts
│ │ ├── strings.ts
│ │ └── test-utils.tsx
│ └── vite-env.d.ts
├── tailwind.config.js
├── tsconfig.json
├── tsconfig.node.json
├── vite.config.ts
├── vitest.config.ts
├── vitest.setup.ts
└── yarn.lock
└── placeholder
└── landing
├── favicon.png
├── index.html
├── otter-floating.svg
└── rotational-logo.png
/.dockerignore:
--------------------------------------------------------------------------------
1 | # Development
2 | .git
3 | .gitignore
4 | .github
5 | .vscode
6 | LICENSE
7 | README.md
8 |
9 | # OS Droppings
10 | .DS_Store
11 |
12 | # Node stuff
13 | node_modules
14 | build
15 |
16 | # Docker stuff
17 | .dockerignore
18 | Dockerfile
19 | Dockerfile.prod
20 | docker-compose.yaml
21 |
22 | # Local configuration
23 | fixtures
24 | .env
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Binaries for programs and plugins
2 | *.exe
3 | *.exe~
4 | *.dll
5 | *.so
6 | *.dylib
7 |
8 |
9 | # Test binary, built with `go test -c`
10 | *.test
11 |
12 | # Output of the go coverage tool, specifically when used with LiteIDE
13 | *.out
14 |
15 | # Dependency directories (remove the comment below to include it)
16 | # vendor/
17 |
18 | # Code droppings
19 | .vscode/
20 |
21 | # OS Droppings
22 | .DS_Store
23 |
24 | # Development Config
25 | .secret/
26 | .env
27 | fixtures
28 |
29 | # Hugo generated files and build
30 | /docs/public/
31 | /docs/resources/_gen/
32 | /docs/assets/jsconfig.json
33 | hugo_stats.json
34 | /docs/.hugo_build.lock
35 | /docs/node_modules
36 | .history
37 |
38 | #frontend
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "docs/themes/hugo-book"]
2 | path = docs/themes/hugo-book
3 | url = https://github.com/alex-shpak/hugo-book
4 |
--------------------------------------------------------------------------------
/.husky/commit-msg:
--------------------------------------------------------------------------------
1 |
2 | #!/bin/sh
3 | . "$(dirname "$0")/_/husky.sh"
4 | cd web/beacon-app
5 | npx --no-install commitlint --edit "$1"
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 | . "$(dirname -- "$0")/_/husky.sh"
3 |
4 | cd web/beacon-app
5 | yarn lint-staged --quiet
--------------------------------------------------------------------------------
/containers/beacon/nginx.conf:
--------------------------------------------------------------------------------
1 | server {
2 | listen 80;
3 | listen [::]:80;
4 | server_name localhost;
5 |
6 | location / {
7 | root /usr/share/nginx/html;
8 | index index.html index.htm;
9 | try_files $uri /index.html;
10 | }
11 |
12 | gzip on;
13 | gzip_vary on;
14 | gzip_min_length 10240;
15 | gzip_proxied expired no-cache no-store private auth;
16 | gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
17 | gzip_disable "MSIE [1-6]\.";
18 | }
--------------------------------------------------------------------------------
/containers/ensign/.gitignore:
--------------------------------------------------------------------------------
1 | db/
--------------------------------------------------------------------------------
/containers/monitor/.gitignore:
--------------------------------------------------------------------------------
1 | grafana/*
2 | !grafana/dashboards/
--------------------------------------------------------------------------------
/containers/monitor/grafana/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/containers/monitor/grafana/.gitkeep
--------------------------------------------------------------------------------
/containers/monitor/grafana/dashboards/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/containers/monitor/grafana/dashboards/.gitkeep
--------------------------------------------------------------------------------
/containers/monitor/prometheus.yml:
--------------------------------------------------------------------------------
1 | # An example Prometheus configuration to scrape a single endpoint from docker-compose
2 | global:
3 | scrape_interval: 30s
4 | scrape_timeout: 10s
5 |
6 | scrape_configs:
7 | - job_name: 'ensign'
8 | scrape_interval: 15s
9 | scrape_timeout: 5s
10 | metrics_path: /metrics
11 | scheme: http
12 | static_configs:
13 | - targets:
14 | - 'ensign:1205'
--------------------------------------------------------------------------------
/containers/placeholder/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM nginx
2 |
3 | COPY web/placeholder/landing/index.html /usr/share/nginx/html/
4 | COPY web/placeholder/landing/favicon.png /usr/share/nginx/html/
5 | COPY web/placeholder/landing/rotational-logo.png /usr/share/nginx/html/
6 | COPY web/placeholder/landing/otter-floating.svg /usr/share/nginx/html/
--------------------------------------------------------------------------------
/containers/quarterdeck/.gitignore:
--------------------------------------------------------------------------------
1 | db/
2 | emails/
--------------------------------------------------------------------------------
/containers/tenant/.gitignore:
--------------------------------------------------------------------------------
1 | db/
2 | emails/
--------------------------------------------------------------------------------
/containers/tenant/db/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/containers/tenant/db/.gitkeep
--------------------------------------------------------------------------------
/containers/uptime/.gitignore:
--------------------------------------------------------------------------------
1 | db/
2 | uptime.tgz
--------------------------------------------------------------------------------
/containers/uptime/db/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/containers/uptime/db/.gitkeep
--------------------------------------------------------------------------------
/docs/archetypes/default.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "{{ replace .Name "-" " " | title }}"
3 | date: {{ .Date }}
4 | draft: true
5 | ---
6 |
7 |
--------------------------------------------------------------------------------
/docs/assets/images/banner.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/assets/images/banner.jpg
--------------------------------------------------------------------------------
/docs/assets/images/cta-illustration.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/assets/images/cta-illustration.jpg
--------------------------------------------------------------------------------
/docs/assets/images/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/assets/images/favicon.png
--------------------------------------------------------------------------------
/docs/assets/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/assets/images/logo.png
--------------------------------------------------------------------------------
/docs/assets/scss/custom.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/assets/scss/custom.scss
--------------------------------------------------------------------------------
/docs/config/_default/menus.en.toml:
--------------------------------------------------------------------------------
1 | ############## English navigation ###############
2 | # main menu
3 | [[main]]
4 | name = "Home"
5 | url = ""
6 | weight = 1
7 |
8 | [[main]]
9 | name = "FAQ"
10 | url = "/faq"
11 | weight = 2
12 |
13 |
14 | # footer menu
15 | [[footer]]
16 | name = "SDKs"
17 | url = "sdk/"
18 | weight = 1
19 |
20 | [[footer]]
21 | name = "Ensign Repo"
22 | url = "https://github.com/rotationalio/ensign"
23 | weight = 2
24 |
25 | [[footer]]
26 | name = "About Us"
27 | url = "https://rotational.io/about/"
28 | weight = 3
--------------------------------------------------------------------------------
/docs/config/_default/menus.fr.toml:
--------------------------------------------------------------------------------
1 | ############# French navigation ##############
2 | # main menu
3 | [[main]]
4 | [[main]]
5 | name = "Home"
6 | url = ""
7 | weight = 1
8 |
9 | [[main]]
10 | name = "FAQ"
11 | url = "faq"
12 | weight = 2
13 |
14 | # footer menu
15 | [[footer]]
16 | name = "Changelog"
17 | url = "changelog/"
18 | weight = 1
19 |
20 | [[footer]]
21 | name = "Contact"
22 | url = "contact/"
23 | weight = 2
24 |
25 | [[footer]]
26 | name = "Github"
27 | url = "https://github.com/themefisher/"
28 | weight = 3
--------------------------------------------------------------------------------
/docs/content/_index.en.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Ensign Squad, Assemble!"
3 | date: 2023-05-16T11:16:03-04:00
4 | description: "Welcome to the Ensign docs!"
5 | ---
6 |
7 | Ensign is a new eventing tool that makes it fast, convenient, and fun to create event-driven microservices without needing a big team of devOps or platform engineers.
8 |
9 | Ensign is an eventing system distributed in time and space. It stores chronological changes to all objects, which you can query with SQL to get change vectors in addition to static snapshots.
10 |
11 | This is Ensign's developer documentation; we're glad you're here!
12 |
13 | {{< image src="img/ensign-squad.png" alt="A friendly group of cartoon sea otters collaborating on tough problems together" zoomable="true" >}}
14 |
15 |
--------------------------------------------------------------------------------
/docs/content/ensql/_index.en.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "EnSQL Reference"
3 | weight: 40
4 | date: 2023-07-29T12:03:04-05:00
5 | ---
6 |
7 | Ensign implements a lightweight structured query language called EnSQL that should be familiar to users of relational databases. The twist for Ensign is that EnSQL allows users to query an Ensign topic over specific windows of time to capture and filter events. While the base language will be familiar and easy to pick up if you've used ANSI or Postgres SQL in the past, there are a few differences and gotchas that are described in detail in this documentation!
8 |
9 |
--------------------------------------------------------------------------------
/docs/content/ensql/syntax/images/SELECT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/content/ensql/syntax/images/SELECT.png
--------------------------------------------------------------------------------
/docs/content/system/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Ensign Internals"
3 | weight: 90
4 | date: 2023-05-17T17:03:41-04:00
5 | ---
6 |
7 | This section of the documentation describes Ensign Core — the internals of the Ensign system.
8 |
--------------------------------------------------------------------------------
/docs/i18n/en.yaml:
--------------------------------------------------------------------------------
1 | - id: search
2 | translation: Search
3 |
4 | - id: search_placeholder
5 | translation: Search Ensign Docs
6 |
7 | - id: topics
8 | translation: Browse Your Topics
9 |
10 | - id: first_name
11 | translation: First Name
12 |
13 | - id: last_name
14 | translation: Last Name
15 |
16 | - id: email
17 | translation: Email
18 |
19 | - id: contact_reason
20 | translation: Reason of Contact
21 |
22 | - id: write_message
23 | translation: Start Writing From Here
24 |
25 | - id: send
26 | translation: Send
27 |
28 | - id: search_result
29 | translation: Search result for
--------------------------------------------------------------------------------
/docs/i18n/fr.yaml:
--------------------------------------------------------------------------------
1 | - id: search
2 | translation: Chercher
3 |
4 | - id: search_placeholder
5 | translation: Cherche Godocs ...
6 |
7 | - id: topics
8 | translation: Parcourez vos sujets
9 |
10 | - id: first_name
11 | translation: Prénom
12 |
13 | - id: last_name
14 | translation: Nom de famille
15 |
16 | - id: email
17 | translation: Email
18 |
19 | - id: contact_reason
20 | translation: Raison du contact
21 |
22 | - id: write_message
23 | translation: Commencez à écrire à partir d'ici
24 |
25 | - id: send
26 | translation: Envoyer
27 |
28 | - id: search_result
29 | translation: Résultat de recherche pour
--------------------------------------------------------------------------------
/docs/netlify.toml:
--------------------------------------------------------------------------------
1 | [build]
2 | publish = "exampleSite/public"
3 | command = "cd exampleSite && hugo --minify --gc --themesDir ../.."
4 |
5 | [build.environment]
6 | HUGO_VERSION = "0.109.0"
7 | GO_VERSION = "1.19.4"
8 | HUGO_THEME = "repo"
9 | HUGO_BASEURL = "/"
10 |
11 | [[headers]]
12 | for = "/*" # This defines which paths this specific [[headers]] block will cover.
13 |
14 | [headers.values]
15 | X-Frame-Options = "DENY"
16 | X-XSS-Protection = "1; mode=block"
17 | Referrer-Policy = "same-origin"
18 | Strict-Transport-Security = "max-age=31536000; includeSubDomains; preload"
19 |
--------------------------------------------------------------------------------
/docs/static/img/baleen_diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/baleen_diagram.png
--------------------------------------------------------------------------------
/docs/static/img/broker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/broker.png
--------------------------------------------------------------------------------
/docs/static/img/comic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/comic.png
--------------------------------------------------------------------------------
/docs/static/img/database_record.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/database_record.png
--------------------------------------------------------------------------------
/docs/static/img/dbs_v_events.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/dbs_v_events.png
--------------------------------------------------------------------------------
/docs/static/img/detective.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/detective.png
--------------------------------------------------------------------------------
/docs/static/img/ensign-squad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/ensign-squad.png
--------------------------------------------------------------------------------
/docs/static/img/enson-laptop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/enson-laptop.png
--------------------------------------------------------------------------------
/docs/static/img/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/favicon.png
--------------------------------------------------------------------------------
/docs/static/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/logo.png
--------------------------------------------------------------------------------
/docs/static/img/mascot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/mascot.jpg
--------------------------------------------------------------------------------
/docs/static/img/sample-eda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/sample-eda.png
--------------------------------------------------------------------------------
/docs/static/img/smol-laptop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/smol-laptop.png
--------------------------------------------------------------------------------
/docs/static/img/weather.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/static/img/weather.png
--------------------------------------------------------------------------------
/docs/themes/godocs-2/.editorconfig:
--------------------------------------------------------------------------------
1 | ; https://editorconfig.org
2 |
3 | root = true
4 |
5 | [*]
6 | charset = utf-8
7 | end_of_line = lf
8 | indent_size = 2
9 | indent_style = space
10 | trim_trailing_whitespace = true
11 | insert_final_newline = true
12 |
13 | [*.md]
14 | trim_trailing_whitespace = false
15 |
--------------------------------------------------------------------------------
/docs/themes/godocs-2/.gitignore:
--------------------------------------------------------------------------------
1 | Thumbs.db
2 | .DS_Store
3 | .dist
4 | .tmp
5 | .lock
6 | .sass-cache
7 | npm-debug.log
8 | node_modules
9 | builds
10 | package-lock.json
11 | public
12 | resources
13 | .hugo_build.lock
14 | jsconfig.json
15 | hugo_stats.json
16 | go.sum
17 | yarn.lock
--------------------------------------------------------------------------------
/docs/themes/godocs-2/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "esversion": 8
3 | }
4 |
--------------------------------------------------------------------------------
/docs/themes/godocs-2/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "overrides": [
3 | {
4 | "files": ["*.html"],
5 | "options": {
6 | "parser": "go-template",
7 | "goTemplateBracketSpacing": true,
8 | "bracketSameLine": true
9 | }
10 | }
11 | ]
12 | }
13 |
--------------------------------------------------------------------------------
/docs/themes/godocs-2/archetypes/default.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "{{ replace .Name "-" " " | title }}"
3 | date: {{ .Date }}
4 | draft: true
5 | ---
6 |
7 |
--------------------------------------------------------------------------------
/docs/themes/godocs-2/assets/scss/_mixins.scss:
--------------------------------------------------------------------------------
1 | @mixin mobile-xs{
2 | @media(max-width:400px){
3 | @content;
4 | }
5 | }
6 | @mixin mobile{
7 | @media(max-width:575px){
8 | @content;
9 | }
10 | }
11 | @mixin tablet{
12 | @media(max-width:767px){
13 | @content;
14 | }
15 | }
16 | @mixin desktop{
17 | @media(max-width:991px){
18 | @content;
19 | }
20 | }
21 | @mixin desktop-lg{
22 | @media(max-width:1200px){
23 | @content;
24 | }
25 | }
26 |
27 | @mixin size($size){
28 | width: $size; height: $size;
29 | }
--------------------------------------------------------------------------------
/docs/themes/godocs-2/config.toml:
--------------------------------------------------------------------------------
1 | # DON'T REMOVE THIS FILE.
2 | # This file is only for forestry and blogdown, If you want to change the variables, please edit `exampleSite/config.toml`
3 |
--------------------------------------------------------------------------------
/docs/themes/godocs-2/layouts/404.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/themes/godocs-2/layouts/404.html
--------------------------------------------------------------------------------
/docs/themes/godocs-2/layouts/_default/changelog.html:
--------------------------------------------------------------------------------
1 | {{ define "main" }}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
{{ .Title }}
9 |
{{.Params.Description}}
10 |
{{ .Content }}
11 |
12 |
13 |
14 |
15 |
16 |
17 | {{ end }}
--------------------------------------------------------------------------------
/docs/themes/godocs-2/layouts/_default/index.json:
--------------------------------------------------------------------------------
1 | {{ $index := slice }}
2 | {{ range .Site.RegularPages }}
3 | {{ $index = $index | append (dict "title" .Title "section" .Section "description" .Params.description "categories" .Params.categories "content" .Plain "href" .Permalink) }}
4 | {{ end }}
5 | {{ $index | jsonify }}
--------------------------------------------------------------------------------
/docs/themes/godocs-2/layouts/_default/list.html:
--------------------------------------------------------------------------------
1 | {{ define "main" }}
2 |
3 | {{ partial "default.html" . }}
4 |
5 | {{ end }}
--------------------------------------------------------------------------------
/docs/themes/godocs-2/layouts/_default/single.html:
--------------------------------------------------------------------------------
1 | {{ define "main" }}
2 |
3 | {{ partial "default.html" . }}
4 |
5 | {{ end }}
--------------------------------------------------------------------------------
/docs/themes/godocs-2/layouts/index.html:
--------------------------------------------------------------------------------
1 | {{ define "main" }}
2 |
3 | {{ partial "default.html" . }}
4 |
5 | {{ end }}
--------------------------------------------------------------------------------
/docs/themes/godocs-2/layouts/partials/components/page-header.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/docs/themes/godocs-2/layouts/partials/components/page-header.html
--------------------------------------------------------------------------------
/docs/themes/godocs-2/layouts/shortcodes/changelog.html:
--------------------------------------------------------------------------------
1 | {{ $_hugo_config := `{ "version": 1 }` }}
2 |
3 |
12 |
13 | |
14 |
15 | {{ block "content" . }}{{ end }}
16 |
17 | {{ template "footer.html" . }}
18 | |
19 | |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/pkg/utils/emails/templates/partials/footer.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/pkg/utils/emails/templates/password_reset_success.html:
--------------------------------------------------------------------------------
1 | {{ template "base.html" . }}
2 |
3 | {{ define "title" }}Your Ensign Password Has Been Reset{{ end }}
4 | {{ define "preheader" }}Confirming that your Ensign password has successfully been reset.{{ end }}
5 |
6 | {{ define "content" }}
7 |
8 |
Hello,
9 |
10 |
Your Ensign password has been successfully reset. If you requested this password reset then no further action is required.
11 |
12 |
If you did not request a password reset, please contact our Ensign Customer Support team immediately at support@rotational.io.
13 |
14 |
We appreciate your attention to account security.
15 |
16 |
Best regards,
The Ensign Team
Rotational Labs
17 |
18 | {{ end }}
--------------------------------------------------------------------------------
/pkg/utils/emails/templates/password_reset_success.txt:
--------------------------------------------------------------------------------
1 | Hello,
2 |
3 | Your Ensign password has been successfully reset. If you requested this password reset then no further action is required.
4 |
5 | If you did not request a password reset, please contact our Ensign Customer Support team immediately at support@rotational.io.
6 |
7 | We appreciate your attention to account security.
8 |
9 | Best regards,
10 |
11 | The Ensign Team
12 | Rotational Labs
--------------------------------------------------------------------------------
/pkg/utils/emails/templates/verify_email.txt:
--------------------------------------------------------------------------------
1 | Hello {{ .FullName }},
2 |
3 | Thank you for registering with Ensign by Rotational Labs! In order to ensure the security of your account, please verify your email address by clicking or copy and pasting the following link into your browser:
4 |
5 | {{ .VerifyURL }}
6 |
7 | If you are having trouble verifying your email address, please contact us at support@rotational.io.
8 |
9 | Thank you,
10 | The Ensign Team
--------------------------------------------------------------------------------
/pkg/utils/emails/testdata/foo.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/pkg/utils/emails/testdata/foo.zip
--------------------------------------------------------------------------------
/pkg/utils/gravatar/gravatar_test.go:
--------------------------------------------------------------------------------
1 | package gravatar_test
2 |
3 | import (
4 | "testing"
5 |
6 | "github.com/rotationalio/ensign/pkg/utils/gravatar"
7 | "github.com/stretchr/testify/require"
8 | )
9 |
10 | func TestGravatar(t *testing.T) {
11 | email := "MyEmailAddress@example.com "
12 | url := gravatar.New(email, nil)
13 | require.Equal(t, "https://www.gravatar.com/avatar/0bc83cb571cd1c50ba6f3e8a78ef1346?d=identicon&r=pg&s=80", url)
14 | }
15 |
16 | func TestHash(t *testing.T) {
17 | // Test case from: https://en.gravatar.com/site/implement/hash/
18 | input := "MyEmailAddress@example.com "
19 | expected := "0bc83cb571cd1c50ba6f3e8a78ef1346"
20 | require.Equal(t, expected, gravatar.Hash(input))
21 | }
22 |
--------------------------------------------------------------------------------
/pkg/utils/logger/testing.go:
--------------------------------------------------------------------------------
1 | package logger
2 |
3 | import (
4 | "io"
5 | "sync"
6 | "testing"
7 |
8 | "github.com/rs/zerolog"
9 | "github.com/rs/zerolog/log"
10 | )
11 |
12 | var (
13 | mu sync.Mutex
14 | orig *zerolog.Logger
15 | )
16 |
17 | func ResetLogger() {
18 | mu.Lock()
19 | defer mu.Unlock()
20 | if orig != nil {
21 | log.Logger = *orig
22 | }
23 | }
24 |
25 | func Testing(tb testing.TB) {
26 | mu.Lock()
27 | defer mu.Unlock()
28 | orig = &log.Logger
29 | log.Logger = log.Output(zerolog.NewTestWriter(tb))
30 | }
31 |
32 | func Discard() {
33 | mu.Lock()
34 | defer mu.Unlock()
35 | orig = &log.Logger
36 | log.Logger = log.Output(zerolog.ConsoleWriter{Out: io.Discard})
37 | }
38 |
--------------------------------------------------------------------------------
/pkg/utils/mtls/errors.go:
--------------------------------------------------------------------------------
1 | package mtls
2 |
3 | import "errors"
4 |
5 | // Standard errors for error type checking
6 | var (
7 | ErrPrivateKeyRequired = errors.New("provider must contain a private key to initialize TLS certs")
8 | ErrNoCertificates = errors.New("provider does not contain any certificates")
9 | ErrMissingKey = errors.New("provider does not contain a private key")
10 | ErrZipEmpty = errors.New("zip archive contains no providers")
11 | ErrZipTooMany = errors.New("multiple providers in zip, is this a provider pool?")
12 | )
13 |
--------------------------------------------------------------------------------
/pkg/utils/mtls/pem/errors.go:
--------------------------------------------------------------------------------
1 | package pem
2 |
3 | import "errors"
4 |
5 | var (
6 | ErrDecodePrivateKey = errors.New("could not decode PEM private key")
7 | ErrDecodePublicKey = errors.New("could not decode PEM public key")
8 | ErrDecodeCertificate = errors.New("could not decode PEM certificate")
9 | ErrDecodeCSR = errors.New("could not decode PEM certificate request")
10 | )
11 |
--------------------------------------------------------------------------------
/pkg/utils/mtls/provider_test.go:
--------------------------------------------------------------------------------
1 | package mtls_test
2 |
--------------------------------------------------------------------------------
/pkg/utils/mtls/testdata/README.md:
--------------------------------------------------------------------------------
1 | # Test Data
2 |
3 | These fixtures were generated by the tests themselves. To regenerate the fixtures,
4 | simply delete them and run the tests and they will be regenerated.
5 |
6 | See the `checkFixtures` function and the `createGroupA` and `createGroupB` functions
7 | for more information on how to adapt or customize the fixtures.
--------------------------------------------------------------------------------
/pkg/utils/pagination/generate.go:
--------------------------------------------------------------------------------
1 | package pagination
2 |
3 | //go:generate protoc -I=$GOPATH/src/github.com/rotationalio/ensign/proto --go_out=. --go_opt=module=github.com/rotationalio/ensign/pkg/utils/pagination pagination/pagination.proto
4 |
--------------------------------------------------------------------------------
/pkg/utils/probez/generate.go:
--------------------------------------------------------------------------------
1 | package probez
2 |
3 | //go:generate protoc -I=$GOPATH/src/github.com/rotationalio/ensign/proto --go_out=. --go_opt=module=github.com/rotationalio/ensign/pkg/utils/probez --go-grpc_out=. --go-grpc_opt=module=github.com/rotationalio/ensign/pkg/utils/probez grpc/health/v1/health.proto
4 |
--------------------------------------------------------------------------------
/pkg/utils/radish/config_test.go:
--------------------------------------------------------------------------------
1 | package radish_test
2 |
3 | import (
4 | "testing"
5 |
6 | . "github.com/rotationalio/ensign/pkg/utils/radish"
7 | "github.com/stretchr/testify/require"
8 | )
9 |
10 | func TestConfig(t *testing.T) {
11 | testCases := []struct {
12 | conf Config
13 | err error
14 | }{
15 | {Config{}, ErrNoWorkers},
16 | {Config{Workers: 4}, ErrNoServerName},
17 | {Config{Workers: 4, ServerName: "radish"}, nil},
18 | }
19 |
20 | for i, tc := range testCases {
21 | err := tc.conf.Validate()
22 | require.ErrorIs(t, err, tc.err, "test case %d failed", i)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/pkg/utils/radish/tasks_test.go:
--------------------------------------------------------------------------------
1 | package radish_test
2 |
3 | import (
4 | "context"
5 | "fmt"
6 | "sync"
7 | )
8 |
9 | type TestTask struct {
10 | failUntil int
11 | attempts int
12 | success bool
13 | wg *sync.WaitGroup
14 | }
15 |
16 | func (t *TestTask) Do(ctx context.Context) error {
17 | t.attempts++
18 | if t.attempts < t.failUntil {
19 | t.success = false
20 | return fmt.Errorf("task errored on attempt %d", t.attempts)
21 | }
22 |
23 | t.success = true
24 | t.wg.Done()
25 | return nil
26 | }
27 |
28 | func (t *TestTask) String() string {
29 | return "test task"
30 | }
31 |
--------------------------------------------------------------------------------
/pkg/utils/responses/marshal.go:
--------------------------------------------------------------------------------
1 | package responses
2 |
3 | import "encoding/json"
4 |
5 | // Remarshal JSON data into a more readable string.
6 | func RemarshalJSON(data []byte) (string, error) {
7 | var obj interface{}
8 | if err := json.Unmarshal(data, &obj); err != nil {
9 | return "", err
10 | }
11 | pretty, err := json.MarshalIndent(obj, "", " ")
12 | if err != nil {
13 | return "", err
14 | }
15 | return string(pretty), nil
16 | }
--------------------------------------------------------------------------------
/pkg/utils/rows/rows.go:
--------------------------------------------------------------------------------
1 | package rows
2 |
3 | import (
4 | "fmt"
5 | "os"
6 | "strings"
7 | "text/tabwriter"
8 | )
9 |
10 | type Writer interface {
11 | Write([]string) error
12 | }
13 |
14 | func NewTabRowWriter(w *tabwriter.Writer) Writer {
15 | if w == nil {
16 | w = tabwriter.NewWriter(os.Stdout, 1, 0, 4, ' ', 0)
17 | }
18 | return &TabRowWriter{*w}
19 | }
20 |
21 | type TabRowWriter struct {
22 | tabwriter.Writer
23 | }
24 |
25 | func (w *TabRowWriter) Write(record []string) error {
26 | fmt.Fprintln(&w.Writer, strings.Join(record, "\t"))
27 | return nil
28 | }
29 |
--------------------------------------------------------------------------------
/pkg/utils/sentry/error.go:
--------------------------------------------------------------------------------
1 | package sentry
2 |
3 | import (
4 | "errors"
5 | "fmt"
6 | )
7 |
8 | // A standardized error type for fingerprinting inside of Sentry.
9 | type ServiceError struct {
10 | msg string
11 | args []interface{}
12 | err error
13 | }
14 |
15 | func (e *ServiceError) Error() string {
16 | if e.msg == "" {
17 | return e.err.Error()
18 | }
19 |
20 | msg := fmt.Sprintf(e.msg, e.args...)
21 | return fmt.Sprintf("%s: %s", msg, e.err)
22 | }
23 |
24 | func (e *ServiceError) Is(target error) bool {
25 | return errors.Is(e.err, target)
26 | }
27 |
28 | func (e *ServiceError) Unwrap() error {
29 | return e.err
30 | }
31 |
--------------------------------------------------------------------------------
/pkg/utils/service/error.go:
--------------------------------------------------------------------------------
1 | package service
2 |
3 | import "errors"
4 |
5 | var (
6 | ErrNoServiceRegistered = errors.New("no service has been registered with the server")
7 | )
8 |
--------------------------------------------------------------------------------
/proto/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rotationalio/ensign/2232bb99b2d0a5ac9a626352fb3e35cd0377b158/proto/.gitkeep
--------------------------------------------------------------------------------
/proto/api/v1beta1/query.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 |
3 | package ensign.v1beta1;
4 |
5 | // Query represents a single EnSQL query with associated placeholder parameters.
6 | message Query {
7 | string query = 1;
8 | repeated Parameter params = 2;
9 | bool include_duplicates = 3;
10 | }
11 |
12 | // Parameter holds a primitive value for passing as a placeholder to a sqlite query.
13 | message Parameter {
14 | oneof value {
15 | sint64 i = 1;
16 | double d = 2;
17 | bool b = 3;
18 | bytes y = 4;
19 | string s = 5;
20 | }
21 | string name = 6;
22 | }
23 |
24 | // Explanation returns information about the plan for executing a query and approximate
25 | // results or errors that might be returned.
26 | message QueryExplanation {}
--------------------------------------------------------------------------------
/proto/raft/v1beta1/log.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 |
3 | package raft.v1beta1;
4 | option go_package = "github.com/rotationalio/ensign/pkg/raft/api/v1beta1;api";
5 |
6 | import "google/protobuf/timestamp.proto";
7 |
8 | message LogEntry {
9 | uint64 index = 1;
10 | uint64 term = 2;
11 | bytes key = 3;
12 | bytes value = 4;
13 | }
14 |
15 | message LogMeta {
16 | uint64 last_applied = 1;
17 | uint64 commit_index = 2;
18 | uint64 length = 3;
19 | google.protobuf.Timestamp created = 4;
20 | google.protobuf.Timestamp modified = 5;
21 | google.protobuf.Timestamp snapshot = 6;
22 | }
--------------------------------------------------------------------------------
/web/beacon-app/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-react"],
3 | "plugins": ["transform-class-properties", "istanbul"]
4 | }
--------------------------------------------------------------------------------
/web/beacon-app/.env.template:
--------------------------------------------------------------------------------
1 | # Displays the build version (tag) and git revision for debugging
2 | REACT_APP_VERSION_NUMBER=v0.14.0-dev
3 | REACT_APP_GIT_REVISION=
4 |
5 | # Specifies connection information for the backend
6 | REACT_APP_QUARTERDECK_BASE_URL=http://localhost:8088/v1
7 | REACT_APP_TENANT_BASE_URL=http://localhost:8080/v1
8 |
9 | # Sentry tracing configuration
10 | REACT_APP_SENTRY_DSN
11 | REACT_APP_SENTRY_ENVIRONMENT=development
12 | REACT_APP_SENTRY_EVENT_ID
13 |
14 | # Google Analytics ID
15 | REACT_APP_ANALYTICS_ID
16 |
17 | # i18n debugging flag
18 | REACT_APP_USE_DASH_LOCALE=false
--------------------------------------------------------------------------------
/web/beacon-app/.eslintignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | dist/
3 |
4 | vite*
--------------------------------------------------------------------------------
/web/beacon-app/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
26 | # misc
27 | build
28 |
29 | coverage
30 | public/tailwind.css
31 |
32 | #src/locales/*
33 |
34 | # cypress specific - we going to ignore all the files for now and only commit the ones we need
35 | cypress/fixtures/*
36 | cypress/downloads/*
37 | cypress/videos/*
38 | cypress/screenshots/*
39 | cypress/reports/*
40 | .nyc_output
--------------------------------------------------------------------------------
/web/beacon-app/.linguirc:
--------------------------------------------------------------------------------
1 | {
2 | "locales": [
3 | "en",
4 | "cs",
5 | "fr"
6 | ],
7 | "sourceLocale": "en",
8 | "catalogs": [
9 | {
10 | "path": "src/locales/{locale}/messages",
11 | "include": [
12 | "src"
13 | ]
14 | }
15 | ],
16 | "format": "po",
17 | "rootDir": ".",
18 | "extractBabelOptions": {
19 | "presets": [
20 | "@babel/preset-typescript"
21 | ]
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/web/beacon-app/.nvmrc:
--------------------------------------------------------------------------------
1 | lts/*
--------------------------------------------------------------------------------
/web/beacon-app/.nyc_output/processinfo/index.json:
--------------------------------------------------------------------------------
1 | {"processes":{},"files":{},"externalIds":{}}
--------------------------------------------------------------------------------
/web/beacon-app/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5",
4 | "printWidth": 100,
5 | "tabWidth": 2,
6 | "jsxSingleQuote": false,
7 | "arrowParents": "always",
8 | "endOfLine": "auto",
9 | "overrides": [{
10 | "files": "*.json",
11 | "options": {
12 | "tabWidth": 2
13 | }
14 | }]
15 | }
--------------------------------------------------------------------------------
/web/beacon-app/.storybook/preview-head.html:
--------------------------------------------------------------------------------
1 |