aboutsummaryrefslogtreecommitdiff
path: root/src/new_fields
diff options
context:
space:
mode:
Diffstat (limited to 'src/new_fields')
-rw-r--r--src/new_fields/CursorField.ts9
-rw-r--r--src/new_fields/Doc.ts21
-rw-r--r--src/new_fields/URLField.ts9
3 files changed, 26 insertions, 13 deletions
diff --git a/src/new_fields/CursorField.ts b/src/new_fields/CursorField.ts
index 1be1ec3e0..fd86031a8 100644
--- a/src/new_fields/CursorField.ts
+++ b/src/new_fields/CursorField.ts
@@ -1,7 +1,7 @@
import { ObjectField } from "./ObjectField";
import { observable } from "mobx";
import { Deserializable } from "../client/util/SerializationHelper";
-import { serializable, createSimpleSchema, object } from "serializr";
+import { serializable, createSimpleSchema, object, date } from "serializr";
import { OnUpdate, ToScriptString, Copy } from "./FieldSymbols";
export type CursorPosition = {
@@ -11,7 +11,8 @@ export type CursorPosition = {
export type CursorMetadata = {
id: string,
- identifier: string
+ identifier: string,
+ timestamp: number
};
export type CursorData = {
@@ -26,7 +27,8 @@ const PositionSchema = createSimpleSchema({
const MetadataSchema = createSimpleSchema({
id: true,
- identifier: true
+ identifier: true,
+ timestamp: true
});
const CursorSchema = createSimpleSchema({
@@ -47,6 +49,7 @@ export default class CursorField extends ObjectField {
setPosition(position: CursorPosition) {
this.data.position = position;
+ this.data.metadata.timestamp = Date.now();
this[OnUpdate]();
}
diff --git a/src/new_fields/Doc.ts b/src/new_fields/Doc.ts
index f4514c33e..b0237d04d 100644
--- a/src/new_fields/Doc.ts
+++ b/src/new_fields/Doc.ts
@@ -19,12 +19,15 @@ export namespace Field {
return field[ToScriptString]();
}
}
- export function IsField(field: any): field is Field {
+ export function IsField(field: any): field is Field;
+ export function IsField(field: any, includeUndefined: true): field is Field | undefined;
+ export function IsField(field: any, includeUndefined: boolean = false): field is Field | undefined {
return (typeof field === "string")
|| (typeof field === "number")
|| (typeof field === "boolean")
|| (field instanceof ObjectField)
- || (field instanceof RefField);
+ || (field instanceof RefField)
+ || (includeUndefined && field === undefined);
}
}
export type Field = number | string | boolean | ObjectField | RefField;
@@ -116,7 +119,6 @@ export class Doc extends RefField {
}
public [HandleUpdate](diff: any) {
- console.log(diff);
const set = diff.$set;
if (set) {
for (const key in set) {
@@ -149,6 +151,9 @@ export namespace Doc {
export function GetT<T extends Field>(doc: Doc, key: string, ctor: ToConstructor<T>, ignoreProto: boolean = false): FieldResult<T> {
return Cast(Get(doc, key, ignoreProto), ctor) as FieldResult<T>;
}
+ export function IsPrototype(doc: Doc) {
+ return GetT(doc, "isPrototype", "boolean", true);
+ }
export async function SetOnPrototype(doc: Doc, key: string, value: Field) {
const proto = Object.getOwnPropertyNames(doc).indexOf("isPrototype") === -1 ? doc.proto : doc;
@@ -180,11 +185,11 @@ export namespace Doc {
// compare whether documents or their protos match
export function AreProtosEqual(doc: Doc, other: Doc) {
- let r = (doc[Id] === other[Id]);
- let r2 = (doc.proto && doc.proto.Id === other[Id]);
- let r3 = (other.proto && other.proto.Id === doc[Id]);
- let r4 = (doc.proto && other.proto && doc.proto[Id] === other.proto[Id]);
- return r || r2 || r3 || r4 ? true : false;
+ let r = (doc === other);
+ let r2 = (doc.proto === other);
+ let r3 = (other.proto === doc);
+ let r4 = (doc.proto === other.proto);
+ return r || r2 || r3 || r4;
}
// gets the document's prototype or returns the document if it is a prototype
diff --git a/src/new_fields/URLField.ts b/src/new_fields/URLField.ts
index a6f8f1cc5..4a2841fb6 100644
--- a/src/new_fields/URLField.ts
+++ b/src/new_fields/URLField.ts
@@ -18,13 +18,18 @@ export abstract class URLField extends ObjectField {
@serializable(url())
readonly url: URL;
- constructor(url: URL) {
+ constructor(url: string);
+ constructor(url: URL);
+ constructor(url: URL | string) {
super();
+ if (typeof url === "string") {
+ url = new URL(url);
+ }
this.url = url;
}
[ToScriptString]() {
- return `new ${this.constructor.name}(new URL(${this.url.href}))`;
+ return `new ${this.constructor.name}("${this.url.href}")`;
}
[Copy](): this {