• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

supabase / storage / 27200912234

09 Jun 2026 10:46AM UTC coverage: 78.038% (+1.6%) from 76.452%
27200912234

push

github

web-flow
fix: replace knex with pg directly (#1096)

Signed-off-by: ferhat elmas <elmas.ferhat@gmail.com>

4835 of 6782 branches covered (71.29%)

Branch coverage included in aggregate %.

1499 of 1771 new or added lines in 41 files covered. (84.64%)

5 existing lines in 5 files now uncovered.

9673 of 11809 relevant lines covered (81.91%)

416.34 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

56.25
/src/http/plugins/vector.ts
1
import { getTenantConfig, multitenantPgExecutor, PgPoolExecutor } from '@internal/database'
2
import { deriveVectorDatabaseUrl } from '@internal/database/vector-store-url'
3
import { ERRORS } from '@internal/errors'
4
import {
5
  BucketScopedSingleShard,
6
  PgShardStoreFactory,
7
  ShardCatalog,
8
  Sharder,
9
  SingleShard,
10
} from '@internal/sharding'
11
import {
12
  createS3VectorClient,
13
  createVectorTransactionPgResolver,
14
  PgVectorMetadataDB,
15
  PgVectorStore,
16
  S3Vector,
17
  VectorStore,
18
  VectorStoreManager,
19
} from '@storage/protocols/vector'
20
import { FastifyInstance } from 'fastify'
21
import fastifyPlugin from 'fastify-plugin'
22
import { Pool as PgPool } from 'pg'
23
import { getConfig } from '../../config'
24

25
declare module 'fastify' {
26
  interface FastifyRequest {
27
    s3Vector: VectorStoreManager
28
  }
29
}
30

31
export const s3vector = fastifyPlugin(async function (fastify: FastifyInstance) {
33✔
32
  const config = getConfig()
283✔
33
  const {
34
    vectorBucketProvider,
35
    vectorDatabaseCreate,
36
    vectorDatabaseURL,
37
    vectorS3Buckets,
38
    isMultitenant,
39
    databaseApplicationName,
40
  } = config
283✔
41

42
  let s3Adapter: S3Vector | undefined
43
  if (vectorBucketProvider === 's3' && vectorS3Buckets.length > 0) {
283✔
44
    s3Adapter = new S3Vector(createS3VectorClient())
282✔
45
  }
46

47
  // pgvector + single-tenant: VECTOR_DATABASE_URL is the maintenance URL the
48
  // migration runner used to CREATE DATABASE; the runtime pool targets the
49
  // derived `storage_vectors` database on the same server. When
50
  // VECTOR_DATABASE_CREATE=false, the runtime pool targets VECTOR_DATABASE_URL
51
  // directly.
52
  let stPgVectorAdapter: PgVectorStore | undefined
53
  let stPgVectorPool: PgPool | undefined
54
  if (vectorBucketProvider === 'pgvector' && !isMultitenant && vectorDatabaseURL) {
283!
55
    const connectionString = vectorDatabaseCreate
×
56
      ? deriveVectorDatabaseUrl(vectorDatabaseURL)
57
      : vectorDatabaseURL
NEW
58
    stPgVectorPool = new PgPool({
×
59
      connectionString,
60
      application_name: databaseApplicationName,
61
      min: 0,
62
      max: 10,
63
    })
NEW
64
    stPgVectorAdapter = new PgVectorStore(new PgPoolExecutor(stPgVectorPool))
×
65
    fastify.addHook('onClose', async () => {
×
NEW
66
      await stPgVectorPool?.end()
×
67
    })
68
  }
69

70
  const featureEnabled =
71
    (vectorBucketProvider === 's3' && Boolean(s3Adapter)) ||
283!
72
    (vectorBucketProvider === 'pgvector' && (isMultitenant || Boolean(stPgVectorAdapter)))
73

74
  fastify.addHook('preHandler', async (req) => {
283✔
75
    if (!featureEnabled) {
152✔
76
      throw ERRORS.FeatureNotEnabled('vector', 'Vector service not configured')
1✔
77
    }
78

79
    const { vectorMaxBucketsCount, vectorMaxIndexesCount } = config
151✔
80

81
    let maxBucketCount = vectorMaxBucketsCount
151✔
82
    let maxIndexCount = vectorMaxIndexesCount
151✔
83

84
    if (isMultitenant) {
151!
85
      const { features } = await getTenantConfig(req.tenantId)
×
86
      maxBucketCount = features?.vectorBuckets?.maxBuckets || vectorMaxBucketsCount
×
87
      maxIndexCount = features?.vectorBuckets?.maxIndexes || vectorMaxIndexesCount
×
88
    }
89

90
    const store = new PgVectorMetadataDB(req.db)
151✔
91

92
    let adapter: VectorStore
93
    if (vectorBucketProvider === 'pgvector') {
151!
94
      adapter = isMultitenant
×
95
        ? new PgVectorStore(createVectorTransactionPgResolver(req.db))
96
        : stPgVectorAdapter!
97
    } else {
98
      adapter = s3Adapter!
151✔
99
    }
100

101
    let shard: Sharder
102
    if (vectorBucketProvider === 'pgvector') {
151!
103
      shard = new BucketScopedSingleShard({
×
104
        keyPrefix: 'pgvector__',
105
        capacity: Number.MAX_SAFE_INTEGER,
106
      })
107
    } else if (isMultitenant) {
151!
NEW
108
      shard = new ShardCatalog(new PgShardStoreFactory(multitenantPgExecutor))
×
109
    } else {
110
      shard = new SingleShard({
151✔
111
        shardKey: vectorS3Buckets[0],
112
        capacity: 10000,
113
      })
114
    }
115

116
    req.s3Vector = new VectorStoreManager(adapter, store, shard, {
151✔
117
      tenantId: req.tenantId,
118
      maxBucketCount,
119
      maxIndexCount,
120
    })
121
  })
122
})
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc