@polpo-ai/drizzle 0.2.13 → 0.4.1

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 (66) hide show
  1. package/dist/__tests__/stores-pg.test.d.ts +2 -0
  2. package/dist/__tests__/stores-pg.test.d.ts.map +1 -0
  3. package/dist/__tests__/stores-pg.test.js +981 -0
  4. package/dist/__tests__/stores-pg.test.js.map +1 -0
  5. package/dist/__tests__/stores.test.js +1 -160
  6. package/dist/__tests__/stores.test.js.map +1 -1
  7. package/dist/index.d.ts +635 -1901
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +0 -24
  10. package/dist/index.js.map +1 -1
  11. package/dist/migrate.d.ts.map +1 -1
  12. package/dist/migrate.js +0 -51
  13. package/dist/migrate.js.map +1 -1
  14. package/dist/schema/index.d.ts +0 -4
  15. package/dist/schema/index.d.ts.map +1 -1
  16. package/dist/schema/index.js +0 -4
  17. package/dist/schema/index.js.map +1 -1
  18. package/dist/stores/agent-store.d.ts.map +1 -1
  19. package/dist/stores/agent-store.js +2 -2
  20. package/dist/stores/agent-store.js.map +1 -1
  21. package/dist/stores/approval-store.d.ts.map +1 -1
  22. package/dist/stores/approval-store.js +2 -2
  23. package/dist/stores/approval-store.js.map +1 -1
  24. package/dist/stores/attachment-store.d.ts.map +1 -1
  25. package/dist/stores/attachment-store.js +3 -3
  26. package/dist/stores/attachment-store.js.map +1 -1
  27. package/dist/stores/index.d.ts +0 -2
  28. package/dist/stores/index.d.ts.map +1 -1
  29. package/dist/stores/index.js +0 -2
  30. package/dist/stores/index.js.map +1 -1
  31. package/dist/stores/playbook-store.d.ts.map +1 -1
  32. package/dist/stores/playbook-store.js +2 -3
  33. package/dist/stores/playbook-store.js.map +1 -1
  34. package/dist/stores/session-store.d.ts.map +1 -1
  35. package/dist/stores/session-store.js +4 -4
  36. package/dist/stores/session-store.js.map +1 -1
  37. package/dist/stores/task-store.d.ts.map +1 -1
  38. package/dist/stores/task-store.js +3 -3
  39. package/dist/stores/task-store.js.map +1 -1
  40. package/dist/stores/team-store.d.ts.map +1 -1
  41. package/dist/stores/team-store.js +2 -2
  42. package/dist/stores/team-store.js.map +1 -1
  43. package/dist/stores/vault-store.d.ts.map +1 -1
  44. package/dist/stores/vault-store.js +2 -3
  45. package/dist/stores/vault-store.js.map +1 -1
  46. package/dist/utils.d.ts +20 -0
  47. package/dist/utils.d.ts.map +1 -1
  48. package/dist/utils.js +38 -0
  49. package/dist/utils.js.map +1 -1
  50. package/package.json +3 -3
  51. package/dist/schema/notifications.d.ts +0 -521
  52. package/dist/schema/notifications.d.ts.map +0 -1
  53. package/dist/schema/notifications.js +0 -47
  54. package/dist/schema/notifications.js.map +0 -1
  55. package/dist/schema/peers.d.ts +0 -743
  56. package/dist/schema/peers.d.ts.map +0 -1
  57. package/dist/schema/peers.js +0 -71
  58. package/dist/schema/peers.js.map +0 -1
  59. package/dist/stores/notification-store.d.ts +0 -20
  60. package/dist/stores/notification-store.d.ts.map +0 -1
  61. package/dist/stores/notification-store.js +0 -111
  62. package/dist/stores/notification-store.js.map +0 -1
  63. package/dist/stores/peer-store.d.ts +0 -40
  64. package/dist/stores/peer-store.d.ts.map +0 -1
  65. package/dist/stores/peer-store.js +0 -203
  66. package/dist/stores/peer-store.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"peers.d.ts","sourceRoot":"","sources":["../../src/schema/peers.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWtB,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;EAE9B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAahC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG7B,CAAC;AAIH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWlB,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;EAE1B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa5B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGzB,CAAC"}
@@ -1,71 +0,0 @@
1
- import { sqliteTable, text, integer, index } from "drizzle-orm/sqlite-core";
2
- import { pgTable, text as pgText, integer as pgInteger, varchar, index as pgIndex } from "drizzle-orm/pg-core";
3
- // ── SQLite schema ──────────────────────────────────────────────────────
4
- export const peersSqlite = sqliteTable("peers", {
5
- id: text("id").primaryKey(),
6
- channel: text("channel").notNull(),
7
- externalId: text("external_id").notNull(),
8
- displayName: text("display_name"),
9
- firstSeenAt: text("first_seen_at").notNull(),
10
- lastSeenAt: text("last_seen_at").notNull(),
11
- linkedTo: text("linked_to"),
12
- }, (table) => [
13
- index("idx_peers_channel").on(table.channel),
14
- index("idx_peers_external_id").on(table.externalId),
15
- ]);
16
- export const peerAllowlistSqlite = sqliteTable("peer_allowlist", {
17
- peerId: text("peer_id").primaryKey(),
18
- });
19
- export const pairingRequestsSqlite = sqliteTable("pairing_requests", {
20
- id: text("id").primaryKey(),
21
- peerId: text("peer_id").notNull(),
22
- channel: text("channel").notNull(),
23
- externalId: text("external_id").notNull(),
24
- displayName: text("display_name"),
25
- code: text("code").notNull().unique(),
26
- createdAt: text("created_at").notNull(),
27
- expiresAt: text("expires_at").notNull(),
28
- resolved: integer("resolved").notNull().default(0),
29
- }, (table) => [
30
- index("idx_pairing_code").on(table.code),
31
- index("idx_pairing_peer").on(table.peerId),
32
- ]);
33
- export const peerSessionsSqlite = sqliteTable("peer_sessions", {
34
- peerId: text("peer_id").primaryKey(),
35
- sessionId: text("session_id").notNull(),
36
- });
37
- // ── PostgreSQL schema ──────────────────────────────────────────────────
38
- export const peersPg = pgTable("peers", {
39
- id: pgText("id").primaryKey(),
40
- channel: varchar("channel", { length: 32 }).notNull(),
41
- externalId: pgText("external_id").notNull(),
42
- displayName: pgText("display_name"),
43
- firstSeenAt: pgText("first_seen_at").notNull(),
44
- lastSeenAt: pgText("last_seen_at").notNull(),
45
- linkedTo: pgText("linked_to"),
46
- }, (table) => [
47
- pgIndex("idx_pg_peers_channel").on(table.channel),
48
- pgIndex("idx_pg_peers_external_id").on(table.externalId),
49
- ]);
50
- export const peerAllowlistPg = pgTable("peer_allowlist", {
51
- peerId: pgText("peer_id").primaryKey(),
52
- });
53
- export const pairingRequestsPg = pgTable("pairing_requests", {
54
- id: pgText("id").primaryKey(),
55
- peerId: pgText("peer_id").notNull(),
56
- channel: varchar("channel", { length: 32 }).notNull(),
57
- externalId: pgText("external_id").notNull(),
58
- displayName: pgText("display_name"),
59
- code: pgText("code").notNull().unique(),
60
- createdAt: pgText("created_at").notNull(),
61
- expiresAt: pgText("expires_at").notNull(),
62
- resolved: pgInteger("resolved").notNull().default(0),
63
- }, (table) => [
64
- pgIndex("idx_pg_pairing_code").on(table.code),
65
- pgIndex("idx_pg_pairing_peer").on(table.peerId),
66
- ]);
67
- export const peerSessionsPg = pgTable("peer_sessions", {
68
- peerId: pgText("peer_id").primaryKey(),
69
- sessionId: pgText("session_id").notNull(),
70
- });
71
- //# sourceMappingURL=peers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"peers.js","sourceRoot":"","sources":["../../src/schema/peers.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import type { NotificationStore, NotificationRecord, NotificationStatus } from "@polpo-ai/core/notification-store";
2
- import { type Dialect } from "../utils.js";
3
- type AnyTable = any;
4
- export declare class DrizzleNotificationStore implements NotificationStore {
5
- private db;
6
- private notifications;
7
- private dialect;
8
- constructor(db: any, notifications: AnyTable, dialect: Dialect);
9
- private rowToRecord;
10
- append(record: NotificationRecord): Promise<void>;
11
- list(limit?: number): Promise<NotificationRecord[]>;
12
- listByChannel(channelId: string, limit?: number): Promise<NotificationRecord[]>;
13
- listByRule(ruleId: string, limit?: number): Promise<NotificationRecord[]>;
14
- listByStatus(status: NotificationStatus, limit?: number): Promise<NotificationRecord[]>;
15
- count(status?: NotificationStatus): Promise<number>;
16
- prune(keep: number): Promise<number>;
17
- close(): Promise<void>;
18
- }
19
- export {};
20
- //# sourceMappingURL=notification-store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notification-store.d.ts","sourceRoot":"","sources":["../../src/stores/notification-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACnH,OAAO,EAAE,KAAK,OAAO,EAAkC,MAAM,aAAa,CAAC;AAE3E,KAAK,QAAQ,GAAG,GAAG,CAAC;AAEpB,qBAAa,wBAAyB,YAAW,iBAAiB;IAE9D,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;gBAFP,EAAE,EAAE,GAAG,EACP,aAAa,EAAE,QAAQ,EACvB,OAAO,EAAE,OAAO;IAG1B,OAAO,CAAC,WAAW;IAmBb,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBjD,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAQnD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAS/E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IASzE,YAAY,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IASvF,KAAK,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAYnD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAC7B"}
@@ -1,111 +0,0 @@
1
- import { eq, desc, sql } from "drizzle-orm";
2
- import { serializeJson, deserializeJson } from "../utils.js";
3
- export class DrizzleNotificationStore {
4
- db;
5
- notifications;
6
- dialect;
7
- constructor(db, notifications, dialect) {
8
- this.db = db;
9
- this.notifications = notifications;
10
- this.dialect = dialect;
11
- }
12
- rowToRecord(row) {
13
- return {
14
- id: row.id,
15
- timestamp: row.timestamp,
16
- ruleId: row.ruleId,
17
- ruleName: row.ruleName,
18
- channel: row.channel,
19
- channelType: row.channelType,
20
- status: row.status,
21
- error: row.error ?? undefined,
22
- title: row.title,
23
- body: row.body,
24
- severity: row.severity,
25
- sourceEvent: row.sourceEvent,
26
- attachmentCount: row.attachmentCount,
27
- attachmentTypes: deserializeJson(row.attachmentTypes, undefined, this.dialect),
28
- };
29
- }
30
- async append(record) {
31
- await this.db.insert(this.notifications).values({
32
- id: record.id,
33
- timestamp: record.timestamp,
34
- ruleId: record.ruleId,
35
- ruleName: record.ruleName,
36
- channel: record.channel,
37
- channelType: record.channelType,
38
- status: record.status,
39
- error: record.error ?? null,
40
- title: record.title,
41
- body: record.body,
42
- severity: record.severity,
43
- sourceEvent: record.sourceEvent,
44
- attachmentCount: record.attachmentCount,
45
- attachmentTypes: serializeJson(record.attachmentTypes, this.dialect),
46
- });
47
- }
48
- async list(limit) {
49
- let q = this.db.select().from(this.notifications)
50
- .orderBy(desc(this.notifications.timestamp));
51
- if (limit)
52
- q = q.limit(limit);
53
- const rows = await q;
54
- return rows.map((r) => this.rowToRecord(r));
55
- }
56
- async listByChannel(channelId, limit) {
57
- let q = this.db.select().from(this.notifications)
58
- .where(eq(this.notifications.channel, channelId))
59
- .orderBy(desc(this.notifications.timestamp));
60
- if (limit)
61
- q = q.limit(limit);
62
- const rows = await q;
63
- return rows.map((r) => this.rowToRecord(r));
64
- }
65
- async listByRule(ruleId, limit) {
66
- let q = this.db.select().from(this.notifications)
67
- .where(eq(this.notifications.ruleId, ruleId))
68
- .orderBy(desc(this.notifications.timestamp));
69
- if (limit)
70
- q = q.limit(limit);
71
- const rows = await q;
72
- return rows.map((r) => this.rowToRecord(r));
73
- }
74
- async listByStatus(status, limit) {
75
- let q = this.db.select().from(this.notifications)
76
- .where(eq(this.notifications.status, status))
77
- .orderBy(desc(this.notifications.timestamp));
78
- if (limit)
79
- q = q.limit(limit);
80
- const rows = await q;
81
- return rows.map((r) => this.rowToRecord(r));
82
- }
83
- async count(status) {
84
- let q;
85
- if (status) {
86
- q = this.db.select({ count: sql `count(*)` }).from(this.notifications)
87
- .where(eq(this.notifications.status, status));
88
- }
89
- else {
90
- q = this.db.select({ count: sql `count(*)` }).from(this.notifications);
91
- }
92
- const rows = await q;
93
- return Number(rows[0]?.count ?? 0);
94
- }
95
- async prune(keep) {
96
- const all = await this.db.select({ id: this.notifications.id })
97
- .from(this.notifications)
98
- .orderBy(desc(this.notifications.timestamp));
99
- if (all.length <= keep)
100
- return 0;
101
- const toDelete = all.slice(keep).map((r) => r.id);
102
- let deleted = 0;
103
- for (const id of toDelete) {
104
- await this.db.delete(this.notifications).where(eq(this.notifications.id, id));
105
- deleted++;
106
- }
107
- return deleted;
108
- }
109
- async close() { }
110
- }
111
- //# sourceMappingURL=notification-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notification-store.js","sourceRoot":"","sources":["../../src/stores/notification-store.ts"],"names":[],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- import type { PeerStore } from "@polpo-ai/core/peer-store";
2
- import type { PeerIdentity, PairingRequest, ChannelType, ChannelGatewayConfig, PresenceEntry } from "@polpo-ai/core/types";
3
- type AnyTable = any;
4
- export declare class DrizzlePeerStore implements PeerStore {
5
- private db;
6
- private schema;
7
- private presence;
8
- constructor(db: any, schema: {
9
- peers: AnyTable;
10
- peerAllowlist: AnyTable;
11
- pairingRequests: AnyTable;
12
- peerSessions: AnyTable;
13
- });
14
- getPeer(peerId: string): Promise<PeerIdentity | undefined>;
15
- upsertPeer(peer: Omit<PeerIdentity, "id" | "firstSeenAt"> & {
16
- id?: string;
17
- }): Promise<PeerIdentity>;
18
- listPeers(channel?: ChannelType): Promise<PeerIdentity[]>;
19
- isAllowed(peerId: string, channelConfig?: ChannelGatewayConfig): Promise<boolean>;
20
- addToAllowlist(peerId: string): Promise<void>;
21
- removeFromAllowlist(peerId: string): Promise<void>;
22
- getAllowlist(): Promise<string[]>;
23
- createPairingRequest(channel: ChannelType, externalId: string, displayName?: string): Promise<PairingRequest>;
24
- resolvePairing(code: string): Promise<PairingRequest | undefined>;
25
- getPendingPairing(peerId: string): Promise<PairingRequest | undefined>;
26
- cleanExpiredPairings(): Promise<number>;
27
- getSessionId(peerId: string): Promise<string | undefined>;
28
- setSessionId(peerId: string, sessionId: string): Promise<void>;
29
- clearSession(peerId: string): Promise<void>;
30
- linkPeers(peerId: string, linkedTo: string): Promise<void>;
31
- resolveCanonicalId(peerId: string): Promise<string>;
32
- updatePresence(peerId: string, activity: PresenceEntry["activity"]): Promise<void>;
33
- getPresence(): Promise<PresenceEntry[]>;
34
- prunePresence(ttlMs?: number): Promise<number>;
35
- private rowToPeer;
36
- private rowToPairing;
37
- private findPeerByExternal;
38
- }
39
- export {};
40
- //# sourceMappingURL=peer-store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"peer-store.d.ts","sourceRoot":"","sources":["../../src/stores/peer-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EACV,YAAY,EAAE,cAAc,EAAE,WAAW,EACzC,oBAAoB,EAAE,aAAa,EACpC,MAAM,sBAAsB,CAAC;AAE9B,KAAK,QAAQ,GAAG,GAAG,CAAC;AAEpB,qBAAa,gBAAiB,YAAW,SAAS;IAI9C,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,MAAM;IAJhB,OAAO,CAAC,QAAQ,CAAyC;gBAG/C,EAAE,EAAE,GAAG,EACP,MAAM,EAAE;QACd,KAAK,EAAE,QAAQ,CAAC;QAChB,aAAa,EAAE,QAAQ,CAAC;QACxB,eAAe,EAAE,QAAQ,CAAC;QAC1B,YAAY,EAAE,QAAQ,CAAC;KACxB;IAKG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAM1D,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,aAAa,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAyBnG,SAAS,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IASzD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAOjF,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOjC,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA2B7G,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAmBjE,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAStE,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IASvC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAMzD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9D,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1D,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOnD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlF,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAIvC,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcpD,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,YAAY;YAcN,kBAAkB;CAKjC"}
@@ -1,203 +0,0 @@
1
- import { eq, and, lt } from "drizzle-orm";
2
- import { nanoid } from "nanoid";
3
- export class DrizzlePeerStore {
4
- db;
5
- schema;
6
- presence = new Map();
7
- constructor(db, schema) {
8
- this.db = db;
9
- this.schema = schema;
10
- }
11
- // ── Peer identity ───────────────────────────────────────────────────
12
- async getPeer(peerId) {
13
- const rows = await this.db.select().from(this.schema.peers)
14
- .where(eq(this.schema.peers.id, peerId));
15
- return rows.length > 0 ? this.rowToPeer(rows[0]) : undefined;
16
- }
17
- async upsertPeer(peer) {
18
- const now = new Date().toISOString();
19
- const id = peer.id ?? nanoid();
20
- const values = {
21
- id,
22
- channel: peer.channel,
23
- externalId: peer.externalId,
24
- displayName: peer.displayName ?? null,
25
- firstSeenAt: now,
26
- lastSeenAt: peer.lastSeenAt,
27
- linkedTo: peer.linkedTo ?? null,
28
- };
29
- await this.db.insert(this.schema.peers).values(values)
30
- .onConflictDoUpdate({
31
- target: this.schema.peers.id,
32
- set: {
33
- displayName: values.displayName,
34
- lastSeenAt: values.lastSeenAt,
35
- linkedTo: values.linkedTo,
36
- },
37
- });
38
- const result = await this.getPeer(id);
39
- return result;
40
- }
41
- async listPeers(channel) {
42
- let q = this.db.select().from(this.schema.peers);
43
- if (channel)
44
- q = q.where(eq(this.schema.peers.channel, channel));
45
- const rows = await q;
46
- return rows.map((r) => this.rowToPeer(r));
47
- }
48
- // ── Authorization ───────────────────────────────────────────────────
49
- async isAllowed(peerId, channelConfig) {
50
- if (channelConfig?.dmPolicy === "open")
51
- return true;
52
- const rows = await this.db.select().from(this.schema.peerAllowlist)
53
- .where(eq(this.schema.peerAllowlist.peerId, peerId));
54
- return rows.length > 0;
55
- }
56
- async addToAllowlist(peerId) {
57
- await this.db.insert(this.schema.peerAllowlist).values({ peerId })
58
- .onConflictDoNothing();
59
- }
60
- async removeFromAllowlist(peerId) {
61
- await this.db.delete(this.schema.peerAllowlist)
62
- .where(eq(this.schema.peerAllowlist.peerId, peerId));
63
- }
64
- async getAllowlist() {
65
- const rows = await this.db.select().from(this.schema.peerAllowlist);
66
- return rows.map((r) => r.peerId);
67
- }
68
- // ── Pairing ─────────────────────────────────────────────────────────
69
- async createPairingRequest(channel, externalId, displayName) {
70
- const id = nanoid();
71
- const code = nanoid(6).toUpperCase();
72
- const now = new Date().toISOString();
73
- const expiresAt = new Date(Date.now() + 10 * 60 * 1000).toISOString(); // 10 min
74
- // Find or create peer
75
- let peer = await this.findPeerByExternal(channel, externalId);
76
- if (!peer) {
77
- peer = await this.upsertPeer({ channel, externalId, displayName, lastSeenAt: now });
78
- }
79
- await this.db.insert(this.schema.pairingRequests).values({
80
- id,
81
- peerId: peer.id,
82
- channel,
83
- externalId,
84
- displayName: displayName ?? null,
85
- code,
86
- createdAt: now,
87
- expiresAt,
88
- resolved: 0,
89
- });
90
- return { id, peerId: peer.id, channel, externalId, displayName, code, createdAt: now, expiresAt, resolved: false };
91
- }
92
- async resolvePairing(code) {
93
- const rows = await this.db.select().from(this.schema.pairingRequests)
94
- .where(and(eq(this.schema.pairingRequests.code, code), eq(this.schema.pairingRequests.resolved, 0)));
95
- if (rows.length === 0)
96
- return undefined;
97
- const row = rows[0];
98
- const now = new Date().toISOString();
99
- if (row.expiresAt < now)
100
- return undefined;
101
- await this.db.update(this.schema.pairingRequests)
102
- .set({ resolved: 1 })
103
- .where(eq(this.schema.pairingRequests.id, row.id));
104
- // Add to allowlist
105
- await this.addToAllowlist(row.peerId);
106
- return this.rowToPairing({ ...row, resolved: 1 });
107
- }
108
- async getPendingPairing(peerId) {
109
- const rows = await this.db.select().from(this.schema.pairingRequests)
110
- .where(and(eq(this.schema.pairingRequests.peerId, peerId), eq(this.schema.pairingRequests.resolved, 0)));
111
- if (rows.length === 0)
112
- return undefined;
113
- const now = new Date().toISOString();
114
- const valid = rows.find((r) => r.expiresAt >= now);
115
- return valid ? this.rowToPairing(valid) : undefined;
116
- }
117
- async cleanExpiredPairings() {
118
- const now = new Date().toISOString();
119
- const result = await this.db.delete(this.schema.pairingRequests)
120
- .where(and(eq(this.schema.pairingRequests.resolved, 0), lt(this.schema.pairingRequests.expiresAt, now)));
121
- return result?.rowCount ?? result?.changes ?? 0;
122
- }
123
- // ── Session mapping ─────────────────────────────────────────────────
124
- async getSessionId(peerId) {
125
- const rows = await this.db.select().from(this.schema.peerSessions)
126
- .where(eq(this.schema.peerSessions.peerId, peerId));
127
- return rows.length > 0 ? rows[0].sessionId : undefined;
128
- }
129
- async setSessionId(peerId, sessionId) {
130
- await this.db.insert(this.schema.peerSessions).values({ peerId, sessionId })
131
- .onConflictDoUpdate({ target: this.schema.peerSessions.peerId, set: { sessionId } });
132
- }
133
- async clearSession(peerId) {
134
- await this.db.delete(this.schema.peerSessions)
135
- .where(eq(this.schema.peerSessions.peerId, peerId));
136
- }
137
- // ── Identity linking ────────────────────────────────────────────────
138
- async linkPeers(peerId, linkedTo) {
139
- await this.db.update(this.schema.peers)
140
- .set({ linkedTo })
141
- .where(eq(this.schema.peers.id, peerId));
142
- }
143
- async resolveCanonicalId(peerId) {
144
- const peer = await this.getPeer(peerId);
145
- return peer?.linkedTo ?? peerId;
146
- }
147
- // ── Presence (in-memory, ephemeral) ─────────────────────────────────
148
- async updatePresence(peerId, activity) {
149
- const peer = await this.getPeer(peerId);
150
- this.presence.set(peerId, {
151
- peerId,
152
- displayName: peer?.displayName,
153
- channel: peer?.channel ?? "webchat",
154
- lastActivityAt: new Date().toISOString(),
155
- activity,
156
- });
157
- }
158
- async getPresence() {
159
- return Array.from(this.presence.values());
160
- }
161
- async prunePresence(ttlMs) {
162
- const cutoff = Date.now() - (ttlMs ?? 5 * 60 * 1000);
163
- let pruned = 0;
164
- for (const [id, entry] of this.presence) {
165
- if (new Date(entry.lastActivityAt).getTime() < cutoff) {
166
- this.presence.delete(id);
167
- pruned++;
168
- }
169
- }
170
- return pruned;
171
- }
172
- // ── Private helpers ─────────────────────────────────────────────────
173
- rowToPeer(row) {
174
- return {
175
- id: row.id,
176
- channel: row.channel,
177
- externalId: row.externalId,
178
- displayName: row.displayName ?? undefined,
179
- firstSeenAt: row.firstSeenAt,
180
- lastSeenAt: row.lastSeenAt,
181
- linkedTo: row.linkedTo ?? undefined,
182
- };
183
- }
184
- rowToPairing(row) {
185
- return {
186
- id: row.id,
187
- peerId: row.peerId,
188
- channel: row.channel,
189
- externalId: row.externalId,
190
- displayName: row.displayName ?? undefined,
191
- code: row.code,
192
- createdAt: row.createdAt,
193
- expiresAt: row.expiresAt,
194
- resolved: Boolean(row.resolved),
195
- };
196
- }
197
- async findPeerByExternal(channel, externalId) {
198
- const rows = await this.db.select().from(this.schema.peers)
199
- .where(and(eq(this.schema.peers.channel, channel), eq(this.schema.peers.externalId, externalId)));
200
- return rows.length > 0 ? this.rowToPeer(rows[0]) : undefined;
201
- }
202
- }
203
- //# sourceMappingURL=peer-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"peer-store.js","sourceRoot":"","sources":["../../src/stores/peer-store.ts"],"names":[],"mappings":"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"}