@antelopejs/interface-database-decorators 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,6 +16,7 @@ Part of [AntelopeJS](https://github.com/AntelopeJS/antelopejs). Used by [Antelop
16
16
  - `Table`, `@RegisterTable`, `@Field`, `@Index` and `@Fixture` declare tables, indexes and seed rows; `RegisterSchema` provisions them.
17
17
  - `BasicDataModel` and `GetModel` give each table typed CRUD methods with optional validation.
18
18
  - `@Encrypted`, `@Hashed`, `@Localized`, `@CreationTime` and `@UpdateTime` transform field values on write and read.
19
+ - `await row.setHashAsync(field, value)` and `await row.testHashAsync(field, value)` hash a password off the event loop. Use them on a server: assigning a `@Hashed` field blocks the event loop for about 150 ms. See [Table modifiers](./docs/3.table-modifiers.md#mixin-methods).
19
20
  - `@Model` injects a model into an [`@antelopejs/interface-api`](https://github.com/AntelopeJS/interface-api) controller.
20
21
 
21
22
  ## Implementations
@@ -76,6 +76,32 @@ export declare function fromDatabase<T extends Constructible>(rawObject: any, Ta
76
76
  export declare function toDatabase<T extends InternalHolder>(object: T): T & InternalHolder;
77
77
  type ExtractModifierOptions<T> = T extends Modifier<any, infer Options> ? Options : undefined;
78
78
  type ExtractModifierArgs<T> = T extends OneWayModifier<any, infer Args> ? Args : [];
79
+ /**
80
+ * Attaches a modifier to a field of a table class. A property decorator calls
81
+ * it with what it holds: `attachModifier(target.constructor, Modifier,
82
+ * propertyKey, options)`.
83
+ *
84
+ * At compile time, `options` must match the options type of `Modifier`.
85
+ * `TableClass` is any function and `field` any property key: nothing checks
86
+ * that `field` names a member of the class.
87
+ *
88
+ * At run time, a modifier with `lock` replaces the field with an accessor on
89
+ * `TableClass.prototype` that routes reads and writes through the field's
90
+ * modifiers. A modifier without `lock` only handles events, and the field
91
+ * keeps its plain value. Each method of the modifier other than `lock` and
92
+ * `unlock` becomes a handler for the event of the same name.
93
+ *
94
+ * @param TableClass The table class, `target.constructor` in a property
95
+ * decorator.
96
+ * @param Modifier The modifier class. The engine creates one instance per
97
+ * attachment and identifies it by its class name.
98
+ * @param field The field to modify, `propertyKey` in a property decorator.
99
+ * @param options The modifier's options, read through `this.options`.
100
+ * @throws Error when a modifier with `lock` is attached to `constructor` or
101
+ * `__proto__`.
102
+ * @throws Error when a modifier with `lock` is attached to a field that
103
+ * already has a one-way modifier, one with `lock` and no `unlock`.
104
+ */
79
105
  export declare function attachModifier<M extends Constructible<Modifier>>(TableClass: Function, Modifier: M, field: PropertyKey, options: ExtractModifierOptions<InstanceType<M>>): void;
80
106
  export declare function getModifiedFields<T extends {
81
107
  constructor: any;
@@ -87,6 +113,25 @@ type ModifierWithProxyArgs = {
87
113
  modifier: Constructible<TwoWayModifier<any, any[], any, any>>;
88
114
  args: unknown[];
89
115
  };
116
+ /**
117
+ * Builds a query expression that reads a field unlocked, for use inside a
118
+ * database query. Each two-way modifier on the field passes the stored value
119
+ * through its own `unlockrequest`. The expression yields the stored value as
120
+ * it is when the field has only one-way modifiers, and the plain field when
121
+ * it has no modifier.
122
+ *
123
+ * At compile time, `field` must be a key of the row type. Nothing ties
124
+ * `table` to the row type, and nothing checks each entry's `args` against
125
+ * its modifier's arguments.
126
+ *
127
+ * @param table The table class. It is read only for its modifier metadata.
128
+ * @param object The row in the query.
129
+ * @param field The field to read.
130
+ * @param modifiers The arguments for each two-way modifier on the field,
131
+ * matched to it by class name.
132
+ * @throws TypeError when `modifiers` has no entry for a two-way modifier on
133
+ * the field.
134
+ */
90
135
  export declare function unlockrequest<T extends {}, K extends keyof T>(table: Constructible, object: DatabaseDev.ValueProxy<T>, field: K, modifiers: ModifierWithProxyArgs[]): DatabaseDev.ValueProxy<T[K]>;
91
136
  export declare function lock<T extends {
92
137
  constructor: any;
@@ -182,6 +182,32 @@ function toDatabase(object) {
182
182
  triggerEvent(object, "toDatabase", result);
183
183
  return result;
184
184
  }
185
+ /**
186
+ * Attaches a modifier to a field of a table class. A property decorator calls
187
+ * it with what it holds: `attachModifier(target.constructor, Modifier,
188
+ * propertyKey, options)`.
189
+ *
190
+ * At compile time, `options` must match the options type of `Modifier`.
191
+ * `TableClass` is any function and `field` any property key: nothing checks
192
+ * that `field` names a member of the class.
193
+ *
194
+ * At run time, a modifier with `lock` replaces the field with an accessor on
195
+ * `TableClass.prototype` that routes reads and writes through the field's
196
+ * modifiers. A modifier without `lock` only handles events, and the field
197
+ * keeps its plain value. Each method of the modifier other than `lock` and
198
+ * `unlock` becomes a handler for the event of the same name.
199
+ *
200
+ * @param TableClass The table class, `target.constructor` in a property
201
+ * decorator.
202
+ * @param Modifier The modifier class. The engine creates one instance per
203
+ * attachment and identifies it by its class name.
204
+ * @param field The field to modify, `propertyKey` in a property decorator.
205
+ * @param options The modifier's options, read through `this.options`.
206
+ * @throws Error when a modifier with `lock` is attached to `constructor` or
207
+ * `__proto__`.
208
+ * @throws Error when a modifier with `lock` is attached to a field that
209
+ * already has a one-way modifier, one with `lock` and no `unlock`.
210
+ */
185
211
  function attachModifier(TableClass, Modifier, field, options) {
186
212
  const entry = (0, records_1.newModifiedField)(Modifier);
187
213
  Object.assign(entry.modifier, { options });
@@ -249,6 +275,25 @@ function unlock(object, Modifier, fields, ...args) {
249
275
  }
250
276
  }
251
277
  }
278
+ /**
279
+ * Builds a query expression that reads a field unlocked, for use inside a
280
+ * database query. Each two-way modifier on the field passes the stored value
281
+ * through its own `unlockrequest`. The expression yields the stored value as
282
+ * it is when the field has only one-way modifiers, and the plain field when
283
+ * it has no modifier.
284
+ *
285
+ * At compile time, `field` must be a key of the row type. Nothing ties
286
+ * `table` to the row type, and nothing checks each entry's `args` against
287
+ * its modifier's arguments.
288
+ *
289
+ * @param table The table class. It is read only for its modifier metadata.
290
+ * @param object The row in the query.
291
+ * @param field The field to read.
292
+ * @param modifiers The arguments for each two-way modifier on the field,
293
+ * matched to it by class name.
294
+ * @throws TypeError when `modifiers` has no entry for a two-way modifier on
295
+ * the field.
296
+ */
252
297
  function unlockrequest(table, object, field, modifiers) {
253
298
  const args = Object.fromEntries(modifiers.map(({ modifier, args: modArgs }) => [modifier.name, modArgs]));
254
299
  const stored = object.cast();
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/modifiers/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/modifiers/common.ts"],"names":[],"mappings":"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"}
@@ -24,9 +24,18 @@ export declare class HashModifier extends OneWayModifier<string | undefined, [
24
24
  /**
25
25
  * Hashes a new value. Assigning the stored hash back keeps it as it is.
26
26
  * Blocks the event loop for one scrypt run: a setter and the conversions
27
- * behind `insert` and `update` are synchronous.
27
+ * behind `insert` and `update` are synchronous. `setHashAsync` runs it on
28
+ * the thread pool instead.
28
29
  */
29
30
  lock(locked_value: string | undefined, value: unknown): string | undefined;
31
+ /**
32
+ * What to assign to the field so that its setter stores the hash of `value`
33
+ * without running scrypt: the scrypt run happens here, on the thread pool.
34
+ * A value the setter handles without scrypt comes back as it is: nothing,
35
+ * the stored hash itself (`locked_value`, empty when nothing is stored), or
36
+ * any value of a field with an `algorithm`.
37
+ */
38
+ private lockAsync;
30
39
  test(locked_value: string | undefined, value: HashInput): boolean;
31
40
  /** {@link test} on the thread pool, without blocking the event loop. */
32
41
  testAsync(locked_value: string, value: HashInput): Promise<boolean>;
@@ -61,6 +70,22 @@ export declare class HashModifier extends OneWayModifier<string | undefined, [
61
70
  * @returns Whether the new value is identical to the original or not.
62
71
  */
63
72
  testHashAsync<This extends {}, F extends keyof This>(this: This, field: F, value: This[F]): Promise<boolean>;
73
+ /**
74
+ * Hash a value on the thread pool, then assign it to the field. The row
75
+ * stores what `this[field] = value` stores, in the same format, without
76
+ * blocking the event loop for the scrypt run. On a server, prefer it to
77
+ * assigning a hashed field. A field with another modifier beside
78
+ * {@link Hashed} is assigned at once, on the event loop. Calls on one row
79
+ * that overlap settle in the order their scrypt runs end: await each one.
80
+ *
81
+ * @param field - Name of the field to set.
82
+ * @param value - Value to hash and store.
83
+ *
84
+ * @returns Once the field holds the hash of `value`.
85
+ *
86
+ * @throws Error when `field` has no {@link Hashed} decorator.
87
+ */
88
+ setHashAsync<This extends object, F extends keyof This>(this: This, field: F, value: This[F]): Promise<void>;
64
89
  /**
65
90
  * Tell whether a stored hash needs writing again: it uses an older format
66
91
  * or cost. After a successful test, assign the tested value to the field
@@ -40,6 +40,24 @@ function scryptAsync(...[password, salt, keylen, options]) {
40
40
  });
41
41
  });
42
42
  }
43
+ /** A new salt and the scrypt arguments that derive the current hash of `candidate` with it. */
44
+ function currentScrypt(candidate) {
45
+ const salt = (0, node_crypto_1.randomBytes)(SALT_BYTES);
46
+ return {
47
+ salt,
48
+ run: scryptArgs(candidate, salt, KEY_BYTES, SCRYPT_COST),
49
+ };
50
+ }
51
+ function storedScrypt(salt, key) {
52
+ return `${CURRENT_PREFIX}${unpaddedBase64(salt)}$${unpaddedBase64(key)}`;
53
+ }
54
+ /** A stored hash derived ahead of the setter, which `lock` keeps as it is. */
55
+ class PrecomputedHash {
56
+ stored;
57
+ constructor(stored) {
58
+ this.stored = stored;
59
+ }
60
+ }
43
61
  function parseScrypt(stored) {
44
62
  const match = STORED_SCRYPT.exec(stored);
45
63
  if (!match)
@@ -97,13 +115,14 @@ function storedText(stored) {
97
115
  }
98
116
  function withHashedField(row, field, use) {
99
117
  const metaTable = (0, common_1.getMetadata)(row.constructor, common_2.ModifiersStaticMetadata);
100
- const entry = (0, records_1.fieldsByKey)(metaTable)[field]?.find(({ modifier }) => modifier instanceof HashModifier);
118
+ const list = (0, records_1.fieldsByKey)(metaTable)[field];
119
+ const entry = list?.find(({ modifier }) => modifier instanceof HashModifier);
101
120
  if (!entry || !(entry.modifier instanceof HashModifier)) {
102
121
  throw new Error(`Field ${String(field)} is not hashed`);
103
122
  }
104
123
  const internal = (0, records_1.getInternal)(row);
105
124
  const stored = (0, records_1.dataByKey)(internal)[field];
106
- return (0, records_1.withRef)(internal, entry.id, entry.modifier, entry.metaRef, (modifier) => use(modifier, (0, kinds_1.isString)(stored) ? stored : ""));
125
+ return (0, records_1.withRef)(internal, entry.id, entry.modifier, entry.metaRef, (modifier) => use(modifier, (0, kinds_1.isString)(stored) ? stored : "", list.length === 1));
107
126
  }
108
127
  /**
109
128
  * Hash modifier. enables the use of {@link Hashed} on table fields.
@@ -118,13 +137,17 @@ class HashModifier extends common_2.OneWayModifier {
118
137
  /**
119
138
  * Hashes a new value. Assigning the stored hash back keeps it as it is.
120
139
  * Blocks the event loop for one scrypt run: a setter and the conversions
121
- * behind `insert` and `update` are synchronous.
140
+ * behind `insert` and `update` are synchronous. `setHashAsync` runs it on
141
+ * the thread pool instead.
122
142
  */
123
143
  // oxlint-disable-next-line anti-slop/no-unknown-parameters -- overrides OneWayModifier.lock; a modified field's value has its table class's type, which the shared modifier chain cannot name
124
144
  lock(locked_value, value) {
125
145
  if (value === undefined) {
126
146
  return value;
127
147
  }
148
+ if (value instanceof PrecomputedHash) {
149
+ return value.stored;
150
+ }
128
151
  if (value === locked_value) {
129
152
  return locked_value;
130
153
  }
@@ -136,9 +159,24 @@ class HashModifier extends common_2.OneWayModifier {
136
159
  }
137
160
  return digestOf(algorithm, this.meta.salt, candidate);
138
161
  }
139
- const salt = (0, node_crypto_1.randomBytes)(SALT_BYTES);
140
- const key = (0, node_crypto_1.scryptSync)(...scryptArgs(candidate, salt, KEY_BYTES, SCRYPT_COST));
141
- return `${CURRENT_PREFIX}${unpaddedBase64(salt)}$${unpaddedBase64(key)}`;
162
+ const { salt, run } = currentScrypt(candidate);
163
+ return storedScrypt(salt, (0, node_crypto_1.scryptSync)(...run));
164
+ }
165
+ /**
166
+ * What to assign to the field so that its setter stores the hash of `value`
167
+ * without running scrypt: the scrypt run happens here, on the thread pool.
168
+ * A value the setter handles without scrypt comes back as it is: nothing,
169
+ * the stored hash itself (`locked_value`, empty when nothing is stored), or
170
+ * any value of a field with an `algorithm`.
171
+ */
172
+ async lockAsync(locked_value, value) {
173
+ if (value === undefined ||
174
+ (locked_value !== "" && value === locked_value) ||
175
+ this.options.algorithm) {
176
+ return value;
177
+ }
178
+ const { salt, run } = currentScrypt(JSON.stringify(value));
179
+ return new PrecomputedHash(storedScrypt(salt, await scryptAsync(...run)));
142
180
  }
143
181
  test(locked_value, value) {
144
182
  const check = this.plan(storedText(locked_value), value);
@@ -189,6 +227,25 @@ class HashModifier extends common_2.OneWayModifier {
189
227
  async testHashAsync(field, value) {
190
228
  return withHashedField(this, field, (modifier, stored) => modifier.testAsync(stored, value));
191
229
  }
230
+ /**
231
+ * Hash a value on the thread pool, then assign it to the field. The row
232
+ * stores what `this[field] = value` stores, in the same format, without
233
+ * blocking the event loop for the scrypt run. On a server, prefer it to
234
+ * assigning a hashed field. A field with another modifier beside
235
+ * {@link Hashed} is assigned at once, on the event loop. Calls on one row
236
+ * that overlap settle in the order their scrypt runs end: await each one.
237
+ *
238
+ * @param field - Name of the field to set.
239
+ * @param value - Value to hash and store.
240
+ *
241
+ * @returns Once the field holds the hash of `value`.
242
+ *
243
+ * @throws Error when `field` has no {@link Hashed} decorator.
244
+ */
245
+ async setHashAsync(field, value) {
246
+ const assigned = await withHashedField(this, field, (modifier, stored, alone) => alone ? modifier.lockAsync(stored, value) : value);
247
+ Reflect.set(this, field, assigned);
248
+ }
192
249
  /**
193
250
  * Tell whether a stored hash needs writing again: it uses an older format
194
251
  * or cost. After a successful test, assign the tested value to the field
@@ -1 +1 @@
1
- {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/modifiers/hash.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/modifiers/hash.ts"],"names":[],"mappings":"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"}
@@ -89,6 +89,25 @@ const AccountModel = (0, model_1.BasicDataModel)(Account, "hash_upgrade_accounts
89
89
  await expectVerifies(after);
90
90
  (0, chai_1.expect)(after.isHashOutdated("password")).to.equal(false);
91
91
  });
92
+ it("re-hashes with setHashAsync and saves it through a whole-row update", async () => {
93
+ const id = await storedRowFrom0_1_11();
94
+ const before = await reload(id);
95
+ await before.setHashAsync("password", hash_rows_1.PASSWORD);
96
+ await model.update(before);
97
+ const after = await reload(id);
98
+ (0, chai_1.expect)(after.password).to.match(/^\$scrypt\$ln=15,r=8,p=3\$/);
99
+ await expectVerifies(after);
100
+ (0, chai_1.expect)(after.isHashOutdated("password")).to.equal(false);
101
+ });
102
+ it("inserts a row whose hash setHashAsync wrote", async () => {
103
+ const account = new Account();
104
+ account.name = "Async";
105
+ await account.setHashAsync("password", hash_rows_1.PASSWORD);
106
+ const [id] = await model.insert(account);
107
+ const after = await reload(id);
108
+ (0, chai_1.expect)(after.password).to.equal(account.password);
109
+ await expectVerifies(after);
110
+ });
92
111
  it("re-hashes through a partial update of the hashed field", async () => {
93
112
  const id = await storedRowFrom0_1_11();
94
113
  await model.update(id, { password: hash_rows_1.PASSWORD });
@@ -1 +1 @@
1
- {"version":3,"file":"hash_upgrade.test.js","sourceRoot":"","sources":["../../src/tests/hash_upgrade.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hash_upgrade.test.js","sourceRoot":"","sources":["../../src/tests/hash_upgrade.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const chai_1 = require("chai");
13
+ const table_1 = require("../../table");
14
+ const common_1 = require("../../modifiers/common");
15
+ const hash_1 = require("../../modifiers/hash");
16
+ const localization_1 = require("../../modifiers/localization");
17
+ const hash_rows_1 = require("../helpers/hash-rows");
18
+ const WRONG_PASSWORD = "not the password";
19
+ const CURRENT_FORMAT = /^\$scrypt\$ln=15,r=8,p=3\$[A-Za-z0-9+/]{22}\$[A-Za-z0-9+/]{43}$/;
20
+ class Account extends table_1.Table.with(hash_1.HashModifier) {
21
+ }
22
+ __decorate([
23
+ (0, hash_1.Hashed)(),
24
+ (0, table_1.Field)("string"),
25
+ __metadata("design:type", String)
26
+ ], Account.prototype, "password", void 0);
27
+ __decorate([
28
+ (0, hash_1.Hashed)({ algorithm: "sha256" }),
29
+ (0, table_1.Field)("string"),
30
+ __metadata("design:type", String)
31
+ ], Account.prototype, "fingerprint", void 0);
32
+ __decorate([
33
+ (0, table_1.Field)("string"),
34
+ __metadata("design:type", String)
35
+ ], Account.prototype, "email", void 0);
36
+ function storedPassword(account) {
37
+ return (0, common_1.toDatabase)(account)._internal?.data.password;
38
+ }
39
+ function reloaded(account) {
40
+ return (0, common_1.fromDatabase)(structuredClone((0, common_1.toDatabase)(account)), Account);
41
+ }
42
+ async function expectTests(account, password) {
43
+ const pending = account.testHashAsync("password", password);
44
+ const matches = account.testHash("password", password);
45
+ (0, chai_1.expect)(await pending).to.equal(matches);
46
+ return matches;
47
+ }
48
+ /** The longest gap between two timer ticks while `work` runs, in ms. */
49
+ async function longestStallMs(work) {
50
+ let last = performance.now();
51
+ let longest = 0;
52
+ let ticking = true;
53
+ const tick = () => {
54
+ const now = performance.now();
55
+ longest = Math.max(longest, now - last);
56
+ last = now;
57
+ if (ticking)
58
+ setTimeout(tick, 1);
59
+ };
60
+ setTimeout(tick, 1);
61
+ await work();
62
+ await new Promise((resolve) => setTimeout(resolve, 5));
63
+ ticking = false;
64
+ return longest;
65
+ }
66
+ (0, hash_rows_1.scryptSuite)("Modifiers - hash - setHashAsync", () => {
67
+ for (const password of [hash_rows_1.PASSWORD, ""]) {
68
+ it(`keeps timers running while it hashes ${JSON.stringify(password)}, unlike an assignment`, async () => {
69
+ const blocked = await longestStallMs(async () => {
70
+ new Account().password = password;
71
+ });
72
+ const account = new Account();
73
+ const free = await longestStallMs(() => account.setHashAsync("password", password));
74
+ (0, chai_1.expect)(storedPassword(account)).to.match(CURRENT_FORMAT);
75
+ (0, chai_1.expect)(free).to.be.below(blocked / 2);
76
+ });
77
+ }
78
+ it("reads back what an assignment reads on a field another modifier holds floating", async () => {
79
+ class Content extends table_1.Table.with(hash_1.HashModifier, localization_1.LocalizationModifier) {
80
+ }
81
+ (0, localization_1.Localized)()(Content.prototype, "title");
82
+ (0, hash_1.Hashed)()(Content.prototype, "title");
83
+ const assigned = new Content();
84
+ assigned.title = hash_rows_1.PASSWORD;
85
+ const awaited = new Content();
86
+ await awaited.setHashAsync("title", hash_rows_1.PASSWORD);
87
+ (0, chai_1.expect)(awaited.title).to.equal(assigned.title);
88
+ (0, chai_1.expect)(JSON.stringify(awaited)).to.equal(JSON.stringify(assigned));
89
+ });
90
+ it("stores a hash that verifies the same way as an assigned one", async () => {
91
+ const assigned = new Account();
92
+ assigned.password = hash_rows_1.PASSWORD;
93
+ const awaited = new Account();
94
+ await awaited.setHashAsync("password", hash_rows_1.PASSWORD);
95
+ for (const account of [assigned, awaited].map(reloaded)) {
96
+ (0, chai_1.expect)(storedPassword(account)).to.match(CURRENT_FORMAT);
97
+ (0, chai_1.expect)(account.isHashOutdated("password")).to.equal(false);
98
+ (0, chai_1.expect)(await expectTests(account, hash_rows_1.PASSWORD)).to.equal(true);
99
+ (0, chai_1.expect)(await expectTests(account, WRONG_PASSWORD)).to.equal(false);
100
+ }
101
+ (0, chai_1.expect)(storedPassword(awaited)).to.not.equal(storedPassword(assigned));
102
+ });
103
+ it("replaces a stored hash and keeps it when given that hash back", async () => {
104
+ const account = new Account();
105
+ account.password = WRONG_PASSWORD;
106
+ await account.setHashAsync("password", hash_rows_1.PASSWORD);
107
+ const stored = storedPassword(account);
108
+ (0, chai_1.expect)(await expectTests(account, hash_rows_1.PASSWORD)).to.equal(true);
109
+ await account.setHashAsync("password", account.password);
110
+ (0, chai_1.expect)(storedPassword(account)).to.equal(stored);
111
+ });
112
+ it("clears the field when given undefined, like an assignment", async () => {
113
+ const account = new Account();
114
+ await account.setHashAsync("password", hash_rows_1.PASSWORD);
115
+ await account.setHashAsync("password", undefined);
116
+ (0, chai_1.expect)(storedPassword(account)).to.equal(undefined);
117
+ });
118
+ it("stores the digest an assignment stores on a field with an algorithm", async () => {
119
+ const account = new Account();
120
+ account.fingerprint = "first";
121
+ await account.setHashAsync("fingerprint", "second");
122
+ const viaAsync = (0, common_1.toDatabase)(account)._internal?.data.fingerprint;
123
+ account.fingerprint = "second";
124
+ (0, chai_1.expect)(viaAsync).to.equal((0, common_1.toDatabase)(account)._internal?.data.fingerprint);
125
+ });
126
+ it("rejects a field that is not hashed", async () => {
127
+ const error = await new Account()
128
+ .setHashAsync("email", "a@example.test")
129
+ .then(() => undefined, (reason) => reason);
130
+ (0, chai_1.expect)(error)
131
+ .to.be.an("error")
132
+ .with.property("message", "Field email is not hashed");
133
+ });
134
+ });
135
+ //# sourceMappingURL=hash_async_set.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash_async_set.test.js","sourceRoot":"","sources":["../../../src/tests/modifiers/hash_async_set.test.ts"],"names":[],"mappings":"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"}
@@ -91,7 +91,8 @@ class User extends Table.with(HashModifier) {
91
91
 
92
92
  - The field hashes the value encoded as JSON, so `"secret"` is hashed as the text `"\"secret\""`.
93
93
  - Each write draws a random 16-byte salt and stores `$scrypt$ln=15,r=8,p=3$<salt>$<key>`. The salt and the 32-byte key are base64 without padding. `ln` is the base-2 logarithm of the scrypt cost N, so N is 32768. The string holds the parameters, the salt, and the key, so the cost can change later.
94
- - A write is synchronous, because a property setter cannot wait, and so are the conversions behind a model's `insert` and `update`. Each assignment blocks the event loop for one scrypt run, which uses 32 MiB (128 × N × r bytes).
94
+ - An assignment is synchronous, because a property setter cannot wait, and so are the conversions behind a model's `insert` and `update` of plain data. Each assignment blocks the event loop for one scrypt run, about 150 ms, which uses 32 MiB (128 × N × r bytes).
95
+ - `setHashAsync` runs that scrypt run on the thread pool, then assigns the result. It stores the same format as an assignment, so rows written either way verify the same way.
95
96
  - Assigning the stored hash back to the field, or calling `lock` on a loaded row, keeps the hash as it is. Assigning `undefined` stores nothing.
96
97
  - `testHash` and `testHashAsync` read `ln`, `r`, `p`, the salt, and the key from the stored string. They derive a key of the stored key's length from the candidate and compare the two with `crypto.timingSafeEqual`, in constant time.
97
98
  - A stored scrypt string verifies only within these limits: `ln`, `r`, and `p` from 1 to 99, at most 128 MiB of memory, `p` at most 16, `ln` below 16 × `r`, and a salt and a key of 16 to 64 bytes each. A string outside them refuses every candidate.
@@ -112,21 +113,33 @@ The `HashModifier` mixin adds these methods to table instances:
112
113
  ```typescript fragment
113
114
  testHash<This extends {}, F extends keyof This>(this: This, field: F, value: This[F]): boolean
114
115
  testHashAsync<This extends {}, F extends keyof This>(this: This, field: F, value: This[F]): Promise<boolean>
116
+ setHashAsync<This extends object, F extends keyof This>(this: This, field: F, value: This[F]): Promise<void>
115
117
  isHashOutdated<This extends {}>(this: This, field: keyof This): boolean
116
118
  ```
117
119
 
120
+ - `setHashAsync` hashes `value` on the thread pool and resolves once the field holds the hash, as `row[field] = value` would leave it. Use it on a server for every write of a scrypt field, such as a signup or a password change, then save the row instance with the model. It rejects with `Field <name> is not hashed` for a field without `@Hashed`. On a field with an `algorithm`, it assigns at once, because a digest is fast. On a field with another modifier beside `@Hashed`, it also assigns at once, on the event loop. Calls on one row that overlap settle in the order their scrypt runs end, so await each one before the next.
121
+
122
+ ```typescript fragment
123
+ const user = new User();
124
+ user.email = email;
125
+ await user.setHashAsync("password", password);
126
+ await userModel.insert(user);
127
+ ```
128
+
129
+ `userModel.insert({ email, password })` and `userModel.update(id, { password })` still hash on the event loop, because they convert plain data through the setter.
130
+
118
131
  - `testHashAsync` resolves whether `value` matches the stored hash. It runs scrypt on the thread pool, so use it on a server. It rejects with `Field <name> is not hashed` for a field without `@Hashed`.
119
132
  - `testHash` gives the same result and blocks the event loop while scrypt runs. It throws `Field <name> is not hashed` for a field without `@Hashed`.
120
133
  - `isHashOutdated` returns whether the stored hash differs from what the field writes today, which is any stored string that does not start with `$scrypt$ln=15,r=8,p=3$`. It returns `false` when nothing is stored, and always on a field with an `algorithm`. It throws `Field <name> is not hashed` for a field without `@Hashed`.
121
134
 
122
135
  #### Upgrade stored hashes
123
136
 
124
- A row whose hash has another format still verifies. On a field without an `algorithm`, a string that is not a scrypt hash is tested as a salted SHA-256 digest, made with the salt in `_internal.meta.HashModifier.salt`, and `isHashOutdated` returns `true` for it. A scrypt hash of another cost verifies with its own parameters and is flagged too. To rewrite a flagged hash, assign the value after a successful test, because only then is the plaintext known:
137
+ A row whose hash has another format still verifies. On a field without an `algorithm`, a string that is not a scrypt hash is tested as a salted SHA-256 digest, made with the salt in `_internal.meta.HashModifier.salt`, and `isHashOutdated` returns `true` for it. A scrypt hash of another cost verifies with its own parameters and is flagged too. To rewrite a flagged hash, set the value after a successful test, because only then is the plaintext known:
125
138
 
126
139
  ```typescript fragment
127
140
  if (await user.testHashAsync("password", password)) {
128
141
  if (user.isHashOutdated("password")) {
129
- user.password = password;
142
+ await user.setHashAsync("password", password);
130
143
  await userModel.update(user);
131
144
  }
132
145
  }
@@ -424,6 +437,16 @@ class MyContainerModifier extends ContainerModifier<{}, { fallback?: string }> {
424
437
  }
425
438
  ```
426
439
 
440
+ ### Attach a modifier
441
+
442
+ A decorator attaches its modifier with `attachModifier(target.constructor, Modifier, propertyKey, options)`, as the examples above do. TypeScript checks `options` against the modifier's options type. It does not check that the field names a member of the class.
443
+
444
+ A modifier with `lock` replaces the field with an accessor that routes reads and writes through the field's modifiers. `attachModifier` throws an `Error` when such a modifier goes on `constructor` or `__proto__`, or on a field that already has a one-way modifier. A modifier without `lock` only handles events, and the field keeps its plain value.
445
+
446
+ ### Read a modified field in a query
447
+
448
+ `unlockrequest(table, row, field, modifiers)` reads a field unlocked inside a database query. It reads `table` only for its modifier metadata. Each two-way modifier on the field passes the stored value through its own `unlockrequest()`, with the arguments that `modifiers` gives for it by class name. A field with only one-way modifiers yields its stored value as it is. `unlockrequest` throws a `TypeError` when `modifiers` has no entry for a two-way modifier on the field. TypeScript checks that `field` is a key of the row, not each entry's arguments.
449
+
427
450
  ## Modifier events
428
451
 
429
452
  A modifier hooks into a row's lifecycle through methods named after events. The engine calls each one with the modifier as `this`, then the table instance, the field name, and the event's arguments:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antelopejs/interface-database-decorators",
3
- "version": "0.2.2",
3
+ "version": "0.3.0",
4
4
  "description": "AntelopeJS decorators for database tables and typed data models, with encrypted, hashed and localized fields",
5
5
  "keywords": [
6
6
  "antelopejs",
@@ -124,7 +124,7 @@
124
124
  "lint:fix": "oxlint --fix",
125
125
  "lint": "oxlint",
126
126
  "prepack": "pnpm run build",
127
- "release": "pnpm run lint && pnpm run prepack && release-it",
127
+ "release": "pnpm run typecheck && pnpm run lint && pnpm run prepack && release-it",
128
128
  "test": "pnpm run build && ajs module test .",
129
129
  "format:check": "oxfmt --check .",
130
130
  "knip": "knip",
@@ -146,7 +146,7 @@
146
146
  "@antelopejs/interface-api": "^0.0.15",
147
147
  "@antelopejs/interface-core": "^0.4.0",
148
148
  "@antelopejs/interface-database": "^0.3.0",
149
- "@antelopejs/tooling-configs": "^0.4.0",
149
+ "@antelopejs/tooling-configs": "^0.5.1",
150
150
  "@types/chai": "^4.3.20",
151
151
  "@types/mocha": "^10.0.10",
152
152
  "@types/node": "^22.19.15",
@@ -110,7 +110,7 @@ class Chef extends Table.with(
110
110
  EncryptionModifier,
111
111
  LocalizationModifier,
112
112
  ) {
113
- @Hashed() declare passphrase: string; // one-way scrypt; test via await instance.testHashAsync("passphrase", value)
113
+ @Hashed() declare passphrase: string; // one-way scrypt; set via await instance.setHashAsync("passphrase", value), test via await instance.testHashAsync("passphrase", value)
114
114
  @Encrypted({ secretKey }) declare supplierCode: string; // transparent encrypt/decrypt (autolock + autounlock)
115
115
  @Localized() declare motto: string; // read AND write via instance.localize("en", ["motto"])
116
116
  @CreationTime() declare hiredAt: Date; // set on insert, stripped from updates
@@ -125,7 +125,8 @@ class Chef extends Table.with(
125
125
  - `Hashed`, `Encrypted`, and `Localized` require the matching modifier class in `Table.with(...)`; `CreationTime`/`UpdateTime` are event-only and need no mixin.
126
126
  - Modifier ordering matters: `attachModifier` throws if you stack a modifier after a one-way modifier (e.g. anything after `@Hashed` on the same field).
127
127
  - Hashed fields cannot be read back or queried directly — only equality-tested with `testHashAsync`, or `testHash`, which blocks the event loop for one scrypt run.
128
- - A row can hold an older hash that still verifies. After a successful test, when `instance.isHashOutdated(field)` is true, assign the tested value and save the row.
128
+ - On a server, write a scrypt field with `await instance.setHashAsync(field, value)`, then insert or update the instance. Assigning the field, or passing it in plain data to `insert` or `update`, blocks the event loop for one scrypt run (about 150 ms).
129
+ - A row can hold an older hash that still verifies. After a successful test, when `instance.isHashOutdated(field)` is true, `await instance.setHashAsync(field, value)` with the tested value and save the row.
129
130
  - `@Hashed({ algorithm })` stores a fast digest instead of scrypt: use it only for non-secret fingerprints, never for credentials.
130
131
  - Localized fields must be written through a localized instance (`instance.localize(locale).field = ...`);
131
132
  values assigned before `localize()` are held in floating state and silently dropped on insert/update.