@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.
Files changed (49) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/bsky.d.ts.map +1 -1
  3. package/dist/bsky.js +1 -1
  4. package/dist/bsky.js.map +1 -1
  5. package/dist/bsync.d.ts.map +1 -1
  6. package/dist/bsync.js +1 -1
  7. package/dist/bsync.js.map +1 -1
  8. package/dist/feed-gen.d.ts.map +1 -1
  9. package/dist/feed-gen.js +1 -1
  10. package/dist/feed-gen.js.map +1 -1
  11. package/dist/get-port.d.ts +4 -0
  12. package/dist/get-port.d.ts.map +1 -0
  13. package/dist/get-port.js +140 -0
  14. package/dist/get-port.js.map +1 -0
  15. package/dist/network-no-appview.d.ts +2 -1
  16. package/dist/network-no-appview.d.ts.map +1 -1
  17. package/dist/network-no-appview.js +21 -3
  18. package/dist/network-no-appview.js.map +1 -1
  19. package/dist/network.d.ts.map +1 -1
  20. package/dist/network.js +1 -1
  21. package/dist/network.js.map +1 -1
  22. package/dist/ozone.d.ts.map +1 -1
  23. package/dist/ozone.js +1 -1
  24. package/dist/ozone.js.map +1 -1
  25. package/dist/pds.d.ts.map +1 -1
  26. package/dist/pds.js +1 -1
  27. package/dist/pds.js.map +1 -1
  28. package/dist/plc.js +1 -1
  29. package/dist/plc.js.map +1 -1
  30. package/dist/seed/index.d.ts +0 -1
  31. package/dist/seed/index.d.ts.map +1 -1
  32. package/dist/seed/index.js +0 -1
  33. package/dist/seed/index.js.map +1 -1
  34. package/package.json +11 -11
  35. package/src/bsky.ts +1 -1
  36. package/src/bsync.ts +1 -1
  37. package/src/feed-gen.ts +1 -1
  38. package/src/get-port.ts +158 -0
  39. package/src/network-no-appview.ts +26 -4
  40. package/src/network.ts +1 -1
  41. package/src/ozone.ts +1 -1
  42. package/src/pds.ts +1 -1
  43. package/src/plc.ts +1 -1
  44. package/src/seed/index.ts +0 -1
  45. package/dist/seed/likes.d.ts +0 -4
  46. package/dist/seed/likes.d.ts.map +0 -1
  47. package/dist/seed/likes.js +0 -37
  48. package/dist/seed/likes.js.map +0 -1
  49. package/src/seed/likes.ts +0 -43
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atproto/dev-env
2
2
 
3
+ ## 0.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#5359](https://github.com/bluesky-social/atproto/pull/5359) [`aadb103`](https://github.com/bluesky-social/atproto/commit/aadb10349497d7c6b6ce5641dbbb1fd940dd5b12) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Remove the unused `likesSeed` test fixture.
8
+
9
+ ### Patch Changes
10
+
11
+ - [#5369](https://github.com/bluesky-social/atproto/pull/5369) [`bd32a32`](https://github.com/bluesky-social/atproto/commit/bd32a32d7103258cdcfd470e9434611ac8f6349b) Thanks [@amckinley](https://github.com/amckinley)! - Serialize stale test-port reservation sweeps and remove owner files left by terminated workers.
12
+
13
+ - [#5367](https://github.com/bluesky-social/atproto/pull/5367) [`63826b9`](https://github.com/bluesky-social/atproto/commit/63826b9d6dc73061fc4b930e5563f4b64c358c10) Thanks [@amckinley](https://github.com/amckinley)! - Reserve test server ports across processes to prevent parallel test workers from selecting the same port.
14
+
15
+ - Updated dependencies [[`098cdd7`](https://github.com/bluesky-social/atproto/commit/098cdd7dcf11fc0421278dd768f286ee80399e4f), [`b2de0ee`](https://github.com/bluesky-social/atproto/commit/b2de0ee1ccb70fac69be90037751ea30daa37e3f), [`aa72025`](https://github.com/bluesky-social/atproto/commit/aa720259cd62362f5ea0a6a8314a42cdc24e6681), [`ed2317e`](https://github.com/bluesky-social/atproto/commit/ed2317e2ce974d63c24f977cd40579badc1e639f), [`5c31425`](https://github.com/bluesky-social/atproto/commit/5c31425e79c46e435e9d87285461e745247ea818), [`aadb103`](https://github.com/bluesky-social/atproto/commit/aadb10349497d7c6b6ce5641dbbb1fd940dd5b12), [`063dba4`](https://github.com/bluesky-social/atproto/commit/063dba438f8edab8ccf9650559ba0839f20ca639)]:
16
+ - @atproto/pds@0.5.27
17
+ - @atproto/api@0.20.39
18
+ - @atproto/bsky@0.0.273
19
+ - @atproto/ozone@0.2.27
20
+ - @atproto/sync@0.4.3
21
+ - @atproto/xrpc-server@0.12.3
22
+
3
23
  ## 0.5.44
4
24
 
5
25
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"bsky.d.ts","sourceRoot":"","sources":["../src/bsky.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;AAErC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,cAAc,eAAe,CAAA;AAE7B,qBAAa,QAAQ;IAEV,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,IAAI,CAAC,QAAQ;IACjB,MAAM,EAAE,IAAI,CAAC,WAAW;IACxB,SAAS,EAAE,IAAI,CAAC,eAAe;IAC/B,QAAQ,EAAE,IAAI,CAAC,iBAAiB;IAChC,GAAG,EAAE,IAAI,CAAC,gBAAgB;IAC1B,SAAS,EAAE,MAAM;IAR1B,YACS,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,IAAI,CAAC,QAAQ,EACjB,MAAM,EAAE,IAAI,CAAC,WAAW,EACxB,SAAS,EAAE,IAAI,CAAC,eAAe,EAC/B,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAChC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAC1B,SAAS,EAAE,MAAM,EACtB;IAEJ,OAAa,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqHtD;IAED,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAEzB;IAED,QAAQ,IAAI,QAAQ,CAInB;IAED,SAAS,IAAI,MAAM,CAIlB;IAED,SAAS,IAAI,MAAM,CAMlB;IAED,gBAAgB;QAEZ,aAAa;MAEhB;IAEK,KAAK,kBAmBV;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF"}
1
+ {"version":3,"file":"bsky.d.ts","sourceRoot":"","sources":["../src/bsky.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;AAErC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAIrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,cAAc,eAAe,CAAA;AAE7B,qBAAa,QAAQ;IAEV,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,IAAI,CAAC,QAAQ;IACjB,MAAM,EAAE,IAAI,CAAC,WAAW;IACxB,SAAS,EAAE,IAAI,CAAC,eAAe;IAC/B,QAAQ,EAAE,IAAI,CAAC,iBAAiB;IAChC,GAAG,EAAE,IAAI,CAAC,gBAAgB;IAC1B,SAAS,EAAE,MAAM;IAR1B,YACS,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,IAAI,CAAC,QAAQ,EACjB,MAAM,EAAE,IAAI,CAAC,WAAW,EACxB,SAAS,EAAE,IAAI,CAAC,eAAe,EAC/B,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAChC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAC1B,SAAS,EAAE,MAAM,EACtB;IAEJ,OAAa,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqHtD;IAED,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAEzB;IAED,QAAQ,IAAI,QAAQ,CAInB;IAED,SAAS,IAAI,MAAM,CAIlB;IAED,SAAS,IAAI,MAAM,CAMlB;IAED,gBAAgB;QAEZ,aAAa;MAEhB;IAEK,KAAK,kBAmBV;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF"}
package/dist/bsky.js CHANGED
@@ -1,11 +1,11 @@
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';
6
5
  import { Secp256k1Keypair } from '@atproto/crypto';
7
6
  import { Client } from '@atproto/lex';
8
7
  import { ADMIN_PASSWORD, EXAMPLE_LABELER } from './const.js';
8
+ import getPort from './get-port.js';
9
9
  export * from '@atproto/bsky';
10
10
  export class TestBsky {
11
11
  constructor(url, port, db, server, dataplane, bsyncSub, sub, serverDid) {
package/dist/bsky.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bsky.js","sourceRoot":"","sources":["../src/bsky.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client as PlcClient } from '@did-plc/lib'\nimport getPort from 'get-port'\nimport * as ui8 from 'uint8arrays'\nimport { AtpAgent } from '@atproto/api'\nimport * as bsky from '@atproto/bsky'\nimport { Secp256k1Keypair } from '@atproto/crypto'\nimport { Client } from '@atproto/lex'\nimport type { DidString } from '@atproto/syntax'\nimport { ADMIN_PASSWORD, EXAMPLE_LABELER } from './const.js'\nimport type { BskyConfig } from './types.js'\nexport * from '@atproto/bsky'\n\nexport class TestBsky {\n constructor(\n public url: string,\n public port: number,\n public db: bsky.Database,\n public server: bsky.BskyAppView,\n public dataplane: bsky.DataPlaneServer,\n public bsyncSub: bsky.BsyncSubscription,\n public sub: bsky.RepoSubscription,\n public serverDid: string,\n ) {}\n\n static async create(cfg: BskyConfig): Promise<TestBsky> {\n const serviceKeypair = cfg.privateKey\n ? await Secp256k1Keypair.import(cfg.privateKey)\n : await Secp256k1Keypair.create()\n const plcClient = new PlcClient(cfg.plcUrl)\n\n const port = cfg.port || (await getPort())\n const url = `http://localhost:${port}`\n const serverDid = (await plcClient.createDid({\n signingKey: serviceKeypair.did(),\n rotationKeys: [serviceKeypair.did()],\n handle: 'bsky.test',\n pds: `http://localhost:${port}`,\n signer: serviceKeypair,\n })) as DidString\n\n const endpoint = `http://localhost:${port}`\n\n await plcClient.updateData(serverDid, serviceKeypair, (x) => {\n x.services['bsky_notif'] = {\n type: 'BskyNotificationService',\n endpoint,\n }\n x.services['bsky_appview'] = {\n type: 'BskyAppView',\n endpoint,\n }\n return x\n })\n\n // shared across server, ingester, and indexer in order to share pool, avoid too many pg connections.\n const db = new bsky.Database({\n url: cfg.dbPostgresUrl,\n schema: cfg.dbPostgresSchema,\n poolSize: 10,\n })\n\n const dataplanePort = await getPort()\n const dataplane = await bsky.DataPlaneServer.create(\n db,\n dataplanePort,\n cfg.plcUrl,\n )\n\n const config = new bsky.ServerConfig({\n version: 'unknown',\n port,\n didPlcUrl: cfg.plcUrl,\n publicUrl: 'https://bsky.public.url',\n serverDid,\n alternateAudienceDids: [],\n dataplaneUrls: [`http://localhost:${dataplanePort}`],\n dataplaneHttpVersion: '1.1',\n bsyncHttpVersion: '1.1',\n bsyncApiKey: 'bsync-api-key',\n modServiceDid: cfg.modServiceDid ?? 'did:example:invalidMod',\n labelsFromIssuerDids: [EXAMPLE_LABELER],\n bigThreadUris: new Set(),\n maxThreadParents: cfg.maxThreadParents ?? 50,\n disableSsrfProtection: true,\n searchTagsHide: new Set(),\n searchTagsHideAll: new Set(),\n threadTagsBumpDown: new Set(),\n threadTagsHide: new Set(),\n visibilityTagHide: '',\n visibilityTagRankPrefix: '',\n debugFieldAllowedDids: new Set(),\n draftsLimit: 500,\n ...cfg,\n adminPasswords: [ADMIN_PASSWORD],\n etcdHosts: [],\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 bsky.Database({\n url: cfg.dbPostgresUrl,\n schema: cfg.dbPostgresSchema,\n })\n if (cfg.migration) {\n await migrationDb.migrateToOrThrow(cfg.migration)\n } else {\n await migrationDb.migrateToLatestOrThrow()\n }\n await migrationDb.close()\n\n // api server\n const server = bsky.BskyAppView.create({\n config,\n signingKey: serviceKeypair,\n })\n\n const bsyncSub = new bsky.BsyncSubscription({\n config,\n db,\n })\n\n const sub = new bsky.RepoSubscription({\n service: cfg.repoProvider,\n db,\n idResolver: dataplane.idResolver,\n })\n\n await server.start()\n\n bsyncSub.start()\n void sub.start()\n\n return new TestBsky(\n url,\n port,\n db,\n server,\n dataplane,\n bsyncSub,\n sub,\n serverDid,\n )\n }\n\n get ctx(): bsky.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 const [password] = this.ctx.cfg.adminPasswords\n return (\n 'Basic ' +\n ui8.toString(ui8.fromString(`admin:${password}`, 'utf8'), 'base64pad')\n )\n }\n\n adminAuthHeaders() {\n return {\n authorization: this.adminAuth(),\n }\n }\n\n async close() {\n // @TODO Use disposable stack when it becomes available (Node24+)\n try {\n await this.server.destroy()\n } finally {\n try {\n await this.bsyncSub.destroy()\n } finally {\n try {\n await this.dataplane.destroy()\n } finally {\n try {\n await this.sub.destroy()\n } finally {\n await this.db.close()\n }\n }\n }\n }\n }\n\n async [Symbol.asyncDispose]() {\n await this.close()\n }\n}\n"]}
1
+ {"version":3,"file":"bsky.js","sourceRoot":"","sources":["../src/bsky.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client as PlcClient } from '@did-plc/lib'\nimport * as ui8 from 'uint8arrays'\nimport { AtpAgent } from '@atproto/api'\nimport * as bsky from '@atproto/bsky'\nimport { Secp256k1Keypair } from '@atproto/crypto'\nimport { Client } from '@atproto/lex'\nimport type { DidString } from '@atproto/syntax'\nimport { ADMIN_PASSWORD, EXAMPLE_LABELER } from './const.js'\nimport getPort from './get-port.js'\nimport type { BskyConfig } from './types.js'\nexport * from '@atproto/bsky'\n\nexport class TestBsky {\n constructor(\n public url: string,\n public port: number,\n public db: bsky.Database,\n public server: bsky.BskyAppView,\n public dataplane: bsky.DataPlaneServer,\n public bsyncSub: bsky.BsyncSubscription,\n public sub: bsky.RepoSubscription,\n public serverDid: string,\n ) {}\n\n static async create(cfg: BskyConfig): Promise<TestBsky> {\n const serviceKeypair = cfg.privateKey\n ? await Secp256k1Keypair.import(cfg.privateKey)\n : await Secp256k1Keypair.create()\n const plcClient = new PlcClient(cfg.plcUrl)\n\n const port = cfg.port || (await getPort())\n const url = `http://localhost:${port}`\n const serverDid = (await plcClient.createDid({\n signingKey: serviceKeypair.did(),\n rotationKeys: [serviceKeypair.did()],\n handle: 'bsky.test',\n pds: `http://localhost:${port}`,\n signer: serviceKeypair,\n })) as DidString\n\n const endpoint = `http://localhost:${port}`\n\n await plcClient.updateData(serverDid, serviceKeypair, (x) => {\n x.services['bsky_notif'] = {\n type: 'BskyNotificationService',\n endpoint,\n }\n x.services['bsky_appview'] = {\n type: 'BskyAppView',\n endpoint,\n }\n return x\n })\n\n // shared across server, ingester, and indexer in order to share pool, avoid too many pg connections.\n const db = new bsky.Database({\n url: cfg.dbPostgresUrl,\n schema: cfg.dbPostgresSchema,\n poolSize: 10,\n })\n\n const dataplanePort = await getPort()\n const dataplane = await bsky.DataPlaneServer.create(\n db,\n dataplanePort,\n cfg.plcUrl,\n )\n\n const config = new bsky.ServerConfig({\n version: 'unknown',\n port,\n didPlcUrl: cfg.plcUrl,\n publicUrl: 'https://bsky.public.url',\n serverDid,\n alternateAudienceDids: [],\n dataplaneUrls: [`http://localhost:${dataplanePort}`],\n dataplaneHttpVersion: '1.1',\n bsyncHttpVersion: '1.1',\n bsyncApiKey: 'bsync-api-key',\n modServiceDid: cfg.modServiceDid ?? 'did:example:invalidMod',\n labelsFromIssuerDids: [EXAMPLE_LABELER],\n bigThreadUris: new Set(),\n maxThreadParents: cfg.maxThreadParents ?? 50,\n disableSsrfProtection: true,\n searchTagsHide: new Set(),\n searchTagsHideAll: new Set(),\n threadTagsBumpDown: new Set(),\n threadTagsHide: new Set(),\n visibilityTagHide: '',\n visibilityTagRankPrefix: '',\n debugFieldAllowedDids: new Set(),\n draftsLimit: 500,\n ...cfg,\n adminPasswords: [ADMIN_PASSWORD],\n etcdHosts: [],\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 bsky.Database({\n url: cfg.dbPostgresUrl,\n schema: cfg.dbPostgresSchema,\n })\n if (cfg.migration) {\n await migrationDb.migrateToOrThrow(cfg.migration)\n } else {\n await migrationDb.migrateToLatestOrThrow()\n }\n await migrationDb.close()\n\n // api server\n const server = bsky.BskyAppView.create({\n config,\n signingKey: serviceKeypair,\n })\n\n const bsyncSub = new bsky.BsyncSubscription({\n config,\n db,\n })\n\n const sub = new bsky.RepoSubscription({\n service: cfg.repoProvider,\n db,\n idResolver: dataplane.idResolver,\n })\n\n await server.start()\n\n bsyncSub.start()\n void sub.start()\n\n return new TestBsky(\n url,\n port,\n db,\n server,\n dataplane,\n bsyncSub,\n sub,\n serverDid,\n )\n }\n\n get ctx(): bsky.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 const [password] = this.ctx.cfg.adminPasswords\n return (\n 'Basic ' +\n ui8.toString(ui8.fromString(`admin:${password}`, 'utf8'), 'base64pad')\n )\n }\n\n adminAuthHeaders() {\n return {\n authorization: this.adminAuth(),\n }\n }\n\n async close() {\n // @TODO Use disposable stack when it becomes available (Node24+)\n try {\n await this.server.destroy()\n } finally {\n try {\n await this.bsyncSub.destroy()\n } finally {\n try {\n await this.dataplane.destroy()\n } finally {\n try {\n await this.sub.destroy()\n } finally {\n await this.db.close()\n }\n }\n }\n }\n }\n\n async [Symbol.asyncDispose]() {\n await this.close()\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bsync.d.ts","sourceRoot":"","sources":["../src/bsync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,qBAAa,SAAS;IAEX,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,KAAK,CAAC,YAAY;IAHpC,YACS,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,KAAK,CAAC,YAAY,EAChC;IAEJ,OAAa,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAmBxD;IAED,IAAI,GAAG,IAAI,KAAK,CAAC,UAAU,CAE1B;IAED;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC;QAC9B,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAC,CAeD;IAEK,KAAK,kBAEV;CACF"}
1
+ {"version":3,"file":"bsync.d.ts","sourceRoot":"","sources":["../src/bsync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,qBAAa,SAAS;IAEX,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,KAAK,CAAC,YAAY;IAHpC,YACS,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,KAAK,CAAC,YAAY,EAChC;IAEJ,OAAa,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAmBxD;IAED,IAAI,GAAG,IAAI,KAAK,CAAC,UAAU,CAE1B;IAED;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC;QAC9B,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAC,CAeD;IAEK,KAAK,kBAEV;CACF"}
package/dist/bsync.js CHANGED
@@ -1,5 +1,5 @@
1
- import getPort from 'get-port';
2
1
  import * as bsync from '@atproto/bsync';
2
+ import getPort from './get-port.js';
3
3
  export class TestBsync {
4
4
  constructor(url, port, service) {
5
5
  this.url = url;
package/dist/bsync.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bsync.js","sourceRoot":"","sources":["../src/bsync.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAGvC,MAAM,OAAO,SAAS;IACpB,YACS,GAAW,EACX,IAAY,EACZ,OAA2B;mBAF3B,GAAG;oBACH,IAAI;uBACJ,OAAO;IACb,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAgB;QAClC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAA;QAC1C,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAA;QAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC5B,IAAI;YACJ,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC;YACnC,QAAQ,EAAE,OAAO;YACjB,uEAAuE;YACvE,wEAAwE;YACxE,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;YAC/B,GAAG,GAAG;SACP,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACvD,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAA;QAC7C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QAErB,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAC1C,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;IACzB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc;QAKlB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAA;QACzB,MAAM,GAAG,GAAG,KAAK,EAAE,KAA2C,EAAE,EAAE;YAChE,MAAM,GAAG,GAAG,MAAM,EAAE;iBACjB,UAAU,CAAC,KAAK,CAAC;iBACjB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;iBACxC,gBAAgB,EAAE,CAAA;YACrB,OAAO,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACrD,CAAC,CAAA;QACD,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1C,GAAG,CAAC,WAAW,CAAC;YAChB,GAAG,CAAC,SAAS,CAAC;YACd,GAAG,CAAC,UAAU,CAAC;SAChB,CAAC,CAAA;QACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;IAC9B,CAAC;CACF","sourcesContent":["import getPort from 'get-port'\nimport * as bsync from '@atproto/bsync'\nimport type { BsyncConfig } from './types.js'\n\nexport class TestBsync {\n constructor(\n public url: string,\n public port: number,\n public service: bsync.BsyncService,\n ) {}\n\n static async create(cfg: BsyncConfig): Promise<TestBsync> {\n const port = cfg.port || (await getPort())\n const url = `http://localhost:${port}`\n\n const config = bsync.envToCfg({\n port,\n apiKeys: cfg.apiKeys ?? ['api-key'],\n dbSchema: 'bsync',\n // Keep the pool small: a bsync runs alongside every test network, so a\n // default-sized pool per network quickly exhausts postgres connections.\n dbPoolSize: cfg.dbPoolSize ?? 5,\n ...cfg,\n })\n\n const service = await bsync.BsyncService.create(config)\n await service.ctx.db.migrateToLatestOrThrow()\n await service.start()\n\n return new TestBsync(url, port, service)\n }\n\n get ctx(): bsync.AppContext {\n return this.service.ctx\n }\n\n /**\n * Current head (max id) of each operation stream. Used to wait for the bsky\n * bsync subscription to catch up in tests, without waiting for the long-poll\n * timeout.\n */\n async getStreamHeads(): Promise<{\n op?: string\n mute?: string\n notif?: string\n }> {\n const db = this.ctx.db.db\n const max = async (table: 'operation' | 'mute_op' | 'notif_op') => {\n const row = await db\n .selectFrom(table)\n .select((eb) => eb.fn.max('id').as('id'))\n .executeTakeFirst()\n return row?.id != null ? String(row.id) : undefined\n }\n const [op, mute, notif] = await Promise.all([\n max('operation'),\n max('mute_op'),\n max('notif_op'),\n ])\n return { op, mute, notif }\n }\n\n async close() {\n await this.service.destroy()\n }\n}\n"]}
1
+ {"version":3,"file":"bsync.js","sourceRoot":"","sources":["../src/bsync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AACvC,OAAO,OAAO,MAAM,eAAe,CAAA;AAGnC,MAAM,OAAO,SAAS;IACpB,YACS,GAAW,EACX,IAAY,EACZ,OAA2B;mBAF3B,GAAG;oBACH,IAAI;uBACJ,OAAO;IACb,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAgB;QAClC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAA;QAC1C,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAA;QAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC5B,IAAI;YACJ,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC;YACnC,QAAQ,EAAE,OAAO;YACjB,uEAAuE;YACvE,wEAAwE;YACxE,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;YAC/B,GAAG,GAAG;SACP,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACvD,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAA;QAC7C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QAErB,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAC1C,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;IACzB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc;QAKlB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAA;QACzB,MAAM,GAAG,GAAG,KAAK,EAAE,KAA2C,EAAE,EAAE;YAChE,MAAM,GAAG,GAAG,MAAM,EAAE;iBACjB,UAAU,CAAC,KAAK,CAAC;iBACjB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;iBACxC,gBAAgB,EAAE,CAAA;YACrB,OAAO,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACrD,CAAC,CAAA;QACD,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1C,GAAG,CAAC,WAAW,CAAC;YAChB,GAAG,CAAC,SAAS,CAAC;YACd,GAAG,CAAC,UAAU,CAAC;SAChB,CAAC,CAAA;QACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;IAC9B,CAAC;CACF","sourcesContent":["import * as bsync from '@atproto/bsync'\nimport getPort from './get-port.js'\nimport type { BsyncConfig } from './types.js'\n\nexport class TestBsync {\n constructor(\n public url: string,\n public port: number,\n public service: bsync.BsyncService,\n ) {}\n\n static async create(cfg: BsyncConfig): Promise<TestBsync> {\n const port = cfg.port || (await getPort())\n const url = `http://localhost:${port}`\n\n const config = bsync.envToCfg({\n port,\n apiKeys: cfg.apiKeys ?? ['api-key'],\n dbSchema: 'bsync',\n // Keep the pool small: a bsync runs alongside every test network, so a\n // default-sized pool per network quickly exhausts postgres connections.\n dbPoolSize: cfg.dbPoolSize ?? 5,\n ...cfg,\n })\n\n const service = await bsync.BsyncService.create(config)\n await service.ctx.db.migrateToLatestOrThrow()\n await service.start()\n\n return new TestBsync(url, port, service)\n }\n\n get ctx(): bsync.AppContext {\n return this.service.ctx\n }\n\n /**\n * Current head (max id) of each operation stream. Used to wait for the bsky\n * bsync subscription to catch up in tests, without waiting for the long-poll\n * timeout.\n */\n async getStreamHeads(): Promise<{\n op?: string\n mute?: string\n notif?: string\n }> {\n const db = this.ctx.db.db\n const max = async (table: 'operation' | 'mute_op' | 'notif_op') => {\n const row = await db\n .selectFrom(table)\n .select((eb) => eb.fn.max('id').as('id'))\n .executeTakeFirst()\n return row?.id != null ? String(row.id) : undefined\n }\n const [op, mute, notif] = await Promise.all([\n max('operation'),\n max('mute_op'),\n max('notif_op'),\n ])\n return { op, mute, notif }\n }\n\n async close() {\n await this.service.destroy()\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"feed-gen.d.ts","sourceRoot":"","sources":["../src/feed-gen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAKjC,OAAO,EAAE,KAAK,eAAe,EAAO,MAAM,cAAc,CAAA;AAIxD,qBAAa,WAAW;IASb,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,IAAI,CAAC,MAAM;IACnB,GAAG,EAAE,MAAM;IAVpB,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,iBAAiB,CAAC,CAAe;IAEzC,IAAI,SAAS,YAEZ;IAED,YACS,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,GAAG,EAAE,MAAM,EAGnB;IAED,OAAa,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACrC,OAAO,CAAC,WAAW,CAAC,CA4BtB;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErB;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF"}
1
+ {"version":3,"file":"feed-gen.d.ts","sourceRoot":"","sources":["../src/feed-gen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAIjC,OAAO,EAAE,KAAK,eAAe,EAAO,MAAM,cAAc,CAAA;AAKxD,qBAAa,WAAW;IASb,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,IAAI,CAAC,MAAM;IACnB,GAAG,EAAE,MAAM;IAVpB,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,iBAAiB,CAAC,CAAe;IAEzC,IAAI,SAAS,YAEZ;IAED,YACS,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,GAAG,EAAE,MAAM,EAGnB;IAED,OAAa,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACrC,OAAO,CAAC,WAAW,CAAC,CA4BtB;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErB;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF"}
package/dist/feed-gen.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import events from 'node:events';
2
2
  import * as plc from '@did-plc/lib';
3
- import getPort from 'get-port';
4
3
  import { createHttpTerminator } from 'http-terminator';
5
4
  import { Secp256k1Keypair } from '@atproto/crypto';
6
5
  import { app } from '@atproto/pds';
7
6
  import { InvalidRequestError, createServer } from '@atproto/xrpc-server';
7
+ import getPort from './get-port.js';
8
8
  export class TestFeedGen {
9
9
  get destroyed() {
10
10
  return this.terminatorPromise != null;
@@ -1 +1 @@
1
- {"version":3,"file":"feed-gen.js","sourceRoot":"","sources":["../src/feed-gen.ts"],"names":[],"mappings":"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","sourcesContent":["import events from 'node:events'\nimport type http from 'node:http'\nimport * as plc from '@did-plc/lib'\nimport getPort from 'get-port'\nimport { type HttpTerminator, createHttpTerminator } from 'http-terminator'\nimport { Secp256k1Keypair } from '@atproto/crypto'\nimport { type SkeletonHandler, app } from '@atproto/pds'\nimport type { AtUriString, DidString } from '@atproto/syntax'\nimport { InvalidRequestError, createServer } from '@atproto/xrpc-server'\n\nexport class TestFeedGen {\n private terminator: HttpTerminator\n private terminatorPromise?: Promise<void>\n\n get destroyed() {\n return this.terminatorPromise != null\n }\n\n constructor(\n public port: number,\n public server: http.Server,\n public did: string,\n ) {\n this.terminator = createHttpTerminator({ server })\n }\n\n static async create(\n plcUrl: string,\n feeds: Record<string, SkeletonHandler>,\n ): Promise<TestFeedGen> {\n const port = await getPort()\n const did = await createFgDid(plcUrl, port)\n const xrpcServer = createServer()\n\n xrpcServer.add(app.bsky.feed.getFeedSkeleton, async (args) => {\n const handler = feeds[args.params.feed]\n if (!handler) {\n throw new InvalidRequestError('unknown feed', 'UnknownFeed')\n }\n return handler(args)\n })\n\n xrpcServer.add(app.bsky.feed.describeFeedGenerator, async () => {\n return {\n encoding: 'application/json' as const,\n body: {\n did: did as DidString,\n feeds: (Object.keys(feeds) as AtUriString[]).map((uri) => ({\n uri,\n })),\n },\n }\n })\n\n const httpServer = xrpcServer.listen(port)\n await events.once(httpServer, 'listening')\n return new TestFeedGen(port, httpServer, did)\n }\n\n close(): Promise<void> {\n return (this.terminatorPromise ??= this.terminator.terminate())\n }\n\n async [Symbol.asyncDispose]() {\n await this.close()\n }\n}\n\nconst createFgDid = async (\n plcUrl: string,\n port: number,\n): Promise<DidString> => {\n const keypair = await Secp256k1Keypair.create()\n const plcClient = new plc.Client(plcUrl)\n const op = await plc.signOperation(\n {\n type: 'plc_operation',\n verificationMethods: {\n atproto: keypair.did(),\n },\n rotationKeys: [keypair.did()],\n alsoKnownAs: [],\n services: {\n bsky_fg: {\n type: 'BskyFeedGenerator',\n endpoint: `http://localhost:${port}`,\n },\n },\n prev: null,\n },\n keypair,\n )\n const did = await plc.didForCreateOp(op)\n await plcClient.sendOperation(did, op)\n return did as DidString\n}\n"]}
1
+ {"version":3,"file":"feed-gen.js","sourceRoot":"","sources":["../src/feed-gen.ts"],"names":[],"mappings":"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","sourcesContent":["import events from 'node:events'\nimport type http from 'node:http'\nimport * as plc from '@did-plc/lib'\nimport { type HttpTerminator, createHttpTerminator } from 'http-terminator'\nimport { Secp256k1Keypair } from '@atproto/crypto'\nimport { type SkeletonHandler, app } from '@atproto/pds'\nimport type { AtUriString, DidString } from '@atproto/syntax'\nimport { InvalidRequestError, createServer } from '@atproto/xrpc-server'\nimport getPort from './get-port.js'\n\nexport class TestFeedGen {\n private terminator: HttpTerminator\n private terminatorPromise?: Promise<void>\n\n get destroyed() {\n return this.terminatorPromise != null\n }\n\n constructor(\n public port: number,\n public server: http.Server,\n public did: string,\n ) {\n this.terminator = createHttpTerminator({ server })\n }\n\n static async create(\n plcUrl: string,\n feeds: Record<string, SkeletonHandler>,\n ): Promise<TestFeedGen> {\n const port = await getPort()\n const did = await createFgDid(plcUrl, port)\n const xrpcServer = createServer()\n\n xrpcServer.add(app.bsky.feed.getFeedSkeleton, async (args) => {\n const handler = feeds[args.params.feed]\n if (!handler) {\n throw new InvalidRequestError('unknown feed', 'UnknownFeed')\n }\n return handler(args)\n })\n\n xrpcServer.add(app.bsky.feed.describeFeedGenerator, async () => {\n return {\n encoding: 'application/json' as const,\n body: {\n did: did as DidString,\n feeds: (Object.keys(feeds) as AtUriString[]).map((uri) => ({\n uri,\n })),\n },\n }\n })\n\n const httpServer = xrpcServer.listen(port)\n await events.once(httpServer, 'listening')\n return new TestFeedGen(port, httpServer, did)\n }\n\n close(): Promise<void> {\n return (this.terminatorPromise ??= this.terminator.terminate())\n }\n\n async [Symbol.asyncDispose]() {\n await this.close()\n }\n}\n\nconst createFgDid = async (\n plcUrl: string,\n port: number,\n): Promise<DidString> => {\n const keypair = await Secp256k1Keypair.create()\n const plcClient = new plc.Client(plcUrl)\n const op = await plc.signOperation(\n {\n type: 'plc_operation',\n verificationMethods: {\n atproto: keypair.did(),\n },\n rotationKeys: [keypair.did()],\n alsoKnownAs: [],\n services: {\n bsky_fg: {\n type: 'BskyFeedGenerator',\n endpoint: `http://localhost:${port}`,\n },\n },\n prev: null,\n },\n keypair,\n )\n const did = await plc.didForCreateOp(op)\n await plcClient.sendOperation(did, op)\n return did as DidString\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export declare const acquireSweepLock: (lockDir: string, ownerPath: string, generation?: number) => Promise<(() => Promise<void>) | undefined>;
2
+ export declare const sweepStaleReservations: (lockDir: string, ownerPath: string) => Promise<void>;
3
+ export default function getPort(): Promise<number>;
4
+ //# sourceMappingURL=get-port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-port.d.ts","sourceRoot":"","sources":["../src/get-port.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,gBAAgB,YAClB,MAAM,aACJ,MAAM,0BAEhB,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CA8C3C,CAAA;AAED,eAAO,MAAM,sBAAsB,YACxB,MAAM,aACJ,MAAM,kBAsBlB,CAAA;AA+BD,wBAA8B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBvD"}
@@ -0,0 +1,140 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { unlinkSync } from 'node:fs';
3
+ import { link, mkdir, readFile, readdir, unlink, writeFile, } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { basename, join } from 'node:path';
6
+ import getAvailablePort from 'get-port';
7
+ const SWEEP_INTERVAL_MS = 1_000;
8
+ const SWEEP_LOCK_PATTERN = /^\.sweep-(\d+)$/;
9
+ const lockDir = join(tmpdir(), `atproto-dev-env-ports-${process.getuid?.() ?? 'unknown'}`);
10
+ const claimedPorts = new Set();
11
+ const ownerPath = join(lockDir, `.owner-${process.pid}-${randomUUID()}`);
12
+ let initialize;
13
+ const isProcessRunning = (pid) => {
14
+ try {
15
+ process.kill(pid, 0);
16
+ return true;
17
+ }
18
+ catch (err) {
19
+ return err?.['code'] !== 'ESRCH';
20
+ }
21
+ };
22
+ export const acquireSweepLock = async (lockDir, ownerPath, generation = Math.floor(Date.now() / SWEEP_INTERVAL_MS)) => {
23
+ const sweepPath = join(lockDir, `.sweep-${generation}`);
24
+ try {
25
+ await link(ownerPath, sweepPath);
26
+ }
27
+ catch (err) {
28
+ if (err?.['code'] === 'EEXIST')
29
+ return;
30
+ throw err;
31
+ }
32
+ try {
33
+ const entries = await readdir(lockDir);
34
+ for (const entry of entries) {
35
+ const match = SWEEP_LOCK_PATTERN.exec(entry);
36
+ if (!match || entry === basename(sweepPath))
37
+ continue;
38
+ const otherSweepPath = join(lockDir, entry);
39
+ try {
40
+ const pid = Number.parseInt(await readFile(otherSweepPath, 'utf8'), 10);
41
+ if (Number.isSafeInteger(pid) && isProcessRunning(pid)) {
42
+ await unlink(sweepPath);
43
+ return;
44
+ }
45
+ // Sweep generations are never reclaimed, so an inactive marker can
46
+ // be removed without racing a new owner of the same path.
47
+ await unlink(otherSweepPath);
48
+ }
49
+ catch (err) {
50
+ if (err?.['code'] !== 'ENOENT')
51
+ throw err;
52
+ }
53
+ }
54
+ return async () => {
55
+ try {
56
+ await unlink(sweepPath);
57
+ }
58
+ catch (err) {
59
+ if (err?.['code'] !== 'ENOENT')
60
+ throw err;
61
+ }
62
+ };
63
+ }
64
+ catch (err) {
65
+ try {
66
+ await unlink(sweepPath);
67
+ }
68
+ catch (cleanupErr) {
69
+ if (cleanupErr?.['code'] !== 'ENOENT')
70
+ throw cleanupErr;
71
+ }
72
+ throw err;
73
+ }
74
+ };
75
+ export const sweepStaleReservations = async (lockDir, ownerPath) => {
76
+ const entries = await readdir(lockDir);
77
+ await Promise.all(entries
78
+ .filter((entry) => entry !== basename(ownerPath) &&
79
+ (/^\d+$/.test(entry) || entry.startsWith('.owner-')))
80
+ .map(async (entry) => {
81
+ const lockPath = join(lockDir, entry);
82
+ try {
83
+ const pid = Number.parseInt(await readFile(lockPath, 'utf8'), 10);
84
+ if (!Number.isSafeInteger(pid) || !isProcessRunning(pid)) {
85
+ await unlink(lockPath);
86
+ }
87
+ }
88
+ catch (err) {
89
+ if (err?.['code'] !== 'ENOENT')
90
+ throw err;
91
+ }
92
+ }));
93
+ };
94
+ const initializeLockDir = async () => {
95
+ await mkdir(lockDir, { recursive: true });
96
+ await writeFile(ownerPath, String(process.pid), { flag: 'wx' });
97
+ const releaseSweepLock = await acquireSweepLock(lockDir, ownerPath);
98
+ if (!releaseSweepLock)
99
+ return;
100
+ try {
101
+ await sweepStaleReservations(lockDir, ownerPath);
102
+ }
103
+ finally {
104
+ await releaseSweepLock();
105
+ }
106
+ };
107
+ process.once('exit', () => {
108
+ for (const lockPath of claimedPorts) {
109
+ try {
110
+ unlinkSync(lockPath);
111
+ }
112
+ catch {
113
+ // The process is already exiting, so cleanup is best effort.
114
+ }
115
+ }
116
+ try {
117
+ unlinkSync(ownerPath);
118
+ }
119
+ catch {
120
+ // The process is already exiting, so cleanup is best effort.
121
+ }
122
+ });
123
+ export default async function getPort() {
124
+ initialize ??= initializeLockDir();
125
+ await initialize;
126
+ while (true) {
127
+ const port = await getAvailablePort();
128
+ const lockPath = join(lockDir, String(port));
129
+ try {
130
+ await link(ownerPath, lockPath);
131
+ claimedPorts.add(lockPath);
132
+ return port;
133
+ }
134
+ catch (err) {
135
+ if (err?.['code'] !== 'EEXIST')
136
+ throw err;
137
+ }
138
+ }
139
+ }
140
+ //# sourceMappingURL=get-port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-port.js","sourceRoot":"","sources":["../src/get-port.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto'\nimport { unlinkSync } from 'node:fs'\nimport {\n link,\n mkdir,\n readFile,\n readdir,\n unlink,\n writeFile,\n} from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { basename, join } from 'node:path'\nimport getAvailablePort from 'get-port'\n\nconst SWEEP_INTERVAL_MS = 1_000\nconst SWEEP_LOCK_PATTERN = /^\\.sweep-(\\d+)$/\nconst lockDir = join(\n tmpdir(),\n `atproto-dev-env-ports-${process.getuid?.() ?? 'unknown'}`,\n)\nconst claimedPorts = new Set<string>()\nconst ownerPath = join(lockDir, `.owner-${process.pid}-${randomUUID()}`)\n\nlet initialize: Promise<void> | undefined\n\nconst isProcessRunning = (pid: number) => {\n try {\n process.kill(pid, 0)\n return true\n } catch (err) {\n return err?.['code'] !== 'ESRCH'\n }\n}\n\nexport const acquireSweepLock = async (\n lockDir: string,\n ownerPath: string,\n generation = Math.floor(Date.now() / SWEEP_INTERVAL_MS),\n): Promise<(() => Promise<void>) | undefined> => {\n const sweepPath = join(lockDir, `.sweep-${generation}`)\n\n try {\n await link(ownerPath, sweepPath)\n } catch (err) {\n if (err?.['code'] === 'EEXIST') return\n throw err\n }\n\n try {\n const entries = await readdir(lockDir)\n for (const entry of entries) {\n const match = SWEEP_LOCK_PATTERN.exec(entry)\n if (!match || entry === basename(sweepPath)) continue\n\n const otherSweepPath = join(lockDir, entry)\n try {\n const pid = Number.parseInt(await readFile(otherSweepPath, 'utf8'), 10)\n if (Number.isSafeInteger(pid) && isProcessRunning(pid)) {\n await unlink(sweepPath)\n return\n }\n // Sweep generations are never reclaimed, so an inactive marker can\n // be removed without racing a new owner of the same path.\n await unlink(otherSweepPath)\n } catch (err) {\n if (err?.['code'] !== 'ENOENT') throw err\n }\n }\n\n return async () => {\n try {\n await unlink(sweepPath)\n } catch (err) {\n if (err?.['code'] !== 'ENOENT') throw err\n }\n }\n } catch (err) {\n try {\n await unlink(sweepPath)\n } catch (cleanupErr) {\n if (cleanupErr?.['code'] !== 'ENOENT') throw cleanupErr\n }\n throw err\n }\n}\n\nexport const sweepStaleReservations = async (\n lockDir: string,\n ownerPath: string,\n) => {\n const entries = await readdir(lockDir)\n await Promise.all(\n entries\n .filter(\n (entry) =>\n entry !== basename(ownerPath) &&\n (/^\\d+$/.test(entry) || entry.startsWith('.owner-')),\n )\n .map(async (entry) => {\n const lockPath = join(lockDir, entry)\n try {\n const pid = Number.parseInt(await readFile(lockPath, 'utf8'), 10)\n if (!Number.isSafeInteger(pid) || !isProcessRunning(pid)) {\n await unlink(lockPath)\n }\n } catch (err) {\n if (err?.['code'] !== 'ENOENT') throw err\n }\n }),\n )\n}\n\nconst initializeLockDir = async () => {\n await mkdir(lockDir, { recursive: true })\n await writeFile(ownerPath, String(process.pid), { flag: 'wx' })\n\n const releaseSweepLock = await acquireSweepLock(lockDir, ownerPath)\n if (!releaseSweepLock) return\n\n try {\n await sweepStaleReservations(lockDir, ownerPath)\n } finally {\n await releaseSweepLock()\n }\n}\n\nprocess.once('exit', () => {\n for (const lockPath of claimedPorts) {\n try {\n unlinkSync(lockPath)\n } catch {\n // The process is already exiting, so cleanup is best effort.\n }\n }\n try {\n unlinkSync(ownerPath)\n } catch {\n // The process is already exiting, so cleanup is best effort.\n }\n})\n\nexport default async function getPort(): Promise<number> {\n initialize ??= initializeLockDir()\n await initialize\n\n while (true) {\n const port = await getAvailablePort()\n const lockPath = join(lockDir, String(port))\n\n try {\n await link(ownerPath, lockPath)\n claimedPorts.add(lockPath)\n return port\n } catch (err) {\n if (err?.['code'] !== 'EEXIST') throw err\n }\n }\n}\n"]}
@@ -4,7 +4,7 @@ import { TestPds } from './pds.js';
4
4
  import { TestPlc } from './plc.js';
5
5
  import { SeedClient } from './seed/client.js';
6
6
  import type { TestServerParams } from './types.js';
7
- export declare class TestNetworkNoAppView {
7
+ export declare class TestNetworkNoAppView implements AsyncDisposable {
8
8
  plc: TestPlc;
9
9
  pds: TestPds;
10
10
  feedGens: TestFeedGen[];
@@ -14,5 +14,6 @@ export declare class TestNetworkNoAppView {
14
14
  getSeedClient(): SeedClient<typeof this>;
15
15
  processAll(): Promise<void>;
16
16
  close(): Promise<void>;
17
+ [Symbol.asyncDispose](): Promise<void>;
17
18
  }
18
19
  //# sourceMappingURL=network-no-appview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"network-no-appview.d.ts","sourceRoot":"","sources":["../src/network-no-appview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGlD,qBAAa,oBAAoB;IAGtB,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,OAAO;IAHrB,QAAQ,EAAE,WAAW,EAAE,CAAK;IAC5B,YACS,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,EACjB;IAEJ,OAAa,MAAM,CACjB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACrC,OAAO,CAAC,oBAAoB,CAAC,CAU/B;IAEK,aAAa,CACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACrC,OAAO,CAAC,WAAW,CAAC,CAItB;IAED,aAAa,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,CAIvC;IAEK,UAAU,kBAEf;IAEK,KAAK,kBAIV;CACF"}
1
+ {"version":3,"file":"network-no-appview.d.ts","sourceRoot":"","sources":["../src/network-no-appview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGlD,qBAAa,oBAAqB,YAAW,eAAe;IAGjD,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,OAAO;IAHrB,QAAQ,EAAE,WAAW,EAAE,CAAK;IAC5B,YACS,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,EACjB;IAEJ,OAAa,MAAM,CACjB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACrC,OAAO,CAAC,oBAAoB,CAAC,CAU/B;IAEK,aAAa,CACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACrC,OAAO,CAAC,WAAW,CAAC,CAItB;IAED,aAAa,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,CAIvC;IAEK,UAAU,kBAEf;IAEK,KAAK,kBAsBV;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF"}
@@ -32,9 +32,27 @@ export class TestNetworkNoAppView {
32
32
  await this.pds.processAll();
33
33
  }
34
34
  async close() {
35
- await Promise.all(this.feedGens.map((fg) => fg.close()));
36
- await this.pds.close();
37
- await this.plc.close();
35
+ // @TODO Use disposable stack to implement this
36
+ const errors = await Promise.allSettled(this.feedGens.map((fg) => fg.close())).then((results) => results.filter((r) => r.status === 'rejected').map((r) => r.reason));
37
+ try {
38
+ await this.pds.close();
39
+ }
40
+ catch (err) {
41
+ errors.push(err);
42
+ }
43
+ try {
44
+ await this.plc.close();
45
+ }
46
+ catch (err) {
47
+ errors.push(err);
48
+ }
49
+ if (errors.length === 1)
50
+ throw errors[0];
51
+ if (errors.length > 1)
52
+ throw new AggregateError(errors);
53
+ }
54
+ async [Symbol.asyncDispose]() {
55
+ await this.close();
38
56
  }
39
57
  }
40
58
  //# sourceMappingURL=network-no-appview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"network-no-appview.js","sourceRoot":"","sources":["../src/network-no-appview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAEhD,MAAM,OAAO,oBAAoB;IAE/B,YACS,GAAY,EACZ,GAAY;QADZ,QAAG,GAAH,GAAG,CAAS;QACZ,QAAG,GAAH,GAAG,CAAS;QAHrB,aAAQ,GAAkB,EAAE,CAAA;IAIzB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,MAAM,GAA8B,EAAE;QAEtC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;YAC/B,SAAS,EAAE,GAAG,CAAC,GAAG;YAClB,GAAG,MAAM,CAAC,GAAG;SACd,CAAC,CAAA;QAEF,oBAAoB,CAAC,GAAG,CAAC,CAAA;QAEzB,OAAO,IAAI,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,KAAsC;QAEtC,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACxD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACtB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,aAAa;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAA;QACnC,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAC5C,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QACxD,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACtB,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;CACF","sourcesContent":["import type { SkeletonHandler } from '@atproto/pds'\nimport { TestFeedGen } from './feed-gen.js'\nimport { TestPds } from './pds.js'\nimport { TestPlc } from './plc.js'\nimport { SeedClient } from './seed/client.js'\nimport type { TestServerParams } from './types.js'\nimport { mockNetworkUtilities } from './util.js'\n\nexport class TestNetworkNoAppView {\n feedGens: TestFeedGen[] = []\n constructor(\n public plc: TestPlc,\n public pds: TestPds,\n ) {}\n\n static async create(\n params: Partial<TestServerParams> = {},\n ): Promise<TestNetworkNoAppView> {\n const plc = await TestPlc.create(params.plc ?? {})\n const pds = await TestPds.create({\n didPlcUrl: plc.url,\n ...params.pds,\n })\n\n mockNetworkUtilities(pds)\n\n return new TestNetworkNoAppView(plc, pds)\n }\n\n async createFeedGen(\n feeds: Record<string, SkeletonHandler>,\n ): Promise<TestFeedGen> {\n const fg = await TestFeedGen.create(this.plc.url, feeds)\n this.feedGens.push(fg)\n return fg\n }\n\n getSeedClient(): SeedClient<typeof this> {\n const agent = this.pds.getAgent()\n const client = this.pds.getClient()\n return new SeedClient(this, agent, client)\n }\n\n async processAll() {\n await this.pds.processAll()\n }\n\n async close() {\n await Promise.all(this.feedGens.map((fg) => fg.close()))\n await this.pds.close()\n await this.plc.close()\n }\n}\n"]}
1
+ {"version":3,"file":"network-no-appview.js","sourceRoot":"","sources":["../src/network-no-appview.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SkeletonHandler } from '@atproto/pds'\nimport { TestFeedGen } from './feed-gen.js'\nimport { TestPds } from './pds.js'\nimport { TestPlc } from './plc.js'\nimport { SeedClient } from './seed/client.js'\nimport type { TestServerParams } from './types.js'\nimport { mockNetworkUtilities } from './util.js'\n\nexport class TestNetworkNoAppView implements AsyncDisposable {\n feedGens: TestFeedGen[] = []\n constructor(\n public plc: TestPlc,\n public pds: TestPds,\n ) {}\n\n static async create(\n params: Partial<TestServerParams> = {},\n ): Promise<TestNetworkNoAppView> {\n const plc = await TestPlc.create(params.plc ?? {})\n const pds = await TestPds.create({\n didPlcUrl: plc.url,\n ...params.pds,\n })\n\n mockNetworkUtilities(pds)\n\n return new TestNetworkNoAppView(plc, pds)\n }\n\n async createFeedGen(\n feeds: Record<string, SkeletonHandler>,\n ): Promise<TestFeedGen> {\n const fg = await TestFeedGen.create(this.plc.url, feeds)\n this.feedGens.push(fg)\n return fg\n }\n\n getSeedClient(): SeedClient<typeof this> {\n const agent = this.pds.getAgent()\n const client = this.pds.getClient()\n return new SeedClient(this, agent, client)\n }\n\n async processAll() {\n await this.pds.processAll()\n }\n\n async close() {\n // @TODO Use disposable stack to implement this\n const errors = await Promise.allSettled(\n this.feedGens.map((fg) => fg.close()),\n ).then((results) =>\n results.filter((r) => r.status === 'rejected').map((r) => r.reason),\n )\n\n try {\n await this.pds.close()\n } catch (err) {\n errors.push(err)\n }\n\n try {\n await this.plc.close()\n } catch (err) {\n errors.push(err)\n }\n\n if (errors.length === 1) throw errors[0]\n if (errors.length > 1) throw new AggregateError(errors)\n }\n\n async [Symbol.asyncDispose]() {\n await this.close()\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAGlC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAMlD,qBAAa,WAAY,SAAQ,oBAAoB;IAE1C,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,OAAO;IACZ,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,SAAS;IAChB,UAAU,CAAC,EAAE,gBAAgB;IANtC,YACS,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,EAChB,UAAU,CAAC,EAAE,gBAAgB,YAAA,EAGrC;IAED,OAAa,MAAM,CACjB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACrC,OAAO,CAAC,WAAW,CAAC,CA8HtB;IAEK,uBAAuB,CAAC,OAAO,SAAO,iBAmB3C;IAEK,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,iBAShC;IAEK,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;;OAS1D;IAEK,YAAY,CAAC,EACjB,QAAyB,EACzB,QAAyB,GAC1B,EAAE;QACD,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB;;OASA;IAEK,KAAK,kBAcV;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF"}
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAGlC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAMlD,qBAAa,WAAY,SAAQ,oBAAoB;IAE1C,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,OAAO;IACZ,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,SAAS;IAChB,UAAU,CAAC,EAAE,gBAAgB;IANtC,YACS,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,EAChB,UAAU,CAAC,EAAE,gBAAgB,YAAA,EAGrC;IAED,OAAa,MAAM,CACjB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACrC,OAAO,CAAC,WAAW,CAAC,CA8HtB;IAEK,uBAAuB,CAAC,OAAO,SAAO,iBAmB3C;IAEK,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,iBAShC;IAEK,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;;OAS1D;IAEK,YAAY,CAAC,EACjB,QAAyB,EACzB,QAAyB,GAC1B,EAAE;QACD,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB;;OASA;IAEK,KAAK,kBAcV;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF"}
package/dist/network.js 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';
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport getPort from 'get-port'\nimport * as uint8arrays from 'uint8arrays'\nimport { allFulfilled, wait } from '@atproto/common-web'\nimport { createServiceJwt } from '@atproto/xrpc-server'\nimport { TestBsky } from './bsky.js'\nimport { TestBsync } from './bsync.js'\nimport { EXAMPLE_LABELER } from './const.js'\nimport { IntrospectServer } from './introspect.js'\nimport { TestNetworkNoAppView } from './network-no-appview.js'\nimport { TestOzone } from './ozone.js'\nimport { TestPds } from './pds.js'\nimport { TestPlc } from './plc.js'\nimport { LexiconAuthorityProfile } from './service-profile-lexicon.js'\nimport { OzoneServiceProfile } from './service-profile-ozone.js'\nimport type { TestServerParams } from './types.js'\nimport { mockNetworkUtilities } from './util.js'\n\nconst ADMIN_USERNAME = 'admin'\nconst ADMIN_PASSWORD = 'admin-pass'\n\nexport class TestNetwork extends TestNetworkNoAppView {\n constructor(\n public plc: TestPlc,\n public pds: TestPds,\n public bsync: TestBsync,\n public bsky: TestBsky,\n public ozone: TestOzone,\n public introspect?: IntrospectServer,\n ) {\n super(plc, pds)\n }\n\n static async create(\n params: Partial<TestServerParams> = {},\n ): Promise<TestNetwork> {\n const redisHost = process.env.REDIS_HOST\n const dbPostgresUrl = params.dbPostgresUrl || process.env.DB_POSTGRES_URL\n assert(dbPostgresUrl, 'Missing postgres url for tests')\n assert(redisHost, 'Missing redis host for tests')\n const dbPostgresSchema =\n params.dbPostgresSchema || process.env.DB_POSTGRES_SCHEMA\n\n const plc = await TestPlc.create(params.plc ?? {})\n\n const bskyPort = params.bsky?.port ?? (await getPort())\n const pdsPort = params.pds?.port ?? (await getPort())\n const ozonePort = params.ozone?.port ?? (await getPort())\n\n const thirdPartyPds = await TestPds.create({\n didPlcUrl: plc.url,\n ...params.pds,\n inviteRequired: false,\n port: await getPort(),\n })\n\n const ozoneUrl = `http://localhost:${ozonePort}`\n\n // @TODO (?) rework the ServiceProfile to live on a separate PDS instead of\n // requiring to migrate to the main PDS\n const ozoneServiceProfile = await OzoneServiceProfile.create(\n thirdPartyPds,\n ozoneUrl,\n )\n const lexiconAuthorityProfile =\n await LexiconAuthorityProfile.create(thirdPartyPds)\n\n const bsyncApiKey = 'bsync-api-key'\n const bsync = await TestBsync.create({\n apiKeys: [bsyncApiKey],\n dbUrl: dbPostgresUrl,\n })\n\n const bsky = await TestBsky.create({\n port: bskyPort,\n plcUrl: plc.url,\n pdsPort,\n bsyncApiKey,\n bsyncUrl: bsync.url,\n rolodexUrl: process.env.BSKY_ROLODEX_URL,\n rolodexIgnoreBadTls: true,\n repoProvider: `ws://localhost:${pdsPort}`,\n dbPostgresSchema: `appview_${dbPostgresSchema}`,\n dbPostgresUrl,\n redisHost,\n modServiceDid: ozoneServiceProfile.did,\n labelsFromIssuerDids: [ozoneServiceProfile.did, EXAMPLE_LABELER],\n // Using a static private key results in a static DID, which is useful for e2e tests with the social-app repo.\n privateKey:\n '3f916c70dc69e4c5e83877f013325b11ecac31742e6a42f5c4fb240d0703d9d5=',\n ...params.bsky,\n })\n\n const pds = await TestPds.create({\n port: pdsPort,\n didPlcUrl: plc.url,\n bskyAppViewUrl: bsky.url,\n bskyAppViewDid: bsky.ctx.cfg.serverDid,\n modServiceUrl: ozoneUrl,\n modServiceDid: ozoneServiceProfile.did,\n lexiconDidAuthority: lexiconAuthorityProfile.did,\n ...params.pds,\n })\n\n // mock before any events start flowing from pds so that we don't miss e.g. any handle resolutions.\n mockNetworkUtilities(pds, bsky)\n\n const ozone = await TestOzone.create({\n port: ozonePort,\n plcUrl: plc.url,\n signingKey: ozoneServiceProfile.key,\n serverDid: ozoneServiceProfile.did,\n dbPostgresSchema: `ozone_${dbPostgresSchema || 'db'}`,\n dbPostgresUrl,\n appviewUrl: bsky.url,\n appviewDid: bsky.ctx.cfg.serverDid,\n appviewPushEvents: true,\n pdsUrl: pds.url,\n pdsDid: pds.ctx.cfg.service.did,\n verifierDid: ozoneServiceProfile.did,\n verifierUrl: pds.url,\n verifierPassword: 'temp',\n ...params.ozone,\n })\n\n await ozoneServiceProfile.migrateTo(pds)\n await ozoneServiceProfile.createRecords()\n\n await lexiconAuthorityProfile.migrateTo(pds)\n await lexiconAuthorityProfile.createRecords()\n\n await ozone.addAdminDid(ozoneServiceProfile.did)\n await ozone.createPolicies()\n\n await thirdPartyPds.processAll()\n await pds.processAll()\n await ozone.processAll()\n await bsky.sub.processAll()\n await bsky.bsyncSub.processAll(await bsync.getStreamHeads())\n await thirdPartyPds.close()\n\n // Weird but if we do this before pds.processAll() somehow appview loses this user and tests in different parts fail because appview doesn't return this user in various contexts anymore\n const ozoneVerifierPassword =\n await ozoneServiceProfile.createAppPasswordForVerification()\n if (ozone.daemon.ctx.cfg.verifier) {\n ozone.daemon.ctx.cfg.verifier.password = ozoneVerifierPassword\n }\n\n let introspect: IntrospectServer | undefined = undefined\n if (params.introspect?.port) {\n introspect = await IntrospectServer.start(\n params.introspect.port,\n plc,\n pds,\n bsync,\n bsky,\n ozone,\n )\n }\n\n return new TestNetwork(plc, pds, bsync, bsky, ozone, introspect)\n }\n\n async processFullSubscription(timeout = 5000) {\n const sub = this.bsky.sub\n // If the subscription is not running, there is no point in\n // waiting for it to process events\n if (!sub.running) return\n const start = Date.now()\n const lastSeq = await this.pds.ctx.sequencer.curr()\n if (!lastSeq) return\n while (Date.now() - start < timeout) {\n await sub.processAll()\n const runnerCursor = await sub.getCursor()\n // if subscription claims to be done, ensure we are at the most recent cursor from PDS, else wait to process again\n // (the subscription may claim to be finished before the PDS has even emitted it's event)\n if (runnerCursor && runnerCursor >= lastSeq) {\n return\n }\n await wait(5)\n }\n throw new Error(`Sequence was not processed within ${timeout}ms`)\n }\n\n async processAll(timeout?: number) {\n await this.pds.processAll()\n await this.ozone.processAll()\n await this.bsky.sub.processAll()\n await this.bsky.bsyncSub.processAll(\n await this.bsync.getStreamHeads(),\n timeout,\n )\n await this.processFullSubscription(timeout)\n }\n\n async serviceHeaders(did: string, lxm: string, aud?: string) {\n const keypair = await this.pds.ctx.actorStore.keypair(did)\n const jwt = await createServiceJwt({\n iss: did,\n aud: aud ?? this.bsky.ctx.cfg.serverDid,\n lxm,\n keypair,\n })\n return { authorization: `Bearer ${jwt}` }\n }\n\n async adminHeaders({\n username = ADMIN_USERNAME,\n password = ADMIN_PASSWORD,\n }: {\n username?: string\n password?: string\n }) {\n return {\n authorization:\n 'Basic ' +\n uint8arrays.toString(\n uint8arrays.fromString(`${username}:${password}`, 'utf8'),\n 'base64pad',\n ),\n }\n }\n\n async close() {\n try {\n await this.processAll()\n } finally {\n await allFulfilled([\n ...this.feedGens.map(async (fg) => fg.close()),\n this.ozone.close(),\n this.bsky.close(),\n this.bsync.close(),\n this.pds.close(),\n this.plc.close(),\n this.introspect?.close(),\n ])\n }\n }\n\n async [Symbol.asyncDispose]() {\n await this.close()\n }\n}\n"]}
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport * as uint8arrays from 'uint8arrays'\nimport { allFulfilled, wait } from '@atproto/common-web'\nimport { createServiceJwt } from '@atproto/xrpc-server'\nimport { TestBsky } from './bsky.js'\nimport { TestBsync } from './bsync.js'\nimport { EXAMPLE_LABELER } from './const.js'\nimport getPort from './get-port.js'\nimport { IntrospectServer } from './introspect.js'\nimport { TestNetworkNoAppView } from './network-no-appview.js'\nimport { TestOzone } from './ozone.js'\nimport { TestPds } from './pds.js'\nimport { TestPlc } from './plc.js'\nimport { LexiconAuthorityProfile } from './service-profile-lexicon.js'\nimport { OzoneServiceProfile } from './service-profile-ozone.js'\nimport type { TestServerParams } from './types.js'\nimport { mockNetworkUtilities } from './util.js'\n\nconst ADMIN_USERNAME = 'admin'\nconst ADMIN_PASSWORD = 'admin-pass'\n\nexport class TestNetwork extends TestNetworkNoAppView {\n constructor(\n public plc: TestPlc,\n public pds: TestPds,\n public bsync: TestBsync,\n public bsky: TestBsky,\n public ozone: TestOzone,\n public introspect?: IntrospectServer,\n ) {\n super(plc, pds)\n }\n\n static async create(\n params: Partial<TestServerParams> = {},\n ): Promise<TestNetwork> {\n const redisHost = process.env.REDIS_HOST\n const dbPostgresUrl = params.dbPostgresUrl || process.env.DB_POSTGRES_URL\n assert(dbPostgresUrl, 'Missing postgres url for tests')\n assert(redisHost, 'Missing redis host for tests')\n const dbPostgresSchema =\n params.dbPostgresSchema || process.env.DB_POSTGRES_SCHEMA\n\n const plc = await TestPlc.create(params.plc ?? {})\n\n const bskyPort = params.bsky?.port ?? (await getPort())\n const pdsPort = params.pds?.port ?? (await getPort())\n const ozonePort = params.ozone?.port ?? (await getPort())\n\n const thirdPartyPds = await TestPds.create({\n didPlcUrl: plc.url,\n ...params.pds,\n inviteRequired: false,\n port: await getPort(),\n })\n\n const ozoneUrl = `http://localhost:${ozonePort}`\n\n // @TODO (?) rework the ServiceProfile to live on a separate PDS instead of\n // requiring to migrate to the main PDS\n const ozoneServiceProfile = await OzoneServiceProfile.create(\n thirdPartyPds,\n ozoneUrl,\n )\n const lexiconAuthorityProfile =\n await LexiconAuthorityProfile.create(thirdPartyPds)\n\n const bsyncApiKey = 'bsync-api-key'\n const bsync = await TestBsync.create({\n apiKeys: [bsyncApiKey],\n dbUrl: dbPostgresUrl,\n })\n\n const bsky = await TestBsky.create({\n port: bskyPort,\n plcUrl: plc.url,\n pdsPort,\n bsyncApiKey,\n bsyncUrl: bsync.url,\n rolodexUrl: process.env.BSKY_ROLODEX_URL,\n rolodexIgnoreBadTls: true,\n repoProvider: `ws://localhost:${pdsPort}`,\n dbPostgresSchema: `appview_${dbPostgresSchema}`,\n dbPostgresUrl,\n redisHost,\n modServiceDid: ozoneServiceProfile.did,\n labelsFromIssuerDids: [ozoneServiceProfile.did, EXAMPLE_LABELER],\n // Using a static private key results in a static DID, which is useful for e2e tests with the social-app repo.\n privateKey:\n '3f916c70dc69e4c5e83877f013325b11ecac31742e6a42f5c4fb240d0703d9d5=',\n ...params.bsky,\n })\n\n const pds = await TestPds.create({\n port: pdsPort,\n didPlcUrl: plc.url,\n bskyAppViewUrl: bsky.url,\n bskyAppViewDid: bsky.ctx.cfg.serverDid,\n modServiceUrl: ozoneUrl,\n modServiceDid: ozoneServiceProfile.did,\n lexiconDidAuthority: lexiconAuthorityProfile.did,\n ...params.pds,\n })\n\n // mock before any events start flowing from pds so that we don't miss e.g. any handle resolutions.\n mockNetworkUtilities(pds, bsky)\n\n const ozone = await TestOzone.create({\n port: ozonePort,\n plcUrl: plc.url,\n signingKey: ozoneServiceProfile.key,\n serverDid: ozoneServiceProfile.did,\n dbPostgresSchema: `ozone_${dbPostgresSchema || 'db'}`,\n dbPostgresUrl,\n appviewUrl: bsky.url,\n appviewDid: bsky.ctx.cfg.serverDid,\n appviewPushEvents: true,\n pdsUrl: pds.url,\n pdsDid: pds.ctx.cfg.service.did,\n verifierDid: ozoneServiceProfile.did,\n verifierUrl: pds.url,\n verifierPassword: 'temp',\n ...params.ozone,\n })\n\n await ozoneServiceProfile.migrateTo(pds)\n await ozoneServiceProfile.createRecords()\n\n await lexiconAuthorityProfile.migrateTo(pds)\n await lexiconAuthorityProfile.createRecords()\n\n await ozone.addAdminDid(ozoneServiceProfile.did)\n await ozone.createPolicies()\n\n await thirdPartyPds.processAll()\n await pds.processAll()\n await ozone.processAll()\n await bsky.sub.processAll()\n await bsky.bsyncSub.processAll(await bsync.getStreamHeads())\n await thirdPartyPds.close()\n\n // Weird but if we do this before pds.processAll() somehow appview loses this user and tests in different parts fail because appview doesn't return this user in various contexts anymore\n const ozoneVerifierPassword =\n await ozoneServiceProfile.createAppPasswordForVerification()\n if (ozone.daemon.ctx.cfg.verifier) {\n ozone.daemon.ctx.cfg.verifier.password = ozoneVerifierPassword\n }\n\n let introspect: IntrospectServer | undefined = undefined\n if (params.introspect?.port) {\n introspect = await IntrospectServer.start(\n params.introspect.port,\n plc,\n pds,\n bsync,\n bsky,\n ozone,\n )\n }\n\n return new TestNetwork(plc, pds, bsync, bsky, ozone, introspect)\n }\n\n async processFullSubscription(timeout = 5000) {\n const sub = this.bsky.sub\n // If the subscription is not running, there is no point in\n // waiting for it to process events\n if (!sub.running) return\n const start = Date.now()\n const lastSeq = await this.pds.ctx.sequencer.curr()\n if (!lastSeq) return\n while (Date.now() - start < timeout) {\n await sub.processAll()\n const runnerCursor = await sub.getCursor()\n // if subscription claims to be done, ensure we are at the most recent cursor from PDS, else wait to process again\n // (the subscription may claim to be finished before the PDS has even emitted it's event)\n if (runnerCursor && runnerCursor >= lastSeq) {\n return\n }\n await wait(5)\n }\n throw new Error(`Sequence was not processed within ${timeout}ms`)\n }\n\n async processAll(timeout?: number) {\n await this.pds.processAll()\n await this.ozone.processAll()\n await this.bsky.sub.processAll()\n await this.bsky.bsyncSub.processAll(\n await this.bsync.getStreamHeads(),\n timeout,\n )\n await this.processFullSubscription(timeout)\n }\n\n async serviceHeaders(did: string, lxm: string, aud?: string) {\n const keypair = await this.pds.ctx.actorStore.keypair(did)\n const jwt = await createServiceJwt({\n iss: did,\n aud: aud ?? this.bsky.ctx.cfg.serverDid,\n lxm,\n keypair,\n })\n return { authorization: `Bearer ${jwt}` }\n }\n\n async adminHeaders({\n username = ADMIN_USERNAME,\n password = ADMIN_PASSWORD,\n }: {\n username?: string\n password?: string\n }) {\n return {\n authorization:\n 'Basic ' +\n uint8arrays.toString(\n uint8arrays.fromString(`${username}:${password}`, 'utf8'),\n 'base64pad',\n ),\n }\n }\n\n async close() {\n try {\n await this.processAll()\n } finally {\n await allFulfilled([\n ...this.feedGens.map(async (fg) => fg.close()),\n this.ozone.close(),\n this.bsky.close(),\n this.bsync.close(),\n this.pds.close(),\n this.plc.close(),\n this.introspect?.close(),\n ])\n }\n }\n\n async [Symbol.asyncDispose]() {\n await this.close()\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ozone.d.ts","sourceRoot":"","sources":["../src/ozone.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,KAAK,OAAO,EAAoB,MAAM,iBAAiB,CAAA;AAChE,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxD,qBAAa,SAAS;IAEX,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,KAAK,CAAC,YAAY;IAC1B,MAAM,EAAE,KAAK,CAAC,WAAW;IACzB,UAAU,EAAE,SAAS;IACrB,cAAc,EAAE,SAAS;IACzB,WAAW,EAAE,SAAS;IAP/B,YACS,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,KAAK,CAAC,YAAY,EAC1B,MAAM,EAAE,KAAK,CAAC,WAAW,EACzB,UAAU,EAAE,SAAS,EACrB,cAAc,EAAE,SAAS,EACzB,WAAW,EAAE,SAAS,EAC3B;IAEJ,OAAa,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CA4E3D;IAED,IAAI,GAAG,IAAI,KAAK,CAAC,UAAU,CAE1B;IAED,QAAQ,IAAI,QAAQ,CAInB;IAED,YAAY,oBAEX;IAEK,WAAW,CAAC,GAAG,EAAE,MAAM,iBAU5B;IAEK,eAAe,CAAC,GAAG,EAAE,MAAM,iBAUhC;IAEK,YAAY,CAAC,GAAG,EAAE,MAAM,iBAU7B;IAEK,cAAc,kBAsEnB;IAEK,UAAU,CACd,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,OAAO,GAAG,WAAW,GAAG,QAAsB;;OAerD;IAEK,UAAU,kBAGf;IAEK,KAAK,kBAMV;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF;AAED,eAAO,MAAM,cAAc,WACjB,MAAM,WACL,OAAO,KACf,OAAO,CAAC,MAAM,CAuBhB,CAAA"}
1
+ {"version":3,"file":"ozone.d.ts","sourceRoot":"","sources":["../src/ozone.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,KAAK,OAAO,EAAoB,MAAM,iBAAiB,CAAA;AAChE,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAIvC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxD,qBAAa,SAAS;IAEX,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,KAAK,CAAC,YAAY;IAC1B,MAAM,EAAE,KAAK,CAAC,WAAW;IACzB,UAAU,EAAE,SAAS;IACrB,cAAc,EAAE,SAAS;IACzB,WAAW,EAAE,SAAS;IAP/B,YACS,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,KAAK,CAAC,YAAY,EAC1B,MAAM,EAAE,KAAK,CAAC,WAAW,EACzB,UAAU,EAAE,SAAS,EACrB,cAAc,EAAE,SAAS,EACzB,WAAW,EAAE,SAAS,EAC3B;IAEJ,OAAa,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CA4E3D;IAED,IAAI,GAAG,IAAI,KAAK,CAAC,UAAU,CAE1B;IAED,QAAQ,IAAI,QAAQ,CAInB;IAED,YAAY,oBAEX;IAEK,WAAW,CAAC,GAAG,EAAE,MAAM,iBAU5B;IAEK,eAAe,CAAC,GAAG,EAAE,MAAM,iBAUhC;IAEK,YAAY,CAAC,GAAG,EAAE,MAAM,iBAU7B;IAEK,cAAc,kBAsEnB;IAEK,UAAU,CACd,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,OAAO,GAAG,WAAW,GAAG,QAAsB;;OAerD;IAEK,UAAU,kBAGf;IAEK,KAAK,kBAMV;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAE1B;CACF;AAED,eAAO,MAAM,cAAc,WACjB,MAAM,WACL,OAAO,KACf,OAAO,CAAC,MAAM,CAuBhB,CAAA"}
package/dist/ozone.js 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 { 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 { createDidAndKey } from './util.js';
11
11
  export class TestOzone {