@atproto/dev-env 0.5.44 → 0.6.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 +20 -0
- package/dist/bsky.d.ts.map +1 -1
- package/dist/bsky.js +1 -1
- package/dist/bsky.js.map +1 -1
- package/dist/bsync.d.ts.map +1 -1
- package/dist/bsync.js +1 -1
- package/dist/bsync.js.map +1 -1
- package/dist/feed-gen.d.ts.map +1 -1
- package/dist/feed-gen.js +1 -1
- package/dist/feed-gen.js.map +1 -1
- package/dist/get-port.d.ts +4 -0
- package/dist/get-port.d.ts.map +1 -0
- package/dist/get-port.js +140 -0
- package/dist/get-port.js.map +1 -0
- package/dist/network-no-appview.d.ts +2 -1
- package/dist/network-no-appview.d.ts.map +1 -1
- package/dist/network-no-appview.js +21 -3
- package/dist/network-no-appview.js.map +1 -1
- package/dist/network.d.ts.map +1 -1
- package/dist/network.js +1 -1
- package/dist/network.js.map +1 -1
- package/dist/ozone.d.ts.map +1 -1
- package/dist/ozone.js +1 -1
- package/dist/ozone.js.map +1 -1
- package/dist/pds.d.ts.map +1 -1
- package/dist/pds.js +1 -1
- package/dist/pds.js.map +1 -1
- package/dist/plc.js +1 -1
- package/dist/plc.js.map +1 -1
- package/dist/seed/index.d.ts +0 -1
- package/dist/seed/index.d.ts.map +1 -1
- package/dist/seed/index.js +0 -1
- package/dist/seed/index.js.map +1 -1
- package/package.json +11 -11
- package/src/bsky.ts +1 -1
- package/src/bsync.ts +1 -1
- package/src/feed-gen.ts +1 -1
- package/src/get-port.ts +158 -0
- package/src/network-no-appview.ts +26 -4
- package/src/network.ts +1 -1
- package/src/ozone.ts +1 -1
- package/src/pds.ts +1 -1
- package/src/plc.ts +1 -1
- package/src/seed/index.ts +0 -1
- package/dist/seed/likes.d.ts +0 -4
- package/dist/seed/likes.d.ts.map +0 -1
- package/dist/seed/likes.js +0 -37
- package/dist/seed/likes.js.map +0 -1
- package/src/seed/likes.ts +0 -43
package/dist/ozone.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ozone.js","sourceRoot":"","sources":["../src/ozone.ts"],"names":[],"mappings":"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","sourcesContent":["import * as plc from '@did-plc/lib'\nimport getPort from 'get-port'\nimport * as ui8 from 'uint8arrays'\nimport { AtpAgent } from '@atproto/api'\nimport { type Keypair, Secp256k1Keypair } from '@atproto/crypto'\nimport * as ozone from '@atproto/ozone'\nimport { createServiceJwt } from '@atproto/xrpc-server'\nimport { ADMIN_PASSWORD, EXAMPLE_LABELER } from './const.js'\nimport { ModeratorClient } from './moderator-client.js'\nimport type { DidAndKey, OzoneConfig } from './types.js'\nimport { createDidAndKey } from './util.js'\n\nexport class TestOzone {\n constructor(\n public url: string,\n public port: number,\n public server: ozone.OzoneService,\n public daemon: ozone.OzoneDaemon,\n public adminAccnt: DidAndKey,\n public moderatorAccnt: DidAndKey,\n public triageAccnt: DidAndKey,\n ) {}\n\n static async create(config: OzoneConfig): Promise<TestOzone> {\n const serviceKeypair =\n config.signingKey ?? (await Secp256k1Keypair.create({ exportable: true }))\n const signingKeyHex = ui8.toString(await serviceKeypair.export(), 'hex')\n let serverDid = config.serverDid\n if (!serverDid) {\n serverDid = await createOzoneDid(config.plcUrl, serviceKeypair)\n }\n\n const admin = await createDidAndKey({\n plcUrl: config.plcUrl,\n handle: 'admin.ozone',\n pds: 'https://pds.invalid',\n })\n\n const moderator = await createDidAndKey({\n plcUrl: config.plcUrl,\n handle: 'moderator.ozone',\n pds: 'https://pds.invalid',\n })\n\n const triage = await createDidAndKey({\n plcUrl: config.plcUrl,\n handle: 'triage.ozone',\n pds: 'https://pds.invalid',\n })\n\n const port = config.port || (await getPort())\n const url = `http://localhost:${port}`\n\n const env: ozone.OzoneEnvironment = {\n devMode: true,\n version: '0.0.0',\n port,\n didPlcUrl: config.plcUrl,\n publicUrl: url,\n serverDid,\n signingKeyHex,\n ...config,\n adminPassword: ADMIN_PASSWORD,\n adminDids: [...(config.adminDids ?? []), admin.did],\n moderatorDids: [\n ...(config.moderatorDids ?? []),\n config.appviewDid,\n moderator.did,\n ],\n triageDids: [...(config.triageDids ?? []), triage.did],\n }\n\n // Separate migration db in case migration changes some connection state that we need in the tests, e.g. \"alter database ... set ...\"\n const migrationDb = new ozone.Database({\n schema: config.dbPostgresSchema,\n url: config.dbPostgresUrl,\n })\n if (config.migration) {\n await migrationDb.migrateToOrThrow(config.migration)\n } else {\n await migrationDb.migrateToLatestOrThrow()\n }\n await migrationDb.close()\n\n const cfg = ozone.envToCfg(env)\n const secrets = ozone.envToSecrets(env)\n\n // api server\n const server = await ozone.OzoneService.create(cfg, secrets, {\n imgInvalidator: config.imgInvalidator,\n })\n await server.start()\n\n const daemon = await ozone.OzoneDaemon.create(cfg, secrets)\n await daemon.start()\n // don't do event reversal in dev-env\n await daemon.ctx.eventReverser.destroy()\n\n return new TestOzone(url, port, server, daemon, admin, moderator, triage)\n }\n\n get ctx(): ozone.AppContext {\n return this.server.ctx\n }\n\n getAgent(): AtpAgent {\n const agent = new AtpAgent({ service: this.url })\n agent.configureLabelers([EXAMPLE_LABELER])\n return agent\n }\n\n getModClient() {\n return new ModeratorClient(this)\n }\n\n async addAdminDid(did: string) {\n await this.ctx.teamService(this.ctx.db).create({\n did,\n disabled: false,\n handle: null,\n displayName: null,\n lastUpdatedBy: this.ctx.cfg.service.did,\n role: 'tools.ozone.team.defs#roleAdmin',\n })\n this.ctx.cfg.access.admins.push(did)\n }\n\n async addModeratorDid(did: string) {\n await this.ctx.teamService(this.ctx.db).create({\n did,\n disabled: false,\n handle: null,\n displayName: null,\n lastUpdatedBy: this.ctx.cfg.service.did,\n role: 'tools.ozone.team.defs#roleModerator',\n })\n this.ctx.cfg.access.moderators.push(did)\n }\n\n async addTriageDid(did: string) {\n await this.ctx.teamService(this.ctx.db).create({\n did,\n disabled: false,\n handle: null,\n displayName: null,\n lastUpdatedBy: this.ctx.cfg.service.did,\n role: 'tools.ozone.team.defs#roleTriage',\n })\n this.ctx.cfg.access.triage.push(did)\n }\n\n async createPolicies() {\n const now = new Date()\n const defaultOptions = {\n managerRole: 'tools.ozone.team.defs#roleAdmin' as const,\n scope: 'instance' as const,\n did: this.ctx.cfg.service.did,\n lastUpdatedBy: this.ctx.cfg.service.did,\n createdBy: this.ctx.cfg.service.did,\n createdAt: now,\n updatedAt: now,\n }\n await this.ctx.settingService(this.ctx.db).upsert({\n ...defaultOptions,\n key: 'tools.ozone.setting.severityLevels',\n value: {\n 'sev-2': {\n strikeCount: 2,\n expiryInDays: 90,\n },\n 'sev-4': {\n strikeCount: 4,\n expiryInDays: 365,\n },\n 'sev-7': {\n needsTakedown: true,\n description: 'Sever violation, immedate account takedown',\n },\n 'custom-sev': {\n strikeCount: 4,\n firstOccurrenceStrikeCount: 8,\n description: 'First offense harsher penalty, on subsequent less',\n },\n },\n description: 'Severity levels and strike count mapping for policies',\n })\n await this.ctx.settingService(this.ctx.db).upsert({\n ...defaultOptions,\n key: 'tools.ozone.setting.policyList',\n value: {\n 'policy-one': {\n name: 'Policy One',\n description: 'Policy for handling user behavior',\n severityLevels: {\n 'sev-1': {\n description: 'Minor infraction',\n isDefault: true,\n },\n 'sev-2': {\n description: 'Moderate infraction',\n isDefault: false,\n },\n },\n },\n 'policy-two': {\n name: 'Policy Two',\n description: 'Policy for handling user action',\n severityLevels: {\n 'sev-4': {\n description: 'Moderate infraction',\n isDefault: false,\n },\n 'sev-5': {\n description: 'Severe infraction',\n isDefault: false,\n },\n },\n },\n },\n description: 'Moderation policies to be associated with actions',\n })\n }\n\n async modHeaders(\n lxm: string,\n role: 'admin' | 'moderator' | 'triage' = 'moderator',\n ) {\n const account =\n role === 'admin'\n ? this.adminAccnt\n : role === 'moderator'\n ? this.moderatorAccnt\n : this.triageAccnt\n const jwt = await createServiceJwt({\n iss: account.did,\n aud: this.ctx.cfg.service.did,\n lxm,\n keypair: account.key,\n })\n return { authorization: `Bearer ${jwt}` }\n }\n\n async processAll() {\n await this.ctx.backgroundQueue.processAll()\n await this.daemon.processAll()\n }\n\n async close() {\n try {\n await this.server.destroy()\n } finally {\n await this.daemon.destroy()\n }\n }\n\n async [Symbol.asyncDispose]() {\n await this.close()\n }\n}\n\nexport const createOzoneDid = async (\n plcUrl: string,\n keypair: Keypair,\n): Promise<string> => {\n const plcClient = new plc.Client(plcUrl)\n const plcOp = await plc.signOperation(\n {\n type: 'plc_operation',\n alsoKnownAs: [],\n rotationKeys: [keypair.did()],\n verificationMethods: {\n atproto_label: keypair.did(),\n },\n services: {\n atproto_labeler: {\n type: 'AtprotoLabeler',\n endpoint: 'https://ozone.public.url',\n },\n },\n prev: null,\n },\n keypair,\n )\n const did = await plc.didForCreateOp(plcOp)\n await plcClient.sendOperation(did, plcOp)\n return did\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ozone.js","sourceRoot":"","sources":["../src/ozone.ts"],"names":[],"mappings":"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","sourcesContent":["import * as plc from '@did-plc/lib'\nimport * as ui8 from 'uint8arrays'\nimport { AtpAgent } from '@atproto/api'\nimport { type Keypair, Secp256k1Keypair } from '@atproto/crypto'\nimport * as ozone from '@atproto/ozone'\nimport { createServiceJwt } from '@atproto/xrpc-server'\nimport { ADMIN_PASSWORD, EXAMPLE_LABELER } from './const.js'\nimport getPort from './get-port.js'\nimport { ModeratorClient } from './moderator-client.js'\nimport type { DidAndKey, OzoneConfig } from './types.js'\nimport { createDidAndKey } from './util.js'\n\nexport class TestOzone {\n constructor(\n public url: string,\n public port: number,\n public server: ozone.OzoneService,\n public daemon: ozone.OzoneDaemon,\n public adminAccnt: DidAndKey,\n public moderatorAccnt: DidAndKey,\n public triageAccnt: DidAndKey,\n ) {}\n\n static async create(config: OzoneConfig): Promise<TestOzone> {\n const serviceKeypair =\n config.signingKey ?? (await Secp256k1Keypair.create({ exportable: true }))\n const signingKeyHex = ui8.toString(await serviceKeypair.export(), 'hex')\n let serverDid = config.serverDid\n if (!serverDid) {\n serverDid = await createOzoneDid(config.plcUrl, serviceKeypair)\n }\n\n const admin = await createDidAndKey({\n plcUrl: config.plcUrl,\n handle: 'admin.ozone',\n pds: 'https://pds.invalid',\n })\n\n const moderator = await createDidAndKey({\n plcUrl: config.plcUrl,\n handle: 'moderator.ozone',\n pds: 'https://pds.invalid',\n })\n\n const triage = await createDidAndKey({\n plcUrl: config.plcUrl,\n handle: 'triage.ozone',\n pds: 'https://pds.invalid',\n })\n\n const port = config.port || (await getPort())\n const url = `http://localhost:${port}`\n\n const env: ozone.OzoneEnvironment = {\n devMode: true,\n version: '0.0.0',\n port,\n didPlcUrl: config.plcUrl,\n publicUrl: url,\n serverDid,\n signingKeyHex,\n ...config,\n adminPassword: ADMIN_PASSWORD,\n adminDids: [...(config.adminDids ?? []), admin.did],\n moderatorDids: [\n ...(config.moderatorDids ?? []),\n config.appviewDid,\n moderator.did,\n ],\n triageDids: [...(config.triageDids ?? []), triage.did],\n }\n\n // Separate migration db in case migration changes some connection state that we need in the tests, e.g. \"alter database ... set ...\"\n const migrationDb = new ozone.Database({\n schema: config.dbPostgresSchema,\n url: config.dbPostgresUrl,\n })\n if (config.migration) {\n await migrationDb.migrateToOrThrow(config.migration)\n } else {\n await migrationDb.migrateToLatestOrThrow()\n }\n await migrationDb.close()\n\n const cfg = ozone.envToCfg(env)\n const secrets = ozone.envToSecrets(env)\n\n // api server\n const server = await ozone.OzoneService.create(cfg, secrets, {\n imgInvalidator: config.imgInvalidator,\n })\n await server.start()\n\n const daemon = await ozone.OzoneDaemon.create(cfg, secrets)\n await daemon.start()\n // don't do event reversal in dev-env\n await daemon.ctx.eventReverser.destroy()\n\n return new TestOzone(url, port, server, daemon, admin, moderator, triage)\n }\n\n get ctx(): ozone.AppContext {\n return this.server.ctx\n }\n\n getAgent(): AtpAgent {\n const agent = new AtpAgent({ service: this.url })\n agent.configureLabelers([EXAMPLE_LABELER])\n return agent\n }\n\n getModClient() {\n return new ModeratorClient(this)\n }\n\n async addAdminDid(did: string) {\n await this.ctx.teamService(this.ctx.db).create({\n did,\n disabled: false,\n handle: null,\n displayName: null,\n lastUpdatedBy: this.ctx.cfg.service.did,\n role: 'tools.ozone.team.defs#roleAdmin',\n })\n this.ctx.cfg.access.admins.push(did)\n }\n\n async addModeratorDid(did: string) {\n await this.ctx.teamService(this.ctx.db).create({\n did,\n disabled: false,\n handle: null,\n displayName: null,\n lastUpdatedBy: this.ctx.cfg.service.did,\n role: 'tools.ozone.team.defs#roleModerator',\n })\n this.ctx.cfg.access.moderators.push(did)\n }\n\n async addTriageDid(did: string) {\n await this.ctx.teamService(this.ctx.db).create({\n did,\n disabled: false,\n handle: null,\n displayName: null,\n lastUpdatedBy: this.ctx.cfg.service.did,\n role: 'tools.ozone.team.defs#roleTriage',\n })\n this.ctx.cfg.access.triage.push(did)\n }\n\n async createPolicies() {\n const now = new Date()\n const defaultOptions = {\n managerRole: 'tools.ozone.team.defs#roleAdmin' as const,\n scope: 'instance' as const,\n did: this.ctx.cfg.service.did,\n lastUpdatedBy: this.ctx.cfg.service.did,\n createdBy: this.ctx.cfg.service.did,\n createdAt: now,\n updatedAt: now,\n }\n await this.ctx.settingService(this.ctx.db).upsert({\n ...defaultOptions,\n key: 'tools.ozone.setting.severityLevels',\n value: {\n 'sev-2': {\n strikeCount: 2,\n expiryInDays: 90,\n },\n 'sev-4': {\n strikeCount: 4,\n expiryInDays: 365,\n },\n 'sev-7': {\n needsTakedown: true,\n description: 'Sever violation, immedate account takedown',\n },\n 'custom-sev': {\n strikeCount: 4,\n firstOccurrenceStrikeCount: 8,\n description: 'First offense harsher penalty, on subsequent less',\n },\n },\n description: 'Severity levels and strike count mapping for policies',\n })\n await this.ctx.settingService(this.ctx.db).upsert({\n ...defaultOptions,\n key: 'tools.ozone.setting.policyList',\n value: {\n 'policy-one': {\n name: 'Policy One',\n description: 'Policy for handling user behavior',\n severityLevels: {\n 'sev-1': {\n description: 'Minor infraction',\n isDefault: true,\n },\n 'sev-2': {\n description: 'Moderate infraction',\n isDefault: false,\n },\n },\n },\n 'policy-two': {\n name: 'Policy Two',\n description: 'Policy for handling user action',\n severityLevels: {\n 'sev-4': {\n description: 'Moderate infraction',\n isDefault: false,\n },\n 'sev-5': {\n description: 'Severe infraction',\n isDefault: false,\n },\n },\n },\n },\n description: 'Moderation policies to be associated with actions',\n })\n }\n\n async modHeaders(\n lxm: string,\n role: 'admin' | 'moderator' | 'triage' = 'moderator',\n ) {\n const account =\n role === 'admin'\n ? this.adminAccnt\n : role === 'moderator'\n ? this.moderatorAccnt\n : this.triageAccnt\n const jwt = await createServiceJwt({\n iss: account.did,\n aud: this.ctx.cfg.service.did,\n lxm,\n keypair: account.key,\n })\n return { authorization: `Bearer ${jwt}` }\n }\n\n async processAll() {\n await this.ctx.backgroundQueue.processAll()\n await this.daemon.processAll()\n }\n\n async close() {\n try {\n await this.server.destroy()\n } finally {\n await this.daemon.destroy()\n }\n }\n\n async [Symbol.asyncDispose]() {\n await this.close()\n }\n}\n\nexport const createOzoneDid = async (\n plcUrl: string,\n keypair: Keypair,\n): Promise<string> => {\n const plcClient = new plc.Client(plcUrl)\n const plcOp = await plc.signOperation(\n {\n type: 'plc_operation',\n alsoKnownAs: [],\n rotationKeys: [keypair.did()],\n verificationMethods: {\n atproto_label: keypair.did(),\n },\n services: {\n atproto_labeler: {\n type: 'AtprotoLabeler',\n endpoint: 'https://ozone.public.url',\n },\n },\n prev: null,\n },\n keypair,\n )\n const did = await plc.didForCreateOp(plcOp)\n await plcClient.sendOperation(did, plcOp)\n return did\n}\n"]}
|
package/dist/pds.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pds.d.ts","sourceRoot":"","sources":["../src/pds.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pds.d.ts","sourceRoot":"","sources":["../src/pds.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,KAAK,UAAU,EAAE,GAAG,EAAyB,MAAM,cAAc,CAAA;AAG1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,qBAAa,OAAO;IAET,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,GAAG;IAHpB,YACS,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,GAAG,EAChB;IAEJ,OAAa,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAiDvD;IAED,IAAI,GAAG,IAAI,UAAU,CAEpB;IAED,QAAQ,IAAI,QAAQ,CAInB;IAED,SAAS,IAAI,MAAM,CAIlB;IAED,SAAS,IAAI,MAAM,CAQlB;IAED,gBAAgB;QAEZ,aAAa;MAEhB;IAED,YAAY,+BAEX;IAEK,UAAU,kBAEf;IAEK,KAAK,kBAEV;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF"}
|
package/dist/pds.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import getPort from 'get-port';
|
|
5
4
|
import * as ui8 from 'uint8arrays';
|
|
6
5
|
import { AtpAgent } from '@atproto/api';
|
|
7
6
|
import { Secp256k1Keypair, randomStr } from '@atproto/crypto';
|
|
8
7
|
import { Client } from '@atproto/lex';
|
|
9
8
|
import { PDS, createSecretKeyObject } from '@atproto/pds';
|
|
10
9
|
import { ADMIN_PASSWORD, EXAMPLE_LABELER, JWT_SECRET } from './const.js';
|
|
10
|
+
import getPort from './get-port.js';
|
|
11
11
|
export class TestPds {
|
|
12
12
|
constructor(url, port, server) {
|
|
13
13
|
this.url = url;
|
package/dist/pds.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pds.js","sourceRoot":"","sources":["../src/pds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"pds.js","sourceRoot":"","sources":["../src/pds.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport * as ui8 from 'uint8arrays'\nimport { AtpAgent } from '@atproto/api'\nimport { Secp256k1Keypair, randomStr } from '@atproto/crypto'\nimport { Client } from '@atproto/lex'\nimport { type AppContext, PDS, createSecretKeyObject } from '@atproto/pds'\nimport { ADMIN_PASSWORD, EXAMPLE_LABELER, JWT_SECRET } from './const.js'\nimport getPort from './get-port.js'\nimport type { PdsConfig } from './types.js'\n\nexport class TestPds {\n constructor(\n public url: string,\n public port: number,\n public server: PDS,\n ) {}\n\n static async create(config: PdsConfig): Promise<TestPds> {\n const plcRotationKey = await Secp256k1Keypair.create({ exportable: true })\n const plcRotationPriv = ui8.toString(await plcRotationKey.export(), 'hex')\n const recoveryKey = (await Secp256k1Keypair.create()).did()\n\n const port = config.port || (await getPort())\n const url = `http://localhost:${port}`\n\n const blobstoreLoc = path.join(os.tmpdir(), randomStr(8, 'base32'))\n const dataDirectory = path.join(os.tmpdir(), randomStr(8, 'base32'))\n await fs.mkdir(dataDirectory, { recursive: true })\n\n const server = await PDS.fromEnv({\n devMode: true,\n port,\n dataDirectory: dataDirectory,\n blobstoreDiskLocation: blobstoreLoc,\n recoveryDidKey: recoveryKey,\n adminPassword: ADMIN_PASSWORD,\n jwtSecret: JWT_SECRET,\n // @NOTE \".example\" will not actually work and is only used to display\n // multiple domains in the sing-up UI\n serviceHandleDomains: ['.test', '.example'],\n bskyAppViewUrl: 'https://appview.invalid',\n bskyAppViewDid: 'did:example:invalid',\n bskyAppViewCdnUrlPattern: 'http://cdn.appview.com/%s/%s/%s',\n modServiceUrl: 'https://moderator.invalid',\n modServiceDid: 'did:example:invalid',\n plcRotationKeyK256PrivateKeyHex: plcRotationPriv,\n inviteRequired: false,\n disableSsrfProtection: true,\n serviceName: 'Development PDS',\n primaryColor: '#f0828d',\n errorColor: 'rgb(238, 0, 78)', // rgb() notation should work too\n logoUrl:\n // Using a \"data:\" instead of a real URL to avoid making CORS requests in dev.\n // License: https://uxwing.com/license/\n // Source: https://uxwing.com/bee-icon/\n `data:image/svg+xml;base64,${Buffer.from('<svg xmlns=\"http://www.w3.org/2000/svg\" shape-rendering=\"geometricPrecision\" text-rendering=\"geometricPrecision\" image-rendering=\"optimizeQuality\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" viewBox=\"0 0 503 511.623\"><path fill=\"#FFB9B9\" d=\"M379.75 85.311l90.022 89.879C503.264 128.804 502.534 31.13 476.188 0c-27.441 31.966-59.103 60.767-96.438 85.311z\"/><path fill=\"#E2828D\" d=\"M399.445 104.976l70.327 70.214c26.443-36.622 31.549-105.205 19.563-147.778-26.692 28.309-56.413 54.344-89.89 77.564z\"/><path fill=\"#FFB9B9\" d=\"M119.595 85.311L29.573 175.19C-3.919 128.804-3.189 31.13 23.156 0c27.441 31.966 59.103 60.767 96.439 85.311z\"/><path fill=\"#E2828D\" d=\"M99.899 104.976L29.573 175.19C3.13 138.568-1.976 69.985 10.01 27.412c26.692 28.309 56.413 54.344 89.889 77.564z\"/><path fill=\"#FFB9B9\" d=\"M251.5 51.303c138.898 0 251.5 103.046 251.5 230.16 0 127.114-112.602 230.16-251.5 230.16C112.6 511.623 0 408.577 0 281.463c0-127.114 112.6-230.16 251.5-230.16z\"/><path fill=\"#331400\" d=\"M138.142 188.245c16.387 0 29.672 13.283 29.672 29.672 0 16.389-13.285 29.673-29.672 29.673-16.389 0-29.675-13.284-29.675-29.673 0-16.389 13.286-29.672 29.675-29.672zM360.695 188.245c16.389 0 29.674 13.283 29.674 29.672 0 16.389-13.285 29.673-29.674 29.673-16.387 0-29.673-13.284-29.673-29.673 0-16.389 13.286-29.672 29.673-29.672z\"/><path fill=\"#F0828D\" fill-rule=\"nonzero\" d=\"M251.5 255.548c37.407 0 71.438 11.136 96.213 29.138 25.886 18.808 41.905 45.125 41.905 74.487 0 29.36-16.017 55.679-41.908 74.49-24.772 18.001-58.805 29.138-96.21 29.138-37.405 0-71.438-11.137-96.21-29.138-25.891-18.811-41.908-45.13-41.908-74.49 0-29.362 16.019-55.679 41.905-74.487 24.775-18.002 58.808-29.138 96.213-29.138z\"/><circle fill=\"#A5414B\" cx=\"203.259\" cy=\"358.515\" r=\"29.673\"/><circle fill=\"#A5414B\" cx=\"298.744\" cy=\"358.515\" r=\"29.673\"/></svg>', 'utf8').toString('base64')}`,\n homeUrl: 'https://bsky.social/',\n termsOfServiceUrl: 'https://bsky.social/about/support/tos',\n privacyPolicyUrl: 'https://bsky.social/about/support/privacy-policy',\n supportUrl: 'https://blueskyweb.zendesk.com/hc/en-us',\n ...config,\n })\n\n await server.start()\n\n return new TestPds(url, port, server)\n }\n\n get ctx(): AppContext {\n return this.server.ctx\n }\n\n getAgent(): AtpAgent {\n const agent = new AtpAgent({ service: this.url })\n agent.configureLabelers([EXAMPLE_LABELER])\n return agent\n }\n\n getClient(): Client {\n const client = new Client({ service: this.url })\n client.setLabelers([EXAMPLE_LABELER])\n return client\n }\n\n adminAuth(): string {\n return (\n 'Basic ' +\n ui8.toString(\n ui8.fromString(`admin:${ADMIN_PASSWORD}`, 'utf8'),\n 'base64pad',\n )\n )\n }\n\n adminAuthHeaders() {\n return {\n authorization: this.adminAuth(),\n }\n }\n\n jwtSecretKey() {\n return createSecretKeyObject(JWT_SECRET)\n }\n\n async processAll() {\n await this.ctx.backgroundQueue.processAll()\n }\n\n async close() {\n await this.server.destroy()\n }\n\n async [Symbol.asyncDispose]() {\n await this.close()\n }\n}\n"]}
|
package/dist/plc.js
CHANGED
package/dist/plc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plc.js","sourceRoot":"","sources":["../src/plc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAA;AACtC,OAAO,OAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"plc.js","sourceRoot":"","sources":["../src/plc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAA;AACtC,OAAO,OAAO,MAAM,eAAe,CAAA;AAGnC,MAAM,OAAO,OAAO;IAClB,YACS,GAAW,EACX,IAAY,EACZ,MAAqB;mBAFrB,GAAG;oBACH,IAAI;sBACJ,MAAM;IACZ,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAc;QAChC,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAA;QAC1C,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAA;QACzD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACvC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA;IACxB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAC7B,CAAC;CACF","sourcesContent":["import { Client as PlcClient } from '@did-plc/lib'\nimport * as plc from '@did-plc/server'\nimport getPort from './get-port.js'\nimport type { PlcConfig } from './types.js'\n\nexport class TestPlc {\n constructor(\n public url: string,\n public port: number,\n public server: plc.PlcServer,\n ) {}\n\n static async create(cfg: PlcConfig): Promise<TestPlc> {\n const db = plc.Database.mock()\n const port = cfg.port || (await getPort())\n const url = `http://localhost:${port}`\n const server = plc.PlcServer.create({ db, port, ...cfg })\n await server.start()\n return new TestPlc(url, port, server)\n }\n\n get ctx(): plc.AppContext {\n return this.server.ctx\n }\n\n getClient(): PlcClient {\n return new PlcClient(this.url)\n }\n\n async close() {\n await this.server.destroy()\n }\n}\n"]}
|
package/dist/seed/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ export * from './client.js';
|
|
|
2
2
|
export { default as authorFeedSeed } from './author-feed.js';
|
|
3
3
|
export { default as basicSeed } from './basic.js';
|
|
4
4
|
export { default as followsSeed } from './follows.js';
|
|
5
|
-
export { default as likesSeed } from './likes.js';
|
|
6
5
|
export { default as quotesSeed } from './quotes.js';
|
|
7
6
|
export { default as repostsSeed } from './reposts.js';
|
|
8
7
|
export { default as usersBulkSeed } from './users-bulk.js';
|
package/dist/seed/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seed/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAE3B,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seed/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAE3B,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/seed/index.js
CHANGED
|
@@ -2,7 +2,6 @@ export * from './client.js';
|
|
|
2
2
|
export { default as authorFeedSeed } from './author-feed.js';
|
|
3
3
|
export { default as basicSeed } from './basic.js';
|
|
4
4
|
export { default as followsSeed } from './follows.js';
|
|
5
|
-
export { default as likesSeed } from './likes.js';
|
|
6
5
|
export { default as quotesSeed } from './quotes.js';
|
|
7
6
|
export { default as repostsSeed } from './reposts.js';
|
|
8
7
|
export { default as usersBulkSeed } from './users-bulk.js';
|
package/dist/seed/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/seed/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAE3B,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/seed/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAE3B,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAA","sourcesContent":["export * from './client.js'\n\nexport { default as authorFeedSeed } from './author-feed.js'\nexport { default as basicSeed } from './basic.js'\nexport { default as followsSeed } from './follows.js'\nexport { default as quotesSeed } from './quotes.js'\nexport { default as repostsSeed } from './reposts.js'\nexport { default as usersBulkSeed } from './users-bulk.js'\nexport { default as usersSeed } from './users.js'\nexport { default as verificationsSeed } from './verifications.js'\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/dev-env",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Local development environment helper for atproto development",
|
|
6
6
|
"keywords": [
|
|
@@ -40,19 +40,19 @@
|
|
|
40
40
|
"multiformats": "^13.0.0",
|
|
41
41
|
"uint8arrays": "^5.0.0",
|
|
42
42
|
"undici": "^8.5.0",
|
|
43
|
-
"@atproto/
|
|
44
|
-
"@atproto/
|
|
43
|
+
"@atproto/bsky": "^0.0.273",
|
|
44
|
+
"@atproto/api": "^0.20.39",
|
|
45
|
+
"@atproto/bsync": "^0.0.40",
|
|
46
|
+
"@atproto/common-web": "^0.5.9",
|
|
45
47
|
"@atproto/identity": "^0.5.9",
|
|
46
|
-
"@atproto/crypto": "^0.5.4",
|
|
47
|
-
"@atproto/ozone": "^0.2.26",
|
|
48
48
|
"@atproto/lex": "^0.3.5",
|
|
49
|
-
"@atproto/bsync": "^0.0.40",
|
|
50
49
|
"@atproto/lexicon": "^0.7.11",
|
|
51
|
-
"@atproto/
|
|
52
|
-
"@atproto/
|
|
53
|
-
"@atproto/sync": "^0.4.
|
|
54
|
-
"@atproto/
|
|
55
|
-
"@atproto/syntax": "^0.7.4"
|
|
50
|
+
"@atproto/ozone": "^0.2.27",
|
|
51
|
+
"@atproto/crypto": "^0.5.4",
|
|
52
|
+
"@atproto/sync": "^0.4.3",
|
|
53
|
+
"@atproto/pds": "^0.5.27",
|
|
54
|
+
"@atproto/syntax": "^0.7.4",
|
|
55
|
+
"@atproto/xrpc-server": "^0.12.3"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@types/express": "^4.17.13"
|
package/src/bsky.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Client as PlcClient } from '@did-plc/lib'
|
|
2
|
-
import getPort from 'get-port'
|
|
3
2
|
import * as ui8 from 'uint8arrays'
|
|
4
3
|
import { AtpAgent } from '@atproto/api'
|
|
5
4
|
import * as bsky from '@atproto/bsky'
|
|
@@ -7,6 +6,7 @@ import { Secp256k1Keypair } from '@atproto/crypto'
|
|
|
7
6
|
import { Client } from '@atproto/lex'
|
|
8
7
|
import type { DidString } from '@atproto/syntax'
|
|
9
8
|
import { ADMIN_PASSWORD, EXAMPLE_LABELER } from './const.js'
|
|
9
|
+
import getPort from './get-port.js'
|
|
10
10
|
import type { BskyConfig } from './types.js'
|
|
11
11
|
export * from '@atproto/bsky'
|
|
12
12
|
|
package/src/bsync.ts
CHANGED
package/src/feed-gen.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import events from 'node:events'
|
|
2
2
|
import type http from 'node:http'
|
|
3
3
|
import * as plc from '@did-plc/lib'
|
|
4
|
-
import getPort from 'get-port'
|
|
5
4
|
import { type HttpTerminator, createHttpTerminator } from 'http-terminator'
|
|
6
5
|
import { Secp256k1Keypair } from '@atproto/crypto'
|
|
7
6
|
import { type SkeletonHandler, app } from '@atproto/pds'
|
|
8
7
|
import type { AtUriString, DidString } from '@atproto/syntax'
|
|
9
8
|
import { InvalidRequestError, createServer } from '@atproto/xrpc-server'
|
|
9
|
+
import getPort from './get-port.js'
|
|
10
10
|
|
|
11
11
|
export class TestFeedGen {
|
|
12
12
|
private terminator: HttpTerminator
|
package/src/get-port.ts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto'
|
|
2
|
+
import { unlinkSync } from 'node:fs'
|
|
3
|
+
import {
|
|
4
|
+
link,
|
|
5
|
+
mkdir,
|
|
6
|
+
readFile,
|
|
7
|
+
readdir,
|
|
8
|
+
unlink,
|
|
9
|
+
writeFile,
|
|
10
|
+
} from 'node:fs/promises'
|
|
11
|
+
import { tmpdir } from 'node:os'
|
|
12
|
+
import { basename, join } from 'node:path'
|
|
13
|
+
import getAvailablePort from 'get-port'
|
|
14
|
+
|
|
15
|
+
const SWEEP_INTERVAL_MS = 1_000
|
|
16
|
+
const SWEEP_LOCK_PATTERN = /^\.sweep-(\d+)$/
|
|
17
|
+
const lockDir = join(
|
|
18
|
+
tmpdir(),
|
|
19
|
+
`atproto-dev-env-ports-${process.getuid?.() ?? 'unknown'}`,
|
|
20
|
+
)
|
|
21
|
+
const claimedPorts = new Set<string>()
|
|
22
|
+
const ownerPath = join(lockDir, `.owner-${process.pid}-${randomUUID()}`)
|
|
23
|
+
|
|
24
|
+
let initialize: Promise<void> | undefined
|
|
25
|
+
|
|
26
|
+
const isProcessRunning = (pid: number) => {
|
|
27
|
+
try {
|
|
28
|
+
process.kill(pid, 0)
|
|
29
|
+
return true
|
|
30
|
+
} catch (err) {
|
|
31
|
+
return err?.['code'] !== 'ESRCH'
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const acquireSweepLock = async (
|
|
36
|
+
lockDir: string,
|
|
37
|
+
ownerPath: string,
|
|
38
|
+
generation = Math.floor(Date.now() / SWEEP_INTERVAL_MS),
|
|
39
|
+
): Promise<(() => Promise<void>) | undefined> => {
|
|
40
|
+
const sweepPath = join(lockDir, `.sweep-${generation}`)
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
await link(ownerPath, sweepPath)
|
|
44
|
+
} catch (err) {
|
|
45
|
+
if (err?.['code'] === 'EEXIST') return
|
|
46
|
+
throw err
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
const entries = await readdir(lockDir)
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
const match = SWEEP_LOCK_PATTERN.exec(entry)
|
|
53
|
+
if (!match || entry === basename(sweepPath)) continue
|
|
54
|
+
|
|
55
|
+
const otherSweepPath = join(lockDir, entry)
|
|
56
|
+
try {
|
|
57
|
+
const pid = Number.parseInt(await readFile(otherSweepPath, 'utf8'), 10)
|
|
58
|
+
if (Number.isSafeInteger(pid) && isProcessRunning(pid)) {
|
|
59
|
+
await unlink(sweepPath)
|
|
60
|
+
return
|
|
61
|
+
}
|
|
62
|
+
// Sweep generations are never reclaimed, so an inactive marker can
|
|
63
|
+
// be removed without racing a new owner of the same path.
|
|
64
|
+
await unlink(otherSweepPath)
|
|
65
|
+
} catch (err) {
|
|
66
|
+
if (err?.['code'] !== 'ENOENT') throw err
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return async () => {
|
|
71
|
+
try {
|
|
72
|
+
await unlink(sweepPath)
|
|
73
|
+
} catch (err) {
|
|
74
|
+
if (err?.['code'] !== 'ENOENT') throw err
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
} catch (err) {
|
|
78
|
+
try {
|
|
79
|
+
await unlink(sweepPath)
|
|
80
|
+
} catch (cleanupErr) {
|
|
81
|
+
if (cleanupErr?.['code'] !== 'ENOENT') throw cleanupErr
|
|
82
|
+
}
|
|
83
|
+
throw err
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export const sweepStaleReservations = async (
|
|
88
|
+
lockDir: string,
|
|
89
|
+
ownerPath: string,
|
|
90
|
+
) => {
|
|
91
|
+
const entries = await readdir(lockDir)
|
|
92
|
+
await Promise.all(
|
|
93
|
+
entries
|
|
94
|
+
.filter(
|
|
95
|
+
(entry) =>
|
|
96
|
+
entry !== basename(ownerPath) &&
|
|
97
|
+
(/^\d+$/.test(entry) || entry.startsWith('.owner-')),
|
|
98
|
+
)
|
|
99
|
+
.map(async (entry) => {
|
|
100
|
+
const lockPath = join(lockDir, entry)
|
|
101
|
+
try {
|
|
102
|
+
const pid = Number.parseInt(await readFile(lockPath, 'utf8'), 10)
|
|
103
|
+
if (!Number.isSafeInteger(pid) || !isProcessRunning(pid)) {
|
|
104
|
+
await unlink(lockPath)
|
|
105
|
+
}
|
|
106
|
+
} catch (err) {
|
|
107
|
+
if (err?.['code'] !== 'ENOENT') throw err
|
|
108
|
+
}
|
|
109
|
+
}),
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const initializeLockDir = async () => {
|
|
114
|
+
await mkdir(lockDir, { recursive: true })
|
|
115
|
+
await writeFile(ownerPath, String(process.pid), { flag: 'wx' })
|
|
116
|
+
|
|
117
|
+
const releaseSweepLock = await acquireSweepLock(lockDir, ownerPath)
|
|
118
|
+
if (!releaseSweepLock) return
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
await sweepStaleReservations(lockDir, ownerPath)
|
|
122
|
+
} finally {
|
|
123
|
+
await releaseSweepLock()
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
process.once('exit', () => {
|
|
128
|
+
for (const lockPath of claimedPorts) {
|
|
129
|
+
try {
|
|
130
|
+
unlinkSync(lockPath)
|
|
131
|
+
} catch {
|
|
132
|
+
// The process is already exiting, so cleanup is best effort.
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
unlinkSync(ownerPath)
|
|
137
|
+
} catch {
|
|
138
|
+
// The process is already exiting, so cleanup is best effort.
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
export default async function getPort(): Promise<number> {
|
|
143
|
+
initialize ??= initializeLockDir()
|
|
144
|
+
await initialize
|
|
145
|
+
|
|
146
|
+
while (true) {
|
|
147
|
+
const port = await getAvailablePort()
|
|
148
|
+
const lockPath = join(lockDir, String(port))
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
await link(ownerPath, lockPath)
|
|
152
|
+
claimedPorts.add(lockPath)
|
|
153
|
+
return port
|
|
154
|
+
} catch (err) {
|
|
155
|
+
if (err?.['code'] !== 'EEXIST') throw err
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -6,7 +6,7 @@ import { SeedClient } from './seed/client.js'
|
|
|
6
6
|
import type { TestServerParams } from './types.js'
|
|
7
7
|
import { mockNetworkUtilities } from './util.js'
|
|
8
8
|
|
|
9
|
-
export class TestNetworkNoAppView {
|
|
9
|
+
export class TestNetworkNoAppView implements AsyncDisposable {
|
|
10
10
|
feedGens: TestFeedGen[] = []
|
|
11
11
|
constructor(
|
|
12
12
|
public plc: TestPlc,
|
|
@@ -46,8 +46,30 @@ export class TestNetworkNoAppView {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
async close() {
|
|
49
|
-
|
|
50
|
-
await
|
|
51
|
-
|
|
49
|
+
// @TODO Use disposable stack to implement this
|
|
50
|
+
const errors = await Promise.allSettled(
|
|
51
|
+
this.feedGens.map((fg) => fg.close()),
|
|
52
|
+
).then((results) =>
|
|
53
|
+
results.filter((r) => r.status === 'rejected').map((r) => r.reason),
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
await this.pds.close()
|
|
58
|
+
} catch (err) {
|
|
59
|
+
errors.push(err)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
try {
|
|
63
|
+
await this.plc.close()
|
|
64
|
+
} catch (err) {
|
|
65
|
+
errors.push(err)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (errors.length === 1) throw errors[0]
|
|
69
|
+
if (errors.length > 1) throw new AggregateError(errors)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async [Symbol.asyncDispose]() {
|
|
73
|
+
await this.close()
|
|
52
74
|
}
|
|
53
75
|
}
|
package/src/network.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import assert from 'node:assert'
|
|
2
|
-
import getPort from 'get-port'
|
|
3
2
|
import * as uint8arrays from 'uint8arrays'
|
|
4
3
|
import { allFulfilled, wait } from '@atproto/common-web'
|
|
5
4
|
import { createServiceJwt } from '@atproto/xrpc-server'
|
|
6
5
|
import { TestBsky } from './bsky.js'
|
|
7
6
|
import { TestBsync } from './bsync.js'
|
|
8
7
|
import { EXAMPLE_LABELER } from './const.js'
|
|
8
|
+
import getPort from './get-port.js'
|
|
9
9
|
import { IntrospectServer } from './introspect.js'
|
|
10
10
|
import { TestNetworkNoAppView } from './network-no-appview.js'
|
|
11
11
|
import { TestOzone } from './ozone.js'
|
package/src/ozone.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as plc from '@did-plc/lib'
|
|
2
|
-
import getPort from 'get-port'
|
|
3
2
|
import * as ui8 from 'uint8arrays'
|
|
4
3
|
import { AtpAgent } from '@atproto/api'
|
|
5
4
|
import { type Keypair, Secp256k1Keypair } from '@atproto/crypto'
|
|
6
5
|
import * as ozone from '@atproto/ozone'
|
|
7
6
|
import { createServiceJwt } from '@atproto/xrpc-server'
|
|
8
7
|
import { ADMIN_PASSWORD, EXAMPLE_LABELER } from './const.js'
|
|
8
|
+
import getPort from './get-port.js'
|
|
9
9
|
import { ModeratorClient } from './moderator-client.js'
|
|
10
10
|
import type { DidAndKey, OzoneConfig } from './types.js'
|
|
11
11
|
import { createDidAndKey } from './util.js'
|
package/src/pds.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import fs from 'node:fs/promises'
|
|
2
2
|
import os from 'node:os'
|
|
3
3
|
import path from 'node:path'
|
|
4
|
-
import getPort from 'get-port'
|
|
5
4
|
import * as ui8 from 'uint8arrays'
|
|
6
5
|
import { AtpAgent } from '@atproto/api'
|
|
7
6
|
import { Secp256k1Keypair, randomStr } from '@atproto/crypto'
|
|
8
7
|
import { Client } from '@atproto/lex'
|
|
9
8
|
import { type AppContext, PDS, createSecretKeyObject } from '@atproto/pds'
|
|
10
9
|
import { ADMIN_PASSWORD, EXAMPLE_LABELER, JWT_SECRET } from './const.js'
|
|
10
|
+
import getPort from './get-port.js'
|
|
11
11
|
import type { PdsConfig } from './types.js'
|
|
12
12
|
|
|
13
13
|
export class TestPds {
|
package/src/plc.ts
CHANGED
package/src/seed/index.ts
CHANGED
|
@@ -3,7 +3,6 @@ export * from './client.js'
|
|
|
3
3
|
export { default as authorFeedSeed } from './author-feed.js'
|
|
4
4
|
export { default as basicSeed } from './basic.js'
|
|
5
5
|
export { default as followsSeed } from './follows.js'
|
|
6
|
-
export { default as likesSeed } from './likes.js'
|
|
7
6
|
export { default as quotesSeed } from './quotes.js'
|
|
8
7
|
export { default as repostsSeed } from './reposts.js'
|
|
9
8
|
export { default as usersBulkSeed } from './users-bulk.js'
|
package/dist/seed/likes.d.ts
DELETED
package/dist/seed/likes.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"likes.d.ts","sourceRoot":"","sources":["../../src/seed/likes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;;0BAEvB,EAAE,EAAE,UAAU"}
|
package/dist/seed/likes.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import basicSeed from './basic.js';
|
|
2
|
-
export default async (sc) => {
|
|
3
|
-
await basicSeed(sc);
|
|
4
|
-
await sc.createAccount('eve', {
|
|
5
|
-
email: 'eve@test.com',
|
|
6
|
-
handle: 'eve.test',
|
|
7
|
-
password: 'eve-pass',
|
|
8
|
-
});
|
|
9
|
-
await sc.like(sc.dids.eve, sc.posts[sc.dids.alice][1].ref);
|
|
10
|
-
await sc.like(sc.dids.carol, sc.replies[sc.dids.bob][0].ref);
|
|
11
|
-
// give alice > 100 likes
|
|
12
|
-
for (let i = 0; i < 50; i++) {
|
|
13
|
-
const [b, c, d] = await Promise.all([
|
|
14
|
-
sc.post(sc.dids.bob, `bob post ${i}`),
|
|
15
|
-
sc.post(sc.dids.carol, `carol post ${i}`),
|
|
16
|
-
sc.post(sc.dids.dan, `dan post ${i}`),
|
|
17
|
-
]);
|
|
18
|
-
await Promise.all([
|
|
19
|
-
sc.like(sc.dids.alice, b.ref), // likes 50 of bobs posts
|
|
20
|
-
i < 45 && sc.like(sc.dids.alice, c.ref), // likes 45 of carols posts
|
|
21
|
-
i < 40 && sc.like(sc.dids.alice, d.ref), // likes 40 of dans posts
|
|
22
|
-
].filter(Boolean));
|
|
23
|
-
}
|
|
24
|
-
// couple more NPCs for suggested follows
|
|
25
|
-
await sc.createAccount('fred', {
|
|
26
|
-
email: 'fred@test.com',
|
|
27
|
-
handle: 'fred.test',
|
|
28
|
-
password: 'fred-pass',
|
|
29
|
-
});
|
|
30
|
-
await sc.createAccount('gina', {
|
|
31
|
-
email: 'gina@test.com',
|
|
32
|
-
handle: 'gina.test',
|
|
33
|
-
password: 'gina-pass',
|
|
34
|
-
});
|
|
35
|
-
return sc;
|
|
36
|
-
};
|
|
37
|
-
//# sourceMappingURL=likes.js.map
|
package/dist/seed/likes.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"likes.js","sourceRoot":"","sources":["../../src/seed/likes.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAA;AAGlC,eAAe,KAAK,EAAE,EAAc,EAAE,EAAE;IACtC,MAAM,SAAS,CAAC,EAAE,CAAC,CAAA;IACnB,MAAM,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;QAC5B,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,UAAU;KACrB,CAAC,CAAA;IACF,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC1D,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAE5D,yBAAyB;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAClC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC;YACrC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;YACzC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC;SACtC,CAAC,CAAA;QACF,MAAM,OAAO,CAAC,GAAG,CACf;YACE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,yBAAyB;YACxD,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,2BAA2B;YACpE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,yBAAyB;SACnE,CAAC,MAAM,CAAC,OAAO,CAAC,CAClB,CAAA;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE;QAC7B,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAA;IACF,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE;QAC7B,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAA;IAEF,OAAO,EAAE,CAAA;AACX,CAAC,CAAA","sourcesContent":["import basicSeed from './basic.js'\nimport type { SeedClient } from './client.js'\n\nexport default async (sc: SeedClient) => {\n await basicSeed(sc)\n await sc.createAccount('eve', {\n email: 'eve@test.com',\n handle: 'eve.test',\n password: 'eve-pass',\n })\n await sc.like(sc.dids.eve, sc.posts[sc.dids.alice][1].ref)\n await sc.like(sc.dids.carol, sc.replies[sc.dids.bob][0].ref)\n\n // give alice > 100 likes\n for (let i = 0; i < 50; i++) {\n const [b, c, d] = await Promise.all([\n sc.post(sc.dids.bob, `bob post ${i}`),\n sc.post(sc.dids.carol, `carol post ${i}`),\n sc.post(sc.dids.dan, `dan post ${i}`),\n ])\n await Promise.all(\n [\n sc.like(sc.dids.alice, b.ref), // likes 50 of bobs posts\n i < 45 && sc.like(sc.dids.alice, c.ref), // likes 45 of carols posts\n i < 40 && sc.like(sc.dids.alice, d.ref), // likes 40 of dans posts\n ].filter(Boolean),\n )\n }\n\n // couple more NPCs for suggested follows\n await sc.createAccount('fred', {\n email: 'fred@test.com',\n handle: 'fred.test',\n password: 'fred-pass',\n })\n await sc.createAccount('gina', {\n email: 'gina@test.com',\n handle: 'gina.test',\n password: 'gina-pass',\n })\n\n return sc\n}\n"]}
|