@backstage/backend-plugin-api 0.2.0 → 0.2.1-next.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @backstage/backend-plugin-api
2
2
 
3
+ ## 0.2.1-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 6cfd4d7073: Added `RootLifecycleService` and `rootLifecycleServiceRef`, as well as added a `labels` option to the existing `LifecycleServiceShutdownHook`.
8
+ - 5e2cebe9a3: Migrate `UrlReader` into this package to gradually remove the dependency on backend-common.
9
+ - 6f02d23b01: Moved `PluginEndpointDiscovery` type from backend-common to backend-plugin-api.
10
+ - Updated dependencies
11
+ - @backstage/backend-common@0.18.0-next.0
12
+ - @backstage/config@1.0.6-next.0
13
+ - @backstage/backend-tasks@0.4.1-next.0
14
+ - @backstage/plugin-permission-common@0.7.3-next.0
15
+
3
16
  ## 0.2.0
4
17
 
5
18
  ### Minor Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/backend-plugin-api",
3
- "version": "0.2.0",
3
+ "version": "0.2.1-next.0",
4
4
  "main": "../dist/index.cjs.js",
5
5
  "types": "../dist/index.alpha.d.ts"
6
6
  }
@@ -4,6 +4,8 @@
4
4
  * @packageDocumentation
5
5
  */
6
6
 
7
+ /// <reference types="node" />
8
+
7
9
  import { Config } from '@backstage/config';
8
10
  import { Handler } from 'express';
9
11
  import { Logger } from 'winston';
@@ -11,11 +13,10 @@ import { PermissionAuthorizer } from '@backstage/plugin-permission-common';
11
13
  import { PermissionEvaluator } from '@backstage/plugin-permission-common';
12
14
  import { PluginCacheManager } from '@backstage/backend-common';
13
15
  import { PluginDatabaseManager } from '@backstage/backend-common';
14
- import { PluginEndpointDiscovery } from '@backstage/backend-common';
15
16
  import { PluginTaskScheduler } from '@backstage/backend-tasks';
17
+ import { Readable } from 'stream';
16
18
  import { TokenManager } from '@backstage/backend-common';
17
19
  import { TransportStreamOptions } from 'winston-transport';
18
- import { UrlReader } from '@backstage/backend-common';
19
20
 
20
21
  /** @public */
21
22
  export declare interface BackendFeature {
@@ -79,6 +80,7 @@ declare namespace coreServices {
79
80
  tokenManagerServiceRef as tokenManager,
80
81
  permissionsServiceRef as permissions,
81
82
  schedulerServiceRef as scheduler,
83
+ rootLifecycleServiceRef as rootLifecycle,
82
84
  rootLoggerServiceRef as rootLogger,
83
85
  pluginMetadataServiceRef as pluginMetadata,
84
86
  lifecycleServiceRef as lifecycle
@@ -144,13 +146,57 @@ export declare type DatabaseService = PluginDatabaseManager;
144
146
  */
145
147
  declare const databaseServiceRef: ServiceRef<PluginDatabaseManager, "plugin">;
146
148
 
147
- /** @public */
148
- export declare type DiscoveryService = PluginEndpointDiscovery;
149
+ /**
150
+ * The DiscoveryService is used to provide a mechanism for backend
151
+ * plugins to discover the endpoints for itself or other backend plugins.
152
+ *
153
+ * The purpose of the discovery API is to allow for many different deployment
154
+ * setups and routing methods through a central configuration, instead
155
+ * of letting each individual plugin manage that configuration.
156
+ *
157
+ * Implementations of the discovery API can be as simple as a URL pattern
158
+ * using the pluginId, but could also have overrides for individual plugins,
159
+ * or query a separate discovery service.
160
+ *
161
+ * @public
162
+ */
163
+ export declare type DiscoveryService = {
164
+ /**
165
+ * Returns the internal HTTP base URL for a given plugin, without a trailing slash.
166
+ *
167
+ * The returned URL should point to an internal endpoint for the plugin, with
168
+ * the shortest route possible. The URL should be used for service-to-service
169
+ * communication within a Backstage backend deployment.
170
+ *
171
+ * This method must always be called just before making a request, as opposed to
172
+ * fetching the URL when constructing an API client. That is to ensure that more
173
+ * flexible routing patterns can be supported.
174
+ *
175
+ * For example, asking for the URL for `catalog` may return something
176
+ * like `http://10.1.2.3/api/catalog`
177
+ */
178
+ getBaseUrl(pluginId: string): Promise<string>;
179
+ /**
180
+ * Returns the external HTTP base backend URL for a given plugin, without a trailing slash.
181
+ *
182
+ * The returned URL should point to an external endpoint for the plugin, such that
183
+ * it is reachable from the Backstage frontend and other external services. The returned
184
+ * URL should be usable for example as a callback / webhook URL.
185
+ *
186
+ * The returned URL should be stable and in general not change unless other static
187
+ * or external configuration is changed. Changes should not come as a surprise
188
+ * to an operator of the Backstage backend.
189
+ *
190
+ * For example, asking for the URL for `catalog` may return something
191
+ * like `https://backstage.example.com/api/catalog`
192
+ */
193
+ getExternalBaseUrl(pluginId: string): Promise<string>;
194
+ };
149
195
 
150
196
  /**
151
197
  * @public
152
198
  */
153
- declare const discoveryServiceRef: ServiceRef<PluginEndpointDiscovery, "plugin">;
199
+ declare const discoveryServiceRef: ServiceRef<DiscoveryService, "plugin">;
154
200
 
155
201
  /**
156
202
  * TODO
@@ -200,6 +246,8 @@ declare const lifecycleServiceRef: ServiceRef<LifecycleService, "plugin">;
200
246
  **/
201
247
  export declare type LifecycleServiceShutdownHook = {
202
248
  fn: () => void | Promise<void>;
249
+ /** Labels to help identify the shutdown hook */
250
+ labels?: Record<string, string>;
203
251
  };
204
252
 
205
253
  /**
@@ -248,6 +296,187 @@ export declare interface PluginMetadataService {
248
296
  */
249
297
  declare const pluginMetadataServiceRef: ServiceRef<PluginMetadataService, "plugin">;
250
298
 
299
+ /**
300
+ * An options object for {@link UrlReaderService.readTree} operations.
301
+ *
302
+ * @public
303
+ */
304
+ export declare type ReadTreeOptions = {
305
+ /**
306
+ * A filter that can be used to select which files should be included.
307
+ *
308
+ * @remarks
309
+ *
310
+ * The path passed to the filter function is the relative path from the URL
311
+ * that the file tree is fetched from, without any leading '/'.
312
+ *
313
+ * For example, given the URL https://github.com/my/repo/tree/master/my-dir, a file
314
+ * at https://github.com/my/repo/blob/master/my-dir/my-subdir/my-file.txt will
315
+ * be represented as my-subdir/my-file.txt
316
+ *
317
+ * If no filter is provided, all files are extracted.
318
+ */
319
+ filter?(path: string, info?: {
320
+ size: number;
321
+ }): boolean;
322
+ /**
323
+ * An ETag which can be provided to check whether a
324
+ * {@link UrlReaderService.readTree} response has changed from a previous execution.
325
+ *
326
+ * @remarks
327
+ *
328
+ * In the {@link UrlReaderService.readTree} response, an ETag is returned along with
329
+ * the tree blob. The ETag is a unique identifier of the tree blob, usually
330
+ * the commit SHA or ETag from the target.
331
+ *
332
+ * When an ETag is given as a request option, {@link UrlReaderService.readTree} will
333
+ * first compare the ETag against the ETag on the target branch. If they
334
+ * match, {@link UrlReaderService.readTree} will throw a
335
+ * {@link @backstage/errors#NotModifiedError} indicating that the response
336
+ * will not differ from the previous response which included this particular
337
+ * ETag. If they do not match, {@link UrlReaderService.readTree} will return the
338
+ * rest of the response along with a new ETag.
339
+ */
340
+ etag?: string;
341
+ /**
342
+ * An abort signal to pass down to the underlying request.
343
+ *
344
+ * @remarks
345
+ *
346
+ * Not all reader implementations may take this field into account.
347
+ */
348
+ signal?: AbortSignal;
349
+ };
350
+
351
+ /**
352
+ * A response object for {@link UrlReaderService.readTree} operations.
353
+ *
354
+ * @public
355
+ */
356
+ export declare type ReadTreeResponse = {
357
+ /**
358
+ * Returns an array of all the files inside the tree, and corresponding
359
+ * functions to read their content.
360
+ */
361
+ files(): Promise<ReadTreeResponseFile[]>;
362
+ /**
363
+ * Returns the tree contents as a binary archive, using a stream.
364
+ */
365
+ archive(): Promise<NodeJS.ReadableStream>;
366
+ /**
367
+ * Extracts the tree response into a directory and returns the path of the
368
+ * directory.
369
+ *
370
+ * **NOTE**: It is the responsibility of the caller to remove the directory after use.
371
+ */
372
+ dir(options?: ReadTreeResponseDirOptions): Promise<string>;
373
+ /**
374
+ * Etag returned by content provider.
375
+ *
376
+ * @remarks
377
+ *
378
+ * Can be used to compare and cache responses when doing subsequent calls.
379
+ */
380
+ etag: string;
381
+ };
382
+
383
+ /**
384
+ * Options that control {@link ReadTreeResponse.dir} execution.
385
+ *
386
+ * @public
387
+ */
388
+ export declare type ReadTreeResponseDirOptions = {
389
+ /**
390
+ * The directory to write files to.
391
+ *
392
+ * @remarks
393
+ *
394
+ * Defaults to the OS tmpdir, or `backend.workingDirectory` if set in config.
395
+ */
396
+ targetDir?: string;
397
+ };
398
+
399
+ /**
400
+ * Represents a single file in a {@link UrlReaderService.readTree} response.
401
+ *
402
+ * @public
403
+ */
404
+ export declare type ReadTreeResponseFile = {
405
+ path: string;
406
+ content(): Promise<Buffer>;
407
+ };
408
+
409
+ /**
410
+ * An options object for readUrl operations.
411
+ *
412
+ * @public
413
+ */
414
+ export declare type ReadUrlOptions = {
415
+ /**
416
+ * An ETag which can be provided to check whether a
417
+ * {@link UrlReaderService.readUrl} response has changed from a previous execution.
418
+ *
419
+ * @remarks
420
+ *
421
+ * In the {@link UrlReaderService.readUrl} response, an ETag is returned along with
422
+ * the data. The ETag is a unique identifier of the data, usually the commit
423
+ * SHA or ETag from the target.
424
+ *
425
+ * When an ETag is given in ReadUrlOptions, {@link UrlReaderService.readUrl} will
426
+ * first compare the ETag against the ETag of the target. If they match,
427
+ * {@link UrlReaderService.readUrl} will throw a
428
+ * {@link @backstage/errors#NotModifiedError} indicating that the response
429
+ * will not differ from the previous response which included this particular
430
+ * ETag. If they do not match, {@link UrlReaderService.readUrl} will return the rest
431
+ * of the response along with a new ETag.
432
+ */
433
+ etag?: string;
434
+ /**
435
+ * An abort signal to pass down to the underlying request.
436
+ *
437
+ * @remarks
438
+ *
439
+ * Not all reader implementations may take this field into account.
440
+ */
441
+ signal?: AbortSignal;
442
+ };
443
+
444
+ /**
445
+ * A response object for {@link UrlReaderService.readUrl} operations.
446
+ *
447
+ * @public
448
+ */
449
+ export declare type ReadUrlResponse = {
450
+ /**
451
+ * Returns the data that was read from the remote URL.
452
+ */
453
+ buffer(): Promise<Buffer>;
454
+ /**
455
+ * Returns the data that was read from the remote URL as a Readable stream.
456
+ *
457
+ * @remarks
458
+ *
459
+ * This method will be required in a future release.
460
+ */
461
+ stream?(): Readable;
462
+ /**
463
+ * Etag returned by content provider.
464
+ *
465
+ * @remarks
466
+ *
467
+ * Can be used to compare and cache responses when doing subsequent calls.
468
+ */
469
+ etag?: string;
470
+ };
471
+
472
+ /** @public */
473
+ export declare type RootLifecycleService = LifecycleService;
474
+
475
+ /**
476
+ * @public
477
+ */
478
+ declare const rootLifecycleServiceRef: ServiceRef<LifecycleService, "root">;
479
+
251
480
  /** @public */
252
481
  export declare type RootLoggerService = LoggerService;
253
482
 
@@ -264,6 +493,66 @@ export declare type SchedulerService = PluginTaskScheduler;
264
493
  */
265
494
  declare const schedulerServiceRef: ServiceRef<PluginTaskScheduler, "plugin">;
266
495
 
496
+ /**
497
+ * An options object for search operations.
498
+ *
499
+ * @public
500
+ */
501
+ export declare type SearchOptions = {
502
+ /**
503
+ * An etag can be provided to check whether the search response has changed from a previous execution.
504
+ *
505
+ * In the search() response, an etag is returned along with the files. The etag is a unique identifier
506
+ * of the current tree, usually the commit SHA or etag from the target.
507
+ *
508
+ * When an etag is given in SearchOptions, search will first compare the etag against the etag
509
+ * on the target branch. If they match, search will throw a NotModifiedError indicating that the search
510
+ * response will not differ from the previous response which included this particular etag. If they mismatch,
511
+ * search will return the rest of SearchResponse along with a new etag.
512
+ */
513
+ etag?: string;
514
+ /**
515
+ * An abort signal to pass down to the underlying request.
516
+ *
517
+ * @remarks
518
+ *
519
+ * Not all reader implementations may take this field into account.
520
+ */
521
+ signal?: AbortSignal;
522
+ };
523
+
524
+ /**
525
+ * The output of a search operation.
526
+ *
527
+ * @public
528
+ */
529
+ export declare type SearchResponse = {
530
+ /**
531
+ * The files that matched the search query.
532
+ */
533
+ files: SearchResponseFile[];
534
+ /**
535
+ * A unique identifier of the current remote tree, usually the commit SHA or etag from the target.
536
+ */
537
+ etag: string;
538
+ };
539
+
540
+ /**
541
+ * Represents a single file in a search response.
542
+ *
543
+ * @public
544
+ */
545
+ export declare type SearchResponseFile = {
546
+ /**
547
+ * The full URL to the file.
548
+ */
549
+ url: string;
550
+ /**
551
+ * The binary contents of the file.
552
+ */
553
+ content(): Promise<Buffer>;
554
+ };
555
+
267
556
  /** @public */
268
557
  export declare type ServiceFactory<TService = unknown> = {
269
558
  scope: 'root';
@@ -335,12 +624,29 @@ export declare type TypesToServiceRef<T> = {
335
624
  [key in keyof T]: ServiceRef<T[key]>;
336
625
  };
337
626
 
338
- /** @public */
339
- export declare type UrlReaderService = UrlReader;
627
+ /**
628
+ * A generic interface for fetching plain data from URLs.
629
+ *
630
+ * @public
631
+ */
632
+ export declare type UrlReaderService = {
633
+ /**
634
+ * Reads a single file and return its content.
635
+ */
636
+ readUrl(url: string, options?: ReadUrlOptions): Promise<ReadUrlResponse>;
637
+ /**
638
+ * Reads a full or partial file tree.
639
+ */
640
+ readTree(url: string, options?: ReadTreeOptions): Promise<ReadTreeResponse>;
641
+ /**
642
+ * Searches for a file in a tree using a glob pattern.
643
+ */
644
+ search(url: string, options?: SearchOptions): Promise<SearchResponse>;
645
+ };
340
646
 
341
647
  /**
342
648
  * @public
343
649
  */
344
- declare const urlReaderServiceRef: ServiceRef<UrlReader, "plugin">;
650
+ declare const urlReaderServiceRef: ServiceRef<UrlReaderService, "plugin">;
345
651
 
346
652
  export { }