Skip to content

Commit b68e814

Browse files
committed
fix: Remove v1+v2, defaulting to v1, and expand table interface
1 parent a475494 commit b68e814

20 files changed

+325
-434
lines changed

config-root.schema.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@
288288
"type": "boolean",
289289
"description": "Attempt fail-over to different node when unreachable. Default: true"
290290
},
291-
"shard": { "type": "integer", "description": "Shard id for this instance." },
291+
"shard": { "type": ["integer", "null"], "description": "Shard id for this instance." },
292292
"logging": { "$ref": "#/definitions/loggerConfig" }
293293
}
294294
},

index.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ export type {
1313
SubscriptionRequest,
1414
RequestTargetOrId,
1515
} from './resources/ResourceInterface.ts';
16-
export { ResourceInterface } from './resources/ResourceInterface.ts';
16+
export type { ResourceInterface, ResourceStaticInterface } from './resources/ResourceInterface.ts';
17+
export type { TableInterface, TableStaticInterface } from './resources/TableInterface.ts';
1718
export type { User } from './security/user.ts';
1819
export type { RecordObject } from './resources/RecordEncoder.ts';
1920
export type { IterableEventQueue } from './resources/IterableEventQueue.ts';

index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ exports.RequestTarget = undefined;
2222
exports.RequestTargetOrId = undefined;
2323
exports.Resource = undefined;
2424
exports.ResourceInterface = undefined;
25+
exports.ResourceStaticInterface = undefined;
2526
exports.Scope = undefined;
2627
exports.Session = undefined;
2728
exports.SourceContext = undefined;
2829
exports.SubscriptionRequest = undefined;
29-
exports.Table = undefined;
30+
exports.TableInterface = undefined;
31+
exports.TableStaticInterface = undefined;
3032
exports.User = undefined;
3133

3234
// these are all overwritten by the globals, but need to be here so that Node's static

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
"bin": {
2222
"harper": "./dist/bin/harper.js"
2323
},
24+
"exports": {
25+
".": "./index.js"
26+
},
2427
"files": [
2528
"dist",
2629
"bin",
@@ -111,9 +114,6 @@
111114
"onFail": "error"
112115
}
113116
},
114-
"exports": {
115-
".": "./dist/index.js"
116-
},
117117
"devDependencies": {
118118
"@harperdb/code-guidelines": "^0.0.6",
119119
"@types/fs-extra": "^11.0.4",

resources/DatabaseInterface.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import type { RocksDatabase } from '@harperfast/rocksdb-js';
2+
import type { Database, RootDatabase } from 'lmdb';
3+
4+
export interface LMDBDatabase extends Database {
5+
customIndex?: any;
6+
isIndexing?: boolean;
7+
indexNulls?: boolean;
8+
}
9+
10+
export interface LMDBRootDatabase extends RootDatabase {
11+
auditStore?: LMDBRootDatabase;
12+
databaseName?: string;
13+
dbisDb?: LMDBDatabase;
14+
isLegacy?: boolean;
15+
needsDeletion?: boolean;
16+
path?: string;
17+
status?: 'open' | 'closed';
18+
}
19+
20+
export interface RocksDatabaseEx extends RocksDatabase {
21+
customIndex?: any;
22+
env: Record<string, any>;
23+
isLegacy?: boolean;
24+
isIndexing?: boolean;
25+
indexNulls?: boolean;
26+
getEntry?: (id: string | number | (string | number)[] | Buffer, options?: any) => { value: any };
27+
}
28+
29+
export interface RocksRootDatabase extends RocksDatabaseEx {
30+
auditStore?: RocksDatabaseEx;
31+
databaseName?: string;
32+
dbisDb?: RocksDatabaseEx;
33+
}
34+
35+
export type DBI =
36+
| LMDBDatabase
37+
| (RocksDatabase & {
38+
customIndex?: any;
39+
isIndexing?: boolean;
40+
indexNulls?: boolean;
41+
rootStore?: RocksRootDatabase;
42+
});

resources/Resource.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import type { ExtendedIterable } from '@harperfast/extended-iterable';
12
import type { User } from '../security/user.ts';
23
import type { RecordObject } from './RecordEncoder.js';
3-
import {
4+
import type {
45
ResourceInterface,
56
SubscriptionRequest,
67
Id,
@@ -314,10 +315,10 @@ export class Resource<Record extends object = any> implements ResourceInterface<
314315
static coerceId(id: string): number | string {
315316
return id;
316317
}
317-
static parseQuery(search, query) {
318+
static parseQuery(search: string, query: RequestTarget): RequestTarget | Query | URLSearchParams | undefined {
318319
return parseQuery(search, query);
319320
}
320-
static parsePath(path, context, query) {
321+
static parsePath(path: string, context: Context, query: URLSearchParams) {
321322
const dotIndex = path.indexOf('.');
322323
if (dotIndex > -1) {
323324
// handle paths of the form /path/id.property
@@ -436,7 +437,7 @@ export class Resource<Record extends object = any> implements ResourceInterface<
436437
| AsyncIterable<Record & Partial<RecordObject>>
437438
| Promise<AsyncIterable<Record & Partial<RecordObject>>>;
438439

439-
search?(target: RequestTargetOrId): AsyncIterable<Record & Partial<RecordObject>>;
440+
search?(target: RequestTargetOrId): ExtendedIterable<Record & Partial<RecordObject>>;
440441

441442
create?(
442443
newRecord: Partial<Record & RecordObject>,

resources/ResourceInterface.ts

Lines changed: 76 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,106 @@
1+
import type { ExtendedIterable } from '@harperfast/extended-iterable';
12
import type { User } from '../security/user.ts';
23
import type { OperationFunctionName } from '../server/serverHelpers/serverUtilities.ts';
3-
import { DatabaseTransaction } from './DatabaseTransaction.ts';
4-
import { IterableEventQueue } from './IterableEventQueue.ts';
4+
import type { DatabaseTransaction } from './DatabaseTransaction.ts';
5+
import type { IterableEventQueue } from './IterableEventQueue.ts';
56
import type { Entry, RecordObject } from './RecordEncoder.ts';
6-
import { RequestTarget } from './RequestTarget.ts';
7+
import type { RequestTarget } from './RequestTarget.ts';
78

89
export interface ResourceInterface<Record extends object = any>
910
extends Partial<RecordObject>, Pick<UpdatableRecord<Record>, 'addTo' | 'subtractFrom'> {
11+
allowCreate(user: User, record: Promise<Record & RecordObject>, context: Context): boolean | Promise<boolean>;
12+
create(newRecord: Partial<Record & RecordObject>, target: RequestTargetOrId): Promise<Record & Partial<RecordObject>>;
13+
post(target: RequestTargetOrId, newRecord: Partial<Record & RecordObject>): Promise<Record & Partial<RecordObject>>;
14+
1015
allowRead(user: User, target: RequestTarget, context: Context): boolean | Promise<boolean>;
11-
get?(
16+
get(
1217
target?: RequestTargetOrId
13-
):
14-
| (Record & Partial<RecordObject>)
15-
| Promise<Record & Partial<RecordObject>>
16-
| AsyncIterable<Record & Partial<RecordObject>>
17-
| Promise<AsyncIterable<Record & Partial<RecordObject>>>;
18-
search?(target: RequestTarget): AsyncIterable<Record & Partial<RecordObject>>;
19-
20-
allowCreate(user: User, record: Promise<Record & RecordObject>, context: Context): boolean | Promise<boolean>;
21-
create?(
22-
newRecord: Partial<Record & RecordObject>,
23-
target: RequestTargetOrId
24-
): void | (Record & Partial<RecordObject>) | Promise<Record & Partial<RecordObject>>;
25-
post?(
26-
target: RequestTargetOrId,
27-
newRecord: Partial<Record & RecordObject>
28-
): void | (Record & Partial<RecordObject>) | Promise<Record & Partial<RecordObject>>;
18+
): Promise<Record & Partial<RecordObject>> | ExtendedIterable<Record & Partial<RecordObject>>;
19+
search(target: RequestTarget): ExtendedIterable<Record & Partial<RecordObject>>;
2920

3021
allowUpdate(user: User, record: Promise<Record & RecordObject>, context: Context): boolean | Promise<boolean>;
31-
put?(
32-
record: Record & RecordObject,
33-
target: RequestTargetOrId
34-
): void | (Record & Partial<RecordObject>) | Promise<void | (Record & Partial<RecordObject>)>;
35-
patch?(
36-
record: Partial<Record & RecordObject>,
37-
target: RequestTargetOrId
38-
): void | (Record & Partial<RecordObject>) | Promise<void | (Record & Partial<RecordObject>)>;
39-
update?(updates: Record & RecordObject, fullUpdate: true): ResourceInterface<Record & Partial<RecordObject>>;
40-
update?(
22+
update(updates: Record & RecordObject, fullUpdate: true): ResourceInterface<Record & Partial<RecordObject>>;
23+
update(
4124
updates: Partial<Record & RecordObject>,
4225
fullUpdate?: boolean
4326
):
4427
| ResourceInterface<Record & Partial<RecordObject>>
4528
| Promise<ResourceInterface<Record & Partial<RecordObject>> | UpdatableRecord<Record & Partial<RecordObject>>>;
29+
put(record: Record & RecordObject, target?: RequestTargetOrId): Promise<void>;
30+
patch(record: Partial<Record & RecordObject>, target: RequestTargetOrId): Promise<void>;
4631

4732
allowDelete(user: User, target: RequestTarget, context: Context): boolean | Promise<boolean>;
48-
delete?(target: RequestTargetOrId): boolean | Promise<boolean>;
33+
delete(target: RequestTargetOrId): Promise<boolean>;
4934

5035
invalidate(target: RequestTargetOrId): void | Promise<void>;
5136

52-
publish?(target: RequestTargetOrId, record: Record, options?: any): void;
53-
subscribe?(request: SubscriptionRequest): AsyncIterable<Record> | Promise<AsyncIterable<Record>>;
37+
subscribe(request: SubscriptionRequest): AsyncIterable<Record> | Promise<AsyncIterable<Record>>;
38+
publish(target: RequestTargetOrId, record: Record, options?: any): void;
5439

5540
doesExist(): boolean;
5641
wasLoadedFromSource(): boolean | void;
5742

5843
getCurrentUser(): User | undefined;
5944
}
6045

46+
export interface ResourceStaticInterface<Record extends object = any> {
47+
new (identifier?: Id, source?: ResourceStaticInterface<Record>): ResourceInterface<Record>;
48+
49+
loadAsInstance?: boolean;
50+
51+
getNewId(): Id;
52+
coerceId(id: Id): Id;
53+
54+
create(idPrefix: Id, record: Record, context: Context): Promise<Id>;
55+
create(record: Record, context: Context): Promise<Id>;
56+
create(idPrefix: any, record: Record, context?: Context): Promise<Id>;
57+
post(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): Promise<Record>;
58+
post(target: RequestTargetOrId, dataOrContext?: Record[] | Context, context?: Context): Promise<Record>;
59+
post(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): Promise<Record>;
60+
61+
get(
62+
target: RequestTargetOrId,
63+
dataOrContext?: Record | Context,
64+
context?: Context
65+
): Promise<Record> | ExtendedIterable<Record>;
66+
search(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): ExtendedIterable<Record>;
67+
query(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): ExtendedIterable<Record>;
68+
69+
update(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): Promise<Record>;
70+
put(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): Promise<void>;
71+
put(target: RequestTargetOrId, dataOrContext?: Record[] | Context, context?: Context): Promise<void>;
72+
patch(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): Promise<void>;
73+
74+
delete(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): Promise<void>;
75+
76+
invalidate(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): Promise<Record> | Record;
77+
78+
connect(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): IterableEventQueue;
79+
subscribe(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): AsyncIterable<Record>;
80+
publish(target: RequestTargetOrId, dataOrContext?: Record | Context, context?: Context): void;
81+
82+
copy(
83+
target: RequestTargetOrId,
84+
dataOrContext?: Record | Context,
85+
context?: Context
86+
): Promise<Record> | Record | void | Promise<void>;
87+
move(
88+
target: RequestTargetOrId,
89+
dataOrContext?: Record | Context,
90+
context?: Context
91+
): Promise<Record> | Record | void | Promise<void>;
92+
93+
parseQuery(search: string, query: RequestTarget): RequestTarget | Query | URLSearchParams | undefined;
94+
parsePath(path: string, context: Context, query: URLSearchParams): string | { property: string; id: string };
95+
isCollection: boolean;
96+
97+
getResource(
98+
target: RequestTargetOrId,
99+
request: Context | SourceContext,
100+
resourceOptions: any
101+
): Promise<ResourceInterface> | ResourceInterface;
102+
}
103+
61104
export interface Session {
62105
id?: any;
63106
user?: User;

resources/ResourceInterfaceV2.ts

Lines changed: 0 additions & 53 deletions
This file was deleted.

resources/ResourceV2.ts

Lines changed: 0 additions & 67 deletions
This file was deleted.

resources/RocksIndexStore.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
type StorePutOptions,
77
type StoreRemoveOptions,
88
} from '@harperfast/rocksdb-js';
9-
import { Id } from './ResourceInterface.ts';
9+
import type { Id } from './ResourceInterface.ts';
1010
import { MAXIMUM_KEY } from 'ordered-binary';
1111

1212
declare module '@harperfast/rocksdb-js' {

0 commit comments

Comments
 (0)