@@ -41,6 +41,44 @@ class DriverService extends BaseService {
4141 types : require ( './types' ) ,
4242 }
4343
44+ // 'IMPLEMENTS' here makes DriverService itself a driver
45+ static IMPLEMENTS = {
46+ driver : {
47+ async usage ( ) {
48+ const actor = Context . get ( 'actor' ) ;
49+
50+ const usages = {
51+ user : { } , // map[str(iface:method)]{date,count,max}
52+ apps : { } , // []{app,map[str(iface:method)]{date,count,max}}
53+ app_objects : { } ,
54+ usages : [ ] ,
55+ } ;
56+
57+ const event = {
58+ actor,
59+ usages : [ ] ,
60+ } ;
61+ const svc_event = this . services . get ( 'event' ) ;
62+ await svc_event . emit ( 'usages.query' , event ) ;
63+ usages . usages = event . usages ;
64+
65+
66+ for ( const k in usages . apps ) {
67+ usages . apps [ k ] = Object . values ( usages . apps [ k ] ) ;
68+ }
69+
70+ return {
71+ // Usage endpoint reports these, but the driver doesn't need to
72+ // user: Object.values(usages.user),
73+ // apps: usages.apps,
74+ // app_objects: usages.app_objects,
75+
76+ // This is the main "usages" object
77+ usages : usages . usages ,
78+ } ;
79+ }
80+ }
81+ }
4482
4583 _construct ( ) {
4684 this . drivers = { } ;
@@ -126,6 +164,26 @@ class DriverService extends BaseService {
126164 { col_drivers } ) ;
127165 }
128166
167+ // This is a bit meta: we register the "driver" driver interface.
168+ // This allows DriverService to be a driver called "driver".
169+ // The driver drivers allows checking metered usage for drivers,
170+ // and in the future may provide other driver-related functions.
171+ async [ '__on_driver.register.interfaces' ] ( ) {
172+ const svc_registry = this . services . get ( 'registry' ) ;
173+ const col_interfaces = svc_registry . get ( 'interfaces' ) ;
174+
175+ col_interfaces . set ( 'driver' , {
176+ description : 'provides functions for managing Puter drivers' ,
177+ methods : {
178+ usage : {
179+ description : 'get usage information for drivers' ,
180+ parameters : { } ,
181+ result : { type : 'json' } ,
182+ }
183+ }
184+ } ) ;
185+ }
186+
129187 register_driver ( interface_name , implementation ) {
130188 this . interface_to_implementation [ interface_name ] = implementation ;
131189 }
0 commit comments