npm.io
0.10.0 • Published 3 weeks ago

@dxos/echo

Licence
FSL-1.1-Apache-2.0
Version
0.10.0
Deps
13
Size
2.6 MB
Vulns
0
Weekly
0
Stars
510

@dxos/echo

ECHO API.

Installation

pnpm i @dxos/echo

DXOS Resources

Contributions

Your ideas, issues, and code are most welcome. Please take a look at our community code of conduct, the issue guide, and the PR contribution guide.

License: FSL-1.1-Apache-2.0 Copyright 2022 DXOS

API

import { Type, Obj, Relation, Ref, Query, Filter } from '@dxos/echo';
Object Relation (extends Obj) Ref
SCHEMA API
Define schema Type.Obj() Type.Relation() Ref.Ref()
Any schema type Type.AnyObj Type.Relation.Any Type.Ref.Any
Get DXN (of schema) Type.getURI(schema) Type.getURI(schema)
Get typename (of schema) Type.getTypename(schema) Type.getTypename(schema)
Get type metadata (of schema) Type.getMeta(schema) Type.getMeta(schema)
Is mutable schema Type.isMutable(schema) Type.isMutable(schema)

| | DATA API | | Unknown instance type | Obj.Unknown | Relation.Unknown | Ref.Unknown | | Create object | Obj.make(Schema, { ... }) | Relation.make(Schema, { ... }) | Ref.make(obj) | | Check kind | Obj.isObject(obj) | Relation.isRelation(obj) | Ref.isRef(ref) | | Get relation source | | Relation.getSource(relation) | | | Get relation target | | Relation.getTarget(relation) | | | Check instance of | Obj.instanceOf(Schema, obj) | | Get schema | Obj.getSchema(obj) | | Get DXN (of instance) | Obj.getDXN(obj) | | Get typename (of instance) | Obj.getTypename(obj) | | Get Meta | Obj.getMeta(obj) | | Is deleted | Obj.isDeleted(obj) |

Type.getURI(schema) == DXN.parse('dxn:type:example.com/type/Person:0.1.0');
Type.getMeta(schema) == { typename: }
Type.getTypename(schema) === 'type.example.type.person'
Type.getVersion(schema) === '0.1.0'

Obj.getDXN(obj) === DXN.parse('dxn:echo:SSSSSSSSSS:XXXXXXXXXXXXX')

// We need this for objects that have typename defined, but their schema can't be resolved (Obj.getSchema(obj) === undefined)
Obj.getTypeURI(obj) === DXN.parse('dxn:type:example.com/type/Person:0.1.0');

/**
 * @deprecated
 **/
// TODO(dmaretskyi): Consider keeping it as a shorthand for zType.getTypename(Obj.getSchema(obj)) ?? Obj.getTypeURI(obj)?.asTypeDXN()?.type`
Obj.getTypename(obj) === 'com.example.type.person'

ISSUE: Create vs live: Is it fundamentally the same thing?

Object construction

Option 1:

Relation.make(EmployeeOf, {
  [Relation.Source]: cyberdyne,
  [Relation.Target]: bill,
  [Obj.Meta]: {
    keys: [{ url: 'acme.com', id: '123' }],
  },
  since: '2022',
});

Option 2:

Obj.make(Contact, {
  name: 'Bill',
});

Relation.make(
  Employee,
  {
    source: cyberdyne,
    target: bill,
    meta: {
      keys: [{ url: 'acme.com', id: '123' }],
    },
  },
  {
    since: '2022',
  },
);

Object model representation.

JSON serialization
Obj.toJSON(obj);
Obj.fromJSON(json, { graph, db });

Defines attributes and encoding placed on objects.

Optional Runtime prop Runtime type JSON prop JSON type Description
Id No id ObjectID ULID string id string Unique object ID
Self DXN Yes Symbol(@dxos/echo/DXN) DXN @dxn string DXN to the object itself
Type No Symbol(@dxos/echo/Type) DXN @type string DXN to the object type
Schema Yes Symbol(@dxos/echo/Schema) Effect-Schema - Reference to the object schema
Tombstone marker Yes Symbol(@dxos/echo/Deleted) boolean @deleted boolean Deletion marker
Metadata Yes Symbol(@dxos/echo/Meta) Metadata object @meta object Metadata section
Entity kind No Symbol(@dxos/echo/EntityKind) EntityKind (inferred from other props) string Obj vs Relation
Relation Source DXN No (only on relations) Symbol(@dxos/echo/RelationSourceDXN) DXN @relationSource DXN string Relation source DXN
Relation Target DXN No (only on relations) Symbol(@dxos/echo/RelationTargetDXN) DXN @relationTarget DXN string Relation target DXN
Relation Source Yes (only on relations) Symbol(@dxos/echo/RelationSource) Object - Relation source object
Relation Target Yes (only on relations) Symbol(@dxos/echo/RelationTarget) Object - Relation target object

NOTE: All of the API functions can return undefined since they are also designed to work with objects outside of the database. TODO: Consider how Database, Hypergraph, and RefResolver are attached to the object.

Value representation
Runtime JSON
Reference Ref { "/": "dxn:..." }