@@ -3,39 +3,47 @@ import path from 'node:path';
33import { DatabaseSync } from 'node:sqlite' ;
44import type { MockOidcBehavior , MockOidcUser } from '../../tools/types' ;
55
6- const dbDir = path . join ( process . cwd ( ) , '.data' ) ;
7- mkdirSync ( dbDir , { recursive : true } ) ;
8- const dbPath = path . join ( dbDir , 'tooling.sqlite' ) ;
9-
10- const db = new DatabaseSync ( dbPath ) ;
11-
12- db . exec ( `
13- CREATE TABLE IF NOT EXISTS mock_oidc_users (
14- id TEXT PRIMARY KEY,
15- dev_session_id TEXT NOT NULL,
16- email TEXT NOT NULL,
17- behavior TEXT NOT NULL DEFAULT 'success',
18- created_at INTEGER NOT NULL
19- );
20- ` ) ;
21-
22- db . exec ( `
23- CREATE TABLE IF NOT EXISTS mock_oidc_auth_codes (
24- code TEXT PRIMARY KEY,
25- user_id TEXT NOT NULL,
26- dev_session_id TEXT NOT NULL,
27- created_at INTEGER NOT NULL
28- );
29- ` ) ;
30-
31- db . exec ( `
32- CREATE TABLE IF NOT EXISTS session_users (
33- dev_session_id TEXT NOT NULL,
34- user_id TEXT NOT NULL,
35- created_at INTEGER NOT NULL,
36- PRIMARY KEY (dev_session_id, user_id)
37- );
38- ` ) ;
6+ let _db : DatabaseSync | null = null ;
7+
8+ function getDb ( ) : DatabaseSync {
9+ if ( _db ) return _db ;
10+
11+ const dbDir = path . join ( process . cwd ( ) , '.data' ) ;
12+ mkdirSync ( dbDir , { recursive : true } ) ;
13+ const dbPath = path . join ( dbDir , 'tooling.sqlite' ) ;
14+
15+ _db = new DatabaseSync ( dbPath ) ;
16+
17+ _db . exec ( `
18+ CREATE TABLE IF NOT EXISTS mock_oidc_users (
19+ id TEXT PRIMARY KEY,
20+ dev_session_id TEXT NOT NULL,
21+ email TEXT NOT NULL,
22+ behavior TEXT NOT NULL DEFAULT 'success',
23+ created_at INTEGER NOT NULL
24+ );
25+ ` ) ;
26+
27+ _db . exec ( `
28+ CREATE TABLE IF NOT EXISTS mock_oidc_auth_codes (
29+ code TEXT PRIMARY KEY,
30+ user_id TEXT NOT NULL,
31+ dev_session_id TEXT NOT NULL,
32+ created_at INTEGER NOT NULL
33+ );
34+ ` ) ;
35+
36+ _db . exec ( `
37+ CREATE TABLE IF NOT EXISTS session_users (
38+ dev_session_id TEXT NOT NULL,
39+ user_id TEXT NOT NULL,
40+ created_at INTEGER NOT NULL,
41+ PRIMARY KEY (dev_session_id, user_id)
42+ );
43+ ` ) ;
44+
45+ return _db ;
46+ }
3947
4048function toUser ( row : Record < string , unknown > ) : MockOidcUser {
4149 return {
@@ -48,7 +56,7 @@ function toUser(row: Record<string, unknown>): MockOidcUser {
4856
4957export const OidcDb = {
5058 listUsers ( devSessionId : string ) : MockOidcUser [ ] {
51- const stmt = db . prepare (
59+ const stmt = getDb ( ) . prepare (
5260 `SELECT id, dev_session_id, email, behavior
5361 FROM mock_oidc_users
5462 WHERE dev_session_id = ?
@@ -58,27 +66,27 @@ export const OidcDb = {
5866 } ,
5967
6068 setSingleUser ( devSessionId : string , email : string ) : MockOidcUser {
61- db . prepare ( `DELETE FROM mock_oidc_users WHERE dev_session_id = ?` ) . run ( devSessionId ) ;
69+ getDb ( ) . prepare ( `DELETE FROM mock_oidc_users WHERE dev_session_id = ?` ) . run ( devSessionId ) ;
6270 const user : MockOidcUser = {
6371 id : crypto . randomUUID ( ) ,
6472 devSessionId,
6573 email,
6674 behavior : 'success' ,
6775 } ;
68- db . prepare (
76+ getDb ( ) . prepare (
6977 `INSERT INTO mock_oidc_users (id, dev_session_id, email, behavior, created_at)
7078 VALUES (?, ?, ?, ?, ?)` ,
7179 ) . run ( user . id , devSessionId , email , user . behavior , Date . now ( ) ) ;
7280 return user ;
7381 } ,
7482
7583 updateBehavior ( id : string , behavior : MockOidcBehavior ) : MockOidcUser | null {
76- db . prepare ( `UPDATE mock_oidc_users SET behavior = ? WHERE id = ?` ) . run ( behavior , id ) ;
84+ getDb ( ) . prepare ( `UPDATE mock_oidc_users SET behavior = ? WHERE id = ?` ) . run ( behavior , id ) ;
7785 return this . getUserById ( id ) ;
7886 } ,
7987
8088 getUserById ( id : string ) : MockOidcUser | null {
81- const row = db
89+ const row = getDb ( )
8290 . prepare (
8391 `SELECT id, dev_session_id, email, behavior
8492 FROM mock_oidc_users
@@ -90,19 +98,19 @@ export const OidcDb = {
9098 } ,
9199
92100 clearUsers ( devSessionId : string ) {
93- db . prepare ( `DELETE FROM mock_oidc_users WHERE dev_session_id = ?` ) . run ( devSessionId ) ;
94- db . prepare ( `DELETE FROM mock_oidc_auth_codes WHERE dev_session_id = ?` ) . run ( devSessionId ) ;
101+ getDb ( ) . prepare ( `DELETE FROM mock_oidc_users WHERE dev_session_id = ?` ) . run ( devSessionId ) ;
102+ getDb ( ) . prepare ( `DELETE FROM mock_oidc_auth_codes WHERE dev_session_id = ?` ) . run ( devSessionId ) ;
95103 } ,
96104
97105 storeAuthCode ( code : string , userId : string , devSessionId : string ) {
98- db . prepare (
106+ getDb ( ) . prepare (
99107 `INSERT INTO mock_oidc_auth_codes (code, user_id, dev_session_id, created_at)
100108 VALUES (?, ?, ?, ?)` ,
101109 ) . run ( code , userId , devSessionId , Date . now ( ) ) ;
102110 } ,
103111
104112 getAuthCode ( code : string ) : { code : string ; userId : string ; sessionId : string } | null {
105- const row = db
113+ const row = getDb ( )
106114 . prepare (
107115 `SELECT code, user_id, dev_session_id
108116 FROM mock_oidc_auth_codes
@@ -121,18 +129,18 @@ export const OidcDb = {
121129 } ,
122130
123131 deleteAuthCode ( code : string ) {
124- db . prepare ( `DELETE FROM mock_oidc_auth_codes WHERE code = ?` ) . run ( code ) ;
132+ getDb ( ) . prepare ( `DELETE FROM mock_oidc_auth_codes WHERE code = ?` ) . run ( code ) ;
125133 } ,
126134
127135 addSessionUser ( devSessionId : string , userId : string ) {
128- db . prepare (
136+ getDb ( ) . prepare (
129137 `INSERT OR IGNORE INTO session_users (dev_session_id, user_id, created_at)
130138 VALUES (?, ?, ?)` ,
131139 ) . run ( devSessionId , userId , Date . now ( ) ) ;
132140 } ,
133141
134142 listSessionUsers ( devSessionId : string ) : string [ ] {
135- const rows = db
143+ const rows = getDb ( )
136144 . prepare (
137145 `SELECT user_id
138146 FROM session_users
@@ -144,10 +152,10 @@ export const OidcDb = {
144152 } ,
145153
146154 removeSessionUser ( devSessionId : string , userId : string ) {
147- db . prepare ( `DELETE FROM session_users WHERE dev_session_id = ? AND user_id = ?` ) . run ( devSessionId , userId ) ;
155+ getDb ( ) . prepare ( `DELETE FROM session_users WHERE dev_session_id = ? AND user_id = ?` ) . run ( devSessionId , userId ) ;
148156 } ,
149157
150158 clearSessionUsers ( devSessionId : string ) {
151- db . prepare ( `DELETE FROM session_users WHERE dev_session_id = ?` ) . run ( devSessionId ) ;
159+ getDb ( ) . prepare ( `DELETE FROM session_users WHERE dev_session_id = ?` ) . run ( devSessionId ) ;
152160 } ,
153161} ;
0 commit comments