@sasjs/api 0.13.0 → 0.14.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/build/browser.js CHANGED
@@ -1,4 +1,4 @@
1
- /* @sasjs/api 0.13.0 - the SASjs Server API, for a service worker. https://github.com/sasjs/api */
1
+ /* @sasjs/api 0.14.0 - the SASjs Server API, for a service worker. https://github.com/sasjs/api */
2
2
  "use strict";
3
3
  var SASjsApi = (() => {
4
4
  var __defProp = Object.defineProperty;
@@ -28,6 +28,7 @@ var SASjsApi = (() => {
28
28
  CODE_CORPUS: () => CODE_CORPUS,
29
29
  DEFAULT_GRANTABLE_ROUTES: () => DEFAULT_GRANTABLE_ROUTES,
30
30
  DEFAULT_IDENTITY: () => DEFAULT_IDENTITY,
31
+ DEFAULT_SESSIONS: () => DEFAULT_SESSIONS,
31
32
  DEPLOY_CORPUS: () => DEPLOY_CORPUS,
32
33
  DEPLOY_LIMITS: () => DEPLOY_LIMITS,
33
34
  DEPLOY_PAYLOAD_BYTES: () => DEPLOY_PAYLOAD_BYTES,
@@ -36,8 +37,10 @@ var SASjsApi = (() => {
36
37
  HANDLED_ROUTES: () => HANDLED_ROUTES,
37
38
  IDENTITY_CORPUS: () => IDENTITY_CORPUS,
38
39
  IDENTITY_FORMAT: () => IDENTITY_FORMAT,
40
+ MemoryAppStreamRegistry: () => MemoryAppStreamRegistry,
39
41
  MemoryDriveStore: () => MemoryDriveStore,
40
42
  MemoryIdentityStore: () => MemoryIdentityStore,
43
+ MemorySessionHost: () => MemorySessionHost,
41
44
  OVERLAY: () => OVERLAY,
42
45
  PROVIDER_MANAGED: () => PROVIDER_MANAGED,
43
46
  RECORD_CORPUS: () => RECORD_CORPUS,
@@ -51,6 +54,7 @@ var SASjsApi = (() => {
51
54
  createDriveService: () => createDriveService,
52
55
  createIdentityService: () => createIdentityService,
53
56
  createRecordService: () => createRecordService,
57
+ createSessionService: () => createSessionService,
54
58
  decodeBase64: () => decodeBase64,
55
59
  deployTree: () => deployTree,
56
60
  dirname: () => dirname,
@@ -68,7 +72,8 @@ var SASjsApi = (() => {
68
72
  runCase: () => runCase,
69
73
  sanitiseDisplayName: () => sanitiseDisplayName,
70
74
  servicesFor: () => servicesFor,
71
- topLevelRouteFor: () => topLevelRouteFor
75
+ topLevelRouteFor: () => topLevelRouteFor,
76
+ unpublishAppStream: () => unpublishAppStream
72
77
  });
73
78
 
74
79
  // src/types.ts
@@ -1007,7 +1012,7 @@ var SASjsApi = (() => {
1007
1012
  },
1008
1013
  {
1009
1014
  status: 404,
1010
- description: "No such app stream entry"
1015
+ description: "No app is published at that folder"
1011
1016
  }
1012
1017
  ]
1013
1018
  },
@@ -2808,7 +2813,7 @@ var SASjsApi = (() => {
2808
2813
  throw new ApiError(400, '"streamServiceName" is required');
2809
2814
  if (!body.appLoc) throw new ApiError(400, '"appLoc" is required');
2810
2815
  if (!await registry.unpublish(body.appLoc))
2811
- throw new ApiError(404, "No such app stream entry.");
2816
+ throw new ApiError(404, "No app is published at that folder.");
2812
2817
  return { status: "success" };
2813
2818
  };
2814
2819
  var MemoryAppStreamRegistry = class {
@@ -5008,7 +5013,7 @@ var SASjsApi = (() => {
5008
5013
  subject: SUBJECT,
5009
5014
  body: { streamServiceName: "myApp", appLoc: "/Public/not-an-app" }
5010
5015
  },
5011
- expect: { status: 404, error: "No such app stream entry." }
5016
+ expect: { status: 404, error: "No app is published at that folder." }
5012
5017
  },
5013
5018
  // ------------------------------------------- the uploaded-archive route
5014
5019
  // The archive is expanded by the host, so what arrives here is the same tree
@@ -5236,6 +5241,112 @@ var SASjsApi = (() => {
5236
5241
  }
5237
5242
  ];
5238
5243
 
5244
+ // src/session/service.ts
5245
+ var createSessionService = (store, host) => {
5246
+ const notFound2 = (id) => `Session with ID '${id}' was not found.`;
5247
+ const visible = async (caller, id) => {
5248
+ if (!caller) throw new ApiError(401, "Unauthorized");
5249
+ const reader = await store.userById(
5250
+ caller.userId
5251
+ );
5252
+ if (!reader || !reader.isActive) throw new ApiError(401, "Unauthorized");
5253
+ const session = await host.session(id);
5254
+ if (!session) throw new ApiError(404, notFound2(id));
5255
+ const owner = session.owner;
5256
+ if (owner !== reader.uid && owner !== reader.username && !reader.isAdmin)
5257
+ throw new ApiError(404, notFound2(id));
5258
+ return session;
5259
+ };
5260
+ return {
5261
+ async summary(caller, id) {
5262
+ const session = await visible(caller, id);
5263
+ return session.summary;
5264
+ },
5265
+ async state(caller, id) {
5266
+ await visible(caller, id);
5267
+ const state = await host.state(id);
5268
+ if (!state) throw new ApiError(404, notFound2(id));
5269
+ return state;
5270
+ },
5271
+ async log(caller, id) {
5272
+ await visible(caller, id);
5273
+ const log = await host.log(id);
5274
+ if (log === void 0) throw new ApiError(404, notFound2(id));
5275
+ return log;
5276
+ },
5277
+ async output(caller, id) {
5278
+ await visible(caller, id);
5279
+ const output = await host.output(id);
5280
+ if (output === void 0) throw new ApiError(404, notFound2(id));
5281
+ return output;
5282
+ }
5283
+ };
5284
+ };
5285
+
5286
+ // src/session/memory-host.ts
5287
+ var DEFAULT_SESSIONS = {
5288
+ "sess-admin": {
5289
+ owner: "user-admin",
5290
+ summary: {
5291
+ sessionId: "sess-admin",
5292
+ state: "completed",
5293
+ pid: 4242,
5294
+ creationTimeStamp: "2026-11-07T09:00:00.000Z",
5295
+ deathTimeStamp: "2026-11-07T09:00:04.000Z",
5296
+ expiresAfterMins: 60
5297
+ }
5298
+ },
5299
+ "sess-restricted": {
5300
+ owner: "user-restricted",
5301
+ summary: {
5302
+ sessionId: "sess-restricted",
5303
+ state: "running",
5304
+ pid: 4243,
5305
+ creationTimeStamp: "2026-11-07T09:05:00.000Z"
5306
+ }
5307
+ },
5308
+ "sess-silent": {
5309
+ owner: "user-admin",
5310
+ summary: {
5311
+ sessionId: "sess-silent",
5312
+ state: "running",
5313
+ pid: 4244,
5314
+ creationTimeStamp: "2026-11-07T09:10:00.000Z"
5315
+ }
5316
+ }
5317
+ };
5318
+ var STATES = {
5319
+ "sess-admin": { state: "completed", pid: 4242, lineCount: 12 },
5320
+ "sess-restricted": { state: "running", pid: 4243, lineCount: 3 }
5321
+ };
5322
+ var LOGS = {
5323
+ "sess-admin": "NOTE: session started\nNOTE: session completed\n",
5324
+ "sess-restricted": "NOTE: session started\n",
5325
+ "sess-silent": ""
5326
+ };
5327
+ var OUTPUTS = {
5328
+ "sess-admin": "<html><body>42</body></html>",
5329
+ "sess-restricted": "",
5330
+ "sess-silent": ""
5331
+ };
5332
+ var MemorySessionHost = class {
5333
+ constructor(sessions = DEFAULT_SESSIONS) {
5334
+ this.sessions = sessions;
5335
+ }
5336
+ async session(id) {
5337
+ return this.sessions[id];
5338
+ }
5339
+ async state(id) {
5340
+ return STATES[id];
5341
+ }
5342
+ async log(id) {
5343
+ return LOGS[id];
5344
+ }
5345
+ async output(id) {
5346
+ return OUTPUTS[id];
5347
+ }
5348
+ };
5349
+
5239
5350
  // src/corpus/records.ts
5240
5351
  var SIGNED_IN_TOKENS = [
5241
5352
  {
@@ -6452,112 +6563,6 @@ var SASjsApi = (() => {
6452
6563
  }
6453
6564
  ];
6454
6565
 
6455
- // src/session/service.ts
6456
- var createSessionService = (store, host) => {
6457
- const notFound2 = (id) => `Session with ID '${id}' was not found.`;
6458
- const visible = async (caller, id) => {
6459
- if (!caller) throw new ApiError(401, "Unauthorized");
6460
- const reader = await store.userById(
6461
- caller.userId
6462
- );
6463
- if (!reader || !reader.isActive) throw new ApiError(401, "Unauthorized");
6464
- const session = await host.session(id);
6465
- if (!session) throw new ApiError(404, notFound2(id));
6466
- const owner = session.owner;
6467
- if (owner !== reader.uid && owner !== reader.username && !reader.isAdmin)
6468
- throw new ApiError(404, notFound2(id));
6469
- return session;
6470
- };
6471
- return {
6472
- async summary(caller, id) {
6473
- const session = await visible(caller, id);
6474
- return session.summary;
6475
- },
6476
- async state(caller, id) {
6477
- await visible(caller, id);
6478
- const state = await host.state(id);
6479
- if (!state) throw new ApiError(404, notFound2(id));
6480
- return state;
6481
- },
6482
- async log(caller, id) {
6483
- await visible(caller, id);
6484
- const log = await host.log(id);
6485
- if (log === void 0) throw new ApiError(404, notFound2(id));
6486
- return log;
6487
- },
6488
- async output(caller, id) {
6489
- await visible(caller, id);
6490
- const output = await host.output(id);
6491
- if (output === void 0) throw new ApiError(404, notFound2(id));
6492
- return output;
6493
- }
6494
- };
6495
- };
6496
-
6497
- // src/session/memory-host.ts
6498
- var DEFAULT_SESSIONS = {
6499
- "sess-admin": {
6500
- owner: "user-admin",
6501
- summary: {
6502
- sessionId: "sess-admin",
6503
- state: "completed",
6504
- pid: 4242,
6505
- creationTimeStamp: "2026-11-07T09:00:00.000Z",
6506
- deathTimeStamp: "2026-11-07T09:00:04.000Z",
6507
- expiresAfterMins: 60
6508
- }
6509
- },
6510
- "sess-restricted": {
6511
- owner: "user-restricted",
6512
- summary: {
6513
- sessionId: "sess-restricted",
6514
- state: "running",
6515
- pid: 4243,
6516
- creationTimeStamp: "2026-11-07T09:05:00.000Z"
6517
- }
6518
- },
6519
- "sess-silent": {
6520
- owner: "user-admin",
6521
- summary: {
6522
- sessionId: "sess-silent",
6523
- state: "running",
6524
- pid: 4244,
6525
- creationTimeStamp: "2026-11-07T09:10:00.000Z"
6526
- }
6527
- }
6528
- };
6529
- var STATES = {
6530
- "sess-admin": { state: "completed", pid: 4242, lineCount: 12 },
6531
- "sess-restricted": { state: "running", pid: 4243, lineCount: 3 }
6532
- };
6533
- var LOGS = {
6534
- "sess-admin": "NOTE: session started\nNOTE: session completed\n",
6535
- "sess-restricted": "NOTE: session started\n",
6536
- "sess-silent": ""
6537
- };
6538
- var OUTPUTS = {
6539
- "sess-admin": "<html><body>42</body></html>",
6540
- "sess-restricted": "",
6541
- "sess-silent": ""
6542
- };
6543
- var MemorySessionHost = class {
6544
- constructor(sessions = DEFAULT_SESSIONS) {
6545
- this.sessions = sessions;
6546
- }
6547
- async session(id) {
6548
- return this.sessions[id];
6549
- }
6550
- async state(id) {
6551
- return STATES[id];
6552
- }
6553
- async log(id) {
6554
- return LOGS[id];
6555
- }
6556
- async output(id) {
6557
- return OUTPUTS[id];
6558
- }
6559
- };
6560
-
6561
6566
  // src/corpus/runner.ts
6562
6567
  var servicesFor = (testCase) => {
6563
6568
  const identity = new MemoryIdentityStore(
@@ -51,7 +51,7 @@ exports.DEPLOY_CORPUS = [
51
51
  subject: SUBJECT,
52
52
  body: { streamServiceName: 'myApp', appLoc: '/Public/not-an-app' }
53
53
  },
54
- expect: { status: 404, error: 'No such app stream entry.' }
54
+ expect: { status: 404, error: 'No app is published at that folder.' }
55
55
  },
56
56
  // ------------------------------------------- the uploaded-archive route
57
57
  // The archive is expanded by the host, so what arrives here is the same tree
@@ -19,7 +19,7 @@ const unpublishAppStream = async (registry, body) => {
19
19
  if (!body.appLoc)
20
20
  throw new types_js_1.ApiError(400, '"appLoc" is required');
21
21
  if (!(await registry.unpublish(body.appLoc)))
22
- throw new types_js_1.ApiError(404, 'No such app stream entry.');
22
+ throw new types_js_1.ApiError(404, 'No app is published at that folder.');
23
23
  return { status: 'success' };
24
24
  };
25
25
  exports.unpublishAppStream = unpublishAppStream;
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.servicesFor = exports.runCase = exports.PROVIDER_MANAGED = exports.ADMIN_SIGNED_IN = exports.RECORD_CORPUS = exports.SESSION_CORPUS = exports.DEPLOY_CORPUS = exports.IDENTITY_CORPUS = exports.DRIVE_CORPUS = exports.parseIdentity = exports.IDENTITY_FORMAT = exports.DEFAULT_IDENTITY = exports.MemoryIdentityStore = exports.CODE_CORPUS = exports.sanitiseDisplayName = exports.createRecordService = exports.createIdentityService = exports.HANDLED_ROUTES = exports.dispatch = exports.TAG_CAPABILITIES = exports.OVERLAY = exports.findRoute = exports.routeById = exports.ROUTES = exports.MemoryDriveStore = exports.measureDeployTree = exports.isDeployTree = exports.deployTree = exports.decodeBase64 = exports.checkDeployTree = exports.DEPLOY_SUCCESS = exports.DEPLOY_PAYLOAD_BYTES = exports.DEPLOY_LIMITS = exports.createDriveService = exports.isRoot = exports.basename = exports.dirname = exports.hasBlockedExtension = exports.normaliseDrivePath = void 0;
17
+ exports.servicesFor = exports.runCase = exports.PROVIDER_MANAGED = exports.ADMIN_SIGNED_IN = exports.RECORD_CORPUS = exports.unpublishAppStream = exports.MemoryAppStreamRegistry = exports.MemorySessionHost = exports.DEFAULT_SESSIONS = exports.createSessionService = exports.SESSION_CORPUS = exports.DEPLOY_CORPUS = exports.IDENTITY_CORPUS = exports.DRIVE_CORPUS = exports.parseIdentity = exports.IDENTITY_FORMAT = exports.DEFAULT_IDENTITY = exports.MemoryIdentityStore = exports.CODE_CORPUS = exports.sanitiseDisplayName = exports.createRecordService = exports.createIdentityService = exports.HANDLED_ROUTES = exports.dispatch = exports.TAG_CAPABILITIES = exports.OVERLAY = exports.findRoute = exports.routeById = exports.ROUTES = exports.MemoryDriveStore = exports.measureDeployTree = exports.isDeployTree = exports.deployTree = exports.decodeBase64 = exports.checkDeployTree = exports.DEPLOY_SUCCESS = exports.DEPLOY_PAYLOAD_BYTES = exports.DEPLOY_LIMITS = exports.createDriveService = exports.isRoot = exports.basename = exports.dirname = exports.hasBlockedExtension = exports.normaliseDrivePath = void 0;
18
18
  /**
19
19
  * `@sasjs/api` - the SASjs Server API described once.
20
20
  *
@@ -83,6 +83,14 @@ var deploy_js_2 = require("./corpus/deploy.js");
83
83
  Object.defineProperty(exports, "DEPLOY_CORPUS", { enumerable: true, get: function () { return deploy_js_2.DEPLOY_CORPUS; } });
84
84
  var session_js_1 = require("./corpus/session.js");
85
85
  Object.defineProperty(exports, "SESSION_CORPUS", { enumerable: true, get: function () { return session_js_1.SESSION_CORPUS; } });
86
+ var service_js_3 = require("./session/service.js");
87
+ Object.defineProperty(exports, "createSessionService", { enumerable: true, get: function () { return service_js_3.createSessionService; } });
88
+ var memory_host_js_1 = require("./session/memory-host.js");
89
+ Object.defineProperty(exports, "DEFAULT_SESSIONS", { enumerable: true, get: function () { return memory_host_js_1.DEFAULT_SESSIONS; } });
90
+ Object.defineProperty(exports, "MemorySessionHost", { enumerable: true, get: function () { return memory_host_js_1.MemorySessionHost; } });
91
+ var registry_js_1 = require("./drive/registry.js");
92
+ Object.defineProperty(exports, "MemoryAppStreamRegistry", { enumerable: true, get: function () { return registry_js_1.MemoryAppStreamRegistry; } });
93
+ Object.defineProperty(exports, "unpublishAppStream", { enumerable: true, get: function () { return registry_js_1.unpublishAppStream; } });
86
94
  var records_js_2 = require("./corpus/records.js");
87
95
  Object.defineProperty(exports, "RECORD_CORPUS", { enumerable: true, get: function () { return records_js_2.RECORD_CORPUS; } });
88
96
  Object.defineProperty(exports, "ADMIN_SIGNED_IN", { enumerable: true, get: function () { return records_js_2.ADMIN_SIGNED_IN; } });
@@ -460,7 +460,7 @@ exports.GENERATED_ROUTES = [
460
460
  },
461
461
  {
462
462
  status: 404,
463
- description: 'No such app stream entry'
463
+ description: 'No app is published at that folder'
464
464
  }
465
465
  ]
466
466
  },
@@ -48,7 +48,7 @@ export const DEPLOY_CORPUS = [
48
48
  subject: SUBJECT,
49
49
  body: { streamServiceName: 'myApp', appLoc: '/Public/not-an-app' }
50
50
  },
51
- expect: { status: 404, error: 'No such app stream entry.' }
51
+ expect: { status: 404, error: 'No app is published at that folder.' }
52
52
  },
53
53
  // ------------------------------------------- the uploaded-archive route
54
54
  // The archive is expanded by the host, so what arrives here is the same tree
@@ -16,7 +16,7 @@ export const unpublishAppStream = async (registry, body) => {
16
16
  if (!body.appLoc)
17
17
  throw new ApiError(400, '"appLoc" is required');
18
18
  if (!(await registry.unpublish(body.appLoc)))
19
- throw new ApiError(404, 'No such app stream entry.');
19
+ throw new ApiError(404, 'No app is published at that folder.');
20
20
  return { status: 'success' };
21
21
  };
22
22
  /**
@@ -40,6 +40,11 @@ export { DRIVE_CORPUS } from './corpus/drive.js';
40
40
  export { IDENTITY_CORPUS } from './corpus/identity.js';
41
41
  export { DEPLOY_CORPUS } from './corpus/deploy.js';
42
42
  export { SESSION_CORPUS } from './corpus/session.js';
43
+ export { createSessionService } from './session/service.js';
44
+ export type { HostSession, SessionHost, SessionService, SessionStateResponse, SessionSummary } from './session/service.js';
45
+ export { DEFAULT_SESSIONS, MemorySessionHost } from './session/memory-host.js';
46
+ export { MemoryAppStreamRegistry, unpublishAppStream } from './drive/registry.js';
47
+ export type { AppStreamRegistry, UnpublishBody } from './drive/registry.js';
43
48
  export { RECORD_CORPUS, ADMIN_SIGNED_IN, PROVIDER_MANAGED } from './corpus/records.js';
44
49
  export type { CorpusCase } from './corpus/drive.js';
45
50
  export { runCase, servicesFor } from './corpus/runner.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,cAAc,YAAY,CAAA;AAC1B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,OAAO,EACP,QAAQ,EACR,MAAM,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,iBAAiB,EAClB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,UAAU,EACX,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACV,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAChE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAG7D,cAAc,2BAA2B,CAAA;AACzC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,YAAY,EACb,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACd,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,aAAa,EACd,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,OAAO,EACP,OAAO,EACP,SAAS,EACT,UAAU,EACX,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EACL,aAAa,EACb,eAAe,EACf,gBAAgB,EACjB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -32,5 +32,8 @@ export { DRIVE_CORPUS } from './corpus/drive.js';
32
32
  export { IDENTITY_CORPUS } from './corpus/identity.js';
33
33
  export { DEPLOY_CORPUS } from './corpus/deploy.js';
34
34
  export { SESSION_CORPUS } from './corpus/session.js';
35
+ export { createSessionService } from './session/service.js';
36
+ export { DEFAULT_SESSIONS, MemorySessionHost } from './session/memory-host.js';
37
+ export { MemoryAppStreamRegistry, unpublishAppStream } from './drive/registry.js';
35
38
  export { RECORD_CORPUS, ADMIN_SIGNED_IN, PROVIDER_MANAGED } from './corpus/records.js';
36
39
  export { runCase, servicesFor } from './corpus/runner.js';
@@ -457,7 +457,7 @@ export const GENERATED_ROUTES = [
457
457
  },
458
458
  {
459
459
  status: 404,
460
- description: 'No such app stream entry'
460
+ description: 'No app is published at that folder'
461
461
  }
462
462
  ]
463
463
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sasjs/api",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "The SASjs Server API, described once - a generated route table, the services behind it, and the conformance corpus both hosts run",
5
5
  "license": "MIT",
6
6
  "author": "SASjs",