create deps tree before deserialize

master
Bronwen 2021-06-20 02:54:02 -04:00
parent 79e550c915
commit 148780f139
3 changed files with 82 additions and 61 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "frigid", "name": "frigid",
"version": "1.3.7", "version": "1.3.8",
"main": "out/index.js", "main": "out/index.js",
"types": "out/index.d.ts", "types": "out/index.d.ts",
"license": "MIT", "license": "MIT",

View File

@ -1,11 +1,12 @@
// import { Ubjson } from '@shelacek/ubjson'; // import { Ubjson } from '@shelacek/ubjson';
import { existsSync, readFileSync, writeFileSync } from 'fs';
import { reverseLookup } from './reverseLookup.js'; import { reverseLookup } from './reverseLookup.js';
export const CTOR_CALLED = Symbol('CTOR_CALLED'); export const CTOR_CALLED = Symbol('CTOR_CALLED');
export const INVOKE_CTOR = Symbol('INVOKE_CTOR'); export const INVOKE_CTOR = Symbol('INVOKE_CTOR');
export const DEBUG = Symbol('DEBUG'); export const DEBUG = Symbol('DEBUG');
type SerializableClass = typeof Serializable;
export default class Serializable { export default class Serializable {
[DEBUG] = false; [DEBUG] = false;
@ -34,7 +35,7 @@ export default class Serializable {
static INSTANCE_DECLARATION = '$$INSTANCE_ID'; static INSTANCE_DECLARATION = '$$INSTANCE_ID';
static INSTANCE_REFERENCE = '$$INSTANCE_REF'; static INSTANCE_REFERENCE = '$$INSTANCE_REF';
static serializationDependencies(): any[] { static serializationDependencies(): SerializableClass[] {
return []; return [];
} }
@ -101,8 +102,21 @@ export default class Serializable {
return transformObject(this); return transformObject(this);
} }
static fromSerializableObject(obj: any, instances: Map<number, object> = new Map()) { static fromSerializableObject(obj: any, instances: Map<number, object> = new Map(), classes: Set<SerializableClass> = new Set()) {
if(obj[Serializable.CLASS_REFERENCE] !== this.name) return null; if(obj[Serializable.CLASS_REFERENCE] !== this.name) return null;
if(classes.size === 0) {
function descendDeps(ctx: SerializableClass) {
for(const child of ctx.serializationDependencies?.() ?? []) {
if(!classes.has(child)) {
classes.add(child)
descendDeps(child);
}
}
}
descendDeps(this);
}
const transformValue = (val: any): any => { const transformValue = (val: any): any => {
if(Array.isArray(val)) { if(Array.isArray(val)) {
@ -111,12 +125,11 @@ export default class Serializable {
return val; return val;
} else if(typeof val === 'object') { } else if(typeof val === 'object') {
if(Serializable.CLASS_REFERENCE in val) { if(Serializable.CLASS_REFERENCE in val) {
const classes = this.serializationDependencies(); const matchingClasses = [...classes].filter((classObject) => {
const matchingClasses = classes.filter((classObject) => {
return classObject.name === val[Serializable.CLASS_REFERENCE] return classObject.name === val[Serializable.CLASS_REFERENCE]
}); });
if(matchingClasses.length === 1) { if(matchingClasses.length === 1) {
return matchingClasses[0].fromSerializableObject(val, instances); return matchingClasses[0].fromSerializableObject(val, instances, classes);
} else { } else {
throw new Error('Unknown class ' + val[Serializable.CLASS_REFERENCE] + '!\n' + throw new Error('Unknown class ' + val[Serializable.CLASS_REFERENCE] + '!\n' +
'Did you forget to add ' + val[Serializable.CLASS_REFERENCE] + ` to ${this.name}.serializationDependencies?`); 'Did you forget to add ' + val[Serializable.CLASS_REFERENCE] + ` to ${this.name}.serializationDependencies?`);
@ -187,8 +200,6 @@ export default class Serializable {
const parse = secondPass(clone); const parse = secondPass(clone);
// clone.restore?.();
return parse; return parse;
} }

114
yarn.lock
View File

@ -1,52 +1,62 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1 # yarn lockfile v1
"@types/node@^15.12.2": "@types/node@^15.12.2":
version "15.12.2" "integrity" "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww=="
resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" "resolved" "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz"
"version" "15.12.2"
assertion-error@^1.1.0:
version "1.1.0" "assertion-error@^1.1.0":
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" "integrity" "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="
"resolved" "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz"
chai@^4.3.4: "version" "1.1.0"
version "4.3.4"
resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" "chai@^4.3.4":
dependencies: "integrity" "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA=="
assertion-error "^1.1.0" "resolved" "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz"
check-error "^1.0.2" "version" "4.3.4"
deep-eql "^3.0.1" dependencies:
get-func-name "^2.0.0" "assertion-error" "^1.1.0"
pathval "^1.1.1" "check-error" "^1.0.2"
type-detect "^4.0.5" "deep-eql" "^3.0.1"
"get-func-name" "^2.0.0"
check-error@^1.0.2: "pathval" "^1.1.1"
version "1.0.2" "type-detect" "^4.0.5"
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
"check-error@^1.0.2":
deep-eql@^3.0.1: "integrity" "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII="
version "3.0.1" "resolved" "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz"
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" "version" "1.0.2"
dependencies:
type-detect "^4.0.0" "deep-eql@^3.0.1":
"integrity" "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw=="
get-func-name@^2.0.0: "resolved" "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz"
version "2.0.0" "version" "3.0.1"
resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" dependencies:
"type-detect" "^4.0.0"
pathval@^1.1.1:
version "1.1.1" "get-func-name@^2.0.0":
resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" "integrity" "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE="
"resolved" "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz"
type-detect@^4.0.0, type-detect@^4.0.5: "version" "2.0.0"
version "4.0.8"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" "pathval@^1.1.1":
"integrity" "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="
typescript@^4.3.2: "resolved" "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz"
version "4.3.2" "version" "1.1.1"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805"
"type-detect@^4.0.0", "type-detect@^4.0.5":
yarn@^1.22.10: "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
version "1.22.10" "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz"
resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.10.tgz#c99daa06257c80f8fa2c3f1490724e394c26b18c" "version" "4.0.8"
"typescript@^4.3.2":
"integrity" "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw=="
"resolved" "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz"
"version" "4.3.2"
"yarn@^1.22.10":
"integrity" "sha512-IanQGI9RRPAN87VGTF7zs2uxkSyQSrSPsju0COgbsKQOOXr5LtcVPeyXWgwVa0ywG3d8dg6kSYKGBuYK021qeA=="
"resolved" "https://registry.npmjs.org/yarn/-/yarn-1.22.10.tgz"
"version" "1.22.10"