Skip to content

Commit c60d639

Browse files
Copilotrubensworks
andcommitted
Use Proxy pattern for query engine wrapping in Solid servers
Co-authored-by: rubensworks <440384+rubensworks@users.noreply.github.com>
1 parent ae7f520 commit c60d639

2 files changed

Lines changed: 92 additions & 72 deletions

File tree

engines/mcp-sparql-link-traversal-solid/lib/BinHelpersSolid.ts

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -62,48 +62,58 @@ export function runCliSolid(queryEngine: QueryEngineBase, version: string): void
6262
// Add session to query engine context if authenticated
6363
let wrappedQueryEngine = queryEngine;
6464
if (session) {
65-
// Create a wrapper that adds the session to all query contexts
66-
wrappedQueryEngine = Object.create(queryEngine);
65+
// Create a proxy that intercepts query methods and adds the session to context
6766
const originalQuery = queryEngine.query.bind(queryEngine);
6867
const originalQueryBindings = queryEngine.queryBindings.bind(queryEngine);
6968
const originalQueryQuads = queryEngine.queryQuads.bind(queryEngine);
7069
const originalQueryBoolean = queryEngine.queryBoolean.bind(queryEngine);
7170
const originalQueryVoid = queryEngine.queryVoid.bind(queryEngine);
7271

73-
wrappedQueryEngine.query = function(query: any, context?: any): any {
74-
return originalQuery(query, {
75-
...context,
76-
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
77-
});
78-
};
79-
80-
wrappedQueryEngine.queryBindings = function(query: any, context?: any): any {
81-
return originalQueryBindings(query, {
82-
...context,
83-
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
84-
});
85-
};
86-
87-
wrappedQueryEngine.queryQuads = function(query: any, context?: any): any {
88-
return originalQueryQuads(query, {
89-
...context,
90-
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
91-
});
92-
};
93-
94-
wrappedQueryEngine.queryBoolean = function(query: any, context?: any): any {
95-
return originalQueryBoolean(query, {
96-
...context,
97-
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
98-
});
99-
};
100-
101-
wrappedQueryEngine.queryVoid = function(query: any, context?: any): any {
102-
return originalQueryVoid(query, {
103-
...context,
104-
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
105-
});
106-
};
72+
wrappedQueryEngine = new Proxy(queryEngine, {
73+
get(target, prop) {
74+
if (prop === 'query') {
75+
return function(query: any, context?: any): any {
76+
return originalQuery(query, {
77+
...context,
78+
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
79+
});
80+
};
81+
}
82+
if (prop === 'queryBindings') {
83+
return function(query: any, context?: any): any {
84+
return originalQueryBindings(query, {
85+
...context,
86+
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
87+
});
88+
};
89+
}
90+
if (prop === 'queryQuads') {
91+
return function(query: any, context?: any): any {
92+
return originalQueryQuads(query, {
93+
...context,
94+
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
95+
});
96+
};
97+
}
98+
if (prop === 'queryBoolean') {
99+
return function(query: any, context?: any): any {
100+
return originalQueryBoolean(query, {
101+
...context,
102+
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
103+
});
104+
};
105+
}
106+
if (prop === 'queryVoid') {
107+
return function(query: any, context?: any): any {
108+
return originalQueryVoid(query, {
109+
...context,
110+
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
111+
});
112+
};
113+
}
114+
return Reflect.get(target, prop);
115+
},
116+
});
107117
}
108118

109119
const server = new SparqlMcpServer(

engines/mcp-sparql-solid/lib/BinHelpersSolid.ts

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -62,48 +62,58 @@ export function runCliSolid(queryEngine: QueryEngineBase, version: string): void
6262
// Add session to query engine context if authenticated
6363
let wrappedQueryEngine = queryEngine;
6464
if (session) {
65-
// Create a wrapper that adds the session to all query contexts
66-
wrappedQueryEngine = Object.create(queryEngine);
65+
// Create a proxy that intercepts query methods and adds the session to context
6766
const originalQuery = queryEngine.query.bind(queryEngine);
6867
const originalQueryBindings = queryEngine.queryBindings.bind(queryEngine);
6968
const originalQueryQuads = queryEngine.queryQuads.bind(queryEngine);
7069
const originalQueryBoolean = queryEngine.queryBoolean.bind(queryEngine);
7170
const originalQueryVoid = queryEngine.queryVoid.bind(queryEngine);
7271

73-
wrappedQueryEngine.query = function(query: any, context?: any): any {
74-
return originalQuery(query, {
75-
...context,
76-
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
77-
});
78-
};
79-
80-
wrappedQueryEngine.queryBindings = function(query: any, context?: any): any {
81-
return originalQueryBindings(query, {
82-
...context,
83-
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
84-
});
85-
};
86-
87-
wrappedQueryEngine.queryQuads = function(query: any, context?: any): any {
88-
return originalQueryQuads(query, {
89-
...context,
90-
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
91-
});
92-
};
93-
94-
wrappedQueryEngine.queryBoolean = function(query: any, context?: any): any {
95-
return originalQueryBoolean(query, {
96-
...context,
97-
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
98-
});
99-
};
100-
101-
wrappedQueryEngine.queryVoid = function(query: any, context?: any): any {
102-
return originalQueryVoid(query, {
103-
...context,
104-
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
105-
});
106-
};
72+
wrappedQueryEngine = new Proxy(queryEngine, {
73+
get(target, prop) {
74+
if (prop === 'query') {
75+
return function(query: any, context?: any): any {
76+
return originalQuery(query, {
77+
...context,
78+
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
79+
});
80+
};
81+
}
82+
if (prop === 'queryBindings') {
83+
return function(query: any, context?: any): any {
84+
return originalQueryBindings(query, {
85+
...context,
86+
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
87+
});
88+
};
89+
}
90+
if (prop === 'queryQuads') {
91+
return function(query: any, context?: any): any {
92+
return originalQueryQuads(query, {
93+
...context,
94+
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
95+
});
96+
};
97+
}
98+
if (prop === 'queryBoolean') {
99+
return function(query: any, context?: any): any {
100+
return originalQueryBoolean(query, {
101+
...context,
102+
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
103+
});
104+
};
105+
}
106+
if (prop === 'queryVoid') {
107+
return function(query: any, context?: any): any {
108+
return originalQueryVoid(query, {
109+
...context,
110+
'@comunica/actor-http-inrupt-solid-client-authn:session': session,
111+
});
112+
};
113+
}
114+
return Reflect.get(target, prop);
115+
},
116+
});
107117
}
108118

109119
const server = new SparqlMcpServer(

0 commit comments

Comments
 (0)