@atproto/bsync 0.0.25 → 0.0.26-next.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/CHANGELOG.md +18 -0
- package/bin/migration-create.ts +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +7 -12
- package/dist/client.js.map +1 -1
- package/dist/config.js +16 -24
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +6 -6
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +8 -36
- package/dist/context.js.map +1 -1
- package/dist/db/index.d.ts +6 -4
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +26 -101
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations/20240108T220751294Z-init.js +4 -8
- package/dist/db/migrations/20240108T220751294Z-init.js.map +1 -1
- package/dist/db/migrations/20240717T224303472Z-notif-ops.js +4 -8
- package/dist/db/migrations/20240717T224303472Z-notif-ops.js.map +1 -1
- package/dist/db/migrations/20250527T022203400Z-add-operation.js +5 -9
- package/dist/db/migrations/20250527T022203400Z-add-operation.js.map +1 -1
- package/dist/db/migrations/20250603T163446567Z-alter-operation.js +2 -6
- package/dist/db/migrations/20250603T163446567Z-alter-operation.js.map +1 -1
- package/dist/db/migrations/index.d.ts +4 -4
- package/dist/db/migrations/index.d.ts.map +1 -1
- package/dist/db/migrations/index.js +4 -40
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/migrations/provider.js +2 -11
- package/dist/db/migrations/provider.js.map +1 -1
- package/dist/db/schema/index.d.ts +5 -5
- package/dist/db/schema/index.d.ts.map +1 -1
- package/dist/db/schema/index.js +1 -2
- package/dist/db/schema/index.js.map +1 -1
- package/dist/db/schema/mute_item.js +1 -4
- package/dist/db/schema/mute_item.js.map +1 -1
- package/dist/db/schema/mute_op.d.ts +1 -1
- package/dist/db/schema/mute_op.d.ts.map +1 -1
- package/dist/db/schema/mute_op.js +2 -5
- package/dist/db/schema/mute_op.js.map +1 -1
- package/dist/db/schema/notif_item.js +1 -4
- package/dist/db/schema/notif_item.js.map +1 -1
- package/dist/db/schema/notif_op.js +2 -5
- package/dist/db/schema/notif_op.js.map +1 -1
- package/dist/db/schema/operation.d.ts +2 -2
- package/dist/db/schema/operation.d.ts.map +1 -1
- package/dist/db/schema/operation.js +2 -5
- package/dist/db/schema/operation.js.map +1 -1
- package/dist/db/types.d.ts +3 -1
- package/dist/db/types.d.ts.map +1 -1
- package/dist/db/types.js +1 -2
- package/dist/db/types.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -88
- package/dist/index.js.map +1 -1
- package/dist/logger.js +8 -11
- package/dist/logger.js.map +1 -1
- package/dist/proto/bsync_connect.d.ts +1 -1
- package/dist/proto/bsync_connect.d.ts.map +1 -1
- package/dist/proto/bsync_connect.js +27 -30
- package/dist/proto/bsync_connect.js.map +1 -1
- package/dist/proto/bsync_pb.js +215 -747
- package/dist/proto/bsync_pb.js.map +1 -1
- package/dist/routes/add-mute-operation.d.ts +2 -2
- package/dist/routes/add-mute-operation.d.ts.map +1 -1
- package/dist/routes/add-mute-operation.js +28 -30
- package/dist/routes/add-mute-operation.js.map +1 -1
- package/dist/routes/add-notif-operation.d.ts +2 -2
- package/dist/routes/add-notif-operation.d.ts.map +1 -1
- package/dist/routes/add-notif-operation.js +14 -16
- package/dist/routes/add-notif-operation.js.map +1 -1
- package/dist/routes/auth.d.ts +1 -1
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +4 -8
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/delete-operations.d.ts +2 -2
- package/dist/routes/delete-operations.d.ts.map +1 -1
- package/dist/routes/delete-operations.js +11 -13
- package/dist/routes/delete-operations.js.map +1 -1
- package/dist/routes/index.d.ts +1 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +19 -24
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/put-operation.d.ts +2 -2
- package/dist/routes/put-operation.d.ts.map +1 -1
- package/dist/routes/put-operation.js +25 -27
- package/dist/routes/put-operation.js.map +1 -1
- package/dist/routes/scan-mute-operations.d.ts +2 -2
- package/dist/routes/scan-mute-operations.d.ts.map +1 -1
- package/dist/routes/scan-mute-operations.js +13 -15
- package/dist/routes/scan-mute-operations.js.map +1 -1
- package/dist/routes/scan-notif-operations.d.ts +2 -2
- package/dist/routes/scan-notif-operations.d.ts.map +1 -1
- package/dist/routes/scan-notif-operations.js +13 -15
- package/dist/routes/scan-notif-operations.js.map +1 -1
- package/dist/routes/scan-operations.d.ts +2 -2
- package/dist/routes/scan-operations.d.ts.map +1 -1
- package/dist/routes/scan-operations.js +13 -15
- package/dist/routes/scan-operations.js.map +1 -1
- package/dist/routes/util.js +12 -20
- package/dist/routes/util.js.map +1 -1
- package/{jest.config.js → jest.config.cjs} +8 -1
- package/package.json +14 -9
- package/src/client.ts +1 -1
- package/src/context.ts +7 -7
- package/src/db/index.ts +12 -8
- package/src/db/migrations/index.ts +4 -4
- package/src/db/schema/index.ts +5 -5
- package/src/db/schema/mute_op.ts +1 -1
- package/src/db/schema/operation.ts +2 -2
- package/src/db/types.ts +3 -1
- package/src/index.ts +17 -13
- package/src/proto/bsync_connect.ts +1 -1
- package/src/routes/add-mute-operation.ts +10 -7
- package/src/routes/add-notif-operation.ts +7 -7
- package/src/routes/auth.ts +1 -1
- package/src/routes/delete-operations.ts +5 -5
- package/src/routes/index.ts +9 -9
- package/src/routes/put-operation.ts +11 -8
- package/src/routes/scan-mute-operations.ts +6 -6
- package/src/routes/scan-notif-operations.ts +6 -6
- package/src/routes/scan-operations.ts +6 -6
- package/tests/delete-operations.test.ts +2 -2
- package/tests/mutes.test.ts +2 -2
- package/tests/notifications.test.ts +2 -2
- package/tests/operations.test.ts +2 -2
- package/tsconfig.build.json +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/tsconfig.tests.json +1 -1
package/dist/routes/util.js
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const connect_1 = require("@connectrpc/connect");
|
|
5
|
-
const syntax_1 = require("@atproto/syntax");
|
|
6
|
-
const validCursor = (cursor) => {
|
|
1
|
+
import { Code, ConnectError } from '@connectrpc/connect';
|
|
2
|
+
import { InvalidDidError, ensureValidAtUri, ensureValidDid, ensureValidNsid, } from '@atproto/syntax';
|
|
3
|
+
export const validCursor = (cursor) => {
|
|
7
4
|
if (cursor === '')
|
|
8
5
|
return null;
|
|
9
6
|
const int = parseInt(cursor, 10);
|
|
10
7
|
if (isNaN(int) || int < 0) {
|
|
11
|
-
throw new
|
|
8
|
+
throw new ConnectError('invalid cursor', Code.InvalidArgument);
|
|
12
9
|
}
|
|
13
10
|
return int;
|
|
14
11
|
};
|
|
15
|
-
|
|
16
|
-
const combineSignals = (a, b) => {
|
|
12
|
+
export const combineSignals = (a, b) => {
|
|
17
13
|
const controller = new AbortController();
|
|
18
14
|
for (const signal of [a, b]) {
|
|
19
15
|
if (signal.aborted) {
|
|
@@ -27,40 +23,36 @@ const combineSignals = (a, b) => {
|
|
|
27
23
|
}
|
|
28
24
|
return controller.signal;
|
|
29
25
|
};
|
|
30
|
-
|
|
31
|
-
const isValidDid = (did) => {
|
|
26
|
+
export const isValidDid = (did) => {
|
|
32
27
|
try {
|
|
33
|
-
|
|
28
|
+
ensureValidDid(did);
|
|
34
29
|
return true;
|
|
35
30
|
}
|
|
36
31
|
catch (err) {
|
|
37
|
-
if (err instanceof
|
|
32
|
+
if (err instanceof InvalidDidError) {
|
|
38
33
|
return false;
|
|
39
34
|
}
|
|
40
35
|
throw err;
|
|
41
36
|
}
|
|
42
37
|
};
|
|
43
|
-
|
|
44
|
-
const isValidAtUri = (uri) => {
|
|
38
|
+
export const isValidAtUri = (uri) => {
|
|
45
39
|
try {
|
|
46
|
-
|
|
40
|
+
ensureValidAtUri(uri);
|
|
47
41
|
return true;
|
|
48
42
|
}
|
|
49
43
|
catch {
|
|
50
44
|
return false;
|
|
51
45
|
}
|
|
52
46
|
};
|
|
53
|
-
|
|
54
|
-
const validateNamespace = (namespace) => {
|
|
47
|
+
export const validateNamespace = (namespace) => {
|
|
55
48
|
const parts = namespace.split('#');
|
|
56
49
|
if (parts.length !== 1 && parts.length !== 2) {
|
|
57
50
|
throw new Error('namespace must be in the format "nsid[#fragment]"');
|
|
58
51
|
}
|
|
59
52
|
const [nsid, fragment] = parts;
|
|
60
|
-
|
|
53
|
+
ensureValidNsid(nsid);
|
|
61
54
|
if (fragment && !/^[a-zA-Z][a-zA-Z0-9]*$/.test(fragment)) {
|
|
62
55
|
throw new Error('namespace fragment must be a valid identifier');
|
|
63
56
|
}
|
|
64
57
|
};
|
|
65
|
-
exports.validateNamespace = validateNamespace;
|
|
66
58
|
//# sourceMappingURL=util.js.map
|
package/dist/routes/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/routes/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/routes/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,iBAAiB,CAAA;AAExB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAc,EAAiB,EAAE;IAC3D,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAChC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAc,EAAE,CAAc,EAAE,EAAE;IAC/D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,UAAU,CAAC,KAAK,EAAE,CAAA;YAClB,OAAO,MAAM,CAAA;QACf,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACtE,2EAA2E;YAC3E,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAA;AAC1B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;IACxC,IAAI,CAAC;QACH,cAAc,CAAC,GAAG,CAAC,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;YACnC,OAAO,KAAK,CAAA;QACd,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,gBAAgB,CAAC,GAAG,CAAC,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAQ,EAAE;IAC3D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAElC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACtE,CAAC;IAED,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAA;IAE9B,eAAe,CAAC,IAAI,CAAC,CAAA;IACrB,IAAI,QAAQ,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAClE,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { Code, ConnectError } from '@connectrpc/connect'\nimport {\n InvalidDidError,\n ensureValidAtUri,\n ensureValidDid,\n ensureValidNsid,\n} from '@atproto/syntax'\n\nexport const validCursor = (cursor: string): number | null => {\n if (cursor === '') return null\n const int = parseInt(cursor, 10)\n if (isNaN(int) || int < 0) {\n throw new ConnectError('invalid cursor', Code.InvalidArgument)\n }\n return int\n}\n\nexport const combineSignals = (a: AbortSignal, b: AbortSignal) => {\n const controller = new AbortController()\n for (const signal of [a, b]) {\n if (signal.aborted) {\n controller.abort()\n return signal\n }\n signal.addEventListener('abort', () => controller.abort(signal.reason), {\n // @ts-ignore https://github.com/DefinitelyTyped/DefinitelyTyped/pull/68625\n signal: controller.signal,\n })\n }\n return controller.signal\n}\n\nexport const isValidDid = (did: string) => {\n try {\n ensureValidDid(did)\n return true\n } catch (err) {\n if (err instanceof InvalidDidError) {\n return false\n }\n throw err\n }\n}\n\nexport const isValidAtUri = (uri: string) => {\n try {\n ensureValidAtUri(uri)\n return true\n } catch {\n return false\n }\n}\n\nexport const validateNamespace = (namespace: string): void => {\n const parts = namespace.split('#')\n\n if (parts.length !== 1 && parts.length !== 2) {\n throw new Error('namespace must be in the format \"nsid[#fragment]\"')\n }\n\n const [nsid, fragment] = parts\n\n ensureValidNsid(nsid)\n if (fragment && !/^[a-zA-Z][a-zA-Z0-9]*$/.test(fragment)) {\n throw new Error('namespace fragment must be a valid identifier')\n }\n}\n"]}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
/** @type {import('jest').Config} */
|
|
2
2
|
module.exports = {
|
|
3
3
|
displayName: 'Bsync',
|
|
4
|
-
transform: {
|
|
4
|
+
transform: {
|
|
5
|
+
'^.+\\.(t|j)s$': [
|
|
6
|
+
'@swc/jest',
|
|
7
|
+
{ jsc: { transform: {} }, module: { type: 'es6' } },
|
|
8
|
+
],
|
|
9
|
+
},
|
|
10
|
+
extensionsToTreatAsEsm: ['.ts'],
|
|
11
|
+
transformIgnorePatterns: [],
|
|
5
12
|
setupFiles: ['<rootDir>/../../jest.setup.ts'],
|
|
6
13
|
moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] },
|
|
7
14
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/bsync",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.26-next.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Sychronizing service for app.bsky App View (Bluesky API)",
|
|
6
6
|
"keywords": [
|
|
@@ -13,10 +13,8 @@
|
|
|
13
13
|
"url": "https://github.com/bluesky-social/atproto",
|
|
14
14
|
"directory": "packages/bsync"
|
|
15
15
|
},
|
|
16
|
-
"main": "dist/index.js",
|
|
17
|
-
"types": "dist/index.d.ts",
|
|
18
16
|
"engines": {
|
|
19
|
-
"node": ">=
|
|
17
|
+
"node": ">=22"
|
|
20
18
|
},
|
|
21
19
|
"dependencies": {
|
|
22
20
|
"@bufbuild/protobuf": "^1.5.0",
|
|
@@ -27,8 +25,8 @@
|
|
|
27
25
|
"pg": "^8.10.0",
|
|
28
26
|
"pino-http": "^8.2.1",
|
|
29
27
|
"typed-emitter": "^2.1.0",
|
|
30
|
-
"@atproto/common": "^0.
|
|
31
|
-
"@atproto/syntax": "^0.
|
|
28
|
+
"@atproto/common": "^0.6.0-next.0",
|
|
29
|
+
"@atproto/syntax": "^0.6.0-next.0"
|
|
32
30
|
},
|
|
33
31
|
"devDependencies": {
|
|
34
32
|
"@bufbuild/buf": "^1.28.1",
|
|
@@ -36,14 +34,21 @@
|
|
|
36
34
|
"@connectrpc/protoc-gen-connect-es": "^1.1.4",
|
|
37
35
|
"@types/pg": "^8.6.6",
|
|
38
36
|
"get-port": "^5.1.1",
|
|
39
|
-
"jest": "^
|
|
37
|
+
"jest": "^30.0.0",
|
|
40
38
|
"ts-node": "^10.8.2",
|
|
41
|
-
"typescript": "^
|
|
39
|
+
"typescript": "^6.0.3"
|
|
40
|
+
},
|
|
41
|
+
"type": "module",
|
|
42
|
+
"exports": {
|
|
43
|
+
".": {
|
|
44
|
+
"types": "./dist/index.d.ts",
|
|
45
|
+
"default": "./dist/index.js"
|
|
46
|
+
}
|
|
42
47
|
},
|
|
43
48
|
"scripts": {
|
|
44
49
|
"build": "tsc --build tsconfig.build.json",
|
|
45
50
|
"start": "node --enable-source-maps dist/bin.js",
|
|
46
|
-
"test": "../dev-infra/with-test-db.sh jest",
|
|
51
|
+
"test": "NODE_OPTIONS=--experimental-vm-modules ../dev-infra/with-test-db.sh jest",
|
|
47
52
|
"test:log": "tail -50 test.log | pino-pretty",
|
|
48
53
|
"test:updateSnapshot": "jest --updateSnapshot",
|
|
49
54
|
"migration:create": "ts-node ./bin/migration-create.ts",
|
package/src/client.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
ConnectTransportOptions,
|
|
8
8
|
createConnectTransport,
|
|
9
9
|
} from '@connectrpc/connect-node'
|
|
10
|
-
import { Service } from './proto/bsync_connect'
|
|
10
|
+
import { Service } from './proto/bsync_connect.js'
|
|
11
11
|
|
|
12
12
|
export type BsyncClient = PromiseClient<typeof Service>
|
|
13
13
|
|
package/src/context.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { EventEmitter } from 'node:
|
|
2
|
-
import TypedEventEmitter from 'typed-emitter'
|
|
3
|
-
import { ServerConfig } from './config'
|
|
4
|
-
import { Database } from './db'
|
|
5
|
-
import { createMuteOpChannel } from './db/schema/mute_op'
|
|
6
|
-
import { createNotifOpChannel } from './db/schema/notif_op'
|
|
7
|
-
import { createOperationChannel } from './db/schema/operation'
|
|
1
|
+
import { EventEmitter } from 'node:events'
|
|
2
|
+
import type TypedEventEmitter from 'typed-emitter'
|
|
3
|
+
import { ServerConfig } from './config.js'
|
|
4
|
+
import { Database } from './db/index.js'
|
|
5
|
+
import { createMuteOpChannel } from './db/schema/mute_op.js'
|
|
6
|
+
import { createNotifOpChannel } from './db/schema/notif_op.js'
|
|
7
|
+
import { createOperationChannel } from './db/schema/operation.js'
|
|
8
8
|
|
|
9
9
|
export type AppContextOptions = {
|
|
10
10
|
db: Database
|
package/src/db/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import assert from 'node:assert'
|
|
2
|
-
import { EventEmitter } from 'node:
|
|
2
|
+
import { EventEmitter } from 'node:events'
|
|
3
3
|
import {
|
|
4
4
|
Kysely,
|
|
5
5
|
KyselyPlugin,
|
|
@@ -11,13 +11,17 @@ import {
|
|
|
11
11
|
RootOperationNode,
|
|
12
12
|
UnknownRow,
|
|
13
13
|
} from 'kysely'
|
|
14
|
-
|
|
15
|
-
import
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
import
|
|
20
|
-
import {
|
|
14
|
+
// eslint-disable-next-line import/default
|
|
15
|
+
import pg from 'pg'
|
|
16
|
+
// eslint-disable-next-line import/no-named-as-default-member
|
|
17
|
+
const { Pool: PgPool, types: pgTypes } = pg
|
|
18
|
+
type PgPool = InstanceType<typeof PgPool>
|
|
19
|
+
import type TypedEmitter from 'typed-emitter'
|
|
20
|
+
import { dbLogger } from '../logger.js'
|
|
21
|
+
import * as migrations from './migrations/index.js'
|
|
22
|
+
import { DbMigrationProvider } from './migrations/provider.js'
|
|
23
|
+
import { DatabaseSchema, DatabaseSchemaType } from './schema/index.js'
|
|
24
|
+
import { PgOptions } from './types.js'
|
|
21
25
|
|
|
22
26
|
export class Database {
|
|
23
27
|
pool: PgPool
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// It's important that every migration is exported from here with the proper name. We'd simplify
|
|
3
3
|
// this with kysely's FileMigrationProvider, but it doesn't play nicely with the build process.
|
|
4
4
|
|
|
5
|
-
export * as _20240108T220751294Z from './20240108T220751294Z-init'
|
|
6
|
-
export * as _20240717T224303472Z from './20240717T224303472Z-notif-ops'
|
|
7
|
-
export * as _20250527T022203400Z from './20250527T022203400Z-add-operation'
|
|
8
|
-
export * as _20250603T163446567Z from './20250603T163446567Z-alter-operation'
|
|
5
|
+
export * as _20240108T220751294Z from './20240108T220751294Z-init.js'
|
|
6
|
+
export * as _20240717T224303472Z from './20240717T224303472Z-notif-ops.js'
|
|
7
|
+
export * as _20250527T022203400Z from './20250527T022203400Z-add-operation.js'
|
|
8
|
+
export * as _20250603T163446567Z from './20250603T163446567Z-alter-operation.js'
|
package/src/db/schema/index.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Kysely } from 'kysely'
|
|
2
|
-
import * as muteItem from './mute_item'
|
|
3
|
-
import * as muteOp from './mute_op'
|
|
4
|
-
import * as notifItem from './notif_item'
|
|
5
|
-
import * as notifOp from './notif_op'
|
|
6
|
-
import * as op from './operation'
|
|
2
|
+
import * as muteItem from './mute_item.js'
|
|
3
|
+
import * as muteOp from './mute_op.js'
|
|
4
|
+
import * as notifItem from './notif_item.js'
|
|
5
|
+
import * as notifOp from './notif_op.js'
|
|
6
|
+
import * as op from './operation.js'
|
|
7
7
|
|
|
8
8
|
export type DatabaseSchemaType = muteItem.PartialDB &
|
|
9
9
|
muteOp.PartialDB &
|
package/src/db/schema/mute_op.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GeneratedAlways } from 'kysely'
|
|
2
|
-
import { Method } from '../../proto/bsync_pb'
|
|
2
|
+
import { Method } from '../../proto/bsync_pb.js'
|
|
3
3
|
|
|
4
4
|
export type OperationMethod = Method.CREATE | Method.UPDATE | Method.DELETE
|
|
5
5
|
|
|
@@ -9,7 +9,7 @@ export interface Operation {
|
|
|
9
9
|
namespace: string
|
|
10
10
|
key: string
|
|
11
11
|
method: OperationMethod
|
|
12
|
-
payload: Uint8Array
|
|
12
|
+
payload: Uint8Array<ArrayBuffer>
|
|
13
13
|
createdAt: GeneratedAlways<Date>
|
|
14
14
|
}
|
|
15
15
|
|
package/src/db/types.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { DynamicModule, RawBuilder, SelectQueryBuilder } from 'kysely'
|
|
2
|
-
|
|
2
|
+
// eslint-disable-next-line import/default
|
|
3
|
+
import pg from 'pg'
|
|
4
|
+
type PgPool = pg.Pool
|
|
3
5
|
|
|
4
6
|
export type DbRef = RawBuilder | ReturnType<DynamicModule['ref']>
|
|
5
7
|
|
package/src/index.ts
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import events from 'node:events'
|
|
2
2
|
import http from 'node:http'
|
|
3
3
|
import { connectNodeAdapter } from '@connectrpc/connect-node'
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
4
|
+
// eslint-disable-next-line import/default, import/no-named-as-default-member
|
|
5
|
+
import httpTerminator from 'http-terminator'
|
|
6
|
+
// eslint-disable-next-line import/no-named-as-default-member
|
|
7
|
+
const { createHttpTerminator } = httpTerminator
|
|
8
|
+
type HttpTerminator = ReturnType<typeof createHttpTerminator>
|
|
9
|
+
import { ServerConfig } from './config.js'
|
|
10
|
+
import { AppContext, AppContextOptions } from './context.js'
|
|
11
|
+
import { createMuteOpChannel } from './db/schema/mute_op.js'
|
|
12
|
+
import { createNotifOpChannel } from './db/schema/notif_op.js'
|
|
13
|
+
import { createOperationChannel } from './db/schema/operation.js'
|
|
14
|
+
import { dbLogger, loggerMiddleware } from './logger.js'
|
|
15
|
+
import routes from './routes/index.js'
|
|
12
16
|
|
|
13
|
-
export * from './config'
|
|
14
|
-
export * from './client'
|
|
15
|
-
export { Database } from './db'
|
|
16
|
-
export { AppContext } from './context'
|
|
17
|
-
export { httpLogger } from './logger'
|
|
17
|
+
export * from './config.js'
|
|
18
|
+
export * from './client.js'
|
|
19
|
+
export { Database } from './db/index.js'
|
|
20
|
+
export { AppContext } from './context.js'
|
|
21
|
+
export { httpLogger } from './logger.js'
|
|
18
22
|
|
|
19
23
|
export class BsyncService {
|
|
20
24
|
public ctx: AppContext
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/* eslint-disable */
|
|
4
4
|
// @ts-nocheck
|
|
5
5
|
|
|
6
|
-
import { AddMuteOperationRequest, AddMuteOperationResponse, AddNotifOperationRequest, AddNotifOperationResponse, DeleteOperationsByActorAndNamespaceRequest, DeleteOperationsByActorAndNamespaceResponse, PingRequest, PingResponse, PutOperationRequest, PutOperationResponse, ScanMuteOperationsRequest, ScanMuteOperationsResponse, ScanNotifOperationsRequest, ScanNotifOperationsResponse, ScanOperationsRequest, ScanOperationsResponse } from "./bsync_pb";
|
|
6
|
+
import { AddMuteOperationRequest, AddMuteOperationResponse, AddNotifOperationRequest, AddNotifOperationResponse, DeleteOperationsByActorAndNamespaceRequest, DeleteOperationsByActorAndNamespaceResponse, PingRequest, PingResponse, PutOperationRequest, PutOperationResponse, ScanMuteOperationsRequest, ScanMuteOperationsResponse, ScanNotifOperationsRequest, ScanNotifOperationsResponse, ScanOperationsRequest, ScanOperationsResponse } from "./bsync_pb.js";
|
|
7
7
|
import { MethodKind } from "@bufbuild/protobuf";
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { Code, ConnectError, ServiceImpl } from '@connectrpc/connect'
|
|
2
2
|
import { sql } from 'kysely'
|
|
3
3
|
import { AtUri } from '@atproto/syntax'
|
|
4
|
-
import { AppContext } from '../context'
|
|
5
|
-
import { Database } from '../db'
|
|
6
|
-
import { createMuteOpChannel } from '../db/schema/mute_op'
|
|
7
|
-
import { Service } from '../proto/bsync_connect'
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
import { AppContext } from '../context.js'
|
|
5
|
+
import { Database } from '../db/index.js'
|
|
6
|
+
import { createMuteOpChannel } from '../db/schema/mute_op.js'
|
|
7
|
+
import { Service } from '../proto/bsync_connect.js'
|
|
8
|
+
import {
|
|
9
|
+
AddMuteOperationResponse,
|
|
10
|
+
MuteOperation_Type,
|
|
11
|
+
} from '../proto/bsync_pb.js'
|
|
12
|
+
import { authWithApiKey } from './auth.js'
|
|
13
|
+
import { isValidAtUri, isValidDid } from './util.js'
|
|
11
14
|
|
|
12
15
|
export default (ctx: AppContext): Partial<ServiceImpl<typeof Service>> => ({
|
|
13
16
|
async addMuteOperation(req, handlerCtx) {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Code, ConnectError, ServiceImpl } from '@connectrpc/connect'
|
|
2
2
|
import { sql } from 'kysely'
|
|
3
|
-
import { AppContext } from '../context'
|
|
4
|
-
import { Database } from '../db'
|
|
5
|
-
import { createNotifOpChannel } from '../db/schema/notif_op'
|
|
6
|
-
import { Service } from '../proto/bsync_connect'
|
|
7
|
-
import { AddNotifOperationResponse } from '../proto/bsync_pb'
|
|
8
|
-
import { authWithApiKey } from './auth'
|
|
9
|
-
import { isValidDid } from './util'
|
|
3
|
+
import { AppContext } from '../context.js'
|
|
4
|
+
import { Database } from '../db/index.js'
|
|
5
|
+
import { createNotifOpChannel } from '../db/schema/notif_op.js'
|
|
6
|
+
import { Service } from '../proto/bsync_connect.js'
|
|
7
|
+
import { AddNotifOperationResponse } from '../proto/bsync_pb.js'
|
|
8
|
+
import { authWithApiKey } from './auth.js'
|
|
9
|
+
import { isValidDid } from './util.js'
|
|
10
10
|
|
|
11
11
|
export default (ctx: AppContext): Partial<ServiceImpl<typeof Service>> => ({
|
|
12
12
|
async addNotifOperation(req, handlerCtx) {
|
package/src/routes/auth.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Code, ConnectError, ServiceImpl } from '@connectrpc/connect'
|
|
2
|
-
import { AppContext } from '../context'
|
|
3
|
-
import { Service } from '../proto/bsync_connect'
|
|
4
|
-
import { DeleteOperationsByActorAndNamespaceResponse } from '../proto/bsync_pb'
|
|
5
|
-
import { authWithApiKey } from './auth'
|
|
6
|
-
import { isValidDid, validateNamespace } from './util'
|
|
2
|
+
import { AppContext } from '../context.js'
|
|
3
|
+
import { Service } from '../proto/bsync_connect.js'
|
|
4
|
+
import { DeleteOperationsByActorAndNamespaceResponse } from '../proto/bsync_pb.js'
|
|
5
|
+
import { authWithApiKey } from './auth.js'
|
|
6
|
+
import { isValidDid, validateNamespace } from './util.js'
|
|
7
7
|
|
|
8
8
|
export default (ctx: AppContext): Partial<ServiceImpl<typeof Service>> => ({
|
|
9
9
|
/**
|
package/src/routes/index.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { ConnectRouter } from '@connectrpc/connect'
|
|
2
2
|
import { sql } from 'kysely'
|
|
3
|
-
import { AppContext } from '../context'
|
|
4
|
-
import { Service } from '../proto/bsync_connect'
|
|
5
|
-
import addMuteOperation from './add-mute-operation'
|
|
6
|
-
import addNotifOperation from './add-notif-operation'
|
|
7
|
-
import deleteOperations from './delete-operations'
|
|
8
|
-
import putOperation from './put-operation'
|
|
9
|
-
import scanMuteOperations from './scan-mute-operations'
|
|
10
|
-
import scanNotifOperations from './scan-notif-operations'
|
|
11
|
-
import scanOperations from './scan-operations'
|
|
3
|
+
import { AppContext } from '../context.js'
|
|
4
|
+
import { Service } from '../proto/bsync_connect.js'
|
|
5
|
+
import addMuteOperation from './add-mute-operation.js'
|
|
6
|
+
import addNotifOperation from './add-notif-operation.js'
|
|
7
|
+
import deleteOperations from './delete-operations.js'
|
|
8
|
+
import putOperation from './put-operation.js'
|
|
9
|
+
import scanMuteOperations from './scan-mute-operations.js'
|
|
10
|
+
import scanNotifOperations from './scan-notif-operations.js'
|
|
11
|
+
import scanOperations from './scan-operations.js'
|
|
12
12
|
|
|
13
13
|
export default (ctx: AppContext) => (router: ConnectRouter) => {
|
|
14
14
|
return router.service(Service, {
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import { Code, ConnectError, ServiceImpl } from '@connectrpc/connect'
|
|
2
2
|
import { sql } from 'kysely'
|
|
3
3
|
import { ensureValidRecordKey } from '@atproto/syntax'
|
|
4
|
-
import { AppContext } from '../context'
|
|
5
|
-
import { Database } from '../db'
|
|
6
|
-
import {
|
|
7
|
-
|
|
4
|
+
import { AppContext } from '../context.js'
|
|
5
|
+
import { Database } from '../db/index.js'
|
|
6
|
+
import {
|
|
7
|
+
OperationMethod,
|
|
8
|
+
createOperationChannel,
|
|
9
|
+
} from '../db/schema/operation.js'
|
|
10
|
+
import { Service } from '../proto/bsync_connect.js'
|
|
8
11
|
import {
|
|
9
12
|
Method,
|
|
10
13
|
PutOperationRequest,
|
|
11
14
|
PutOperationResponse,
|
|
12
|
-
} from '../proto/bsync_pb'
|
|
13
|
-
import { authWithApiKey } from './auth'
|
|
14
|
-
import { isValidDid, validateNamespace } from './util'
|
|
15
|
+
} from '../proto/bsync_pb.js'
|
|
16
|
+
import { authWithApiKey } from './auth.js'
|
|
17
|
+
import { isValidDid, validateNamespace } from './util.js'
|
|
15
18
|
|
|
16
19
|
export default (ctx: AppContext): Partial<ServiceImpl<typeof Service>> => ({
|
|
17
20
|
async putOperation(req, handlerCtx) {
|
|
@@ -107,6 +110,6 @@ type Operation = {
|
|
|
107
110
|
actorDid: string
|
|
108
111
|
namespace: string
|
|
109
112
|
key: string
|
|
110
|
-
payload: Uint8Array
|
|
113
|
+
payload: Uint8Array<ArrayBuffer>
|
|
111
114
|
method: OperationMethod
|
|
112
115
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { once } from 'node:events'
|
|
2
2
|
import { ServiceImpl } from '@connectrpc/connect'
|
|
3
|
-
import { AppContext } from '../context'
|
|
4
|
-
import { createMuteOpChannel } from '../db/schema/mute_op'
|
|
5
|
-
import { Service } from '../proto/bsync_connect'
|
|
6
|
-
import { ScanMuteOperationsResponse } from '../proto/bsync_pb'
|
|
7
|
-
import { authWithApiKey } from './auth'
|
|
8
|
-
import { combineSignals, validCursor } from './util'
|
|
3
|
+
import { AppContext } from '../context.js'
|
|
4
|
+
import { createMuteOpChannel } from '../db/schema/mute_op.js'
|
|
5
|
+
import { Service } from '../proto/bsync_connect.js'
|
|
6
|
+
import { ScanMuteOperationsResponse } from '../proto/bsync_pb.js'
|
|
7
|
+
import { authWithApiKey } from './auth.js'
|
|
8
|
+
import { combineSignals, validCursor } from './util.js'
|
|
9
9
|
|
|
10
10
|
export default (ctx: AppContext): Partial<ServiceImpl<typeof Service>> => ({
|
|
11
11
|
async scanMuteOperations(req, handlerCtx) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { once } from 'node:events'
|
|
2
2
|
import { ServiceImpl } from '@connectrpc/connect'
|
|
3
|
-
import { AppContext } from '../context'
|
|
4
|
-
import { createNotifOpChannel } from '../db/schema/notif_op'
|
|
5
|
-
import { Service } from '../proto/bsync_connect'
|
|
6
|
-
import { ScanNotifOperationsResponse } from '../proto/bsync_pb'
|
|
7
|
-
import { authWithApiKey } from './auth'
|
|
8
|
-
import { combineSignals, validCursor } from './util'
|
|
3
|
+
import { AppContext } from '../context.js'
|
|
4
|
+
import { createNotifOpChannel } from '../db/schema/notif_op.js'
|
|
5
|
+
import { Service } from '../proto/bsync_connect.js'
|
|
6
|
+
import { ScanNotifOperationsResponse } from '../proto/bsync_pb.js'
|
|
7
|
+
import { authWithApiKey } from './auth.js'
|
|
8
|
+
import { combineSignals, validCursor } from './util.js'
|
|
9
9
|
|
|
10
10
|
export default (ctx: AppContext): Partial<ServiceImpl<typeof Service>> => ({
|
|
11
11
|
async scanNotifOperations(req, handlerCtx) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { once } from 'node:events'
|
|
2
2
|
import { ServiceImpl } from '@connectrpc/connect'
|
|
3
|
-
import { AppContext } from '../context'
|
|
4
|
-
import { createOperationChannel } from '../db/schema/operation'
|
|
5
|
-
import { Service } from '../proto/bsync_connect'
|
|
6
|
-
import { ScanOperationsResponse } from '../proto/bsync_pb'
|
|
7
|
-
import { authWithApiKey } from './auth'
|
|
8
|
-
import { combineSignals, validCursor } from './util'
|
|
3
|
+
import { AppContext } from '../context.js'
|
|
4
|
+
import { createOperationChannel } from '../db/schema/operation.js'
|
|
5
|
+
import { Service } from '../proto/bsync_connect.js'
|
|
6
|
+
import { ScanOperationsResponse } from '../proto/bsync_pb.js'
|
|
7
|
+
import { authWithApiKey } from './auth.js'
|
|
8
|
+
import { combineSignals, validCursor } from './util.js'
|
|
9
9
|
|
|
10
10
|
export default (ctx: AppContext): Partial<ServiceImpl<typeof Service>> => ({
|
|
11
11
|
async scanOperations(req, handlerCtx) {
|
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
authWithApiKey,
|
|
7
7
|
createClient,
|
|
8
8
|
envToCfg,
|
|
9
|
-
} from '../src'
|
|
10
|
-
import { Method } from '../src/proto/bsync_pb'
|
|
9
|
+
} from '../src/index.js'
|
|
10
|
+
import { Method } from '../src/proto/bsync_pb.js'
|
|
11
11
|
|
|
12
12
|
describe('operations', () => {
|
|
13
13
|
let bsync: BsyncService
|
package/tests/mutes.test.ts
CHANGED
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
authWithApiKey,
|
|
9
9
|
createClient,
|
|
10
10
|
envToCfg,
|
|
11
|
-
} from '../src'
|
|
12
|
-
import { MuteOperation, MuteOperation_Type } from '../src/proto/bsync_pb'
|
|
11
|
+
} from '../src/index.js'
|
|
12
|
+
import { MuteOperation, MuteOperation_Type } from '../src/proto/bsync_pb.js'
|
|
13
13
|
|
|
14
14
|
describe('mutes', () => {
|
|
15
15
|
let bsync: BsyncService
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
authWithApiKey,
|
|
9
9
|
createClient,
|
|
10
10
|
envToCfg,
|
|
11
|
-
} from '../src'
|
|
12
|
-
import { NotifOperation } from '../src/proto/bsync_pb'
|
|
11
|
+
} from '../src/index.js'
|
|
12
|
+
import { NotifOperation } from '../src/proto/bsync_pb.js'
|
|
13
13
|
|
|
14
14
|
describe('notifications', () => {
|
|
15
15
|
let bsync: BsyncService
|
package/tests/operations.test.ts
CHANGED
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
authWithApiKey,
|
|
10
10
|
createClient,
|
|
11
11
|
envToCfg,
|
|
12
|
-
} from '../src'
|
|
13
|
-
import { Method, Operation } from '../src/proto/bsync_pb'
|
|
12
|
+
} from '../src/index.js'
|
|
13
|
+
import { Method, Operation } from '../src/proto/bsync_pb.js'
|
|
14
14
|
|
|
15
15
|
describe('operations', () => {
|
|
16
16
|
let bsync: BsyncService
|
package/tsconfig.build.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["./src/client.ts","./src/config.ts","./src/context.ts","./src/index.ts","./src/logger.ts","./src/db/index.ts","./src/db/types.ts","./src/db/migrations/
|
|
1
|
+
{"root":["./src/client.ts","./src/config.ts","./src/context.ts","./src/index.ts","./src/logger.ts","./src/db/index.ts","./src/db/types.ts","./src/db/migrations/20240108t220751294z-init.ts","./src/db/migrations/20240717t224303472z-notif-ops.ts","./src/db/migrations/20250527t022203400z-add-operation.ts","./src/db/migrations/20250603t163446567z-alter-operation.ts","./src/db/migrations/index.ts","./src/db/migrations/provider.ts","./src/db/schema/index.ts","./src/db/schema/mute_item.ts","./src/db/schema/mute_op.ts","./src/db/schema/notif_item.ts","./src/db/schema/notif_op.ts","./src/db/schema/operation.ts","./src/proto/bsync_connect.ts","./src/proto/bsync_pb.ts","./src/routes/add-mute-operation.ts","./src/routes/add-notif-operation.ts","./src/routes/auth.ts","./src/routes/delete-operations.ts","./src/routes/index.ts","./src/routes/put-operation.ts","./src/routes/scan-mute-operations.ts","./src/routes/scan-notif-operations.ts","./src/routes/scan-operations.ts","./src/routes/util.ts","../../tsconfig/cjs-default-exports.d.ts"],"version":"6.0.3"}
|
package/tsconfig.tests.json
CHANGED